STM32F10x 学习笔记6(USART实现串口通讯 2)
时间:11-20
来源:互联网
点击:
这次讲讲利用串口收发中断来进行串口通讯。STM32 上为每个串口分配了一个中断。也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断。程序需在中断处理函数中读取状态寄存器(USART_SR)来判断当前的是什么中断。下面的中断映像图给出了这些中断源是如何汇合成最终的中断信号的。图中也给出了如何控制每一个单独的中断源是否起作用。
另外,Cortex-M3内核中还有个NVIC,可以控制这里的中断信号是否触发中断处理函数的执行,还有这些外部中断的级别。关于NVIC可以参考《ARMCortexM3权威指南》,里面讲解的非常详细。
简单的说,为了开启中断,我们需要如下的代码:
- NVIC_InitTypeDefNVIC_InitStructure;
- NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
- USART_ITConfig(USART1,USART_IT_TXE,ENABLE);//开启发送中断
这里多说一句,串口的发送中断有两个,分别是:
- l发送数据寄存器空中断(TXE)
- l发送完成中断(TC)
一般来说我们会使用发送数据寄存器空中断,用这个中断发送的效率会高一些。
中断处理函数的框架如下,如果检测到错误就清除错误,收到数了就处理。发完当前数据了就发下一个。
- voidUSART1_IRQHandler(void)
- {
- unsignedintdata;
- if(USART1->SR&0x0F)
- {
- //Seeifwehavesomekindoferror,Clearinterrupt
- data=USART1->DR;
- }
- elseif(USART1->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
- {
- data=USART1->DR;
- //对收到的数据进行处理,或者干些其他的事
- }
- elseif(USART1->SR&USART_FLAG_TXE)
- {
- {//可以发送数据了,如果没有数据需要发送,就在这里关闭发送中断
- USART1->DR=something;//Yes,Sendcharacter
- }
- }
- }
下面给一个利用环形缓冲区的串口驱动程序。
- #ifndef_COM_BUFFERED_H_
- #define_COM_BUFFERED_H_
- #defineCOM10
- #defineCOM21
- #defineCOM_RX_BUF_SIZE64/*NumberofcharactersinRxringbuffer*/
- #defineCOM_TX_BUF_SIZE64/*NumberofcharactersinTxringbuffer*/
- #defineCOM_NO_ERR0/*Functioncallwassuccessful*/
- #defineCOM_BAD_CH1/*Invalidcommunicationsportchannel*/
- #defineCOM_RX_EMPTY2/*Rxbufferisempty,nocharacteravailable*/
- #defineCOM_TX_FULL3/*Txbufferisfull,couldnotdepositcharacter*/
- #defineCOM_TX_EMPTY4/*IftheTxbufferisempty.*/
- /************************************************************
- *function:COMGetCharB
- *parameter:charport,portcanbeCOM1/COM2
- *parameter:char*errisapointertowhereanerrorcodewillbeplaced:
- **errissettoCOM_NO_ERRifacharacterisavailable
- **errissettoCOM_RX_EMPTYiftheRxbufferisempty
- **errissettoCOM_BAD_CHifyouhavespecifiedaninvalidchannel
- *return:char
- *usage:Thisfunctioniscalledbyyourapplicationtoobtainacharacterfromthecommunications
- *channel.
- *changelog:
- *************************************************************/
- unsignedcharCOMGetCharB(unsignedcharch,unsignedchar*err);
- /************************************************************
- *function:COMPutCharB
- *parameter:charport,portcanbeCOM1/COM2
- *return:COMM_NO_ERRifthefunctionwassuccessful(thebufferwasnotfull)
- *COMM_TX_FULLifthebufferwasfull
- *COMM_BAD_CHifyouhavespecifiedanincorrectchannel
- *usage:Thisfunctioniscalledbyyourapplicationtosendacharacteronthecommunications
- *channel.ThecharactertosendisfirstinsertedintotheTxbufferandwillbesentby
- *theTxISR.Ifthisisthefirstcharacterplacedintothebuffer,theTxISRwillbe
- *enabled.IftheTxbufferisfull,thecharacterwillnotbesent(i.e.itwillbelost)
- *changelog:
- *************************************************************/
- unsignedcharCOMPutCharB(unsignedcharport,unsignedcharc);
- /************************************************************
- *function:COMBufferInit
- *parameter:
- *return:
- *usage:Thisfunctioniscalledbyyourapplicationtoinitializethecommunicationsmodule.You
- *mustcallthisfunctionbeforecallinganyotherfunctions.
- *changelog:
- ************************************************************
STM32F10xUSAR串口通 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)