我的一个项目用到STM32F072CBT6的4个USART, 其中USART1,usart2,usart3都是用DMA方式发送,中断接收,都可以工作了,唯独USART4既不能中断接收,也不能中断发送,发送能检测到TXE标志,但是不能进入中断。TXD接口也检测不到数据输出。下面是USART4的初始化代码和部分原理图 void Usart4_Init(void) { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 开启GPIOA时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // 开启USART4时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART4, ENABLE); // 配置USART4引脚功能复用 GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_4); GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_4); // 配置 USART Tx and Rx 引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置 USART4 USART_InitStructure.USART_BaudRate = 2400; USART_InitStructure.USART_WordLength = USART_WordLength_9b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_Even; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART4, &USART_InitStructure); // 配置 USART4中断 NVIC_InitStructure.NVIC_IRQChannel = USART3_4_IRQn;// 中断号 NVIC_InitStructure.NVIC_IRQChannelPriority = 0;// 中断优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断 NVIC_Init(&NVIC_InitStructure); // 配置中断 USART_ITConfig(USART4, USART_IT_RXNE, ENABLE); // 使能接收中断 USART_Cmd(USART4, ENABLE); // 使能外设 } 发送子程序,发送过程,暂时使用了检测发送标志位判断发送完成,一样没有任何进展 uint8 usart4_send[64]; // USART发送缓存 uint8 usart4_send_length; // 发送的数据长度 uint8 usart4_send_count; // 发送数据长度计数器 uint8 Usart4Send(void) { uint8 i; for (i = 0; i < usart4_send_length; i++) { USART_SendData(USART4, usart4_send); while (USART_GetFlagStatus(USART4, USART_FLAG_TXE) == RESET); } OSSemPost(usart4_tx_sem); // 发送USART4发送完成信号 } 中断处理,包含usart3的接收部分 void USART3_4_IRQHandler(void) { OSIntEnter(); if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) != RESET) { // 接收中断 Usart3Sink(USART_ReceiveData(USART3)); // 存储数据 usart3_finish_delay = 4; } if (USART_GetFlagStatus(USART4, USART_FLAG_RXNE) != RESET) { // 接收中断 Usart4Sink(USART_ReceiveData(USART4)); // 存储数据 usart4_finish_delay = 8; } if (USART_GetFlagStatus(USART4, USART_FLAG_TXE) != RESET) { // USART4 发送中断 USART_ClearFlag(USART4, USART_FLAG_TXE); // 发送中断处理 } if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET) { // 清除溢出中断 USART_ClearFlag(USART3, USART_FLAG_ORE); USART_ReceiveData(USART3); // 虚拟一次读数据 } if (USART_GetFlagStatus(USART4, USART_FLAG_ORE) != RESET) { // 清除溢出中断 USART_ClearFlag(USART4, USART_FLAG_ORE); USART_ReceiveData(USART4); // 虚拟一次读数据 } OSIntExit(); } 由于一直在调试,代码有点乱,应该不影响诸位大侠的判断。 |
【STM32F0开发日志/评测/笔记】+互补PWM波的产生
STM32F030 PB14和PB15无法输出PWM求助
【STM32F030探索套件】序列之五 外部中断
【STM32F0开发日志---二】+ucosii.2.92移植在STM32F030
上传个STM32F0+5110+内部温度传感器的菜鸟实例
【STM32F030探索套件使用问题】STM32F030 SPI方式驱动ST7565LCD失败
求一份STM32F051 I2C驱动LCD 12864的例程
STM32F0 M0 向结构体赋值进入HardFault异常
STM32F0 ADC-DMA方式采集2路数据时出现问题
STM32F030C8T6,TIM16定时慢很多问题?
评分
查看全部评分
评分
查看全部评分
谢谢各位的帮助。现在可以进入中断了。
STM32F072应该没有中断优先级分组。
谢谢你的帮助,问题已经解决。超级低级的错误。初始化代码忘记调用