这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 【AIcubeV1.01L】使用AIcube配置串口发送功能

共1条 1/1 1 跳转至

【AIcubeV1.01L】使用AIcube配置串口发送功能

高工
2026-04-10 19:39:34     打赏

一:STC32串口知识

    STC32G系列单片机具有2个全双工同步/异步串行通信接口(USART1和USART2)。每个串行口由2个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。

    STC32G系列单片机的串口1、串口2均有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。用户可用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。

    串口1、串口2的通讯口均可以通过功能管脚的切换功能切换到多组端口,从而可以将一个通讯口分时复用为多个通讯口。

二:图形化配置

2.1 串口配置如下所示:

02-1 串口1配置.png

串口模式 (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 定时器配置:

02-2 定时器1配置.png

定时器配置过程:

第一步:确定定时器与串口的绑定关系

首先需要确认你使用的是哪个串口,因为不同串口绑定的定时器是固定的:

  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");                
}

02-3串口输出截图.png

四:发现问题:

这里发现由于使用使用图形化配置的工程,代码运行时间太快了,初始化完成后直接输出字符串;导致字符串不正常,所以在发送之前,我增加几百毫秒的延时,才算正常。

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码  
		P40 =0 ;
		delay_ms(200);
		PrintString1("EEPW STC32G UART1 Test !\r\n");	
    //<<AICUBE_USER_MAIN_CODE_END>>



关键词: AIcubeV1.01L     串口    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]