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

关注、星标、置顶公众号


前言

华大单片机HC32L110、HC32F003和HC32F005系列MCU有相同的UART通讯模块,因此这三个系列UART模块的使用程序也相同,本文将介绍通过中断的方式进行UART的通讯。


数据格式

此UART模块共有模式0~模式3四种通讯模式,其中模式0为半双工同步通讯模式,此模式为同步模式不在我们今天的讨论范围之内。此模块支持8bit、9bit的数据格式,因此异步通讯的数据格式为:1位起始位,8bit或9bit的数据位,1位结束位。模式1为8bit数据位的全双工异步模式;模式2和模式3为9bit数据位的全双工异步通讯模式。具体如下图:
在这里插入图片描述
由上图可知模式2和模式3中数据多了个TB8位。该位在多机通讯环境下使用时,当 TB8=1,表明所接收的是地址帧;当 TB8=0,表明所接收的是数据帧。当不需要多机通讯时,此位作为奇偶校验位来使用。大家在使用UART模块之前一定要注意确定自己要使用的模式,模式如果选错会直接导致通讯数据出现错误。


波特率产生

异步通讯时波特率有两种产生方式。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 寄存器,将会破坏当前正在发送数据。软件应该避免这种操作。


相关寄存器

寄存器符号描述说明
UARTx_SBUF数据寄存器
7:0SBUF数据寄存器发送数据时,待发送数据写入该寄存器;
接收数据时,从该寄存器中读出接收到的数据;
注意,对该寄存器读的值实际是 RxBuffer 中的值,对该寄存器写的值实际是写到了 TXShifter 中。
UARTx_SCON控制寄存器
9DBAUD波特率倍率设置0:单倍波特率;
1:双倍波特率
7:6SM01工作模式配置00:mode0;01:mode1;
10:mode2;11:mode3
5SM2多机通讯使能控制0:关闭多机通信功能
1:使能多机通信功能
4REN接收使能mode0: 0:发送,1:接收
其他: 0:发送,1:接收/发送
3TB8发送数据时待发送的TB8位
2RB8接收数据时收到的RB8位
1TIEN发送完成中断使能0:禁止发送完成中断
1:使能发送完成中断
0RIEN接收完成中断使能0:禁止接收完成中断
1:使能接收完成中断
UARTx_ISR标志位寄存器
2FE接收帧错误标志位;硬件置位,软件清零1:FE中断标志有效
0:FE中断标志无效
1TI发送完成中断标志位;硬件置位,软件清零1:TI中断标志有效
0:TI中断标志无效
0RI接收完成中断标志位;硬件置位,软件清零1:RI中断标志有效
0:RI中断标志无效
UARTx_ICR中断标志位清除寄存器
2FECLR清除接收帧错误标志位写0清零,写1无效
1TICLR清除发送完成中断标志位写0清零,写1无效
0RICLR清除接收完成中断标志位写0清零,写1无效

相关程序

配置中断相关内容

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;                    //取出接收数据
    u8RxFlg = 1;                                      //接收标志置1
}

主逻辑

while(1)
{
    CheckFlg = 0;                                           //校验出错标志清零
    if(u8RxFlg)                                             //有接收数据进入,无数据跳过
    {
        u8RxFlg = 0;                                        //接收标志清零
        if(Uart_CheckEvenOrOdd(UARTCH1,Even,u8RxData[1])!=Ok)   //检查偶检验是否成功
        {
            CheckFlg = 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]);
        }
    }
}

UART模式对比

好多朋友在使用UART的时候因为没有掌握4种模式的差别,所示调试的时候总是接收数据不对,走了很多弯路,现在就把不同种的差别总结一下。
半双工同步模式
Mode0 波特率为固定的 PCLK 时钟的 1/12。不常用。
全双工异步模式
Mode1 数据位8位,不带检验位,不带多机通讯功能,波特率由TIMER产生,常用;
Mode2 数据位9位,带检验位,带多机通讯功能,波特率为与PCLK有关的固定值,不常用;
Mode3 数据位9位,带检验位,带多机通讯功能,波特率由TIMER产生,常用。
不同模式的总结可以参考下表:
在这里插入图片描述


不同配置波特率误差表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


