embedded - 如何为STM32 Nucleo F429ZI启用UART?

标签 embedded microcontroller stm32 stm32f4

我正在尝试为 STM32 Nucleo - F429ZI 启用 UART。 我已经阅读了用户手册,它说默认情况下可以将 USART 3 配置为虚拟 com 端口。这是我的代码。我可以看到 USART 3 有引脚 D8 和 D9。这是我的代码。我在这里做错了什么,我在 com 端口上没有看到打印。

引用数据表 - https://www.st.com/resource/en/data_brief/nucleo-f429zi.pdf https://www.st.com/resource/en/user_manual/dm00244518-stm32-nucleo-144-boards-stmicroelectronics.pdf

//test print msg
char usr_msg[256];
//Ends

void printmsg(char *msg)
{
    for(uint32_t i = 0; i < strlen(msg); i++)
    {
        while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) != SET);
        USART_SendData(USART3, msg[i]);
    }
}

    static void prvSetupUart(void)
    {
        GPIO_InitTypeDef gpio_uart_pins;
        USART_InitTypeDef uart3_init;
    
        //GPIO D is connected to AHB1 bus.
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    
        // Enable the UART 3 peripheral clock -- connected to APB1 bus.
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    
        // zero the local variable
        memset(&gpio_uart_pins,0,sizeof(gpio_uart_pins));
        memset(&uart3_init,0,sizeof(uart3_init));
        // GPIO port D - pin 8 like TX
        // GPIO port D - ping 9 like RX
        gpio_uart_pins.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
        gpio_uart_pins.GPIO_Mode = GPIO_Mode_AF; //AF - Alternate function i.e. TX and RX.
        gpio_uart_pins.GPIO_PuPd = GPIO_PuPd_UP; //Pull up so that we see some default voltage.
    
        GPIO_Init(GPIOD, &gpio_uart_pins);
    
        uart3_init.USART_BaudRate = 115200;
        uart3_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        uart3_init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        uart3_init.USART_Parity = USART_Parity_No;
        uart3_init.USART_StopBits = USART_StopBits_1;
        uart3_init.USART_WordLength = USART_WordLength_8b;
        USART_Init(USART3,&uart3_init);
        //Enable USART 3 peripheral.
        USART_Cmd(USART3, ENABLE);
    
    }

    int main(void)
    {
        //Step number 1 - DeInit the RCC - Reset Control Clock so that we don't use Pre-scaler or PLL.
        // Basically, we want to use lower speed.
        RCC_DeInit();
        // update the System Core Clock
    
        //Step number 2 -- Update the clock to use the default clock.
        SystemCoreClockUpdate();
    
        prvSetupUart();
    
        sprintf(usr_msg, "This is Hello World\r\\n");
    
        printmsg(usr_msg);
    
        for(;;);
    }

最佳答案

您忘记设置要使用的 AF 模式(每个引脚可能有 16 种 AF 模式)。此时AF寄存器被设置为0,这是错误的。您需要将其设置为 7

enter image description here

我不知道如何使用 SPL 库(已贬值且不再支持)对其进行存档。

这是注册版本

#define GPIO_AFRL_AFRL0_Msk     (GPIO_AFRL_AFRL0_0 | GPIO_AFRL_AFRL0_1 | GPIO_AFRL_AFRL0_2 | GPIO_AFRL_AFRL0_3)

void GPIO_SetAF(GPIO_TypeDef *gpio, unsigned pin, unsigned AF)
{
    volatile uint32_t *AFreg = &gpio -> AFR[pin >= 8];

    if(AF <= 15)
    {
        if(pin > 7) pin -= 8;

        *AFreg &= ~(GPIO_AFRL_AFRL0_Msk << (4 * pin));
        *AFreg |= (AF << (4 * pin));
    }
}

关于embedded - 如何为STM32 Nucleo F429ZI启用UART?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62569017/

相关文章:

embedded - 芯片(SoC)中的各种复位

c - 16 位唯一键到 8 位数组索引(完美哈希)

c++ - 具有深度 sleep 模式的低功耗ESP32 + LoRa (TTGO LoRa32 OLED Board V1.0)

c - STM32F4 Discovery 上的中断未更新变量值

c - 结构成员上的 free() 仅在调试中导致 Hardfault

Python *.py, *.pyo, *.pyc : Which can be eliminated for an Embedded System?

html - 嵌入式网络/应用服务器

javascript - 如何为 Arduino 或类似的微 Controller 编写 JavaScript 编译器?

c - 为什么这个宏体中有类型转换?

c - STM Nucleo I2C 未发送所有数据