
刚开始学STM32,手里有一块公司的板子,板子上的USB接到FT232R,再从FT232R接到MCU的PD5(USART2TX)和PD6(USART2RX)。 我尝试了公司的代码,应该是用标准库写的。我把断点打在USART2_IRQHandler里面,然后串口调试软件随便发个数据,程序能跑到断点那。 而我自己最近跟着正点原子的视频在学,用的是HAL库,我把断点打在USART_UX_IRQHandler和HAL_UART_RxCpltCallback里,发现怎么也进不去中断。我感觉我该配的都配了,各位大佬帮忙看看是哪些没写对 USART相关的宏定义如下 #define USART_TX_GPIO_PORT GPIOD #define USART_TX_GPIO_PIN GPIO_PIN_5 #define USART_TX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0) /* PD口时钟使能 */ #define USART_RX_GPIO_PORT GPIOD #define USART_RX_GPIO_PIN GPIO_PIN_6 #define USART_RX_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOD_CLK_ENABLE(); }while(0) /* PD口时钟使能 */ #define USART_UX USART2 #define USART_UX_IRQn USART2_IRQn #define USART_UX_IRQHandler USART2_IRQHandler #define USART_UX_CLK_ENABLE() do{ __HAL_RCC_USART2_CLK_ENABLE(); }while(0) /* USART2 时钟使能 */ main的代码如下 int main(void){ // uint8_t len; // uint16_t times = 0; HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟为72Mhz */ //delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化为115200 */ //led_init(); /* 初始化LED */ HAL_RCC_GetSysClockFreq(); while (1) { } } sys_stm32_clock_init里的代码如下 #if USART_EN_RX /*如果使能了接收*/ /* 接收缓冲, 最大USART_REC_LEN个字节. */ uint8_t g_usart_rx_buf[USART_REC_LEN]; /* 接收状态 * bit15, 接收完成标志 * bit14, 接收到0x0d * bit13~0, 接收到的有效字节数目 */ uint16_t g_usart_rx_sta = 0; uint8_t g_rx_buffer[RXBUFFERSIZE]; /* HAL库使用的串口接收缓冲 */ UART_HandleTypeDef g_uart2_handle; /* UART句柄 */ /** * @brief 串口X初始化函数 * @param baudrate: 波特率, 根据自己需要设置波特率值 * @note 注意: 必须设置正确的时钟源, 否则串口波特率就会设置异常. * 这里的USART的时钟源在sys_stm32_clock_init()函数中已经设置过了. * @retval 无 */ void usart_init(uint32_t baudrate) { /*UART 初始化设置*/ g_uart2_handle.Instance = USART_UX; /* USART_UX */ g_uart2_handle.Init.BaudRate = baudrate; /* 波特率 */ g_uart2_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 字长为8位数据格式 */ g_uart2_handle.Init.StopBits = UART_STOPBITS_1; /* 一个停止位 */ g_uart2_handle.Init.Parity = UART_PARITY_NONE; /* 无奇偶校验位 */ g_uart2_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */ g_uart2_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */ HAL_UART_Init(&g_uart2_handle); /* HAL_UART_Init()会使能UART1 */ /* 该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 */ HAL_UART_Receive_IT(&g_uart2_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE); } 下面是配置GPIO、CLOCK和NVIC的代码 void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef gpio_init_struct; if (huart->Instance == USART_UX) /* 如果是串口1,进行串口1 MSP初始化 */ { USART_TX_GPIO_CLK_ENABLE(); /* 使能串口TX脚时钟 */ USART_RX_GPIO_CLK_ENABLE(); /* 使能串口RX脚时钟 */ USART_UX_CLK_ENABLE(); /* 使能串口时钟 */ gpio_init_struct.Pin = USART_TX_GPIO_PIN; /* 串口发送引脚号 */ gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */ gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */ gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* IO速度设置为高速 */ HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init_struct); gpio_init_struct.Pin = USART_RX_GPIO_PIN; /* 串口RX脚 模式设置 */ gpio_init_struct.Pull = GPIO_NOPULL; gpio_init_struct.Mode = GPIO_MODE_AF_INPUT; HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init_struct); /* 串口RX脚 必须设置成输入模式 */ __HAL_AFIO_REMAP_USART2_ENABLE(); #if USART_EN_RX HAL_NVIC_EnableIRQ(USART_UX_IRQn); /* 使能USART1中断通道 */ HAL_NVIC_SetPriority(USART_UX_IRQn, 0, 0); /* 组2,最低优先级:抢占优先级3,子优先级3 */ #endif } } |
STM32N6570-DK开发板,哪里还有卖的?
stm32ide怎么正确的导出项目
STM32F105RBT6 2025年 ROSH REACH 报告
STM32CubeMX 使用"FW_F1 V1.8.6"生成FreeRTOS代码缺少"freertos_mpool.h"?
你好,我的setting里面设置都没有问题。但是显示failed download cortexm3
STM32L431偶发串口乱码问题。
STM32F103C8出現找不到'STM32100B_EVAL/stm32100b_eval.h' file not found
STM32的DCode bus是连接到bus matrix的吗?参考手册描述和图片是不符吗?
stm32f407无法配置定时器2为全部dma
求助,使用51单片机和VL6180X传感器测距,结果一直是0是什么原因,能读到ID为0xB4
如果你使用STM32CubeMx进行配置,使用HAL库组织代码,估计10分钟就就OK了。
我看你贴出的代码和使用到的管脚,这里用到了AFIO模块,但似乎没看到你开启AFIO模块的时钟,记得将其开启。
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_AFIO_REMAP_USART2_ENABLE();
如果你使用CubeMx配置就很方便,基于图形化配置生成初始化代码时他就帮你做好了。
在官方的库中有类似的例程,可以参考一下。