首页 > 其他分享 >HC32F460串口波特率设置19200,函数返回ErrorInvalidParameter

HC32F460串口波特率设置19200,函数返回ErrorInvalidParameter

时间:2023-08-01 17:33:56浏览次数:38  
标签:USART 19200 串口 enRet Fraction Integer 波特率 DIV stcInitCfg

今天,在调试项目的时候,遇到设置串口2波特率为19200的时候,USART_SetBaudrate(M4_USART2, 19200)函数返回 ErrorInvalidParameter,导致程序陷入了死循环,配置程序如下:

void USART2_LIN_Config(void){
    
#ifdef LIN_EN
 #ifdef HC32_MCU
   stc_usart_uart_init_t stcInitCfg;
     en_result_t enRet;
     
     stcInitCfg.enClkDiv = UsartClkDiv_1;
     stcInitCfg.enClkMode = UsartIntClkCkNoOutput;
     stcInitCfg.enDataLength = UsartDataBits8;
     stcInitCfg.enDirection = UsartDataLsbFirst;
     stcInitCfg.enStopBit = UsartOneStopBit;
     stcInitCfg.enParity = UsartParityNone;
     stcInitCfg.enSampleMode = UsartSamleBit8;
     stcInitCfg.enDetectMode = UsartStartBitFallEdge;
     stcInitCfg.enHwFlow = UsartRtsEnable;
     enRet = USART_UART_Init(M4_USART2, &stcInitCfg);
     if (enRet != Ok)
        { while (1); }
     enRet = USART_SetBaudrate(M4_USART2, 19200);
     if (enRet != Ok)
        { while (1); }
     USART_FuncCmd(M4_USART2, UsartRx, Enable);
   USART_FuncCmd(M4_USART2, UsartTx, Enable);
     USART_FuncCmd(M4_USART2, UsartRxInt,Enable);
 #endif
#endif
}

之后,我百思不得其解,根据函数注释来看是“ErrorInvalidParameter       USARTx is invalid”,也就是串口无效,这怎么可能呢,之后我进入底层函数查看

在   static en_result_t SetUartBaudrate(M4_USART_TypeDef *USARTx, uint32_t u32Baudrate)  函数里看,

DIV = ((float)C / ((float)B * 8.0f * (2.0f - (float)OVER8))) - 1.0f;
            DIV_Integer = (uint32_t)(DIV);

            if (!((DIV < 0.0f) || (DIV_Integer > 0xFFul)))
            {
                enRet = Ok;
                if ((DIV - (float32_t)DIV_Integer) > 0.00001f)
                {
                    /* FBME = 1 Calculation formula */
                    /* B = C * (128 + DIV_Fraction) / (8 * (2 - OVER8) * (DIV_Integer + 1) * 256) */
                    /* DIV_Fraction = ((8 * (2 - OVER8) * (DIV_Integer + 1) * 256 * B) / C) - 128 */
                    /* E = (C * (128 + DIV_Fraction) / (8 * (2 - OVER8) * (DIV_Integer + 1) * 256 * B)) - 1 */
                    /* DIV_Fraction = (((2 - OVER8) * (DIV_Integer + 1) * 2048 * B) / C) - 128 */
                    u64Tmp = (uint64_t)(((uint64_t)2ul - (uint64_t)OVER8) * ((uint64_t)DIV_Integer + 1ul) * (uint64_t)B);
                    DIV_Fraction = (uint32_t)(2048ul * u64Tmp / C - 128ul);
                    if (DIV_Fraction > 0x7Ful)
                    {
                        enRet = ErrorInvalidParameter;
                    }
                }

                if (Ok == enRet)
                {
                    USARTx->CR1_f.FBME = (DIV_Fraction > 0x7Ful) ? 0ul : 1ul;
                    USARTx->BRR_f.DIV_FRACTION = DIV_Fraction;
                    USARTx->BRR_f.DIV_INTEGER = DIV_Integer;
                }
            }

我怀疑是频率的问题,原先给串口分配的频率是42MHz,之后我改为10.5MHz,就好了

