新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32F10x 學(xué)習(xí)筆記7(USART實(shí)現(xiàn)串口通訊 3)

        STM32F10x 學(xué)習(xí)筆記7(USART實(shí)現(xiàn)串口通訊 3)

        作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
        在上一篇學(xué)習(xí)筆記《STM32F10x 學(xué)習(xí)筆記6(USART實(shí)現(xiàn)串口通訊 2)》給出了個(gè)利用環(huán)形緩沖區(qū)的串口驅(qū)動(dòng)。最近研究了uCOS-II在STM32上的移植。下面再給個(gè)利用uCOS-II的信號(hào)量的串口驅(qū)動(dòng)。整個(gè)驅(qū)動(dòng)的基本框架和上一篇沒什么區(qū)別,所以不多介紹。直接貼代碼:

        整個(gè)驅(qū)動(dòng)包含四個(gè)文件:

        本文引用地址:http://www.104case.com/article/201611/318843.htm

        uart.h

        uart.c

        COMMRTOS.H

        COMMRTOS.c

        其中前兩個(gè)文件是對串口基本功能的封裝

        uart.h 的代碼如下:

        1. #ifndef_UART_H_
        2. #define_UART_H_
        3. voidUSART1_Init(void);
        4. voidUSART2_Init(void);
        5. voidUART_PutChar(USART_TypeDef*USARTx,uint8_tData);
        6. voidUART_PutStr(USART_TypeDef*USARTx,uint8_t*str);
        7. uint8_tUART_GetChar(USART_TypeDef*USARTx);
        8. #endif

        uart.c 的代碼

        1. #include"stm32f10x.h"
        2. voidUSART1_Init(void)
        3. {
        4. GPIO_InitTypeDefGPIO_InitStructure;
        5. USART_InitTypeDefUSART_InitStructure;
        6. NVIC_InitTypeDefNVIC_InitStructure;
        7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
        8. /*ConfigureUSARTTxasalternatefunctionpush-pull*/
        9. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        10. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
        11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        12. GPIO_Init(GPIOA,&GPIO_InitStructure);
        13. /*ConfigureUSARTRxasinputfloating*/
        14. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        15. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
        16. GPIO_Init(GPIOA,&GPIO_InitStructure);
        17. USART_InitStructure.USART_BaudRate=9600;
        18. USART_InitStructure.USART_WordLength=USART_WordLength_8b;
        19. USART_InitStructure.USART_StopBits=USART_StopBits_1;
        20. USART_InitStructure.USART_Parity=USART_Parity_No;
        21. USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        22. USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        23. USART_Init(USART1,&USART_InitStructure);
        24. USART_Cmd(USART1,ENABLE);
        25. NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
        26. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
        27. NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
        28. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        29. NVIC_Init(&NVIC_InitStructure);
        30. }
        31. voidUSART2_Init(void)
        32. {
        33. GPIO_InitTypeDefGPIO_InitStructure;
        34. USART_InitTypeDefUSART_InitStructure;
        35. NVIC_InitTypeDefNVIC_InitStructure;
        36. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);
        37. /*ConfigureUSARTTxasalternatefunctionpush-pull*/
        38. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
        39. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        40. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        41. GPIO_Init(GPIOD,&GPIO_InitStructure);
        42. /*ConfigureUSARTRxasinputfloating*/
        43. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        44. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
        45. GPIO_Init(GPIOD,&GPIO_InitStructure);
        46. GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);
        47. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
        48. USART_InitStructure.USART_BaudRate=9600;
        49. USART_InitStructure.USART_WordLength=USART_WordLength_8b;
        50. USART_InitStructure.USART_StopBits=USART_StopBits_1;
        51. USART_InitStructure.USART_Parity=USART_Parity_No;
        52. USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        53. USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        54. USART_Init(USART2,&USART_InitStructure);
        55. USART_Cmd(USART2,ENABLE);
        56. NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
        57. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
        58. NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
        59. NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
        60. NVIC_Init(&NVIC_InitStructure);
        61. }
        62. voidUART_PutChar(USART_TypeDef*USARTx,uint8_tData)
        63. {
        64. //while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET){};
        65. while((USARTx->SR&USART_FLAG_TXE)==0x00){};
        66. //USART_SendData(USARTx,Data);
        67. USARTx->DR=Data;
        68. }
        69. voidUART_PutStr(USART_TypeDef*USARTx,uint8_t*str)
        70. {
        71. while(0!=*str)
        72. {
        73. UART_PutChar(USARTx,*str);
        74. str++;
        75. }
        76. }
        77. uint8_tUART_GetChar(USART_TypeDef*USARTx)
        78. {
        79. //while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==RESET){};
        80. while((USARTx->SR&USART_FLAG_RXNE)==0x00){};
        81. //returnUSART_ReceiveData(USARTx);
        82. return(USARTx->DR&0xff);
        83. }

        commrtos.h 的代碼如下:

        1. #ifndef_COMMRTOS_H_
        2. #define_COMMRTOS_H_
        3. #ifndefCFG_H
        4. #defineCOMM_RX_BUF_SIZE64/*NumberofcharactersinRxringbuffer*/
        5. #defineCOMM_TX_BUF_SIZE64/*NumberofcharactersinTxringbuffer*/
        6. #endif
        7. /*
        8. *********************************************************************************************************
        9. *CONSTANTS
        10. *********************************************************************************************************
        11. */
        12. #ifndefFALSE
        13. #defineFALSE0x00
        14. #endif
        15. #ifndefTRUE
        16. #defineTRUE0xff
        17. #endif
        18. #ifndefNUL
        19. #defineNUL0x00
        20. #endif
        21. #defineCOM10
        22. #defineCOM21
        23. /*ERRORCODES*/
        24. #defineCOMM_NO_ERR0/*Functioncallwassuccessful*/
        25. #defineCOMM_BAD_CH1/*Invalidcommunicationsportchannel*/
        26. #defineCOMM_RX_EMPTY2/*Rxbufferisempty,nocharacteravailable*/
        27. #defineCOMM_TX_FULL3/*Txbufferisfull,couldnotdepositcharacter*/
        28. #defineCOMM_TX_EMPTY4/*IftheTxbufferisempty.*/
        29. #defineCOMM_RX_TIMEOUT5/*Ifatimeoutoccurredwhilewaitingforacharacter*/
        30. #defineCOMM_TX_TIMEOUT6/*Ifatimeoutoccurredwhilewaitingtosendachar.*/
        31. #defineCOMM_PARITY_NONE0/*Definesforsettingparity*/
        32. #defineCOMM_PARITY_ODD1
        33. #defineCOMM_PARITY_EVEN2
        34. unsignedcharCommGetChar(unsignedcharch,unsignedshortto,unsignedchar*err);
        35. voidCOMInit(void);
        36. unsignedcharCommIsEmpty(unsignedcharch);
        37. unsignedcharCommIsFull(unsignedcharch);
        38. unsignedcharCommPutChar(unsignedcharch,unsignedcharc,unsignedshortto);
        39. voidCommPutStr(unsignedcharch,uint8_t*str);
        40. #endif

        commrtos.c 的代碼如下:

        1. #include"stm32f10x_usart.h"
        2. #include"includes.h"
        3. #include"COMMRTOS.H"
        4. /*
        5. *DATATYPES
        6. */
        7. typedefstruct{
        8. unsignedshortRingBufRxCtr;/*NumberofcharactersintheRxringbuffer*/
        9. OS_EVENT*RingBufRxSem;/*PointertoRxsemaphore*/
        10. unsignedchar*RingBufRxInPtr;/*Pointertowherenextcharacterwillbeinserted*/
        11. unsignedchar*RingBufRxOutPtr;/*Pointerfromwherenextcharacterwillbeextracted*/
        12. unsignedcharRingBufRx[COMM_RX_BUF_SIZE];/*Ringbuffercharacterstorage(Rx)*/
        13. unsignedshortRingBufTxCtr;/*NumberofcharactersintheTxringbuffer*/
        14. OS_EVENT*RingBufTxSem;/*PointertoTxsemaphore*/
        15. unsignedchar*RingBufTxInPtr;/*Pointertowherenextcharacterwillbeinserted*/
        16. unsignedchar*RingBufTxOutPtr;/*Pointerfromwherenextcharacterwillbeextracted*/
        17. unsignedcharRingBufTx[COMM_TX_BUF_SIZE];/*Ringbuffercharacterstorage(Tx)*/
        18. }COMM_RING_BUF;
        19. /*
        20. *GLOBALVARIABLES
        21. */
        22. COMM_RING_BUFComm1Buf;
        23. COMM_RING_BUFComm2Buf;
        24. staticvoidCOMEnableTxInt(unsignedcharport)
        25. {
        26. staticUSART_TypeDef*map[2]={USART1,USART2};
        27. //USART_ITConfig(map[port],USART_IT_TXE,ENABLE);
        28. map[port]->CR1|=USART_FLAG_TXE;
        29. }
        30. /*
        31. *********************************************************************************************************
        32. *REMOVECHARACTERFROMRINGBUFFER
        33. *
        34. *
        35. *Description:Thisfunctioniscalledbyyourapplicationtoobtainacharacterfromthecommunications
        36. *channel.Thefunctionwillwaitforacharactertobereceivedontheserialchannelor
        37. *untilthefunctiontimesout.
        38. *Arguments:chistheCOMMportchannelnumberandcaneitherbe:
        39. *COMM1
        40. *COMM2
        41. *toistheamountoftime(inclockticks)thatthecallingfunctioniswillingto
        42. *waitforacharactertoarrive.Ifyouspecifyatimeoutof0,thefunctionwill
        43. *waitforeverforacharactertoarrive.
        44. *errisapointertowhereanerrorcodewillbeplaced:
        45. **errissettoCOMM_NO_ERRifacharacterhasbeenreceived
        46. **errissettoCOMM_RX_TIMEOUTifatimeoutoccurred
        47. **errissettoCOMM_BAD_CHifyouspecifyaninvalidchannelnumber
        48. *Returns:Thecharacterinthebuffer(orNULifatimeoutoccurred)
        49. *********************************************************************************************************
        50. */
        51. unsignedcharCommGetChar(unsignedcharch,unsignedshortto,unsignedchar*err)
        52. {
        53. unsignedcharc;
        54. unsignedcharoserr;
        55. COMM_RING_BUF*pbuf;
        56. OS_CPU_SRcpu_sr;
        57. switch(ch)
        58. {/*Obtainpointertocommunicationschannel*/
        59. caseCOM1:
        60. pbuf=&Comm1Buf;
        61. break;
        62. caseCOM2:
        63. pbuf=&Comm2Buf;
        64. break;
        65. default:
        66. *err=COMM_BAD_CH;
        67. return(NUL);
        68. }
        69. OSSemPend(pbuf->RingBufRxSem,to,&oserr);/*Waitforcharactertoarrive*/
        70. if(oserr==OS_TIMEOUT)
        71. {/*Seeifcharactersreceivedwithintimeout*/
        72. *err=COMM_RX_TIMEOUT;/*No,returnerrorcode*/
        73. return(NUL);
        74. }
        75. else
        76. {
        77. OS_ENTER_CRITICAL();
        78. pbuf->RingBufRxCtr--;/*Yes,decrementcharactercount*/
        79. c=*pbuf->RingBufRxOutPtr++;/*Getcharacterfrombuffer*/
        80. if(pbuf->RingBufRxOutPtr==&pbuf->RingBufRx[COMM_RX_BUF_SIZE])
        81. {/*WrapOUTpointer*/
        82. pbuf->RingBufRxOutPtr=&pbuf->RingBufRx[0];
        83. }
        84. OS_EXIT_CRITICAL();
        85. *err=COMM_NO_ERR;
        86. return(c);
        87. }
        88. }
        89. voidCommPutStr(unsignedcharch,uint8_t*str)
        90. {
        91. while(0!=*str)
        92. {
        93. CommPutChar(ch,*str,0);
        94. str++;
        95. }
        96. }
        97. staticunsignedcharCOMGetTxChar(unsignedcharch,unsignedchar*err)
        98. {
        99. unsignedcharc;
        100. COMM_RING_BUF*pbuf;
        101. switch(ch)
        102. {/*Obtainpointertocommunicationschannel*/
        103. caseCOM1:
        104. pbuf=&Comm1Buf;
        105. break;
        106. caseCOM2:
        107. pbuf=&Comm2Buf;
        108. break;
        109. default:
        110. *err=COMM_BAD_CH;
        111. return(NUL);
        112. }
        113. if(pbuf->RingBufTxCtr>0)
        114. {/*Seeifbufferisempty*/
        115. pbuf->RingBufTxCtr--;/*No,decrementcharactercount*/
        116. c=*pbuf->RingBufTxOutPtr++;/*Getcharacterfrombuffer*/
        117. if(pbuf->RingBufTxOutPtr==&pbuf->RingBufTx[COMM_TX_BUF_SIZE])
        118. {/*WrapOUTpointer*/
        119. pbuf->RingBufTxOutPtr=&pbuf->RingBufTx[0];
        120. }
        121. OSSemPost(pbuf->RingBufTxSem);/*Indicatethatcharacterwillbesent*/
        122. *err=COMM_NO_ERR;
        123. return(c);/*Charactersarestillavailable*/
        124. }
        125. else
        126. {
        127. *err=COMM_TX_EMPTY;
        128. return(NUL);/*Bufferisempty*/
        129. }
        130. }
        131. /*
        132. *********************************************************************************************************
        133. *INITIALIZECOMMUNICATIONSMODULE
        134. *Description:Thisfunctioniscalledbyyourapplicationtoinitializethecommunicationsmodule.You
        135. *mustcallthisfunctionbeforecallinganyotherfunctions.
        136. *Arguments:none
        137. *********************************************************************************************************
        138. */
        139. voidCOMInit(void)
        140. {
        141. COMM_RING_BUF*pbuf;
        142. pbuf=&Comm1Buf;/*InitializetheringbufferforCOMM1*/
        143. pbuf->RingBufRxCtr=0;
        144. pbuf->RingBufRxInPtr=&pbuf->RingBufRx[0];
        145. pbuf->RingBufRxOutPtr=&pbuf->RingBufRx[0];
        146. pbuf->RingBufRxSem=OSSemCreate(0);
        147. pbuf->RingBufTxCtr=0;
        148. pbuf->RingBufTxInPtr=&pbuf->RingBufTx[0];
        149. pbuf->RingBufTxOutPtr=&pbuf->RingBufTx[0];
        150. pbuf->RingBufTxSem=OSSemCreate(COMM_TX_BUF_SIZE);
        151. pbuf=&Comm2Buf;/*InitializetheringbufferforCOMM2*/
        152. pbuf->RingBufRxCtr=0;
        153. pbuf->RingBufRxInPtr=&pbuf->RingBufRx[0];
        154. pbuf->RingBufRxOutPtr=&pbuf->RingBufRx[0];
        155. pbuf->RingBufRxSem=OSSemCreate(0);
        156. pbuf->RingBufTxCtr=0;
        157. pbuf->RingBufTxInPtr=&pbuf->RingBufTx[0];
        158. pbuf->RingBufTxOutPtr=&pbuf->RingBufTx[0];
        159. pbuf->RingBufTxSem=OSSemCreate(COMM_TX_BUF_SIZE);
        160. }
        161. /*
        162. *********************************************************************************************************
        163. *SEEIFRXCHARACTERBUFFERISEMPTY
        164. *
        165. *
        166. *Description:Thisfunctioniscalledbyyourapplicationtoseeifanycharacterisavailablefromthe
        167. *communicationschannel.Ifatleastonecharacterisavailable,thefunctionreturns
        168. *FALSEotherwise,thefunctionreturnsTRUE.
        169. *Arguments:chistheCOMMportchannelnumberandcaneitherbe:
        170. *COMM1
        171. *COMM2
        172. *Returns:TRUEifthebufferISempty.
        173. *FALSEifthebufferISNOTemptyoryouhavespecifiedanincorrectchannel.
        174. *********************************************************************************************************
        175. */
        176. unsignedcharCommIsEmpty(unsignedcharch)
        177. {
        178. unsignedcharempty;
        179. COMM_RING_BUF*pbuf;
        180. OS_CPU_SRcpu_sr;
        181. switch(ch)
        182. {/*Obtainpointertocommunicationschannel*/
        183. caseCOM1:
        184. pbuf=&Comm1Buf;
        185. break;
        186. caseCOM2:
        187. pbuf=&Comm2Buf;
        188. break;
        189. default:
        190. return(TRUE);
        191. }
        192. OS_ENTER_CRITICAL();
        193. if(pbuf->RingBufRxCtr>0)
        194. {/*Seeifbufferisempty*/
        195. empty=FALSE;/*BufferisNOTempty*/
        196. }
        197. else
        198. {
        199. empty=TRUE;/*Bufferisempty*/
        200. }
        201. OS_EXIT_CRITICAL();
        202. return(empty);
        203. }
        204. /*
        205. *********************************************************************************************************
        206. *SEEIFTXCHARACTERBUFFERISFULL
        207. *Description:Thisfunctioniscalledbyyourapplicationtoseeifanymorecharacterscanbeplaced
        208. *intheTxbuffer.Inotherwords,thisfunctionchecktoseeiftheTxbufferisfull.
        209. *Ifthebufferisfull,thefunctionreturnsTRUEotherwise,thefunctionreturnsFALSE.
        210. *Arguments:chistheCOMMportchannelnumberandcaneitherbe:
        211. *COMM1
        212. *COMM2
        213. *Returns:TRUEifthebufferISfull.
        214. *FALSEifthebufferISNOTfulloryouhavespecifiedanincorrectchannel.
        215. *********************************************************************************************************
        216. */
        217. unsignedcharCommIsFull(unsignedcharch)
        218. {
        219. unsignedcharfull;
        220. COMM_RING_BUF*pbuf;
        221. OS_CPU_SRcpu_sr;
        222. switch(ch)
        223. {/*Obtainpointertocommunicationschannel*/
        224. caseCOM1:
        225. pbuf=&Comm1Buf;
        226. break;
        227. caseCOM2:
        228. pbuf=&Comm2Buf;
        229. break;
        230. default:
        231. return(TRUE);
        232. }
        233. OS_ENTER_CRITICAL();
        234. if(pbuf->RingBufTxCtr
        235. {/*Seeifbufferisfull*/
        236. full=FALSE;/*BufferisNOTfull*/
        237. }
        238. else
        239. {
        240. full=TRUE;/*Bufferisfull*/
        241. }
        242. OS_EXIT_CRITICAL();
        243. return(full);
        244. }
        245. /*
        246. *********************************************************************************************************
        247. *OUTPUTCHARACTER
        248. *
        249. *
        250. *Description:Thisfunctioniscalledbyyourapplicationtosendacharacteronthecommunications
        251. *channel.Thefunctionwillwaitforthebuffertoemptyoutifthebufferisfull.
        252. *Thefunctionreturnstoyourapplicationifthebufferdoesntemptywithinthespecified
        253. *timeout.Atimeoutvalueof0meansthatthecallingfunctionwillwaitforeverforthe
        254. *buffertoemptyout.ThecharactertosendisfirstinsertedintotheTxbufferandwill
        255. *besentbytheTxISR.Ifthisisthefirstcharacterplacedintothebuffer,theTxISR
        256. *willbeenabled.
        257. *Arguments:chistheCOMMportchannelnumberandcaneitherbe:
        258. *COMM1
        259. *COMM2
        260. *cisthecharactertosend.
        261. *toisthetimeout(inclockticks)towaitincasethebufferisfull.Ifyou
        262. *specifyatimeoutof0,thefunctionwillwaitforeverforthebuffertoempty.
        263. *Returns:COMM_NO_ERRifthecharacterwasplacedintheTxbuffer
        264. *COMM_TX_TIMEOUTifthebufferdidntemptywithinthespecifiedtimeoutperiod
        265. *COMM_BAD_CHifyouspecifyaninvalidchannelnumber
        266. *********************************************************************************************************
        267. */
        268. unsignedcharCommPutChar(unsignedcharch,unsignedcharc,unsignedshortto)
        269. {
        270. unsignedcharoserr;
        271. COMM_RING_BUF*pbuf;
        272. OS_CPU_SRcpu_sr;
        273. switch(ch)
        274. {/*Obtainpointertocommunicationschannel*/
        275. caseCOM1:
        276. pbuf=&Comm1Buf;
        277. break;
        278. caseCOM2:
        279. pbuf=&Comm2Buf;
        280. break;
        281. default:
        282. return(COMM_BAD_CH);
        283. }
        284. OSSemPend(pbuf->RingBufTxSem,to,&oserr);/*WaitforspaceinTxbuffer*/
        285. if(oserr==OS_TIMEOUT)
        286. {
        287. return(COMM_TX_TIMEOUT);/*Timedout,returnerrorcode*/
        288. }
        289. OS_ENTER_CRITICAL();
        290. pbuf->RingBufTxCtr++;/*No,incrementcharactercount*/
        291. *pbuf->RingBufTxInPtr++=c;/*Putcharacterintobuffer*/
        292. if(pbuf->RingBufTxInPtr==&pbuf->RingBufTx[COMM_TX_BUF_SIZE])
        293. {/*WrapINpointer*/
        294. pbuf->RingBufTxInPtr=&pbuf->RingBufTx[0];
        295. }
        296. if(pbuf->RingBufTxCtr==1)
        297. {/*Seeifthisisthefirstcharacter*/
        298. COMEnableTxInt(ch);/*Yes,EnableTxinterrupts*/
        299. }
        300. OS_EXIT_CRITICAL();
        301. return(COMM_NO_ERR);
        302. }
        303. /*
        304. *********************************************************************************************************
        305. *INSERTCHARACTERINTORINGBUFFER
        306. *
        307. *
        308. *Description:ThisfunctioniscalledbytheRxISRtoinsertacharacterintothereceiveringbuffer.
        309. *Arguments:chistheCOMMportchannelnumberandcaneitherbe:
        310. *COMM1
        311. *COMM2
        312. *cisthecharactertoinsertintotheringbuffer.Ifthebufferisfull,the
        313. *characterwillnotbeinserted,itwillbelost.
        314. *********************************************************************************************************
        315. */
        316. staticvoidCOMPutRxChar(unsignedcharch,unsignedcharc)
        317. {
        318. COMM_RING_BUF*pbuf;
        319. switch(ch)
        320. {/*Obtainpointertocommunicationschannel*/
        321. caseCOM1:
        322. pbuf=&Comm1Buf;
        323. break;
        324. caseCOM2:
        325. pbuf=&Comm2Buf;
        326. break;
        327. default:
        328. return;
        329. }
        330. if(pbuf->RingBufRxCtr
        331. {/*Seeifbufferisfull*/
        332. pbuf->RingBufRxCtr++;/*No,incrementcharactercount*/
        333. *pbuf->RingBufRxInPtr++=c;/*Putcharacterintobuffer*/
        334. if(pbuf->RingBufRxInPtr==&pbuf->RingBufRx[COMM_RX_BUF_SIZE])
        335. {/*WrapINpointer*/
        336. pbuf->RingBufRxInPtr=&pbuf->RingBufRx[0];
        337. }
        338. OSSemPost(pbuf->RingBufRxSem);/*Indicatethatcharacterwasreceived*/
        339. }
        340. }
        341. //ThisfunctioniscalledbytheRxISRtoinsertacharacterintothereceiveringbuffer.
        342. voidUSART1_IRQHandler(void)
        343. {
        344. unsignedintdata;
        345. unsignedcharerr;
        346. OS_CPU_SRcpu_sr;
        347. OS_ENTER_CRITICAL();/*TelluC/OS-IIthatwearestartinganISR*/
        348. OSIntNesting++;
        349. OS_EXIT_CRITICAL();
        350. if(USART1->SR&0x0F)
        351. {
        352. //Seeifwehavesomekindoferror
        353. //Clearinterrupt(donothingaboutit!)
        354. data=USART1->DR;
        355. }
        356. elseif(USART1->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
        357. {
        358. data=USART1->DR;
        359. COMPutRxChar(COM1,data);//Insertreceivedcharacterintobuffer
        360. }
        361. elseif(USART1->SR&USART_FLAG_TXE)
        362. {
        363. data=COMGetTxChar(COM1,&err);//Getnextcharactertosend.
        364. if(err==COMM_TX_EMPTY)
        365. {//Dowehaveanymorecharacterstosend?
        366. //No,DisableTxinterrupts
        367. //USART_ITConfig(USART1,USART_IT_TXE|USART_IT_TC,DISABLE);
        368. USART1->CR1&=~USART_FLAG_TXE|USART_FLAG_TC;
        369. }
        370. else
        371. {
        372. USART1->DR=data;//Yes,Sendcharacter
        373. }
        374. }
        375. OSIntExit();
        376. }
        377. voidUSART2_IRQHandler(void)
        378. {
        379. unsignedintdata;
        380. unsignedcharerr;
        381. OS_CPU_SRcpu_sr;
        382. OS_ENTER_CRITICAL();/*TelluC/OS-IIthatwearestartinganISR*/
        383. OSIntNesting++;
        384. OS_EXIT_CRITICAL();
        385. if(USART2->SR&0x0F)
        386. {
        387. //Seeifwehavesomekindoferror
        388. //Clearinterrupt(donothingaboutit!)
        389. data=USART2->DR;
        390. }
        391. elseif(USART2->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
        392. {
        393. data=USART2->DR;
        394. COMPutRxChar(COM2,data);//Insertreceivedcharacterintobuffer
        395. }
        396. elseif(USART2->SR&USART_FLAG_TXE)
        397. {
        398. data=COMGetTxChar(COM2,&err);//Getnextcharactertosend.
        399. if(err==COMM_TX_EMPTY)
        400. {//Dowehaveanymorecharacterstosend?
        401. //No,DisableTxinterrupts
        402. //USART_ITConfig(USART2,USART_IT_TXE|USART_IT_TC,DISABLE);
        403. USART2->CR1&=~USART_FLAG_TXE|USART_FLAG_TC;
        404. }
        405. else
        406. {
        407. USART2->DR=data;//Yes,Sendcharacter
        408. }
        409. }
        410. OSIntExit();
        411. }

        下面再給出個(gè)測試代碼:

        1. #include"stm32f10x.h"
        2. #include"uart.h"
        3. #include"led.h"
        4. #include"COMMRTOS.H"
        5. #include"ucos_ii.h"
        6. #defineTASK_STK_SIZE128
        7. OS_STKTaskStartStk[TASK_STK_SIZE];
        8. OS_STKTaskUartReadStk[TASK_STK_SIZE];
        9. voidTaskUartRead(void*pdata)
        10. {
        11. unsignedcharerr;
        12. unsignedcharc;
        13. for(;;)
        14. {
        15. c=CommGetChar(COM2,0,&err);
        16. if(err==COMM_NO_ERR)
        17. CommPutChar(COM2,c,0);
        18. }
        19. }
        20. voidTaskStart(void*pdata)
        21. {
        22. SysTick_Config(SystemCoreClock/10);
        23. USART1_Init();
        24. USART2_Init();
        25. COMInit();
        26. //USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        27. //USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
        28. USART1->CR1|=USART_FLAG_RXNE;
        29. USART2->CR1|=USART_FLAG_RXNE;
        30. OSTaskCreate(TaskUartRead,(void*)0,&(TaskUartReadStk[TASK_STK_SIZE-1]),2);
        31. UART_PutStr(USART2,"USART2HelloWorld!nr");
        32. //CommPutChar(COM2,+,0);
        33. CommPutStr(COM2,"CommPutCharBnr");
        34. for(;;)
        35. {
        36. LED_Spark();
        37. CommPutChar(COM2,+,0);
        38. OSTimeDly(10);
        39. }
        40. }
        41. intmain(void)
        42. {
        43. SystemInit();
        44. LED_Init();
        45. OSInit();
        46. OSTaskCreate(TaskStart,(void*)0,&(TaskStartStk[TASK_STK_SIZE-1]),1);
        47. OSStart();
        48. for(;;)
        49. {
        50. }
        51. }



        關(guān)鍵詞: STM32F10xUSART串口通

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 策勒县| 象州县| 德江县| 华坪县| 九江县| 塘沽区| 莒南县| 镇坪县| 中阳县| 霍山县| 扶沟县| 乐山市| 道孚县| 兴和县| 辽中县| 齐齐哈尔市| 南木林县| 舟曲县| 保山市| 得荣县| 万载县| 灵石县| 仲巴县| 永丰县| 榆社县| 甘肃省| 武鸣县| 鹿泉市| 新营市| 四会市| 唐海县| 宜城市| 景东| 长兴县| 正宁县| 阳曲县| 谷城县| 武山县| 苍山县| 邛崃市| 西畴县|