关注微信公众号『芯缘意码』,查看更多内容,回复“加群”加入技术交流群。
淘宝 店铺 搜索 『芯缘意码』,购买开发学习板仿真器。
公众号:芯缘意码https://shop219666036.taobao.com


  • 10
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: hc32f460是一款高性能的32位微控制器,它支持串口DMA功能。串口DMA是一种通过直接内存访问(DMA)方式来传输数据的技术,可以大大提高串口通信的效率。 hc32f460的串口DMA功能通过将串口数据的传输交给DMA控制器来完成,减轻了CPU的负担。在使用串口DMA时,首先需要配置DMA控制器,包括设置DMA通道、传输数据的起始地址和长度等。然后,将数据写入串口发送缓冲区,并启动DMA传输。DMA控制器会自动根据配置的参数从内存中读取数据,并将数据直接发送到串口,无需CPU的干预。 串口DMA可以极大地提高数据传输的速度,尤其适用于大量数据的传输和高速通信的场景。相比于传统的CPU中断方式,串口DMA能够实现数据的无缝传输,提高了系统的响应速度和实时性。 hc32f460的串口DMA功能还具有灵活的配置选项,例如可以选择不同的DMA通道进行数据传输,还支持循环传输模式和多缓冲区传输,以满足不同的应用需求。 总之,hc32f460的串口DMA功能是一项强大且高效的数据传输技术,能够提升系统的性能和可靠性。通过 DMA 控制器和串口的协同工作,能够实现高速、实时的数据传输,广泛应用于各种通信和控制系统中。 ### 回答2: HC32F460是一款基于ARM Cortex-M4内核的高性能微控制器。它具有丰富的外设功能,包括多个串口接口和DMA控制器。串口DMA是指通过DMA控制器来管理串口数据的传输。 在HC32F460中,串口DMA的工作原理如下:首先,我们需要配置串口控制器的相关参数,包括波特率、数据位、停止位和校验位等。然后,我们通过编程的方式配置DMA控制器,以使其能够将串口数据的发送和接收与内存之间进行直接传输。 对于串口发送功能,当我们要发送一段数据时,首先将数据存储在内存中的发送缓冲区中,然后通过编程的方式触发DMA控制器开始传输。DMA控制器会自动从内存中读取数据,并通过串口控制器发送出去。在传输过程中,我们无需干预,可以继续进行其他的操作。 对于串口接收功能,当有数据到达时,串口控制器会将数据存储在接收缓冲区中。然后,我们再次通过编程的方式触发DMA控制器开始传输。DMA控制器会自动将数据从接收缓冲区读取到内存中,以供后续的处理使用。同样,在传输过程中我们无需干预。 通过使用串口DMA,我们可以实现高效的串口数据传输,提高系统的性能。它可以减少CPU的负载,降低数据传输的延迟。同时,由于采用了直接内存访问的方式,可以减少CPU与外设之间的数据拷贝,提高数据传输的速度。 总之,HC32F460串口DMA是一种高效的数据传输方式,通过使用DMA控制器来管理串口数据的传输,可以提高系统的性能和可靠性。 ### 回答3: HC32F460是一种高性能的32位MCU芯片,具有丰富的外设接口和强大的处理能力。其中,串口DMA是这款芯片上的一个功能模块,用于实现串口的数据传输。 串口DMA可以通过配置寄存器来进行初始化设置。首先需要配置串口的传输参数,例如波特率、数据位数、停止位等。然后设置DMA的初始化参数,包括数据的传输方向、传输大小、源地址和目的地址等。接下来,通过使能串口DMA功能,就可以开始进行数据传输。 串口DMA的工作原理是通过中断触发和DMA通道来实现数据的传输。当有数据到达串口时,串口DMA会产生一个中断请求,触发DMA通道进行数据的传输。DMA通道会自动从源地址读取数据,并将数据传输到目的地址。数据传输完成后,DMA通道会产生一个传输完成的中断,在此中断中可以进行相应的处理,例如发送一个完成信号给外部设备。 串口DMA的优点是能够大大提高数据传输的效率和可靠性。由于数据传输由DMA通道完成,可以减轻CPU的负担,提高系统的响应速度。同时,采用DMA传输数据,可以避免由于CPU繁忙而导致的数据丢失或错误。因此,串口DMA在需要高效、稳定传输大量数据的应用中非常有用。 总之,HC32F460的串口DMA是一种可靠高效的数据传输方式,通过合理配置和使用,可以实现高速稳定的串口通信

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值