你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

《STM32CubeMX2 实战课程》学习笔记5+CubeMX2生成的Uart初始化代码中没有使能

[复制链接]
patch1582 发布时间:2026-10-8 09:08

由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);

赞 收藏 评论0 发布时间:2026-10-8 09:08

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版