昨晚看到一个帖子,讲到了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)
谢谢阅览~
|