打印
[综合信息]

华大单片机HC32L110 HC32F003 HC32F005 UART串口通讯

[复制链接]
2471|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
晓伍|  楼主 | 2021-8-1 15:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
数据格式
此UART模块共有模式0~模式3四种通讯模式,其中模式0为半双工同步通讯模式,此模式为同步模式不在我们今天的讨论范围之内。此模块支持8bit、9bit的数据格式,因此异步通讯的数据格式为:1位起始位,8bit或9bit的数据位,1位结束位。模式1为8bit数据位的全双工异步模式;模式2和模式3为9bit数据位的全双工异步通讯模式。具体如下图:

由上图可知模式2和模式3中数据多了个TB8位。该位在多机通讯环境下使用时,当 TB8=1,表明所接收的是地址帧;当 TB8=0,表明所接收的是数据帧。当不需要多机通讯时,此位作为奇偶校验位来使用。大家在使用UART模块之前一定要注意确定自己要使用的模式,模式如果选错会直接导致通讯数据出现错误。


使用特权

评论回复
沙发
晓伍|  楼主 | 2021-8-1 15:19 | 只看该作者
波特率产生
异步通讯时波特率有两种产生方式。Mode2为一种方式,Mode1和Mode3为一种方式。
Mode2:
当工作在 Mode2 时,波特率被固定在如下公式所得值:

其中,UARTx_SCON.DBAUD 表示双倍波特率,Freq 为 PCLK 时钟频率。

Mode1/3:
当工作在 Mode1 或者 Mode3 时,波特率由 TIMER 的溢出时间决定。具体公式如下图
所示:

其中,UARTx_SCON.DBAUD 表示双倍波特率,Freq 为 PCLK 时钟频率,TM 为TIMER 计数值。注意,TIMER 必须配置为 16 位自动重载入模式,计数寄存器和重载寄存器都得写入 TM 值。UART0对应使用的TIMER是TIM0,UART1对应使用的TIMER是TIM1。对于不同的PCLK产生的不同的波特率误差是有差别的,大家在使用的时候最好先查下误表,看下自己的配置所对应的误差是否在可接受的范围,如果误差不可接受,更改到自己可以接受的误差所对应的配置。不同配置波特率误差表在本文最后。

发送数据
发送数据时,与 UARTx_SCON.REN 的值无关,将所发送数据写入 UARTx_SBUF 寄存器中,数据就会从 TXD 移出(低位在先,高位在后)。

接收数据
接收数据时,需将 UARTx_SCON.REN 位置 1,并将 UARTx_ISR.RI 位清 0。开始接收 RXD 上数据(低位在先,高位在后),当接收完毕,可以从 UARTx_SBUF 寄存器读出。

接收缓存
通用 UART(UART0/1)接收端有一个帧长度(8/9bits)的接收缓存,也就是说当一帧数据接收完毕后,接收缓存中的数据会被一直保持,直到下一帧数据的 Stop 位接收完毕后,接收缓存才会更新为新一帧数据。

发送缓存
通用 UART(UART0/1)发送端不支持发送缓存。如果在发送数据过程中,填写UARTx_SBUF 寄存器,将会破坏当前正在发送数据。软件应该避免这种操作。


使用特权

评论回复
板凳
晓伍|  楼主 | 2021-8-1 15:20 | 只看该作者
相关寄存器


使用特权

评论回复
地板
晓伍|  楼主 | 2021-8-1 15:21 | 只看该作者
相关程序
配置中断相关内容
stcUartIrqCb.pfnRxIrqCb = RxIntCallback; //配置接收中断回调函数
stcUartIrqCb.pfnTxIrqCb = NULL;
stcUartIrqCb.pfnRxErrIrqCb = ErrIntCallback; //配置错误中断回调函数
stcConfig.pstcIrqCb = &stcUartIrqCb; //配置中断服务函数
stcConfig.bTouchNvic = TRUE; //允许中断

配置通讯相关内容
stcConfig.enRunMode = UartMode3; //测试项,更改此处来转换4种模式测试
stcMulti.enMulti_mode = UartNormal; //测试项,更改此处来转换多主机模式,mode2/3才有多主机模//式,此处配置为正常工作模式
stcConfig.pstcMultiMode = &stcMulti; //配置正常或多机工作模式

配置波特率
    stcBaud.bDbaud = 0u;                              //双倍波特率功能
    stcBaud.u32Baud = 9600u;                          //更新波特率位置
    stcBaud.u8Mode = UartMode3;                      //计算波特率需要模式参数
    pclk = Clk_GetPClkFreq();                        //获得PCLK
    timer=Uart_SetBaudRate(UARTCH1,pclk,&stcBaud); //计算波特率所需TIMER值

    stcBtConfig.enMD = BtMode2;                      //自动重装载16位计数器/定时器
    stcBtConfig.enCT = BtTimer;                      //定时模式
    Bt_Init(TIM1, &stcBtConfig);                     //调用basetimer1设置函数产生波特率
    Bt_ARRSet(TIM1,timer);                            //配置重载值
    Bt_Cnt16Set(TIM1,timer);                          //配置计数值
    Bt_Run(TIM1);                                      //启动定时


串口及接收中断配置
    Uart_Init(UARTCH1, &stcConfig);                //串口1初始化
    Uart_EnableIrq(UARTCH1,UartRxIrq);             //允许串口1接收中断
    Uart_ClrStatus(UARTCH1,UartRxFull);            //清串口1接收中断标志
    Uart_EnableFunc(UARTCH1,UartRx);               //串口1接收中断使能


接收中断回调函数
void RxIntCallback(void)
{
    u8RxData[1]=M0P_UART1->SBUF;                    //取出接收数据
    u8Rx** = 1;                                      //接收标志置1
}


主逻辑
while(1)
{
    Check** = 0;                                           //校验出错标志清零
    if(u8Rx**)                                             //有接收数据进入,无数据跳过
    {
        u8Rx** = 0;                                        //接收标志清零
        if(Uart_CheckEvenOrOdd(UARTCH1,Even,u8RxData[1])!=Ok)   //检查偶检验是否成功
        {
            Check** = 1;                                          //偶校验出错
        }
        else
        {
            Uart_SetTb8(UARTCH1,Even,u8RxData[0]);             //根据数据设置TB8位
            Uart_SendData(UARTCH1,u8RxData[0]);               //发送数据
            Uart_SetTb8(UARTCH1,Even,u8RxData[1]);
            Uart_SendData(UARTCH1,u8RxData[1]);
        }
    }
}


使用特权

评论回复
5
晓伍|  楼主 | 2021-8-1 15:22 | 只看该作者
UART模式对比
好多朋友在使用UART的时候因为没有掌握4种模式的差别,所示调试的时候总是接收数据不对,走了很多弯路,现在就把不同种的差别总结一下。
半双工同步模式
Mode0 波特率为固定的 PCLK 时钟的 1/12。不常用。
全双工异步模式
Mode1 数据位8位,不带检验位,不带多机通讯功能,波特率由TIMER产生,常用;
Mode2 数据位9位,带检验位,带多机通讯功能,波特率为与PCLK有关的固定值,不常用;
Mode3 数据位9位,带检验位,带多机通讯功能,波特率由TIMER产生,常用。
不同模式的总结可以参考下表:


使用特权

评论回复
6
晓伍|  楼主 | 2021-8-1 15:22 | 只看该作者
不同配置波特率误差表













使用特权

评论回复
7
遇惊魂| | 2022-7-8 16:24 | 只看该作者
晓伍 发表于 2021-8-1 15:22
不同配置波特率误差表

请问这个文档在哪获得

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

4113

帖子

1

粉丝