ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

华大半导体HC32F4A0笔记(三),RS485通信,使用串口USART1,DMA接收

2021-01-28 19:32:16  阅读:1339  来源: 互联网

标签:DMA TX USART RS485 RX 串口 GPIO USART1 define


一、USART的工作频率和波特率

在这里插入图片描述
看用户手册一上来就糊涂了,手册里面写的PCLK是什么?翻看手册第4章有关CMU章节。似乎这里说的PCLK就是PCLK1?手册是第一版,纰漏其实蛮多的。
在这里插入图片描述
在官方库函数验证了猜测,这里说的PCLK指的就是PCLK1:


en_result_t USART_SetBaudrate(M4_USART_TypeDef *USARTx,
                                    uint32_t u32Baudrate,
                                    float32_t *pf32Err)
{
    /* …… */

    /* Get USART clock frequency */
    u32UsartDiv = USART_DIV(USARTx);
    u32UsartClk = PCLK_FREQ / u32UsartDiv; 

    /* …… */
}

在设置波特率的函数中找到了这么一句话u32UsartClk = PCLK_FREQ / u32UsartDiv;看起来是在计算USART的频率的,展开PCLK_FREQ这个宏得到:

#define PCLK_FREQ                                                              \
(   SystemCoreClock >> (READ_REG32_BIT(M4_CMU->SCFGR, CMU_SCFGR_PCLK1S) >> CMU_SCFGR_PCLK1S_POS))

果然,PCLK就是PCLK1
在这里插入图片描述
手册中没有说明USART的工作频率限制,所以理论上最高的波特率就是PCLK1 / 8(Bps)。计算公式为:
在这里插入图片描述

本例波特率定在19200,并不是特别高。根据公式,并考虑到过采样要求,可以把串口的工作频率调到16分频。确定下来后,开始初始化USART。

二、初始化USART1

本例TX为PA09,RX为PA10,其功能20对应USART1的TX和RX:
在这里插入图片描述
故本例使用UASRT1:

/* UART unit definition */
#define USART_FUNCTION_CLK_GATE         (PWC_FCG3_USART1)
/* UART RX/TX Port/Pin definition */
#define USART_RX_PORT                   (GPIO_PORT_A)   /* PH13: USART1_RX */
#define USART_RX_PIN                    (GPIO_PIN_10)
#define USART_RX_GPIO_FUNC              (GPIO_FUNC_20_USART1_RX)

#define USART_TX_PORT                   (GPIO_PORT_A)   /* PH15: USART1_TX */
#define USART_TX_PIN                    (GPIO_PIN_09)
#define USART_TX_GPIO_FUNC              (GPIO_FUNC_20_USART1_TX)
    /* Enable peripheral clock */
    PWC_Fcg3PeriphClockCmd(USART_FUNCTION_CLK_GATE, Enable);
	
	/* Configure USART RX/TX pin. */
    GPIO_SetFunc(USART_RX_PORT, USART_RX_PIN, USART_RX_GPIO_FUNC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(USART_TX_PORT, USART_TX_PIN, USART_TX_GPIO_FUNC, PIN_SUBFUNC_DISABLE);

使能时钟,给USART1上电,配置PA9和PA10的功能为TX和RX。

/* UART unit definition */
#define USART_UNIT                      (M4_USART1)
#define USART_BAUDRATE                  (19200UL)
#define USART_DATA_BITS                 (8U)
#define USART_CHECK_BITS                (0U)
#define USART_STOP_BITS                 (1U)
#define USART_FRAME_BITS                (USART_DATA_BITS + USART_CHECK_BITS + \
										 USART_STOP_BITS + (1U))
    const stc_usart_uart_init_t stcUartInit = {
        .u32Baudrate = USART_BAUDRATE,
        .u32BitDirection = USART_LSB,
        .u32StopBit = USART_STOPBIT_1BIT,
        .u32Parity = USART_PARITY_NONE,
        .u32DataWidth = USART_DATA_LENGTH_8BIT,
        .u32ClkMode = USART_INTERNCLK_OUTPUT,
        .u32PclkDiv = USART_PCLK_DIV16,
        .u32OversamplingBits = USART_OVERSAMPLING_8BIT,
        .u32NoiseFilterState = USART_NOISE_FILTER_DISABLE,
        .u32SbDetectPolarity = USART_SB_DETECT_FALLING,
    };
	
	if (Ok != USART_UartInit(USART_UNIT, &stcUartInit))
    {
        for (;;)
        {
        }
    }

参考官方例程写的,这个代码风格跟TRM和ADC的例程不一样。

  • 波特率19200

  • 左对齐

  • 停止位1

  • 校验位无

  • 数据位8

  • 时钟模式后面说

  • 64分频

  • 8位过采样,这个不是很清楚,猜测比特率为192,000,USART工作频率为6,250,000,为其32倍,32是个8位数。
    在这里插入图片描述

  • 不开滤波

  • 开始位检测方式为RX管脚低电平

时钟模式
在这里插入图片描述
当作UART使用,并使用内部时钟时,可以设置为00或者01,本例只有TX RX,没有配置CK脚,按道理可以配置成00。但是配置成00的话,CR1寄存器中的RTOF标志立不起来,串口也进不了TIMEOUT中断。例程里面用的是01。使用01后就没有这个故障,以后再找原因。

明天继续

标签:DMA,TX,USART,RS485,RX,串口,GPIO,USART1,define
来源: https://blog.csdn.net/cypressxt926/article/details/113352137

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有