|
由CubeMX2生成的Uart初始化代码中没有将串口使能,生成的初始化函数如下,中断和DMA的使能都正常,但是唯独缺少了串口的使能,废了老大劲才找到这个问题,越是不起眼的小问题越是难找到原因 hal_uart_handle_t *mx_usart2_uart_init(void) { hal_uart_config_t uart_config; HAL_RCC_USART2_EnableClock(); HAL_RCC_GPIOA_EnableClock(); / Basic configuration / if (HAL_UART_Init(&hUSART2, HAL_UART2) != HAL_OK) { return NULL; } if (HAL_RCC_USART2_SetKernelClkSource(HAL_RCC_USART2_CLK_SRC_PCLK1) != HAL_OK) { return NULL; } uart_config.baud_rate = 115200; uart_config.clock_prescaler = HAL_UART_PRESCALER_DIV1; uart_config.word_length = HAL_UART_WORD_LENGTH_8_BIT; uart_config.stop_bits = HAL_UART_STOP_BIT_1; uart_config.parity = HAL_UART_PARITY_NONE; uart_config.direction = HAL_UART_DIRECTION_TX_RX; uart_config.hw_flow_ctl = HAL_UART_HW_CONTROL_NONE; uart_config.oversampling = HAL_UART_OVERSAMPLING_16; uart_config.one_bit_sampling = HAL_UART_ONE_BIT_SAMPLE_DISABLE; if (HAL_UART_SetConfig(&hUSART2, &uart_config) != HAL_OK) { return NULL; } / ### USART2 GPIO Configuration ########################### / / GPIO Clocks activation / hal_gpio_config_t gpio_config; /** [GPIO Pin] ------> [Signal Name] ------> [Labels] PA3 ------> USART2_RX ------> PA3 PA2 ------> USART2_TX ------> PA2 **/ gpio_config.mode = HAL_GPIO_MODE_ALTERNATE; gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL; gpio_config.pull = HAL_GPIO_PULL_UP; gpio_config.speed = HAL_GPIO_SPEED_FREQ_LOW; gpio_config.alternate = HAL_GPIO_AF_7; HAL_GPIO_Init(HAL_GPIOA, PA3_PIN | PA2_PIN, &gpio_config); hal_exti_config_t exti_config; / Initialize the EXTI for line 3 / HAL_EXTI_Init(&hEXTI3, HAL_EXTI_LINE_3); / Set the trigger as RISING for the GPIOA / exti_config.trigger = HAL_EXTI_TRIGGER_RISING; exti_config.gpio_port = HAL_EXTI_GPIOA; HAL_EXTI_SetConfig(&hEXTI3, &exti_config); / Initialize the EXTI for line 2 / HAL_EXTI_Init(&hEXTI2, HAL_EXTI_LINE_2); / Set the trigger as RISING for the GPIOA / exti_config.trigger = HAL_EXTI_TRIGGER_RISING; exti_config.gpio_port = HAL_EXTI_GPIOA; HAL_EXTI_SetConfig(&hEXTI2, &exti_config); / Enable interrupt / HAL_CORTEX_NVIC_SetPriority(USART2_IRQn, HAL_CORTEX_NVIC_PREEMP_PRIORITY_0, HAL_CORTEX_NVIC_SUB_PRIORITY_0); HAL_CORTEX_NVIC_EnableIRQ(USART2_IRQn); / Configure the DMA TX / if (HAL_DMA_Init(&hLPDMA1_CH0, HAL_LPDMA1_CH0) != HAL_OK) { return NULL; } HAL_RCC_LPDMA1_EnableClock(); hal_dma_direct_xfer_config_t xfer_cfg_usart2_tx_dma; xfer_cfg_usart2_tx_dma.request = HAL_LPDMA1_REQUEST_USART2_TX; xfer_cfg_usart2_tx_dma.direction = HAL_DMA_DIRECTION_MEMORY_TO_PERIPH; xfer_cfg_usart2_tx_dma.src_inc = HAL_DMA_SRC_ADDR_INCREMENTED; xfer_cfg_usart2_tx_dma.dest_inc = HAL_DMA_DEST_ADDR_FIXED; xfer_cfg_usart2_tx_dma.src_data_width = HAL_DMA_SRC_DATA_WIDTH_BYTE; xfer_cfg_usart2_tx_dma.dest_data_width = HAL_DMA_DEST_DATA_WIDTH_BYTE; xfer_cfg_usart2_tx_dma.priority = HAL_DMA_PRIORITY_LOW_WEIGHT_LOW; if (HAL_DMA_SetConfigPeriphDirectXfer(&hLPDMA1_CH0, &xfer_cfg_usart2_tx_dma) != HAL_OK) { return NULL; } / Enable the interruption for LPDMA1_CH0 / HAL_CORTEX_NVIC_SetPriority(LPDMA1_CH0_IRQn, HAL_CORTEX_NVIC_PREEMP_PRIORITY_0, HAL_CORTEX_NVIC_SUB_PRIORITY_0); HAL_CORTEX_NVIC_EnableIRQ(LPDMA1_CH0_IRQn); / Link the Transmit DMA handle to the UART handle / if (HAL_UART_SetTxDMA(&hUSART2, &hLPDMA1_CH0) != HAL_OK) { return NULL; } / Configure the DMA RX / if (HAL_DMA_Init(&hLPDMA1_CH1, HAL_LPDMA1_CH1) != HAL_OK) { return NULL; } HAL_RCC_LPDMA1_EnableClock(); hal_dma_direct_xfer_config_t xfer_cfg_usart2_rx_dma; xfer_cfg_usart2_rx_dma.request = HAL_LPDMA1_REQUEST_USART2_RX; xfer_cfg_usart2_rx_dma.direction = HAL_DMA_DIRECTION_PERIPH_TO_MEMORY; xfer_cfg_usart2_rx_dma.src_inc = HAL_DMA_SRC_ADDR_FIXED; xfer_cfg_usart2_rx_dma.dest_inc = HAL_DMA_DEST_ADDR_INCREMENTED; xfer_cfg_usart2_rx_dma.src_data_width = HAL_DMA_SRC_DATA_WIDTH_BYTE; xfer_cfg_usart2_rx_dma.dest_data_width = HAL_DMA_DEST_DATA_WIDTH_BYTE; xfer_cfg_usart2_rx_dma.priority = HAL_DMA_PRIORITY_LOW_WEIGHT_LOW; if (HAL_DMA_SetConfigPeriphDirectXfer(&hLPDMA1_CH1, &xfer_cfg_usart2_rx_dma) != HAL_OK) { return NULL; } / Enable the interruption for LPDMA1_CH1 / HAL_CORTEX_NVIC_SetPriority(LPDMA1_CH1_IRQn, HAL_CORTEX_NVIC_PREEMP_PRIORITY_0, HAL_CORTEX_NVIC_SUB_PRIORITY_0); HAL_CORTEX_NVIC_EnableIRQ(LPDMA1_CH1_IRQn); / Link the Receive DMA handle to the UART handle / if (HAL_UART_SetRxDMA(&hUSART2, &hLPDMA1_CH1) != HAL_OK) { return NULL; } return &hUSART2; } 在调用该初始化函数之后,将其使能即可 huart2 = mx_usart2_uart_init(); if (huart2 == NULL) { while (1); } USART2->CR1 |= (USART_CR1_UE | USART_CR1_TE | USART_CR1_RE); |
STM32CubeMX2 学习分享:CubeMX2时钟树
《STM32CubeMX2 实战课程》学习笔记+从配置到工程移植的完整实践
STM32CubeMX2 学习分享:界面和配置体验升级
《STM32CubeMX2 实战课程》学习笔记4+FreeRTOS中的SysTick错误及改正
【NUCLEO-C562RE】OLED 显示
STM32CubeMX2 学习分享新建工程
STM32C542RC开发板的串口不定长数据接收实验
《STM32CubeMX2 实战课程》学习笔记——STM32C562RE开发测试
Stm32c542开发板测评:Stm32cubeMX2+VScode逐步完整展示实现心跳呼吸灯+串口收发+按键中断等功能
STM32C5 EDATA 使用指南:配置、问题排查与读写示例
微信公众号
手机版