Files
STC32G_Power_Monitor/Source/uart.c
2025-08-31 21:43:17 +08:00

230 lines
6.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "uart.h"
uint8 busy[5]; //接收忙标志位
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口初始化
// @param uart_n 串口模块号(USART_1,USART_2,USART_3,USART_4)
// @param uart_rx_pin 串口接收引脚
// @param uart_tx_pin 串口发送引脚
// @param baud 串口波特率
// @param tim_n 使用tim_n作为串口波特率发生器(TIM1-TIM4)
// @return NULL
// Sample usage: uart_init(UART_1, UART1_RX_P30, UART1_TX_P31, 115200, TIM_2); //初始化串口1 波特率115200 发送引脚使用P31 接收引脚使用P30 ,使用定时器2作为波特率发生器
// @note 串口1使用 定时器1或者定时器2 作为波特率发生器。
// 串口2使用 定时器2 作为波特率发生器。
// 串口3使用 定时器3或者定时器2 作为波特率发生器。
// 串口4使用 定时器4或者定时器2 作为波特率发生器。
// STC32G仅有 定时器0-定时器4这5个定时器。
// 编码器采集数据也需要定时器作为外部计数。
// 如果不同的串口,使用同一个定时器,串口的波特率以最后一个初始化为准
//-------------------------------------------------------------------------------------------------------------------
void uart_init(UARTN_enum uart_n, UARTPIN_enum uart_rx_pin, UARTPIN_enum uart_tx_pin, uint32 baud, TIMN_enum tim_n)
{
uint16 brt;
brt = (uint16)(65536 - (sys_clk/baud/4));
switch(uart_n)
{
case UART_1:
{
if(TIM_1 == tim_n)
{
SCON |= 0x50;
TMOD |= 0x00;
TL1 = brt;
TH1 = brt >> 8;
AUXR |= 0x40;
TR1 = 1;
busy[1] = 0;
}
else if(TIM_2 == tim_n)
{
SCON |= 0x50;
T2L = brt;
T2H = brt >> 8;
AUXR |= 0x15;
}
P_SW1 &= ~(0x03<<6);
if((UART1_RX_P30 == uart_rx_pin) && (UART1_TX_P31 == uart_tx_pin))
{
P_SW1 |= 0x00;
}
else if((UART1_RX_P36 == uart_rx_pin) && (UART1_TX_P37 == uart_tx_pin))
{
P_SW1 |= 0x40;
}
else if((UART1_RX_P16 == uart_rx_pin) && (UART1_TX_P17 == uart_tx_pin))
{
P_SW1 |= 0x80;
}
else if((UART1_RX_P43 == uart_rx_pin) && (UART1_TX_P44 == uart_tx_pin))
{
P_SW1 |= 0xc0;
}
busy[1] = 0;
ES = 1;
break;
}
case UART_2:
{
if(TIM_2 == tim_n)
{
S2CON |= 0x50;
T2L = brt;
T2H = brt >> 8;
AUXR |= 0x14;
}
P_SW2 &= ~(0x01<<0);
if((UART2_RX_P10 == uart_rx_pin) && (UART2_TX_P11 == uart_tx_pin))
{
P_SW2 |= 0x00;
}
else if((UART2_RX_P46 == uart_rx_pin) && (UART2_TX_P47 == uart_tx_pin))
{
P_SW2 |= 0x01;
}
IE2 |= 0x01 << 0; //允许串行口2中断
busy[2] = 0;
break;
}
case UART_3:
{
if(TIM_2 == tim_n)
{
S3CON |= 0x10;
T2L = brt;
T2H = brt >> 8;
AUXR |= 0x14;
}
else if(TIM_3 == tim_n)
{
S3CON |= 0x50;
T3L = brt;
T3H = brt >> 8;
T4T3M |= 0x0a;
}
P_SW2 &= ~(0x01<<1);
if((UART3_RX_P00 == uart_rx_pin) && (UART3_TX_P01 == uart_tx_pin))
{
P_SW2 |= 0x00;
}
else if((UART3_RX_P50 == uart_rx_pin) && (UART3_TX_P51 == uart_tx_pin))
{
P_SW2 |= 0x02;
}
IE2 |= 0x01<<3; //允许串行口3中断
busy[3] = 0;
break;
}
case UART_4:
{
if(TIM_2 == tim_n)
{
S4CON |= 0x10;
T2L = brt;
T2H = brt >> 8;
AUXR |= 0x14;
}
else if(TIM_4 == tim_n)
{
S4CON |= 0x50;
T4L = brt;
T4H = brt >> 8;
T4T3M |= 0xa0;
}
P_SW2 &= ~(0x01<<2);
if((UART4_RX_P02 == uart_rx_pin) && (UART4_TX_P03 == uart_tx_pin))
{
P_SW2 |= 0x00;
}
else if((UART4_RX_P52 == uart_rx_pin) && (UART4_TX_P53 == uart_tx_pin))
{
P5M0 = 0x00;
P5M1 = 0x01<<2;//P5.2 需要设置为高阻
P_SW2 |= 0x04;
}
IE2 |= 0x01<<4; //允许串行口4中断
busy[4] = 0;
break;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口字节输出
// @param uart_n 串口模块号(USART_1,USART_2,USART_3,USART_4)
// @param dat 需要发送的字节
// @return void
// Sample usage: uart_putchar(UART_1,0xA5); // 串口1发送0xA5
//-------------------------------------------------------------------------------------------------------------------
void uart_putchar(UARTN_enum uart_n,uint8 dat)
{
switch(uart_n)
{
case UART_1:
while (busy[1]);
busy[1] = 1;
SBUF = dat;
break;
case UART_2:
while (busy[2]);
busy[2] = 1;
S2BUF = dat;
break;
case UART_3:
while (busy[3]);
busy[3] = 1;
S3BUF = dat;
break;
case UART_4:
while (busy[4]);
busy[4] = 1;
S4BUF = dat;
break;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口发送数组
// @param uart_n 串口模块号(USART_1,USART_2,USART_3,USART_4)
// @param *buff 要发送的数组地址
// @param len 发送长度
// @return void
// Sample usage: uart_putbuff(UART_1,&a[0],5);
//-------------------------------------------------------------------------------------------------------------------
void uart_putbuff(UARTN_enum uart_n,uint8 *p,uint32 len)
{
while(len--)
uart_putchar(uart_n,*p++);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief 串口发送字符串
// @param uart_n 串口模块号(USART_1,USART_2,USART_3,USART_4)
// @param *str 要发送的字符串地址
// @return void
// Sample usage: uart_putstr(UART_1,"i lvoe you");
//-------------------------------------------------------------------------------------------------------------------
void uart_putstr(UARTN_enum uart_n,uint8 *str)
{
while(*str)
{
uart_putchar(uart_n, *str++);
}
}