微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32F10x 学习笔记6(USART实现串口通讯 2)

STM32F10x 学习笔记6(USART实现串口通讯 2)

时间:11-20 来源:互联网 点击:
这次讲讲利用串口收发中断来进行串口通讯STM32 上为每个串口分配了一个中断。也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断。程序需在中断处理函数中读取状态寄存器(USART_SR)来判断当前的是什么中断。下面的中断映像图给出了这些中断源是如何汇合成最终的中断信号的。图中也给出了如何控制每一个单独的中断源是否起作用。

另外,Cortex-M3内核中还有个NVIC,可以控制这里的中断信号是否触发中断处理函数的执行,还有这些外部中断的级别。关于NVIC可以参考《ARMCortexM3权威指南》,里面讲解的非常详细。

简单的说,为了开启中断,我们需要如下的代码:

  1. NVIC_InitTypeDefNVIC_InitStructure;
  2. NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
  3. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  4. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  5. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  6. NVIC_Init(&NVIC_InitStructure);
  7. USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
  8. USART_ITConfig(USART1,USART_IT_TXE,ENABLE);//开启发送中断

这里多说一句,串口的发送中断有两个,分别是:

  1. l发送数据寄存器空中断(TXE)
  2. l发送完成中断(TC)

一般来说我们会使用发送数据寄存器空中断,用这个中断发送的效率会高一些。

中断处理函数的框架如下,如果检测到错误就清除错误,收到数了就处理。发完当前数据了就发下一个。

  1. voidUSART1_IRQHandler(void)
  2. {
  3. unsignedintdata;
  4. if(USART1->SR&0x0F)
  5. {
  6. //Seeifwehavesomekindoferror,Clearinterrupt
  7. data=USART1->DR;
  8. }
  9. elseif(USART1->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
  10. {
  11. data=USART1->DR;
  12. //对收到的数据进行处理,或者干些其他的事
  13. }
  14. elseif(USART1->SR&USART_FLAG_TXE)
  15. {
  16. {//可以发送数据了,如果没有数据需要发送,就在这里关闭发送中断
  17. USART1->DR=something;//Yes,Sendcharacter
  18. }
  19. }
  20. }


下面给一个利用环形缓冲区的串口驱动程序。

  1. #ifndef_COM_BUFFERED_H_
  2. #define_COM_BUFFERED_H_
  3. #defineCOM10
  4. #defineCOM21
  5. #defineCOM_RX_BUF_SIZE64/*NumberofcharactersinRxringbuffer*/
  6. #defineCOM_TX_BUF_SIZE64/*NumberofcharactersinTxringbuffer*/
  7. #defineCOM_NO_ERR0/*Functioncallwassuccessful*/
  8. #defineCOM_BAD_CH1/*Invalidcommunicationsportchannel*/
  9. #defineCOM_RX_EMPTY2/*Rxbufferisempty,nocharacteravailable*/
  10. #defineCOM_TX_FULL3/*Txbufferisfull,couldnotdepositcharacter*/
  11. #defineCOM_TX_EMPTY4/*IftheTxbufferisempty.*/
  12. /************************************************************
  13. *function:COMGetCharB
  14. *parameter:charport,portcanbeCOM1/COM2
  15. *parameter:char*errisapointertowhereanerrorcodewillbeplaced:
  16. **errissettoCOM_NO_ERRifacharacterisavailable
  17. **errissettoCOM_RX_EMPTYiftheRxbufferisempty
  18. **errissettoCOM_BAD_CHifyouhavespecifiedaninvalidchannel
  19. *return:char
  20. *usage:Thisfunctioniscalledbyyourapplicationtoobtainacharacterfromthecommunications
  21. *channel.
  22. *changelog:
  23. *************************************************************/
  24. unsignedcharCOMGetCharB(unsignedcharch,unsignedchar*err);
  25. /************************************************************
  26. *function:COMPutCharB
  27. *parameter:charport,portcanbeCOM1/COM2
  28. *return:COMM_NO_ERRifthefunctionwassuccessful(thebufferwasnotfull)
  29. *COMM_TX_FULLifthebufferwasfull
  30. *COMM_BAD_CHifyouhavespecifiedanincorrectchannel
  31. *usage:Thisfunctioniscalledbyyourapplicationtosendacharacteronthecommunications
  32. *channel.ThecharactertosendisfirstinsertedintotheTxbufferandwillbesentby
  33. *theTxISR.Ifthisisthefirstcharacterplacedintothebuffer,theTxISRwillbe
  34. *enabled.IftheTxbufferisfull,thecharacterwillnotbesent(i.e.itwillbelost)
  35. *changelog:
  36. *************************************************************/
  37. unsignedcharCOMPutCharB(unsignedcharport,unsignedcharc);
  38. /************************************************************
  39. *function:COMBufferInit
  40. *parameter:
  41. *return:
  42. *usage:Thisfunctioniscalledbyyourapplicationtoinitializethecommunicationsmodule.You
  43. *mustcallthisfunctionbeforecallinganyotherfunctions.
  44. *changelog:
  45. ************************************************************

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top