【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定时慢很多问题?
结贴,虽然不是你说的这个原因。但是还是非常感谢你的指点
解决问题后的代码如下:
void USART1_IRQHandler(void)
{
uint8_t Rx_Data_Buf = 0;
if (USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET) //发送中断被触发
{
USART_ClearFlag(USART1, USART_FLAG_TC);
USART1_Busy = RESET;
USART2_String("T\n");
}
if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) //接收中断被触发
{
Rx_Data_Buf = USART_ReceiveData(USART1);
if (Rx_Data_Buf != '\n')
{
USART1_RxData_buffer[Rx_count] = Rx_Data_Buf;
Rx_count++;
if (Rx_count == 1 && USART1_RxData_buffer[0] != 'A')
Rx_count = 0;
if (Rx_count == 2 && USART1_RxData_buffer[1] != 'X' )
{
if (USART1_RxData_buffer[1] == 'A' )
Rx_count = 1;
else
Rx_count = 0;
}
if (Rx_count == 3 && USART1_RxData_buffer[2] != 'X' )
{
if (USART1_RxData_buffer[2] == 'A' )
Rx_count = 1;
else
Rx_count = 0;
}
//以上过滤无效打印信息,只有AXX开头的字符串才认为是需要接收的模块命令;
}
if (Rx_Data_Buf == '\n' && Rx_count > 10)
{
USART1_RxData_buffer[Rx_count] = Rx_Data_Buf;
USART1_RxData_buffer[Rx_count+1] = '\0';
Rx_count = 0;
Rx_ReadData_Over = SET;
}
}
if (USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET) //接收溢出中断被触发
{
USART_ClearFlag(USART1, USART_FLAG_ORE);
USART2_Printf("USART1 ISR(ORE) = %b\n",USART1->ISR);
}
//USART2_Printf("USART1 ISR = %b\n",USART1->ISR);
}
就是把之前的 :USART_GetITStatus(USART1,USART_IT_RXNE) 修改为:USART_GetFlagStatus(USART1,USART_FLAG_RXNE);
根本原因就是对这两个库函数的功能没有搞清楚;USART_GetITStatus(USART1,USART_IT_RXNE)这个函数的功能是获取你设置了那些中断,因为函数返回的是CR1/CR2/CR3的相应标志位;而中断函数中需要查询的是当前是哪个中断产生,所以必须使用USART_GetFlagStatus(USART1,USART_FLAG_RXNE);因为所有的中断请求都是在ISR寄存器中;查看库函数,只有这个函数返回的是ISR寄存器的值。
新手接触STM32,走了很多弯路!!!并且STM32F030系列的编程参考手册没有中文的,我们这些英文不太好的新手 ,学起来相当费力啊!!!希望以后不要再走这样的弯路!!!!
问题解决了就好