GD320E503RC芯片配置USART5,如何实现4800的波特率

9600以上的波特率都可以正常通信,但是设置成4800波特率,用逻辑分析仪自动检测出来的是38051。如何配置成4800的波特率。

要实现USART5的4800波特率,需要在STM32的时钟配置和USART5的寄存器配置上进行相应的设置。

时钟配置
在使用USART5之前,需要先配置USART5所使用的时钟源。如果使用STM32的内部时钟源,则需要将系统时钟配置为内部时钟,并将USART5的时钟源设置为PCLK1。如果使用外部时钟源,则需要将外部时钟源的时钟频率配置到系统时钟中。具体的时钟配置方法可以参考STM32的时钟配置手册。

USART5寄存器配置
在时钟配置完成后,需要对USART5的寄存器进行相应的配置,以实现4800波特率。具体的配置步骤如下:

(1) 设置波特率

将USART5的波特率设置为4800,可以通过设置USART5的BRR寄存器来实现。BRR寄存器的值可以通过以下公式计算得出:

BRR = USART_DIV_SAMPLING16(SystemCoreClock, 4800)

其中,USART_DIV_SAMPLING16是一个宏定义,用于计算USART的预分频值。对于STM32F4系列的芯片,该宏定义的实现如下:

#define USART_DIV_SAMPLING16(PCLK, BAUD)
(((PCLK)25)/(4(BAUD)))

(2) 配置数据位、停止位和校验位

将USART5的数据位设置为8位,停止位设置为1位,校验位不使能。可以通过设置USART5的CR1寄存器和CR2寄存器来实现。

(3) 使能USART5

将USART5使能,可以通过设置USART5的CR1寄存器中的UE位来实现。

配置完成后,可以通过逻辑分析仪检测USART5的波特率是否为4800。如果还是检测到38051,则可能是由于时钟配置或寄存器配置不正确导致的。可以根据具体的情况进行调试。

引用chatGPT作答,针对您的问题,需要确认一下您的GD32芯片型号,因为GD32系列芯片中并没有GD320E503RC这个型号。不过一般而言,UART的波特率计算公式为:

波特率 = 系统时钟频率 / (分频系数 × (1 + 波特率分频系数))

其中,分频系数是USARTDIV的值,波特率分频系数是BRR的值。

对于您的问题,如果逻辑分析仪检测出来的波特率是38051,而不是预期的4800,那么可能存在以下几种情况:

1.波特率分频系数没有被正确配置,导致计算出来的波特率不正确。

2.系统时钟频率与实际不符,导致计算出来的波特率不正确。

3.其他配置不正确的问题。

具体的解决方法如下:

1.确认波特率分频系数是否正确配置。根据您的需求,需要将BRR的值设置为系统时钟频率除以(分频系数 × 4800),然后将结果四舍五入到最接近的整数。如果这个值超过了255,那么就需要将USARTDIV的值调整,使得计算出来的波特率分频系数在可接受范围内。

2.确认系统时钟频率是否正确。系统时钟频率可以使用RCC_GetClocksFreq()函数获取。如果实际系统时钟频率与配置不符,可以尝试调整系统时钟源或者配置PLL等来解决问题。

3.确认其他配置是否正确。比如,USART的数据位、停止位、校验位等是否设置正确,GPIO是否配置正确等。

另外,建议您在配置USART时使用标准库函数来进行配置,这样可以更加方便和可靠。具体的使用方法可以参考GD32标准库文档。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
首先,需要确认一下芯片的时钟源配置和USART时钟分频配置是否正确。可以通过以下步骤进行确认:

  1. 确认芯片的时钟源配置:

将芯片的时钟源配置为内部RC振荡器,并根据自己的实际情况确定RC振荡器的频率。例如,若RC振荡器频率为8MHz,则将芯片的时钟源配置为内部RC振荡器,并将RC振荡器频率设置为8MHz。

  1. 确认USART时钟分频配置:

可以通过以下公式计算USART时钟分频系数:

USART时钟分频系数 = (时钟源频率 / (16 * 波特率))

例如,在时钟源频率为8MHz时,要实现4800波特率的通信,计算得到USART时钟分频系数为104.1667,取整得到104,这就是最终的USART时钟分频系数。

在确认芯片的时钟源配置和USART时钟分频配置正确之后,可以按照以下步骤进行代码实现:

#include <stdio.h>
#include <gd32e50x.h>

#define USARTx         USART5
#define USART_CLK      RCU_USART5
#define USART_GPIO_CLK RCU_GPIOC
#define USART_TX_GPIO_PIN GPIO_PIN_12
#define USART_RX_GPIO_PIN GPIO_PIN_2
#define USART_TX_GPIO_PORT GPIOC
#define USART_RX_GPIO_PORT GPIOC

void usart5_init(void)
{
    /* GPIO clock enable */
    rcu_periph_clock_enable(USART_GPIO_CLK);

    /* USART clock enable */
    rcu_periph_clock_enable(USART_CLK);

    /* Configure USART Tx and Rx as alternate function push-pull */
    gpio_init(USART_TX_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, USART_TX_GPIO_PIN);
    gpio_init(USART_RX_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, USART_RX_GPIO_PIN);

    /* USART configure */
    usart_deinit(USARTx);
    usart_baudrate_set(USARTx, 4800U); // Set baudrate to 4800
    usart_word_length_set(USARTx, USART_WL_8BIT);
    usart_stop_bit_set(USARTx, USART_STB_1BIT);
    usart_parity_config(USARTx, USART_PM_NONE);
    usart_hardware_flow_rts_config(USARTx, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USARTx, USART_CTS_DISABLE);
    usart_receive_config(USARTx, USART_RECEIVE_ENABLE);
    usart_transmit_config(USARTx, USART_TRANSMIT_ENABLE);

    /* Enable USART */
    usart_enable(USARTx);
}

int main(void)
{
    uint8_t tx_data[] = "Hello, world!\n";
    uint8_t rx_data[20] = {0};
    uint32_t i = 0;

    /* Initialize USART5 */
    usart5_init();

    /* Transmit data */
    for (i = 0; i < sizeof(tx_data); i++)
    {
        usart_data_transmit(USARTx, tx_data[i]);
        while (usart_flag_get(USARTx, USART_FLAG_TBE) == RESET);
    }

    /* Receive data */
    for (i = 0; i < sizeof(rx_data); i++)
    {
        while (usart_flag_get(USARTx, USART_FLAG_RBNE) == RESET);
        rx_data[i] = (uint8_t)usart_data_receive(USARTx);
    }

    /* Print received data */
    printf("Received data: %s", rx_data);

    while (1);
}

在上面的代码中,我们初始化了USART5,将波特率设置为4800,并通过USART5向串口发送了一段字符串。然后,我们从USART5接收数据,并通过printf函数将接收到的数据打印出来。

需要注意的是,在使用printf函数打印数据时,需要先将stdout重定向到USART5。可以在代码中添加以下代码实现:

/* Set stdout to USART5 */
usart_printf_init(USARTx);

这个函数的实现可以自行查找。

最后,需要说明的是,在调试过程中,可以使用示波器或逻辑分析仪对串口信号进行观察和分析,以确定波特率是否设置正确。如果发现波特率不正确,可以尝试重新调整芯片的时钟源配置和USART时钟分频配置。
如果我的回答解决了您的问题,请采纳!

直接套用stm32的代码试试看,是不是gd的底层代码有bug,导致你一直没能达到预期。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    很抱歉,由于我是一个语言模型AI,我没有能力回答关于芯片配置的问题。建议您咨询相关的硬件工程师或者参考GD320E503RC芯片的官方文档进行配置。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^