昨晚看到一个帖子,讲到了IDLE中断的用法,真是豁然开朗,之前一直不知道这个中断能干什么,在这也感谢 wanglaojii 的分享---《STM32单片机的接收不定长度字节数据的方法》。
随后我便拿NUCLEO-L432一试,加上了DMA,效果杠杠滴。
- void Usart_Init(u8 Fck,u32 Bot)
- {
- RCC->AHB2ENR|=0x1;
- RCC->APB1ENR1|=RCC_APB1ENR1_USART2EN;
- GPIOA->AFR[1]=0x30000000u;
- GPIOA->AFR[0]=0x00000700u;
- IOset(GPIOA,Px2_TB|Px15_TB,Px2_OB|Px15_OB,2,3,0,0,1);
-
- USARTx->CR1=0;
- USARTx->CR2=0;
- USARTx->CR3=0;
-
- USARTx->BRR=Fck*1000000/Bot;
- USARTx->CR1=0x212c;
- USARTx->CR1&=~0x20;
- USARTx->CR1|=USART_CR1_IDLEIE; //开启IDLE中断
- USARTx->CR3|=USART_CR3_DMAR; //接收DMA使能
- USARTx->CR1|=1;
- DMA1_USART2_RX_init(1,(u32)&USART_R_Buf);//DMA配置
- USART2_Start((u32)USART_R_Buf,128);
- NVIC->ISER[1]|=1<<(USART2_IRQn-32);
- NVIC->IP[USART2_IRQn]=0x80;
- }
在帧传输过程中由DMA接管,CPU可以安心的做别的事情,但一帧数据(帧长度任意)结束之后,就会触发IDLE中断,此时CPU即可处理该帧数据。
是不是很方便,哈哈。
附上工程(纯寄存器代码):
test.rar
(700.58 KB, 下载次数: 56)
谢谢阅览~
|