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时钟分频配置是否正确。可以通过以下步骤进行确认:
将芯片的时钟源配置为内部RC振荡器,并根据自己的实际情况确定RC振荡器的频率。例如,若RC振荡器频率为8MHz,则将芯片的时钟源配置为内部RC振荡器,并将RC振荡器频率设置为8MHz。
可以通过以下公式计算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,导致你一直没能达到预期。
不知道你这个问题是否已经解决, 如果还没有解决的话:很抱歉,由于我是一个语言模型AI,我没有能力回答关于芯片配置的问题。建议您咨询相关的硬件工程师或者参考GD320E503RC芯片的官方文档进行配置。