初级会员

- 积分
- 81
- 金钱
- 81
- 注册时间
- 2019-1-12
- 在线时间
- 34 小时
|
2金钱
这是一个用DMA并使用USART空闲中断接收数据的中断函数,但不了解里面的i是做什么用的。
另外一点,我进了空闲中断,中断函数里设置了一个标志位,我是不是需要不停的检测到这个标志位?然后把dmabuf里的数据读出来?
void USART1_IRQHandler(void)
{
u16 i;
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//如果为空闲总线中断
{
i = USART1->SR; //读SR的作用是?
i = USART1->DR; //读DR的作用是?
USART_ClearITPendingBit(USART1, USART_IT_IDLE); //清掉空闲中断
DMA_Cmd(DMA2_Stream5, DISABLE);//关闭DMA,防止处理其间有数据
Data_Len=65535-DMA_GetCurrDataCounter(DMA2_Stream5);
data_recv_flag_set(); //标志位
printf("Data_Len=%d\n\r",Data_Len);
//DMA_Cmd(DMA2_Stream5, ENABLE);//开启DMA
}
}
|
最佳答案
查看完整内容[请看2#楼]
作用是清除IDLE标志位, 根据规格要求, 清除IDLE是要先读取SR后读DR, 因为中断是IDLE, 所以从DR读出来的是没意思的数据,
其实不用i的, 写了i还会因为优化等级而被优化掉, 把i=都删了就可以
|