一:STC32串口知识
STC32G系列单片机具有2个全双工同步/异步串行通信接口(USART1和USART2)。每个串行口由2个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。
STC32G系列单片机的串口1、串口2均有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。用户可用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。
串口1、串口2的通讯口均可以通过功能管脚的切换功能切换到多组端口,从而可以将一个通讯口分时复用为多个通讯口。二:图形化配置
2.1 串口配置如下所示:

串口模式 (UART_Mode):最常用的是 UART_8bit_BRTx,即8位数据、可变波特率模式,1位起始位、1位停止位、无校验。
波特率发生器 (UART_BRT_Use):用于产生串口通信时钟。通常为每个串口选择它专用的定时器(如UART1用 BRT_Timer1或者定时器1
波特率 (UART_BaudRate):直接写入想要的数值即可,如 9600、115200。库函数会自动计算定时器重载值。
引脚映射 (UARTx_SW):这是配置的重要一步。STC32G的每个串口都有多个可选的引脚组,需要使用 STC32G_Switch.h 中的宏来选择和切换。
2.2 定时器配置:

定时器配置过程:
第一步:确定定时器与串口的绑定关系
首先需要确认你使用的是哪个串口,因为不同串口绑定的定时器是固定的:
UART1:可使用定时器1或定时器2。
UART2:只能使用定时器2。
UART3:只能使用定时器3。
UART4:只能使用定时器4。
第二步:设置定时器的工作模式
作为波特率发生器,定时器必须工作在自动重载模式。
若使用定时器1,将其工作模式设置为“8位自动重载模式”(模式2)。
若使用定时器2/3/4,它们的工作模式固定为“16位自动重载模式”,直接配置即可。
第三步:选择定时器的时钟源(分频设置) 这一步决定了定时器的计数速度,直接影响波特率的准确性。你需要根据系统时钟频率,选择不分频(1T模式)或12分频(12T模式)。
通常为了提高精度,会优先选择不分频(1T模式)。
以定时器2为例,需要操作AUXR寄存器中的T2x12位。T2x12 = 1代表不分频(1T模式),T2x12 = 0代表12分频(12T模式)。第四步:计算并装载定时器的初值
这是最关键的一步,你需要计算出能让定时器在正确时间溢出的初值,并将其装入重载寄存器。
装载初值:将计算出的16位重载值拆分为高8位和低8位,分别写入对应的寄存器(如T2H和T2L)。
第五步:启动定时器 完成上述配置后,最后一步是启动定时器。通过将定时器启动控制位置1,定时器便开始运行。例如,启动定时器2需要将AUXR寄存器中的TR2位置1。定时器启动后,就会持续为串口提供稳定的波特率时钟信号。
三:重映射一下串口:
3.1 初始化串口如下:
void UART1_Init(void)
{
UART1_SwitchP3031(); //设置串口数据端口: RxD (P3.0), TxD (P3.1)
UART1_Timer1BRT(); //选择定时器1作为串口1波特率发生器
UART1_EnableRx(); //使能串口1接收数据
UART1_Mode1(); //设置串口1为模式1 (8位数据可变波特率)
UART1_SetIntPriority(3); //设置中断为最高优先级
UART1_EnableInt(); //使能串口1中断
//<<AICUBE_USER_UART1_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_UART1_INITIAL_END>>
}3.2 写一个输出函数:
void PrintString1(u8 *puts)
{
for (; *puts != 0; puts++) //遇到停止符0结束
{
SBUF = *puts;
B_TX1_Busy = 1;
while(B_TX1_Busy);
}
}3.3 在定时器中添加下标志位1S
if(flag == 1 )
{
flag = 0 ;
PrintString1("EEPW STC32G UART1 Test !rn");
}
四:发现问题:
这里发现由于使用使用图形化配置的工程,代码运行时间太快了,初始化完成后直接输出字符串;导致字符串不正常,所以在发送之前,我增加几百毫秒的延时,才算正常。
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
P40 =0 ;
delay_ms(200);
PrintString1("EEPW STC32G UART1 Test !\r\n");
//<<AICUBE_USER_MAIN_CODE_END>>
我要赚赏金
