USART_TIM.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "main.h"
  2. #if 1
  3. #define USART_TIMx USART1
  4. #define USART_TIM_CLK RCC_APB2Periph_USART1
  5. #define USART_TIM_APBxClkCmd RCC_APB2PeriphClockCmd
  6. #define USART_TIM_BAUDRATE 9600
  7. #define USART_TIM_GPIO_CLK (RCC_APB2Periph_GPIOA)
  8. #define USART_TIM_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
  9. #define USART_TIM_TX_GPIO_PORT GPIOA
  10. #define USART_TIM_TX_GPIO_PIN GPIO_Pin_9
  11. #define USART_TIM_RX_GPIO_PORT GPIOA
  12. #define USART_TIM_RX_GPIO_PIN GPIO_Pin_10
  13. #define USART_TIM_IRQ USART1_IRQn
  14. #define USART_TIM_IRQHandler USART1_IRQHandler
  15. #else
  16. #define USART_TIMx USART2
  17. #define USART_TIM_CLK RCC_APB1Periph_USART2
  18. #define USART_TIM_APBxClkCmd RCC_APB1PeriphClockCmd
  19. #define USART_TIM_BAUDRATE 115200
  20. #define USART_TIM_GPIO_CLK (RCC_APB2Periph_GPIOA)
  21. #define USART_TIM_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
  22. #define USART_TIM_TX_GPIO_PORT GPIOA
  23. #define USART_TIM_TX_GPIO_PIN GPIO_Pin_2
  24. #define USART_TIM_RX_GPIO_PORT GPIOA
  25. #define USART_TIM_RX_GPIO_PIN GPIO_Pin_3
  26. #define USART_TIM_IRQ USART2_IRQn
  27. #define USART_TIM_IRQHandler USART2_IRQHandler
  28. #endif
  29. // 串口接收和发送缓存区
  30. char USART_TIM_RX_BUF[USART_TIM_MAX_RECV_LEN];
  31. char USART_TIM_TX_BUF[USART_TIM_MAX_SEND_LEN];
  32. // [14:0]: 接收字节数 [15]: 接收完成标志
  33. volatile uint16_t USART_TIM_RX_STA = 0;
  34. // WIFI串口中断处理
  35. void USART_TIM_IRQHandler(void)
  36. {
  37. uint8_t res;
  38. if(USART_GetITStatus(USART_TIMx, USART_IT_RXNE) != RESET)
  39. {
  40. res =USART_ReceiveData(USART_TIMx);
  41. if((USART_TIM_RX_STA&(1<<15))==0)
  42. {
  43. if(USART_TIM_RX_STA<USART_TIM_MAX_RECV_LEN)
  44. {
  45. TIM_SetCounter(TIM3,0);
  46. if(USART_TIM_RX_STA==0)
  47. {
  48. TIM_Cmd(TIM3,ENABLE);
  49. }
  50. USART_TIM_RX_BUF[USART_TIM_RX_STA++]=res;
  51. }else
  52. {
  53. USART_TIM_RX_STA|=1<<15;
  54. }
  55. }
  56. }
  57. }
  58. /* 在别处复现 接收到数据的处理函数
  59. void USART_Rec_Handle(void)
  60. {
  61. // 接收到一次数据了
  62. if(USART_TIM_RX_STA&0X8000)
  63. {
  64. // 添加结束符
  65. USART_TIM_RX_BUF[USART_TIM_RX_STA&0X7FFF]=0;
  66. #ifdef DEBUG_printf
  67. printf("%s\n",USART_TIM_RX_BUF);
  68. #endif
  69. // user handle
  70. // 清空缓存区
  71. memset(USART_TIM_RX_BUF, 0, USART_TIM_MAX_RECV_LEN);
  72. // 清除接收标志
  73. USART_TIM_RX_STA = 0;
  74. }
  75. }
  76. */
  77. // TIM3中断处理
  78. void TIM3_IRQHandler(void)
  79. {
  80. if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  81. {
  82. USART_TIM_RX_STA|=1<<15;
  83. TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  84. TIM_Cmd(TIM3, DISABLE);
  85. }
  86. }
  87. /**
  88. * @brief 10ms定时器初始化
  89. * @param None
  90. * @retval None
  91. * @note 用于检测串口接收状态
  92. */
  93. void USART_TIM_TIM_Init(void)
  94. {
  95. NVIC_InitTypeDef NVIC_InitStructure;
  96. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  97. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  98. TIM_DeInit(TIM3);
  99. TIM_TimeBaseStructure.TIM_Period = 1000-1;
  100. TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;
  101. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  102. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  103. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  104. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  105. TIM_Cmd(TIM3,DISABLE);
  106. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  107. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  108. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  109. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  110. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  111. NVIC_Init(&NVIC_InitStructure);
  112. }
  113. /**
  114. * @brief 串口初始化
  115. * @param None
  116. * @retval None
  117. * @note None
  118. */
  119. void USART_TIM_USART_Init(void)
  120. {
  121. NVIC_InitTypeDef NVIC_InitStructure;
  122. GPIO_InitTypeDef GPIO_InitStructure;
  123. USART_InitTypeDef USART_InitStructure;
  124. USART_TIM_GPIO_APBxClkCmd(USART_TIM_GPIO_CLK, ENABLE);
  125. USART_TIM_APBxClkCmd(USART_TIM_CLK,ENABLE);
  126. USART_DeInit(USART_TIMx);
  127. //USART_TX
  128. GPIO_InitStructure.GPIO_Pin = USART_TIM_TX_GPIO_PIN;
  129. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  130. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  131. GPIO_Init(USART_TIM_TX_GPIO_PORT, &GPIO_InitStructure);
  132. //USART_RX
  133. GPIO_InitStructure.GPIO_Pin = USART_TIM_RX_GPIO_PIN;
  134. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  135. GPIO_Init(USART_TIM_RX_GPIO_PORT, &GPIO_InitStructure);
  136. USART_InitStructure.USART_BaudRate = USART_TIM_BAUDRATE;
  137. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  138. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  139. USART_InitStructure.USART_Parity = USART_Parity_No;
  140. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  141. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  142. USART_Init(USART_TIMx, &USART_InitStructure);
  143. USART_Cmd(USART_TIMx, ENABLE);
  144. USART_ITConfig(USART_TIMx, USART_IT_RXNE, ENABLE);
  145. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  146. NVIC_InitStructure.NVIC_IRQChannel = USART_TIM_IRQ;
  147. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  148. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  149. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  150. NVIC_Init(&NVIC_InitStructure);
  151. USART_TIM_RX_STA=0;
  152. }