Health.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. 智能健康检测模块
  3. */
  4. #include "main.h"
  5. static void Health_Rec_Handle(HealthDataStruct *HealthData1);
  6. static void Health_TIM_Init(void);
  7. static void Health_USART_Init(void);
  8. static void Health_Init(void);
  9. static void Health_Open(void);
  10. static void Health_Close(void);
  11. HealthClassStruct HealthClass = {
  12. .Init = Health_Init,
  13. .GetHealthData = Health_Rec_Handle,
  14. .Open = Health_Open,
  15. .Close = Health_Close
  16. };
  17. #define Health_MAX_RECV_LEN 128 // 接收缓存大小
  18. #define Health_MAX_SEND_LEN 1 // 发送缓存大小
  19. #define Health_RX_EN 1 // 接收使能标志
  20. // 串口接收和发送缓存区
  21. unsigned char Health_RX_BUF[Health_MAX_RECV_LEN];
  22. char Health_TX_BUF[Health_MAX_SEND_LEN];
  23. // [14:0]: 接收字节数 [15]: 接收完成标志
  24. volatile uint16_t Health_RX_STA = 0;
  25. #if 1
  26. #define Healthx USART1
  27. #define Health_CLK RCC_APB2Periph_USART1
  28. #define Health_APBxClkCmd RCC_APB2PeriphClockCmd
  29. #define Health_BAUDRATE 38400
  30. #define Health_GPIO_CLK (RCC_APB2Periph_GPIOA)
  31. #define Health_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
  32. #define Health_TX_GPIO_PORT GPIOA
  33. #define Health_TX_GPIO_PIN GPIO_Pin_9
  34. #define Health_RX_GPIO_PORT GPIOA
  35. #define Health_RX_GPIO_PIN GPIO_Pin_10
  36. #define Health_IRQ USART1_IRQn
  37. #define Health_IRQHandler USART1_IRQHandler
  38. #else
  39. #define Healthx USART2
  40. #define Health_CLK RCC_APB1Periph_USART2
  41. #define Health_APBxClkCmd RCC_APB1PeriphClockCmd
  42. #define Health_BAUDRATE 115200
  43. #define Health_GPIO_CLK (RCC_APB2Periph_GPIOA)
  44. #define Health_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd
  45. #define Health_TX_GPIO_PORT GPIOA
  46. #define Health_TX_GPIO_PIN GPIO_Pin_2
  47. #define Health_RX_GPIO_PORT GPIOA
  48. #define Health_RX_GPIO_PIN GPIO_Pin_3
  49. #define Health_IRQ USART2_IRQn
  50. #define Health_IRQHandler USART2_IRQHandler
  51. #endif
  52. /**
  53. * @brief 串口中断
  54. * @param None
  55. * @retval None
  56. * @note None
  57. */
  58. void Health_IRQHandler(void)
  59. {
  60. uint8_t res;
  61. if(USART_GetITStatus(Healthx, USART_IT_RXNE) != RESET)
  62. {
  63. res =USART_ReceiveData(Healthx);
  64. if((Health_RX_STA&(1<<15))==0)
  65. {
  66. if(Health_RX_STA<Health_MAX_RECV_LEN)
  67. {
  68. TIM_SetCounter(TIM3,0);
  69. if(Health_RX_STA==0)
  70. {
  71. TIM_Cmd(TIM3,ENABLE);
  72. }
  73. Health_RX_BUF[Health_RX_STA++]=res;
  74. }else
  75. {
  76. Health_RX_STA|=1<<15;
  77. }
  78. }
  79. }
  80. }
  81. /**
  82. * @brief TIM3中断
  83. * @param None
  84. * @retval None
  85. * @note None
  86. */
  87. void TIM3_IRQHandler(void)
  88. {
  89. if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  90. {
  91. Health_RX_STA|=1<<15;
  92. TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  93. TIM_Cmd(TIM3, DISABLE);
  94. }
  95. }
  96. /**
  97. * @brief 健康检测模块数据处理
  98. * @param None
  99. * @retval None
  100. * @note 把串口接收到的数据分类存放
  101. */
  102. static void Health_Rec_Handle(HealthDataStruct *HealthData1)
  103. {
  104. // 接收到一次数据了
  105. if(Health_RX_STA&0X8000)
  106. {
  107. // 添加结束符
  108. Health_RX_BUF[Health_RX_STA&0X7FFF]=0;
  109. #ifdef DEBUG_printf
  110. //printf("%s\n",Health_RX_BUF);
  111. #endif
  112. // 数据头为0xff且第76字节不为空
  113. if((Health_RX_BUF[0] == 0xFF) && (Health_RX_BUF[75]) != 0)
  114. {
  115. HealthData1->head = Health_RX_BUF[0];
  116. uint8_t i = 0;
  117. for(i = 0; i <= 64; i++)
  118. {
  119. HealthData1->heartRateWaveform[i] = Health_RX_BUF[i+1];
  120. }
  121. HealthData1->heartRate = Health_RX_BUF[65];
  122. HealthData1->spo = Health_RX_BUF[66];
  123. HealthData1->bk = Health_RX_BUF[67];
  124. for(i = 0; i <= 8; i++)
  125. {
  126. HealthData1->rsv[i] = Health_RX_BUF[i+68];
  127. }
  128. #ifdef DEBUG_printf
  129. printf("gaoya: %d diya: %d\n",HealthData1->rsv[3], HealthData1->rsv[4]);
  130. #endif
  131. }
  132. // 清空缓存区
  133. memset(Health_RX_BUF, 0, Health_MAX_RECV_LEN);
  134. // 清除接收标志
  135. Health_RX_STA = 0;
  136. }
  137. }
  138. /**
  139. * @brief 开启检测
  140. * @param None
  141. * @retval None
  142. * @note None
  143. */
  144. static void Health_Open(void)
  145. {
  146. USART_SendData(Healthx, 0x8A);
  147. }
  148. /**
  149. * @brief 关闭检测
  150. * @param None
  151. * @retval None
  152. * @note None
  153. */
  154. static void Health_Close(void)
  155. {
  156. USART_SendData(Healthx, 0x88);
  157. }
  158. /**
  159. * @brief 10ms定时器初始化
  160. * @param None
  161. * @retval None
  162. * @note 用于检测串口接收状态
  163. */
  164. static void Health_TIM_Init(void)
  165. {
  166. NVIC_InitTypeDef NVIC_InitStructure;
  167. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  168. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  169. TIM_DeInit(TIM3);
  170. TIM_TimeBaseStructure.TIM_Period = 1000-1;
  171. TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;
  172. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  173. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  174. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  175. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
  176. TIM_Cmd(TIM3,DISABLE);
  177. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  178. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  179. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  180. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  181. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  182. NVIC_Init(&NVIC_InitStructure);
  183. }
  184. /**
  185. * @brief 串口初始化
  186. * @param None
  187. * @retval None
  188. * @note None
  189. */
  190. static void Health_USART_Init(void)
  191. {
  192. NVIC_InitTypeDef NVIC_InitStructure;
  193. GPIO_InitTypeDef GPIO_InitStructure;
  194. USART_InitTypeDef USART_InitStructure;
  195. Health_GPIO_APBxClkCmd(Health_GPIO_CLK, ENABLE);
  196. Health_APBxClkCmd(Health_CLK,ENABLE);
  197. USART_DeInit(Healthx);
  198. //USART_TX
  199. GPIO_InitStructure.GPIO_Pin = Health_TX_GPIO_PIN;
  200. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  201. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  202. GPIO_Init(Health_TX_GPIO_PORT, &GPIO_InitStructure);
  203. //USART_RX
  204. GPIO_InitStructure.GPIO_Pin = Health_RX_GPIO_PIN;
  205. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  206. GPIO_Init(Health_RX_GPIO_PORT, &GPIO_InitStructure);
  207. USART_InitStructure.USART_BaudRate = Health_BAUDRATE;
  208. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  209. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  210. USART_InitStructure.USART_Parity = USART_Parity_No;
  211. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  212. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  213. USART_Init(Healthx, &USART_InitStructure);
  214. USART_Cmd(Healthx, ENABLE);
  215. USART_ITConfig(Healthx, USART_IT_RXNE, ENABLE);
  216. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  217. NVIC_InitStructure.NVIC_IRQChannel = Health_IRQ;
  218. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  219. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  220. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  221. NVIC_Init(&NVIC_InitStructure);
  222. Health_RX_STA=0;
  223. }
  224. /**
  225. * @brief 健康检测模块初始化
  226. * @param None
  227. * @retval None
  228. * @note None
  229. */
  230. static void Health_Init(void)
  231. {
  232. Health_USART_Init();
  233. Health_TIM_Init();
  234. }