标签:USART,19200,串口,enRet,Fraction,Integer,波特率,DIV,stcInitCfg
From: https://www.cnblogs.com/tlazy-12138/p/17598492.html

相关文章

  • 使用Java进行串口通信
    引言 由于java的平台无关特性使得串口编程很困难。因为串口需要一个与特定平台实现的标准的API,而这对于java来说很困难。不幸的是,Sun在java的串口通信上没有太多关注。Sun已经定义了一个叫做JavaComm的串口通信API,但它的实现却不是javaSE(标准版)的一部分。Sun只为少数java平台提......
  • iTOP-i.MX6ULL开发板Qt 串口编程
    本章内容对应视频讲解链接(在线观看):QT上位机开发之串口助手(上)→B站搜索标题→【北京迅为】嵌入式学习之QT学习篇QT上位机开发之串口助手(下)→B站搜索标题→【北京迅为】嵌入式学习之QT学习篇本节我们使用Qt来编写一个简单的上位机。实验介绍:组装ui界面,使用Qt提供的串口类......
  • stm32CubeIDE 串口UART+DMA+空闲中断接收不定长数据
    一、概述串口使用时,有时候会有接收不定长数据的需求,这时候用DMA+空闲中断的方式是最好的方法。二、cubeide的配置串口按照需求配置后,添加一个串口接收的DMA,如下图 三、代码编写部分1、在串口init函数 MX_UART4_Init(void)的末尾用户代码区域添加使能空闲中......
  • Java利用Rxtx进行串口通讯
    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了。那么问题来了,如何进行串口通讯呢?老板说你用Java写个程序好了嘛,用Java写串口程序也是醉了。实验室也没别人写了,所以就......
  • WIFI&蓝牙(ESP32)转CAN总线&串口TTL模块-A2-蓝牙和CAN总线透传通信(经典蓝牙主机)
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ESP32_CAN"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>          实现的......
  • Mac 串口查询之 /dev/cu. 与 /dev/tty. 记录
    输入指令ls/dev/cu.*,可获得Mac的串口信息。内容如下输入指令cd/dev回车,再输入指令ls*tty,也可查询串口信息。内容如下之前Mac与Arduino通信的时候,串口的格式为/dev/tty.Arduino。最近在调试N100九轴传感器,发现用「/tty.」格式的话识别不到传感器,即/dev/tty.N100不行......
  • 麒麟系统打开串口失败
    1.串口打开失败“Open/dev/ttyS0SerialPortError” 解决方法:需要给/dev/ttyS0增加读写权限,或者直接使用root权限打开程序(不建议)。$sudochmod777/dev/ttyS0ttyS0修改成自己电脑上需要打开的串口名称2.UDP无法转发数据解决方法:请检查收到的数据结尾是否有\n......
  • M1-Mac-Parallels Desktop-Windows11 安装 CP210x 串口驱动
    设备作为虚拟COM端口工作时,需要CP210xUSB至UART桥虚拟COM端口(VCP)驱动器以促进与CP210x产品的主机通信。也可使用直接存取驱动器将这些设备连接至主机。我需要在Windows系统下调试WHEELTEC的9轴传感器N100。由于办公电脑是M1的MacAir,所以只能在Paral......
  • 《c++徒步》串口篇
    串口和USB串口是指通过串行传输数据的接口,它使用少量的引脚来传输数据。串口通常以RS-232(常见的是DB9或DB25连接器)或RS-485等协议进行通信。串口常用于连接计算机和外部设备,例如调制解调器、打印机、传感器等。USB是一种通用的连接标准,用于连接各种外部设备到计算机或其他主机设......
  • 洗衣机语音芯片NV170D,静态电流小于2uA一线MCU串口控制,IO口丰富
    洗衣机加入语音提示功能的主要是为了提高用户体验和方便用户使用。通过语音提示,洗衣机可以告诉用户当前洗涤、漂洗、脱水等不同阶段的进展状态,让用户更好地掌握洗衣机的工作情况,方便用户进行时间安排。此外,语音提示功能对于老年人或视力不好的人来说也非常有用,能够让他们更轻松地使......