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

STM32F10x 学习笔记7(USART实现串口通讯 3)

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

  1. if(pbuf->RingBufRxInPtr==&pbuf->if(pbuf->RingBufRxInPtr==&pbuf->RingBufRx[COMM_RX_BUF_SIZE])
  2. {/*WrapINpointer*/
  3. pbuf->RingBufRxInPtr=&pbuf->RingBufRx[0];
  4. }
  5. OSSemPost(pbuf->RingBufRxSem);/*Indicatethatcharacterwasreceived*/
  6. }
  7. }
  8. //ThisfunctioniscalledbytheRxISRtoinsertacharacterintothereceiveringbuffer.
  9. voidUSART1_IRQHandler(void)
  10. {
  11. unsignedintdata;
  12. unsignedcharerr;
  13. OS_CPU_SRcpu_sr;
  14. OS_ENTER_CRITICAL();/*TelluC/OS-IIthatwearestartinganISR*/
  15. OSIntNesting++;
  16. OS_EXIT_CRITICAL();
  17. if(USART1->SR&0x0F)
  18. {
  19. //Seeifwehavesomekindoferror
  20. //Clearinterrupt(donothingaboutit!)
  21. data=USART1->DR;
  22. }
  23. elseif(USART1->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
  24. {
  25. data=USART1->DR;
  26. COMPutRxChar(COM1,data);//Insertreceivedcharacterintobuffer
  27. }
  28. elseif(USART1->SR&USART_FLAG_TXE)
  29. {
  30. data=COMGetTxChar(COM1,&err);//Getnextcharactertosend.
  31. if(err==COMM_TX_EMPTY)
  32. {//Dowehaveanymorecharacterstosend?
  33. //No,DisableTxinterrupts
  34. //USART_ITConfig(USART1,USART_IT_TXE|USART_IT_TC,DISABLE);
  35. USART1->CR1&=~USART_FLAG_TXE|USART_FLAG_TC;
  36. }
  37. else
  38. {
  39. USART1->DR=data;//Yes,Sendcharacter
  40. }
  41. }
  42. OSIntExit();
  43. }
  44. voidUSART2_IRQHandler(void)
  45. {
  46. unsignedintdata;
  47. unsignedcharerr;
  48. OS_CPU_SRcpu_sr;
  49. OS_ENTER_CRITICAL();/*TelluC/OS-IIthatwearestartinganISR*/
  50. OSIntNesting++;
  51. OS_EXIT_CRITICAL();
  52. if(USART2->SR&0x0F)
  53. {
  54. //Seeifwehavesomekindoferror
  55. //Clearinterrupt(donothingaboutit!)
  56. data=USART2->DR;
  57. }
  58. elseif(USART2->SR&USART_FLAG_RXNE)//ReceiveDataRegFullFlag
  59. {
  60. data=USART2->DR;
  61. COMPutRxChar(COM2,data);//Insertreceivedcharacterintobuffer
  62. }
  63. elseif(USART2->SR&USART_FLAG_TXE)
  64. {
  65. data=COMGetTxChar(COM2,&err);//Getnextcharactertosend.
  66. if(err==COMM_TX_EMPTY)
  67. {//Dowehaveanymorecharacterstosend?
  68. //No,DisableTxinterrupts
  69. //USART_ITConfig(USART2,USART_IT_TXE|USART_IT_TC,DISABLE);
  70. USART2->CR1&=~USART_FLAG_TXE|USART_FLAG_TC;
  71. }
  72. else
  73. {
  74. USART2->DR=data;//Yes,Sendcharacter
  75. }
  76. }
  77. OSIntExit();
  78. }

下面再给出个测试代码:

  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!\n\r");
  32. //CommPutChar(COM2,+,0);
  33. CommPutStr(COM2,"CommPutCharB\n\r");
  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. }


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

网站地图

Top