本帖最后由 eagle0754 于 2015-3-24 21:22 编辑
现在用STM32F0芯片,做串口接收实验。初始化中只是开了接收中断。接收中断如下所示:
- volatile uint8_t Usart1RxTerm = 0;
- uint32_t Usart1RxCount = 0;
- uint8_t Usart1RxBuffer[256];
- void USART1_IRQHandler(void)
- {
- if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
- {
- USART_ReceiveData(USART1); //(1)
- }
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
- {
- if (0 == Usart1RxTerm)
- {
- Usart1RxBuffer[Usart1RxCount++] = SART_ReceiveData(USART1);
- }
- if(Usart1RxCount==256)
- {
- Usart1RxCount = 0; //(2)
- Usart1RxTerm = 1;
- }
- }
- }
复制代码
程序运行后,在中断服务程序的(1)和(2)位置设置断点后全速运行。电脑使用串口助手首次发送256个字节到STM32F0可以正常运行到断点(2)。
然后电脑上串口助手再次发送256字节后,就停在断点(1)了。这是为什么?
网上说中断服务中判断到ORE时,读一次接收缓冲就行了。但是没作用啊
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{
USART_ReceiveData(USART1);
}
|
谢谢版主,这个中断没有问题。是外部清接收完标志时出错
{
Usart1RxBuffer[Usart1RxCount++] = SART_ReceiveData(USART1);
}
这里注意,你把Usart1RxTerm = 1;数据不在接收,这里可以改为,
c=SART_ReceiveData(USART1);
if (0 == Usart1RxTerm)
{
Usart1RxBuffer[Usart1RxCount++] = c;
}
这样就可以了.