刚开始学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 } } |
请问为什么自己加了stdio.h,sprintf还是用不了?
STM32H7串口智能卡模式
想找一款pin to pin的MCU(参考STM32F105RC),支持CAN FD的,64PIN封装,各位小伙伴们有推荐吗
STM32F103做从站 上电过程,上位机不断发送数据造成,通讯失败,请大侠指导一下
蓝牙串口接受18位数据(包含包头1、包尾1、校验1)错位
想用STM32F103或407在不影响主程序进程的情况下(即不太压榨中断资源情况) 实现下列描述的PWM波形,
stm32F103驱动W5500
lin通讯
STM32G4串口无法发送正确的信息
STM32H747I-DISCO开发板无法连接芯片
在官方的库中有类似的例程,可以参考一下。
如果你使用STM32CubeMx进行配置,使用HAL库组织代码,估计10分钟就就OK了。
我看你贴出的代码和使用到的管脚,这里用到了AFIO模块,但似乎没看到你开启AFIO模块的时钟,记得将其开启。
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_AFIO_REMAP_USART2_ENABLE();
如果你使用CubeMx配置就很方便,基于图形化配置生成初始化代码时他就帮你做好了。