main.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * Copyright (c) 2024 STMicroelectronics.
  10. * All rights reserved.
  11. *
  12. * This software is licensed under terms that can be found in the LICENSE file
  13. * in the root directory of this software component.
  14. * If no LICENSE file comes with this software, it is provided AS-IS.
  15. *
  16. ******************************************************************************
  17. */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21. #include "adc.h"
  22. #include "dma.h"
  23. #include "rtc.h"
  24. #include "tim.h"
  25. #include "usart.h"
  26. #include "gpio.h"
  27. /* Private includes ----------------------------------------------------------*/
  28. /* USER CODE BEGIN Includes */
  29. #include "stdlib.h"
  30. #include "stdio.h"
  31. #include "string.h"
  32. #include "lora_comm.h"
  33. #include "stm32f0xx_hal_rtc.h"
  34. /* USER CODE END Includes */
  35. /* Private typedef -----------------------------------------------------------*/
  36. /* USER CODE BEGIN PTD */
  37. /* USER CODE END PTD */
  38. /* Private define ------------------------------------------------------------*/
  39. /* USER CODE BEGIN PD */
  40. /* USER CODE END PD */
  41. /* Private macro -------------------------------------------------------------*/
  42. /* USER CODE BEGIN PM */
  43. #define ENABLE_RTC_ALARM 1
  44. #define ENABLE_SRAND_DELAY 1
  45. #define ENABLE_TIMER_COUNT 1
  46. #define ENABLE_TIMER_CALLBACK 0
  47. #define ENABLE_UART1_DEBUG 0
  48. #define DEV_MAC "01:02:03:04"
  49. #define MAC_ADDR_CHAR_1 'A'
  50. #define MAC_ADDR_CHAR_2 'D'
  51. #define HI_BYTE(value) (U08)((value) >> 8)
  52. #define LO_BYTE(value) (U08)(value)
  53. #define EVENT_MARK_CB 0x0001
  54. #define EVENT_MARK_NURSE 0x0002
  55. #define EVENT_MARK_CALL 0x0004
  56. #define EVENT_MARK_HANDLE 0x0008
  57. #define EVENT_MARK_C_D 0x0010
  58. #define EVENT_MARK_CANCEL 0x0020
  59. #define EVENT_MARK_UNPIN 0x0040
  60. #define EVENT_MARK_BAT_LOW 0x0080
  61. #define EVENT_MARK_SOS 0x0100
  62. #define SCAN_KEY_NUM 7
  63. //RF TX packet
  64. //$ABlora1,1E#,(地址AB:0xF1234)
  65. /* USER CODE END PM */
  66. /* Private variables ---------------------------------------------------------*/
  67. /* USER CODE BEGIN PV */
  68. #define UART_RXBUF_LEN 64
  69. #define UART_RXBUF_REV_LEN 24
  70. uint8_t RX_recv_dma_buf[UART_RXBUF_LEN] = {0};
  71. uint8_t RX_recv_buf[UART_RXBUF_LEN] = {0};
  72. volatile uint16_t event_bits = 0;
  73. volatile uint8_t rx_gateway_reps_flag = 0;
  74. volatile uint8_t flag_cd_event = 0;
  75. volatile uint8_t flag_handle_event = 0;
  76. #define MAC_ADDR_LEN 4
  77. #define RF_RXBUF_LEN 16
  78. char MAC_ADDR[MAC_ADDR_LEN] = {'A', 'B'};
  79. uint8_t RF_TX_Buf[RF_RXBUF_LEN] = {'$', 0x12, 0x34,0x46,0x45, 'L', 'O', 'R', 'A', '7', ',', '1', 'F', '#', 0x0D, 0x0A};
  80. union u_tag {
  81. float f;
  82. unsigned char bytes[4];
  83. } u;
  84. const U08 DeviceMacInfo[] __attribute__((at(0X80036CC)))="F201";
  85. uint8_t key_type = VALUE_SOS;
  86. uint8_t key_value = KEY_EVENT_1;
  87. uint8_t send_cnt = RX_RE_SEND_CNT;
  88. uint8_t standby_flag = 0;
  89. volatile uint8_t even_cancel_flag = 0;
  90. #define LOW_VOL_HALF_VALUE 2.4
  91. #define ADC_SAMPLE_CNT 20
  92. uint16_t adc_value[ADC_SAMPLE_CNT] = {0};
  93. uint16_t adc_buf[ADC_SAMPLE_CNT] = {0};
  94. uint32_t ad_val;
  95. float ad_vol;
  96. #define KEY_DOWN 0
  97. #define KEY_UP 1
  98. #define KEY_DIDTH_TIME 50 //MS
  99. typedef struct __key_model {
  100. uint16_t key_gpio;
  101. uint8_t key_value;
  102. uint8_t ditch_time;
  103. GPIO_TypeDef * key_gpio_group;
  104. void * timer;
  105. }KEY_MODLE;
  106. KEY_MODLE keyboard_v[SCAN_KEY_NUM];
  107. uint16_t keyboard_gpio[SCAN_KEY_NUM] = {CANCEL_KEY_Pin, CHANGE_KEY_Pin, HADLE_KEY_Pin, CALL_KEY_Pin, NURSE_KEY_Pin, REINFORCE_KEY_Pin, UNPIN_KEY_Pin};
  108. GPIO_TypeDef *key_io_group[SCAN_KEY_NUM] = {CANCEL_KEY_GPIO_Port, CHANGE_KEY_GPIO_Port, HADLE_KEY_GPIO_Port, CALL_KEY_GPIO_Port, NURSE_KEY_GPIO_Port, REINFORCE_KEY_GPIO_Port, UNPIN_KEY_GPIO_Port};
  109. uart_comm uart1;
  110. extern DMA_HandleTypeDef hdma_usart1_rx;
  111. /* USER CODE END PV */
  112. /* Private function prototypes -----------------------------------------------*/
  113. void SystemClock_Config(void);
  114. /* USER CODE BEGIN PFP */
  115. void RF_send_event(uint8_t event_type, uint8_t key_value, uint8_t send_cnt);
  116. /* USER CODE END PFP */
  117. /* Private user code ---------------------------------------------------------*/
  118. /* USER CODE BEGIN 0 */
  119. #if ENABLE_UART1_DEBUG
  120. int fputc(int ch, FILE *fp)
  121. {
  122. HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 100);
  123. return ch;
  124. }
  125. #else
  126. /*
  127. * The following is UART interpent handle functions.
  128. */
  129. void uart_error_restore(UART_HandleTypeDef *huart)
  130. {
  131. if (huart->ErrorCode)
  132. {
  133. __HAL_UART_CLEAR_PEFLAG(huart);
  134. __HAL_UART_CLEAR_FEFLAG(huart);
  135. __HAL_UART_CLEAR_NEFLAG(huart);
  136. __HAL_UART_CLEAR_OREFLAG(huart);
  137. HAL_UART_DeInit(huart);
  138. if (huart == &huart1)
  139. {
  140. MX_USART1_UART_Init();
  141. }
  142. }
  143. }
  144. /*
  145. * Todo: optimize huart variable the darkest sense in a interrupt handle.
  146. * xfli
  147. */
  148. void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
  149. {
  150. uint32_t temp;
  151. uint8_t ret;
  152. uart_error_restore(huart);
  153. if (RESET != __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE))
  154. {
  155. if (huart == uart1.uart)
  156. {
  157. __HAL_UART_CLEAR_IDLEFLAG(huart);
  158. temp = __HAL_DMA_GET_COUNTER(uart1.dma);
  159. temp = uart1.rxtotal - temp;
  160. uart1.rxcnt = temp - uart1.rxoff;
  161. if (uart1.rxcnt)
  162. {
  163. temp = uart1.rxtotal - uart1.rxoff;
  164. if (temp >= uart1.rxcnt)
  165. {
  166. memcpy(RX_recv_buf, uart1.rxbuf+uart1.rxoff, uart1.rxcnt);
  167. }
  168. else
  169. {
  170. memcpy(RX_recv_buf, uart1.rxbuf+uart1.rxoff, temp);
  171. memcpy(RX_recv_buf+temp, uart1.rxbuf, uart1.rxcnt - temp);
  172. }
  173. uart1.rxoff += uart1.rxcnt;
  174. if(RX_recv_buf[16] == 0x0D && RX_recv_buf[17] == 0x0A)
  175. {
  176. //len = sizeof(RX_recv_buf);
  177. if(RX_recv_buf[0] == '$' && RX_recv_buf[15] == '#')
  178. {
  179. //To check if the received data is sended to current device.
  180. if(RX_recv_buf[1] == MAC_ADDR[0] && RX_recv_buf[2] == MAC_ADDR[1])
  181. {
  182. //char str[8];
  183. //memcpy(str, RX_recv_buf+3, 7);
  184. //Todo parse received data and if is valid.!!!
  185. //ret = strcmp(str, "CALLLED");
  186. //if(ret == 0)
  187. {
  188. rx_gateway_reps_flag = 1;
  189. // key_type = VALUE_SOS;
  190. //key_value = KEY_EVENT_1;
  191. }
  192. }
  193. }
  194. }
  195. }
  196. }
  197. }
  198. }
  199. #endif
  200. #if ENABLE_TIMER_CALLBACK
  201. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  202. {
  203. if(htim != &htim14)
  204. {
  205. //printf("Timer is htim14!\r\n");
  206. return;
  207. }
  208. ///Todo needed code process...
  209. return;
  210. }
  211. #endif
  212. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  213. {
  214. // 刚从STOP模式唤醒时钟默认使用内部高速8M时钟,所以需要重新配置时钟)
  215. //SystemClock_Config();
  216. // 如果使用了WKUP引脚唤醒则需要清除这个WKUP唤醒标记
  217. //__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  218. switch(GPIO_Pin)
  219. {
  220. case CANCEL_KEY_Pin:
  221. #if ENABLE_UART1_DEBUG
  222. printf("CANCEL_Pin.\r\n");
  223. #endif
  224. BEEP_OFF();
  225. event_bits |= EVENT_MARK_CANCEL;
  226. //even_cancel_flag = 1;
  227. break;
  228. case CHANGE_KEY_Pin:
  229. #if ENABLE_UART1_DEBUG
  230. printf("CHANGE_KEY_Pin.\r\n");
  231. #endif
  232. event_bits |= EVENT_MARK_C_D;
  233. break;
  234. case HADLE_KEY_Pin:
  235. #if ENABLE_UART1_DEBUG
  236. printf("HADLE_KEY_Pin.\r\n");
  237. #endif
  238. event_bits |= EVENT_MARK_HANDLE;
  239. break;
  240. case CALL_KEY_Pin:
  241. #if ENABLE_UART1_DEBUG
  242. printf("CALL_KEY_Pin.\r\n");
  243. #endif
  244. event_bits |= EVENT_MARK_CALL;
  245. break;
  246. case NURSE_KEY_Pin:
  247. #if ENABLE_UART1_DEBUG
  248. printf("NURSE_KEY_Pin.\r\n");
  249. #endif
  250. event_bits |= EVENT_MARK_NURSE;
  251. break;
  252. case REINFORCE_KEY_Pin:
  253. #if ENABLE_UART1_DEBUG
  254. printf("REINFORCE_KEY_Pin.\r\n");
  255. #endif
  256. event_bits |= EVENT_MARK_CB;
  257. break;
  258. case UNPIN_KEY_Pin:
  259. #if ENABLE_UART1_DEBUG
  260. printf("UNPIN_KEY_Pin.\r\n");
  261. #endif
  262. event_bits |= EVENT_MARK_UNPIN;
  263. break;
  264. default:
  265. break;
  266. }
  267. return;
  268. }
  269. uint32_t srand_delay(void)
  270. {
  271. #define RANDOM_MAX 500 //随机数最大值
  272. #define RANDOM_MIN 50 //随机数最小值
  273. uint32_t random_value = 0;
  274. #if ENABLE_SRAND_DELAY
  275. //RTC_DateTypeDef date_info;
  276. RTC_TimeTypeDef time_info;
  277. HAL_RTC_GetTime(&hrtc, &time_info, RTC_FORMAT_BIN);
  278. //HAL_RTC_GetDate(&hrtc, &date_info, RTC_FORMAT_BIN);
  279. #if ENABLE_UART1_DEBUG
  280. printf("当前时间:%2d:%2d:%2d", time_info.Hours, time_info.Minutes, time_info.Seconds);
  281. #endif
  282. #if ENABLE_TIMER_COUNT
  283. //HAL_TIM_Base_Start(&htim14);
  284. random_value = __HAL_TIM_GET_COUNTER(&htim14);
  285. srand(time_info.Hours + time_info.Minutes + time_info.Seconds + random_value);//随机数种子设置
  286. #endif
  287. random_value = rand() % (RANDOM_MAX + 1 - RANDOM_MIN) + RANDOM_MIN;//随机数生成
  288. #if ENABLE_UART1_DEBUG
  289. printf(" 当前随机数为:%d\r\n", random_value);
  290. #endif
  291. #endif
  292. return random_value;
  293. }
  294. void GPIO_AnalogState_Config(void)
  295. {
  296. GPIO_InitTypeDef GPIO_InitStruct;
  297. /*Set all GPIO in analog state to reduce power consumption*/
  298. __HAL_RCC_GPIOA_CLK_ENABLE();
  299. __HAL_RCC_GPIOB_CLK_ENABLE();
  300. GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  301. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  302. GPIO_InitStruct.Pull = GPIO_NOPULL;
  303. GPIO_InitStruct.Pin = GPIO_PIN_All;
  304. HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
  305. HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
  306. __HAL_RCC_GPIOA_CLK_DISABLE();
  307. __HAL_RCC_GPIOB_CLK_DISABLE();
  308. }
  309. #if ENABLE_RTC_ALARM
  310. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
  311. {
  312. uint8_t i;
  313. // STOP模式唤醒后默认时钟主频为内部8M时钟,所以要先初始化时钟配置
  314. SystemClock_Config();
  315. //printf("3s时间到,唤醒!\r\n");
  316. //唤醒后红灯提示报警发生
  317. // for(i=0; i<LED_GREEN_FLUSH_COUNT; i++)
  318. // {
  319. // LED_GREEN_ON();
  320. // HAL_Delay(LED_FLUSH_TIME_DELAY);
  321. // LED_GREEN_OFF();
  322. // HAL_Delay(LED_FLUSH_TIME_DELAY);
  323. // }
  324. // uint8_t event_t = VALUE_ONLINE_FB;
  325. // RF_send_event(event_t, KEY_EVENT_1, RX_RE_SEND_CNT);
  326. return;
  327. }
  328. void RTC_AlarmStart(void)
  329. {
  330. RTC_TimeTypeDef tim = {0};
  331. RTC_AlarmTypeDef sAlarm = {0};
  332. RTC_DateTypeDef sdate = {0};
  333. // 获取当前时间
  334. //RTC_GetTime(&tim);
  335. HAL_RTC_GetTime(&hrtc, &tim, RTC_FORMAT_BIN);
  336. HAL_RTC_GetDate(&hrtc, &sdate, RTC_FORMAT_BIN);
  337. sAlarm.AlarmTime.Hours = tim.Hours+24;//每24小时一次唤醒,心跳
  338. sAlarm.AlarmTime.Minutes = tim.Minutes;
  339. sAlarm.AlarmTime.Seconds = tim.Seconds ; /* 设置下次闹钟提醒时间是当前时间的3s之后 */
  340. sAlarm.Alarm = RTC_ALARM_A;
  341. if(sAlarm.AlarmTime.Seconds >= 60)
  342. {
  343. sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds % 60;
  344. sAlarm.AlarmTime.Minutes += 1;
  345. if(sAlarm.AlarmTime.Minutes >= 60)
  346. {
  347. sAlarm.AlarmTime.Minutes = sAlarm.AlarmTime.Minutes % 60;
  348. sAlarm.AlarmTime.Hours += 1;
  349. if(sAlarm.AlarmTime.Hours >= 24)
  350. {
  351. sAlarm.AlarmTime.Hours = sAlarm.AlarmTime.Hours % 24;
  352. sdate.Date += 1;
  353. }
  354. }
  355. }
  356. sAlarm.AlarmTime.SubSeconds = 0;
  357. sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  358. sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
  359. sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
  360. sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
  361. sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
  362. sAlarm.AlarmDateWeekDay = sdate.Date;
  363. // 启动闹钟中断事件
  364. HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
  365. }
  366. #endif
  367. /*
  368. void sys_enter_stop_mode(void)
  369. {
  370. // 使能PWR时钟
  371. __HAL_RCC_PWR_CLK_ENABLE();
  372. HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
  373. // 清除唤醒标记
  374. __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  375. // 如果使用WK-UP引脚唤醒那么需要使能
  376. HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
  377. // 进入STOP模式
  378. HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
  379. }
  380. */
  381. void sys_enter_standby_mode(void)
  382. {
  383. // 使能PWR时钟
  384. __HAL_RCC_PWR_CLK_ENABLE();
  385. HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);
  386. // 清除唤醒标记
  387. __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
  388. // 如果使用WK-UP引脚唤醒那么需要使能
  389. HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
  390. // 进入待机模式
  391. HAL_PWR_EnterSTANDBYMode();
  392. }
  393. /*
  394. void sys_enter_stop_mode(void)
  395. {
  396. __HAL_RCC_PWR_CLK_ENABLE(); // 使能PWR时钟
  397. __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标记
  398. HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 进入STOP模式
  399. }
  400. void sys_enter_standby_mode(void)
  401. {
  402. __HAL_RCC_PWR_CLK_ENABLE(); // 使能PWR时钟
  403. __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); // 清除唤醒标记
  404. HAL_PWR_EnterSTANDBYMode(); // 进入待机模式
  405. }
  406. */
  407. void uart_comm_init(void)
  408. {
  409. /*Init UART1 RX for ECG DATA CHANNEL*/
  410. uart1.uart = &huart1;
  411. uart1.dma = &hdma_usart1_rx;
  412. uart1.rxbuf = RX_recv_dma_buf;
  413. uart1.rxcnt = 0;
  414. uart1.rxoff = 0;
  415. uart1.rxtotal = UART_RXBUF_LEN;
  416. __HAL_UART_ENABLE_IT(uart1.uart, UART_IT_IDLE);
  417. HAL_UART_Receive_DMA(uart1.uart, uart1.rxbuf, uart1.rxtotal);
  418. }
  419. void RF_send_event(uint8_t event_type, uint8_t event_value, uint8_t send_cnt)
  420. {
  421. uint8_t i;
  422. uint16_t delay;
  423. //uint8_t crc_t = 0;
  424. for(i=0; i<MAC_ADDR_LEN; i++)
  425. {
  426. RF_TX_Buf[i+1] = MAC_ADDR[i];
  427. }
  428. RF_TX_Buf[RF_RXBUF_LEN - 7] = event_type+48;
  429. RF_TX_Buf[RF_RXBUF_LEN - 5] = event_value+48;
  430. /*
  431. for(i=1; i<RF_RXBUF_LEN-2; i++)
  432. {
  433. crc_t += RF_RXBUF_LEN[i]
  434. }
  435. */
  436. for(i=0; i<send_cnt; i++)
  437. {
  438. delay = srand_delay();
  439. HAL_Delay(delay+send_cnt*15);
  440. HAL_UART_Transmit(uart1.uart, RF_TX_Buf, RF_RXBUF_LEN, 100);
  441. }
  442. return;
  443. }
  444. uint8_t read_flash_get_MAC(void)
  445. {
  446. uint8_t i, ret = 0;
  447. //get MAC address from flash specical page.
  448. //????
  449. #if 0
  450. for(i=0; i<MAC_ADDR_LEN; i++)
  451. {
  452. MAC_ADDR[i] = read_flash_get_MAC();
  453. }
  454. #else
  455. U32 u32prm = *(U32*)(0X80036CC);
  456. MAC_ADDR[0] = LO_BYTE(u32prm); //MAC_ADDR_CHAR_1;
  457. MAC_ADDR[1] = u32prm>>8; //MAC_ADDR_CHAR_2;
  458. MAC_ADDR[2] = u32prm>>16;
  459. MAC_ADDR[3] = u32prm>>24;
  460. #endif
  461. return ret;
  462. }
  463. static void event_response_func(uint8_t event)
  464. {
  465. BEEP_OFF();
  466. LED_RED_OFF();
  467. BEEP_ON();
  468. HAL_Delay(200);
  469. BEEP_OFF();
  470. LED_RED_ON();
  471. HAL_Delay(100);
  472. LED_RED_OFF();
  473. RF_send_event(event, KEY_EVENT_1, 3);
  474. return;
  475. }
  476. static void init_keyboard_model(void)
  477. {
  478. uint8_t i;
  479. memset((char *)keyboard_v, 0, sizeof(KEY_MODLE));
  480. for(i=0; i<SCAN_KEY_NUM; i++)
  481. {
  482. keyboard_v[i].key_value = GPIO_PIN_SET;
  483. keyboard_v[i].key_value = KEY_DIDTH_TIME;
  484. keyboard_v[i].key_gpio = keyboard_gpio[i];
  485. keyboard_v[i].key_gpio_group = key_io_group[i];
  486. }
  487. return;
  488. }
  489. static void event_scan_key_status(void)
  490. {
  491. uint8_t i;
  492. uint16_t k_value;
  493. for(i=0; i<SCAN_KEY_NUM; i++)
  494. {
  495. k_value = HAL_GPIO_ReadPin(keyboard_v[i].key_gpio_group, keyboard_v[i].key_gpio);
  496. if(k_value == GPIO_PIN_RESET) {
  497. switch(keyboard_v[i].key_gpio)
  498. {
  499. case CANCEL_KEY_Pin:
  500. #if ENABLE_UART1_DEBUG
  501. printf("CANCEL_Pin.\r\n");
  502. #endif
  503. event_bits |= EVENT_MARK_CANCEL;
  504. break;
  505. case CHANGE_KEY_Pin:
  506. #if ENABLE_UART1_DEBUG
  507. printf("CHANGE_KEY_Pin.\r\n");
  508. #endif
  509. event_bits |= EVENT_MARK_C_D;
  510. break;
  511. case HADLE_KEY_Pin:
  512. #if ENABLE_UART1_DEBUG
  513. printf("HADLE_KEY_Pin.\r\n");
  514. #endif
  515. event_bits |= EVENT_MARK_HANDLE;
  516. break;
  517. case CALL_KEY_Pin:
  518. #if ENABLE_UART1_DEBUG
  519. printf("CALL_KEY_Pin.\r\n");
  520. #endif
  521. event_bits |= EVENT_MARK_CALL;
  522. break;
  523. case NURSE_KEY_Pin:
  524. #if ENABLE_UART1_DEBUG
  525. printf("NURSE_KEY_Pin.\r\n");
  526. #endif
  527. event_bits |= EVENT_MARK_NURSE;
  528. break;
  529. case REINFORCE_KEY_Pin:
  530. #if ENABLE_UART1_DEBUG
  531. printf("REINFORCE_KEY_Pin.\r\n");
  532. #endif
  533. event_bits |= EVENT_MARK_CB;
  534. break;
  535. case UNPIN_KEY_Pin:
  536. #if ENABLE_UART1_DEBUG
  537. printf("UNPIN_KEY_Pin.\r\n");
  538. #endif
  539. event_bits |= EVENT_MARK_UNPIN;
  540. break;
  541. default:
  542. break;
  543. }
  544. }
  545. }
  546. return;
  547. }
  548. static uint8_t event_checkout_and_scan(void)
  549. {
  550. uint8_t type, ret;
  551. uint8_t value = KEY_EVENT_1;
  552. ret = 0;
  553. type = (uint8_t)VALUE_UNKOWN;
  554. event_scan_key_status();
  555. //Checkout the event list...
  556. if (event_bits & EVENT_MARK_CANCEL) //实际修改为增援
  557. {
  558. type = VALUE_CB;//VALUE_CANCEL;
  559. event_response_func(type);
  560. event_bits &= ~EVENT_MARK_CANCEL;
  561. }
  562. if (event_bits & EVENT_MARK_CB) //实际修改为Nurse
  563. {
  564. type = VALUE_NURSING; //VALUE_CB;
  565. event_response_func(type);
  566. event_bits &= ~EVENT_MARK_CB;
  567. }
  568. if (event_bits & EVENT_MARK_NURSE) //实际修改为面板呼叫
  569. {
  570. type = VALUE_CALL;//VALUE_NURSING;
  571. event_response_func(type);
  572. event_bits &= ~EVENT_MARK_NURSE;
  573. }
  574. if (event_bits & EVENT_MARK_CALL) //实际修改为取消
  575. {
  576. type = VALUE_CANCEL;//VALUE_CALL;
  577. event_response_func(type);
  578. event_bits &= ~EVENT_MARK_CALL;
  579. }
  580. if (event_bits & EVENT_MARK_UNPIN)
  581. {
  582. type = VALUE_UNPIN;
  583. event_response_func(type);
  584. event_bits &= ~EVENT_MARK_UNPIN;
  585. }
  586. if (event_bits & EVENT_MARK_HANDLE)
  587. {
  588. type = VALUE_HANDLE_CALL;
  589. flag_handle_event = 1;
  590. event_response_func(type);
  591. event_bits &= ~EVENT_MARK_HANDLE;
  592. }
  593. if (event_bits & EVENT_MARK_C_D)
  594. {
  595. type = VALUE_C_D;
  596. flag_cd_event = 1;
  597. event_response_func(type);
  598. event_bits &= ~EVENT_MARK_C_D;
  599. }
  600. if (event_bits & EVENT_MARK_SOS)
  601. {
  602. type = VALUE_SOS;
  603. event_response_func(type);
  604. event_bits &= ~EVENT_MARK_SOS;
  605. }
  606. if(type)
  607. {
  608. type = (uint8_t)VALUE_UNKOWN;
  609. ret = 1;
  610. }
  611. return ret;
  612. }
  613. /* USER CODE END 0 */
  614. /**
  615. * @brief The application entry point.
  616. * @retval int
  617. */
  618. int main(void)
  619. {
  620. /* USER CODE BEGIN 1 */
  621. /* USER CODE END 1 */
  622. /* MCU Configuration--------------------------------------------------------*/
  623. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  624. HAL_Init();
  625. /* USER CODE BEGIN Init */
  626. /* USER CODE END Init */
  627. /* Configure the system clock */
  628. SystemClock_Config();
  629. /* USER CODE BEGIN SysInit */
  630. /* USER CODE END SysInit */
  631. /* Initialize all configured peripherals */
  632. MX_GPIO_Init();
  633. MX_DMA_Init();
  634. MX_ADC_Init();
  635. MX_RTC_Init();
  636. MX_TIM14_Init();
  637. MX_USART1_UART_Init();
  638. /* USER CODE BEGIN 2 */
  639. //Wait the power bapass capacitance chargeing to full.
  640. HAL_Delay(200);
  641. //printf("Hello word!! I'm main Ctroller board.\r\n");
  642. LED_GREEN_OFF();
  643. LED_RED_OFF();
  644. RF_PWR_ON();
  645. HAL_Delay(200);
  646. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
  647. HAL_GPIO_WritePin(GPIOA, CE_Pin|RLED2_Pin|GLED1_Pin, GPIO_PIN_SET);
  648. HAL_GPIO_WritePin(GPIOA, RESET_Pin, GPIO_PIN_RESET);
  649. /*Configure GPIO pin Output Level */
  650. uart_comm_init();
  651. #if ENABLE_TIMER_COUNT
  652. HAL_TIM_Base_Start(&htim14);
  653. #endif
  654. uint8_t i, ret;
  655. key_type = VALUE_SOS;
  656. key_value = KEY_EVENT_1;
  657. send_cnt = 0;
  658. standby_flag = 0;
  659. //Todo read the device MAC address from the indicated page in flash and to save.
  660. read_flash_get_MAC();
  661. //Todo Set LORA module...
  662. //81 ---开启透传模式
  663. //82 ---关闭透传模式,即 AT 命令模式
  664. HAL_Delay(200);
  665. set_work_mode(0);
  666. //485125000Hz
  667. //483200000Hz
  668. set_work_freq(1);
  669. //6 ---速率 1868bps
  670. set_rf_rate(6);
  671. //set_rf_tx_power(int index);
  672. HAL_Delay(20);
  673. set_work_mode(1);
  674. HAL_Delay(50);
  675. HAL_ADC_Start_DMA(&hadc, (uint32_t *)adc_value, ADC_SAMPLE_CNT);
  676. //HAL_ADC_Start(&hadc);
  677. //init keyboard model.
  678. init_keyboard_model();
  679. /* USER CODE END 2 */
  680. /* Infinite loop */
  681. /* USER CODE BEGIN WHILE */
  682. while (1)
  683. {
  684. #if ENABLE_UART1_DEBUG
  685. uint32_t random_value = __HAL_TIM_GET_COUNTER(&htim14);
  686. printf("tim14 cnt [%d].\r\n", random_value);
  687. #endif
  688. /* USER CODE END WHILE */
  689. /* USER CODE BEGIN 3 */
  690. //唤醒后红灯提示报警发生
  691. //HAL_Delay(800);
  692. // BEEP_ON();
  693. // HAL_Delay(200);
  694. // BEEP_OFF();
  695. //
  696. // LED_RED_ON();
  697. // HAL_Delay(100);
  698. // LED_RED_OFF();
  699. // HAL_Delay(400);
  700. //printf("BEEP_ON.\r\n");
  701. //HAL_Delay(LED_FLUSH_TIME_DELAY);
  702. //Get AD value and calculate battery volume...
  703. ad_val=0;
  704. memcpy(adc_buf, adc_value, ADC_SAMPLE_CNT*2);
  705. for(i=0; i<ADC_SAMPLE_CNT; i++)
  706. {
  707. ad_val += adc_buf[i];
  708. }
  709. ad_vol = (ad_val / ADC_SAMPLE_CNT);
  710. HAL_Delay(20);
  711. // unsigned t=(unsigned)ad_vol;
  712. // RF_TX_Buf[1]=t/1000+48;
  713. // RF_TX_Buf[2]=(t/100)%10+48;
  714. // RF_TX_Buf[3]=(t/10)%10+48;
  715. // RF_TX_Buf[4]=t%10+48;
  716. // HAL_UART_Transmit(uart1.uart, RF_TX_Buf, 16, 100);
  717. //Send the alarm message by RF channel
  718. send_cnt++;
  719. if(send_cnt<=4){
  720. //低电量上报,前3秒发送
  721. if(4096/ad_vol*1.2 <= LOW_VOL_HALF_VALUE)
  722. {
  723. //low battery...
  724. uint8_t event_t = VALUE_BAT_LOW;
  725. RF_send_event(event_t, KEY_EVENT_1, 1);
  726. }
  727. //发送心跳
  728. RF_send_event(VALUE_ONLINE_FB, key_value, 1);
  729. }else{
  730. HAL_Delay(200);
  731. }
  732. if(rx_gateway_reps_flag)
  733. {
  734. //To parse data from ... RX_recv_buf
  735. //唤醒后红灯提示报警发生
  736. for(i=0; i<LED_GREEN_FLUSH_COUNT; i++)
  737. {
  738. //LED_GREEN_ON();
  739. LED_RED_ON();
  740. HAL_Delay(100);
  741. //LED_GREEN_OFF();
  742. LED_RED_OFF();
  743. HAL_Delay(300);
  744. }
  745. rx_gateway_reps_flag = 0;
  746. standby_flag = 1;
  747. }
  748. //Checkout the event list...
  749. ret = event_checkout_and_scan();
  750. if (ret)
  751. {
  752. HAL_Delay(200); //Why delay?
  753. standby_flag = 1;
  754. //重置寄存器
  755. STATE_REST_H();
  756. }
  757. if(standby_flag == 1 || send_cnt > RX_RE_SEND_CNT)
  758. {
  759. standby_flag = 0;
  760. send_cnt = 0;
  761. //配置下次唤醒的闹钟时间
  762. //HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 5, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
  763. RTC_AlarmStart();
  764. //set_work_mode(0);
  765. //set_work_mode(5); //TC-037模块进入休眠
  766. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
  767. RF_PWR_OFF();
  768. HAL_Delay(5);
  769. //sys_enter_stop_mode();
  770. sys_enter_standby_mode();
  771. }
  772. }
  773. /* USER CODE END 3 */
  774. }
  775. /**
  776. * @brief System Clock Configuration
  777. * @retval None
  778. */
  779. void SystemClock_Config(void)
  780. {
  781. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  782. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  783. RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  784. /** Initializes the RCC Oscillators according to the specified parameters
  785. * in the RCC_OscInitTypeDef structure.
  786. */
  787. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI14|RCC_OSCILLATORTYPE_LSI
  788. |RCC_OSCILLATORTYPE_HSE;
  789. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  790. RCC_OscInitStruct.HSI14State = RCC_HSI14_ON;
  791. RCC_OscInitStruct.HSI14CalibrationValue = 16;
  792. RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  793. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  794. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  795. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;
  796. RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  797. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  798. {
  799. Error_Handler();
  800. }
  801. /** Initializes the CPU, AHB and APB buses clocks
  802. */
  803. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  804. |RCC_CLOCKTYPE_PCLK1;
  805. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  806. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  807. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  808. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  809. {
  810. Error_Handler();
  811. }
  812. PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_RTC;
  813. PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  814. PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  815. if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  816. {
  817. Error_Handler();
  818. }
  819. }
  820. /* USER CODE BEGIN 4 */
  821. /* USER CODE END 4 */
  822. /**
  823. * @brief This function is executed in case of error occurrence.
  824. * @retval None
  825. */
  826. void Error_Handler(void)
  827. {
  828. /* USER CODE BEGIN Error_Handler_Debug */
  829. /* User can add his own implementation to report the HAL error return state */
  830. __disable_irq();
  831. while (1)
  832. {
  833. }
  834. /* USER CODE END Error_Handler_Debug */
  835. }
  836. #ifdef USE_FULL_ASSERT
  837. /**
  838. * @brief Reports the name of the source file and the source line number
  839. * where the assert_param error has occurred.
  840. * @param file: pointer to the source file name
  841. * @param line: assert_param error line source number
  842. * @retval None
  843. */
  844. void assert_failed(uint8_t *file, uint32_t line)
  845. {
  846. /* USER CODE BEGIN 6 */
  847. /* User can add his own implementation to report the file name and line number,
  848. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  849. /* USER CODE END 6 */
  850. }
  851. #endif /* USE_FULL_ASSERT */