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

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

时间:11-20 来源:互联网 点击:

  1. charfull;
  2. COM_RING_BUF*pbuf;
  3. switch(port)
  4. {/*Obtainpointertocommunicationschannel*/
  5. caseCOM1:
  6. pbuf=&COM1Buf;
  7. break;
  8. caseCOM2:
  9. pbuf=&COM2Buf;
  10. break;
  11. default:
  12. return(1);
  13. }
  14. OS_ENTER_CRITICAL();
  15. if(pbuf->RingBufTxCtr
  16. full=0;/*BufferisNOTfull*/
  17. }else{
  18. full=1;/*Bufferisfull*/
  19. }
  20. OS_EXIT_CRITICAL();
  21. return(full);
  22. }
  23. //ThisfunctioniscalledbytheRxISRtoinsertacharacterintothereceiveringbuffer.
  24. staticvoidCOMPutRxChar(unsignedcharport,unsignedcharc)
  25. {
  26. COM_RING_BUF*pbuf;
  27. switch(port)
  28. {/*Obtainpointertocommunicationschannel*/
  29. caseCOM1:
  30. pbuf=&COM1Buf;
  31. break;
  32. caseCOM2:
  33. pbuf=&COM2Buf;
  34. break;
  35. default:
  36. return;
  37. }
  38. if(pbuf->RingBufRxCtr
  39. pbuf->RingBufRxCtr++;/*No,incrementcharactercount*/
  40. *pbuf->RingBufRxInPtr++=c;/*Putcharacterintobuffer*/
  41. if(pbuf->RingBufRxInPtr==&pbuf->RingBufRx[COM_RX_BUF_SIZE]){/*WrapINpointer*/
  42. pbuf->RingBufRxInPtr=&pbuf->RingBufRx[0];
  43. }
  44. }
  45. }
  46. //ThisfunctioniscalledbytheTxISRtoextractthenextcharacterfromtheTxbuffer.
  47. //ThefunctionreturnsFALSEifthebufferisemptyafterthecharacterisextractedfrom
  48. //thebuffer.ThisisdonetosignaltheTxISRtodisableinterruptsbecausethisisthe
  49. //lastcharactertosend.
  50. staticunsignedcharCOMGetTxChar(unsignedcharport,unsignedchar*err)
  51. {
  52. unsignedcharc;
  53. COM_RING_BUF*pbuf;
  54. switch(port)
  55. {/*Obtainpointertocommunicationschannel*/
  56. caseCOM1:
  57. pbuf=&COM1Buf;
  58. break;
  59. caseCOM2:
  60. pbuf=&COM2Buf;
  61. break;
  62. default:
  63. *err=COM_BAD_CH;
  64. return(0);
  65. }
  66. if(pbuf->RingBufTxCtr>0){/*Seeifbufferisempty*/
  67. pbuf->RingBufTxCtr--;/*No,decrementcharactercount*/
  68. c=*pbuf->RingBufTxOutPtr++;/*Getcharacterfrombuffer*/
  69. if(pbuf->RingBufTxOutPtr==&pbuf->RingBufTx[COM_TX_BUF_SIZE])
  70. {
  71. pbuf->RingBufTxOutPtr=&pbuf->RingBufTx[0];/*WrapOUTpointer*/
  72. }
  73. *err=COM_NO_ERR;
  74. return(c);/*Charactersarestillavailable*/
  75. }else{
  76. *err=COM_TX_EMPTY;
  77. return(0);/*Bufferisempty*/
  78. }
  79. }
  80. voidUSART1_IRQHandler(void)
  81. {
  82. unsignedintdata;
  83. unsignedcharerr;
  84. if(USART1->SR&0x0F)
  85. {
  86. //Seeifwehavesomekindoferror
  87. //Clearinterrupt(donothingaboutit!)
  88. data=USART1->DR;
  89. }
  90. elseif(USART1->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
  91. {
  92. data=USART1->DR;
  93. COMPutRxChar(COM1,data);//Insertreceivedcharacterintobuffer
  94. }
  95. elseif(USART1->SR&USART_FLAG_TXE)
  96. {
  97. data=COMGetTxChar(COM1,&err);//Getnextcharactertosend.
  98. if(err==COM_TX_EMPTY)
  99. {//Dowehaveanymorecharacterstosend?
  100. //No,DisableTxinterrupts
  101. //USART_ITConfig(USART1,USART_IT_TXE|USART_IT_TC,ENABLE);
  102. USART1->CR1&=~USART_FLAG_TXE|USART_FLAG_TC;
  103. }
  104. else
  105. {
  106. USART1->DR=data;//Yes,Sendcharacter
  107. }
  108. }
  109. }
  110. voidUSART2_IRQHandler(void)
  111. {
  112. unsignedintdata;
  113. unsignedcharerr;
  114. if(USART2->SR&0x0F)
  115. {
  116. //Seeifwehavesomekindoferror
  117. //Clearinterrupt(donothingaboutit!)
  118. data=USART2->DR;
  119. }
  120. elseif(USART2->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
  121. {
  122. data=USART2->DR;
  123. COMPutRxChar(COM2,data);//Insertreceivedcharacterintobuffer
  124. }
  125. elseif(USART2->SR&USART_FLAG_TXE)
  126. {
  127. data=COMGetTxChar(COM2,&err);//Getnextcharactertosend.
  128. if(err==COM_TX_EMPTY)
  129. {//Dowehaveanymorecharacterstosend?
  130. //No,DisableTxinterrupts
  131. //USART_ITConfig(USART2,USART_IT_TXE|USART_IT_TC,ENABLE);
  132. USART2->CR1&=~USART_FLAG_TXE|USART_FLAG_TC;
  133. }
  134. else
  135. {
  136. USART2->DR=data;//Yes,Sendcharacter
  137. }
  138. }
  139. }


下面给个例子主程序,来演示如何使用上面的串口驱动代码。

  1. #include"misc.h"
  2. #include"stm32f10x.h"
  3. #include"com_buffered.h"
  4. voidUART_PutStrB(unsignedcharport,uint8_t*str)
  5. {
  6. while(0!=*str)
  7. {
  8. COMPutCharB(port,*str);
  9. str++;
  10. }
  11. }
  12. voidUSART1_Init(void)
  13. {
  14. GPIO_InitTypeDefGPIO_InitStructure;
  15. USART_InitTypeDefUSART_InitStructure;
  16. NVIC_InitTypeDefNVIC_InitStructure;
  17. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
  18. /*ConfigureUSARTTxasalternatefunctionpush-pull*/
  19. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  20. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
  21. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  22. GPIO_Init(GPIOA,&GPIO_InitStructure);
  23. /*ConfigureUSARTRxasinputfloating*/
  24. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOA

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

网站地图

Top