main.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. ** This notice applies to any and all portions of this file
  8. * that are not between comment pairs USER CODE BEGIN and
  9. * USER CODE END. Other portions of this file, whether
  10. * inserted by the user or by software development tools
  11. * are owned by their respective copyright owners.
  12. *
  13. * COPYRIGHT(c) 2019 STMicroelectronics
  14. *
  15. * Redistribution and use in source and binary forms, with or without modification,
  16. * are permitted provided that the following conditions are met:
  17. * 1. Redistributions of source code must retain the above copyright notice,
  18. * this list of conditions and the following disclaimer.
  19. * 2. Redistributions in binary form must reproduce the above copyright notice,
  20. * this list of conditions and the following disclaimer in the documentation
  21. * and/or other materials provided with the distribution.
  22. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  23. * may be used to endorse or promote products derived from this software
  24. * without specific prior written permission.
  25. *
  26. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  27. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,p THE
  28. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  29. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  30. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  31. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  32. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  33. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  34. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  35. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  36. *
  37. ******************************************************************************
  38. */
  39. /* USER CODE END Header */
  40. /* Includes ------------------------------------------------------------------*/
  41. #include "main.h"
  42. /* Private includes ----------------------------------------------------------*/
  43. /* USER CODE BEGIN Includes */
  44. /* USER CODE END Includes */
  45. /* Private typedef -----------------------------------------------------------*/
  46. /* USER CODE BEGIN PTD */
  47. /* USER CODE END PTD */
  48. /* Private define ------------------------------------------------------------*/
  49. /* USER CODE BEGIN PD */
  50. /* USER CODE END PD */
  51. /* Private macro -------------------------------------------------------------*/
  52. /* USER CODE BEGIN PM */
  53. /* USER CODE END PM */
  54. /* Private variables ---------------------------------------------------------*/
  55. I2C_HandleTypeDef hi2c2;
  56. TIM_HandleTypeDef htim6;
  57. UART_HandleTypeDef huart1;
  58. UART_HandleTypeDef huart2;
  59. /* USER CODE BEGIN PV */
  60. uint8_t rx1_data[1];
  61. uint8_t rx2_data[1];
  62. uint8_t ring_buf[buf_size];
  63. uint8_t count_in1 = 0;//, count_out = 0;
  64. uint8_t count_in2 = 0;//, count_out = 0;
  65. uint8_t count_in3 = 0, count_out = 0;
  66. uint8_t UartDataisReved;
  67. uint8_t RGB_SensorIDAutoset = 0;
  68. volatile uint32_t UartTimerCnt = 0;
  69. volatile uint32_t LedTimerCnt = 0;
  70. uint8_t buf[buf_size] = {0,};
  71. uint8_t MyControllerID = 0;
  72. uint8_t SensorID = 0;
  73. /* USER CODE END PV */
  74. /* Private function prototypes -----------------------------------------------*/
  75. void SystemClock_Config(void);
  76. static void MX_GPIO_Init(void);
  77. static void MX_TIM6_Init(void);
  78. static void MX_USART1_UART_Init(void);
  79. static void MX_USART2_UART_Init(void);
  80. static void MX_I2C2_Init(void);
  81. static void MX_NVIC_Init(void);
  82. /* USER CODE BEGIN PFP */
  83. void RGB_SensorIDAutoSet(uint8_t set);
  84. uint8_t RGB_SensorIDAutoGet(void);
  85. void UartDataRecvSet(uint8_t val);
  86. void Uart_dataCheck(uint8_t* cnt);
  87. void Uart1_Data_Send(uint8_t* data,uint8_t size);
  88. /* USER CODE END PFP */
  89. /* Private user code ---------------------------------------------------------*/
  90. /* USER CODE BEGIN 0 */
  91. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  92. {
  93. if(huart->Instance == USART1)//RGB Comunication
  94. {
  95. buf[count_in1] = rx1_data[0];//(uint8_t)USART2->DR;
  96. // printf("data %02x \r\n",rx1_data[0]);
  97. if(buf[count_in1++] == 0xEB){
  98. if(buf[blucell_length] == (count_in1 - 3))
  99. UartDataRecvSet(1);
  100. else
  101. count_in1 = 0;
  102. }
  103. HAL_UART_Receive_IT(&huart1,&rx1_data[0],1);
  104. }
  105. if(huart->Instance == USART2) // Lora?? ?†µ?‹ ?•˜?Š” ?¬?Џ
  106. {
  107. buf[count_in2] = rx2_data[0];//(uint8_t)USART2->DR;
  108. // if(buf[count_in++] == 0xEB)UartDataRecvSet(1);
  109. if(buf[count_in2++] == 0xEB){
  110. if(buf[blucell_length] == (count_in2 - 3))
  111. UartDataRecvSet(2);
  112. else
  113. count_in1 = 0;
  114. // printf("UART 2 %d",((count_in2 -1) - 3));
  115. }
  116. HAL_UART_Receive_IT(&huart2,&rx2_data[0],1);
  117. }
  118. #if 0 // PYJ.2019.04.13_BEGIN --
  119. if(huart->Instance == USART3) //GUI ?? ?†µ?‹ ?•˜?Š” Port
  120. {
  121. buf[count_in3] = rx3_data[0];//(uint8_t)USART2->DR;
  122. if(buf[count_in3++] == 0xEB)UartDataRecvSet(3);
  123. /*ring_buf[count_in] = rx2_data[0];//(uint8_t)USART2->DR;
  124. if(++count_in>=buf_size) count_in=0;*/
  125. HAL_UART_Receive_IT(&huart3,&rx3_data[0],1);
  126. }
  127. #endif // PYJ.2019.04.13_END --
  128. }
  129. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  130. {
  131. if(htim->Instance == TIM6){
  132. UartTimerCnt++;
  133. LedTimerCnt++;
  134. }
  135. }
  136. void UartDataRecvSet(uint8_t val){
  137. UartDataisReved = val;
  138. }
  139. uint8_t UartDataRecvGet(void){
  140. return UartDataisReved;
  141. }
  142. void RGB_SensorIDAutoSet(uint8_t set){
  143. RGB_SensorIDAutoset = set;
  144. }
  145. uint8_t RGB_SensorIDAutoGet(void){
  146. return RGB_SensorIDAutoset;
  147. }
  148. void Uart2_Data_Send(uint8_t* data,uint8_t size){
  149. HAL_UART_Transmit(&huart2, data,size, 10);
  150. }
  151. void Uart1_Data_Send(uint8_t* data,uint8_t size){
  152. HAL_UART_Transmit(&huart1, data,size, 10);
  153. }
  154. int _write (int file, uint8_t *ptr, uint16_t len)
  155. {
  156. HAL_UART_Transmit (&huart1, ptr, len, 10);
  157. return len;
  158. }
  159. void Uart_dataCheck(uint8_t* cnt){
  160. etError crccheck = 0;
  161. #if 0
  162. for(uint8_t i = 0; i < (* cnt); i++){
  163. printf("%02x ",buf[i]);
  164. }
  165. printf("\r\n");
  166. #endif
  167. crccheck = STH30_CheckCrc(&buf[blucell_type],buf[blucell_length],buf[buf[blucell_length] + 1]);
  168. if(crccheck == CHECKSUM_ERROR){
  169. for(uint8_t i = 0; i < (*cnt); i++){
  170. printf("%02x ",buf[i]);
  171. }
  172. printf("Original CRC : %02x RecvCRC : %02x \r\n",crccheck,buf[buf[blucell_length] + 1]);
  173. }
  174. else if(crccheck == NO_ERROR){
  175. RGB_Controller_Func(&buf[blucell_stx]);
  176. }
  177. else{
  178. printf("What Happen?\r\n");
  179. /*NOP*/
  180. }
  181. *cnt = 0;
  182. memset(buf,0x00,buf_size);
  183. }
  184. void RGB_Sensor_PowerOnOff(uint8_t id){
  185. printf("%d Power ON \r\n",id);
  186. switch(id){
  187. case 0:
  188. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  189. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_SET);
  190. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_SET);
  191. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_SET);
  192. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_SET);
  193. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_SET);
  194. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_SET);
  195. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_SET);
  196. break;
  197. case 1:
  198. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_RESET);
  199. HAL_Delay(50);
  200. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  201. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_RESET);
  202. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_RESET);
  203. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_RESET);
  204. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_RESET);
  205. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_RESET);
  206. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_RESET);
  207. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_RESET);
  208. break;
  209. case 2:
  210. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  211. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_SET);
  212. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_RESET);
  213. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_RESET);
  214. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_RESET);
  215. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_RESET);
  216. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_RESET);
  217. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_RESET);
  218. break;
  219. case 3:
  220. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  221. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_SET);
  222. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_SET);
  223. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_RESET);
  224. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_RESET);
  225. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_RESET);
  226. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_RESET);
  227. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_RESET);
  228. break;
  229. case 4:
  230. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  231. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_SET);
  232. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_SET);
  233. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_SET);
  234. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_RESET);
  235. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_RESET);
  236. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_RESET);
  237. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_RESET);
  238. break;
  239. case 5:
  240. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  241. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_SET);
  242. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_SET);
  243. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_SET);
  244. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_SET);
  245. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_RESET);
  246. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_RESET);
  247. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_RESET);
  248. break;
  249. case 6:
  250. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  251. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_SET);
  252. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_SET);
  253. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_SET);
  254. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_SET);
  255. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_SET);
  256. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_RESET);
  257. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_RESET);
  258. break;
  259. case 7:
  260. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  261. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_SET);
  262. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_SET);
  263. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_SET);
  264. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_SET);
  265. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_SET);
  266. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_SET);
  267. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_RESET);
  268. break;
  269. case 8:
  270. HAL_GPIO_WritePin(SENSOR_EN1_GPIO_Port,SENSOR_EN1_Pin,GPIO_PIN_SET);
  271. HAL_GPIO_WritePin(SENSOR_EN2_GPIO_Port,SENSOR_EN2_Pin,GPIO_PIN_SET);
  272. HAL_GPIO_WritePin(SENSOR_EN3_GPIO_Port,SENSOR_EN3_Pin,GPIO_PIN_SET);
  273. HAL_GPIO_WritePin(SENSOR_EN4_GPIO_Port,SENSOR_EN4_Pin,GPIO_PIN_SET);
  274. HAL_GPIO_WritePin(SENSOR_EN5_GPIO_Port,SENSOR_EN5_Pin,GPIO_PIN_SET);
  275. HAL_GPIO_WritePin(SENSOR_EN6_GPIO_Port,SENSOR_EN6_Pin,GPIO_PIN_SET);
  276. HAL_GPIO_WritePin(SENSOR_EN7_GPIO_Port,SENSOR_EN7_Pin,GPIO_PIN_SET);
  277. HAL_GPIO_WritePin(SENSOR_EN8_GPIO_Port,SENSOR_EN8_Pin,GPIO_PIN_SET);
  278. break;
  279. }
  280. }
  281. #define StartAddr ((uint32_t)0x08030000)
  282. #if 1 // PYJ.2019.03.19_BEGIN --
  283. //----------------------------------------------------
  284. #define FLASH_USER StartAddr
  285. #define START_ADDR FLASH_USER
  286. #define END_ADDR FLASH_USER + 262144 // 256K
  287. //----------------------------------------------------
  288. #if 0 // PYJ.2019.03.20_BEGIN --
  289. void test_write() // 쓰기함수
  290. {
  291. __HAL_RCC_TIM7_CLK_DISABLE(); // 매인타이머를 정지합니다
  292. uint32_t Address = 0;
  293. Address = StartAddr;
  294. // printf("================First============ \r\n");
  295. // for(uint8_t i=0;i<16;i++)
  296. // {
  297. // printf("%08x: %X\r\n", Address, *(uint32_t*)Address);
  298. // Address += 4;
  299. // }
  300. // HAL_FLASH_Unlock(); // lock 풀기
  301. // HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, START_ADDR, (uint32_t)0x12345678); //test
  302. // HAL_FLASH_Lock(); // lock 잠그기
  303. // __HAL_RCC_TIM7_CLK_ENABLE(); // 매인타이머를 재시작합니다
  304. Address = StartAddr;
  305. printf("================Second============ \r\n");
  306. //while(Address < 0x0803FFFF)
  307. for(uint16_t i = 0; i<37273 ; i++)
  308. {
  309. printf("%02X", *(uint8_t*)Address);
  310. Address ++;
  311. }
  312. printf("%08x:",Address);
  313. }
  314. #endif // PYJ.2019.03.20_END --
  315. #define DATA_16_1 ((uint32_t)0x1234)
  316. #define DATA_16_2 ((uint32_t)0x5678)
  317. #if 1 // PYJ.2019.03.20_BEGIN --
  318. void test_read(void) // 쓰기함수
  319. {
  320. uint32_t Address = 0x08000000;
  321. uint8_t aa = 0;
  322. for(uint32_t i = Address; i <= Address + 0x35d8; i++ ){
  323. printf("%02X ",*(uint8_t*)i);
  324. aa++;
  325. if(aa > 15){
  326. printf("\n");
  327. aa= 0;
  328. }
  329. }
  330. }
  331. #endif // PYJ.2019.03.20_END --
  332. #define ADDR_FLASH_PAGE_TEST ((uint32_t)0x08030000) /* Base @ of Page 127, 1 Kbytes */
  333. #define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_TEST /* Start @ of user Flash area */
  334. #define FLASH_USER_END_ADDR ADDR_FLASH_PAGE_TEST + ((uint32_t)0x0000FFFF) /* End @ of user Flash area */
  335. void Flash_RGB_Data_Write(uint32_t Addr,uint8_t* data){
  336. uint16_t temp_Red = 0,temp_Green = 0,temp_Blue = 0;
  337. temp_Red = ((data[blucell_red_H] << 8) |data[blucell_red_L]); //R
  338. temp_Green= ((data[blucell_green_H] << 8) |data[blucell_green_L]); //G
  339. temp_Blue = ((data[blucell_blue_H] << 8) |data[blucell_blue_L]); //B
  340. HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Addr + 0 , (uint16_t)temp_Red);
  341. HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Addr + 2 , (uint16_t)temp_Green);
  342. HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD,Addr + 4 , (uint16_t)temp_Blue);
  343. }
  344. void Flash_write(uint8_t* data) // 쓰기함수
  345. {
  346. /*Variable used for Erase procedure*/
  347. // static FLASH_EraseInitTypeDef EraseInitStruct;
  348. uint32_t Address = 0;//, PAGEError = 0;
  349. /* Fill EraseInit structure*/
  350. // EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  351. // EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;
  352. // EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;
  353. Address = START_ADDR;
  354. __HAL_RCC_TIM7_CLK_DISABLE(); // 매인타이머를 정지합니다
  355. HAL_FLASH_Unlock(); // lock 풀기
  356. // if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK){
  357. // printf("Erase Failed \r\n");
  358. // }else{
  359. // printf("Erase Success \r\n");
  360. // }
  361. switch(data[blucell_dstid]){
  362. case 1:
  363. Address += 0;
  364. break;
  365. case 2:
  366. Address += 6;
  367. break;
  368. case 3:
  369. Address += 12;
  370. break;
  371. case 4:
  372. Address += 18;
  373. break;
  374. case 5:
  375. Address += 24;
  376. break;
  377. case 6:
  378. Address += 30;
  379. break;
  380. case 7:
  381. Address += 36;
  382. break;
  383. case 8:
  384. Address += 42;
  385. break;
  386. }
  387. Flash_RGB_Data_Write(Address,&data[blucell_stx]);
  388. HAL_FLASH_Lock(); // lock 잠그기
  389. __HAL_RCC_TIM7_CLK_ENABLE(); // 매인타이머를 재시작합니다
  390. }
  391. void Flash_InitRead(void) // 쓰기함수
  392. {
  393. uint32_t Address = 0;
  394. Address = StartAddr;
  395. for(uint8_t i = 1; i <= 8; i++ ){
  396. RGB_SensorRedLimit_Buf[i] = (*(uint16_t*)Address);
  397. // printf("%08x : %04X \n",Address ,*(uint16_t*)Address);
  398. Address += 2;
  399. RGB_SensorGreenLimit_Buf[i] = (*(uint16_t*)Address);
  400. // printf("%08x : %04X \n",Address ,*(uint16_t*)Address);
  401. Address += 2;
  402. RGB_SensorBlueLimit_Buf[i] = (*(uint16_t*)Address);
  403. // printf("%08x : %04X \n",Address ,*(uint16_t*)Address);
  404. Address += 2;
  405. }
  406. }
  407. #endif // PYJ.2019.03.19_END --
  408. SX1276_hw_t SX1276_hw;
  409. SX1276_t SX1276;
  410. int master;
  411. int ret;
  412. char buffer[64];
  413. int message;
  414. int message_length;
  415. /* USER CODE END 0 */
  416. /**
  417. * @brief The application entry point.
  418. * @retval int
  419. */
  420. int main(void)
  421. {
  422. /* USER CODE BEGIN 1 */
  423. uint8_t StatusRequest_data[RGB_SensorDataRequest_Length] = {0xbe,RGB_Status_Data_Request,RGB_SensorDataRequest_Length - 3,MyControllerID,SensorID,STH30_CreateCrc(&StatusRequest_data[blucell_type],StatusRequest_data[blucell_length]),0xeb};
  424. uint8_t IDAutoSetRequest_data[RGB_SensorIDAutoSetRequest_Length] = {0xbe,RGB_SensorID_SET,RGB_SensorIDAutoSetRequest_Length - 3,MyControllerID,SensorID,STH30_CreateCrc(&IDAutoSetRequest_data[blucell_type],IDAutoSetRequest_data[blucell_length]),0xeb};
  425. uint8_t temp_sensorid = 0;
  426. uint8_t uartdatarecv= 0;
  427. /* USER CODE END 1 */
  428. /* MCU Configuration--------------------------------------------------------*/
  429. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  430. HAL_Init();
  431. /* USER CODE BEGIN Init */
  432. /* USER CODE END Init */
  433. /* Configure the system clock */
  434. SystemClock_Config();
  435. /* USER CODE BEGIN SysInit */
  436. /* USER CODE END SysInit */
  437. /* Initialize all configured peripherals */
  438. MX_GPIO_Init();
  439. MX_TIM6_Init();
  440. MX_USART1_UART_Init();
  441. MX_USART2_UART_Init();
  442. MX_I2C2_Init();
  443. /* Initialize interrupts */
  444. MX_NVIC_Init();
  445. /* USER CODE BEGIN 2 */
  446. HAL_TIM_Base_Start_IT(&htim6);
  447. HAL_UART_Receive_IT(&huart1, &rx1_data[0],1);
  448. HAL_UART_Receive_IT(&huart2, &rx2_data[0],1);
  449. setbuf(stdout, NULL); // \n 을 적을 떄만
  450. #if 1 // PYJ.2019.03.04_BEGIN --
  451. printf("****************************************\r\n");
  452. printf("RGB Project\r\n");
  453. printf("Build at %s %s\r\n", __DATE__, __TIME__);
  454. printf("Copyright (c) 2019. BLUECELL\r\n");
  455. printf("****************************************\r\n");
  456. #endif // PYJ.2019.03.04_END --
  457. RGB_SensorIDAutoSet(1);
  458. Flash_InitRead();
  459. /* USER CODE END 2 */
  460. /* Infinite loop */
  461. /* USER CODE BEGIN WHILE */
  462. //initialize LoRa module
  463. SX1276_hw.dio0.port = SX1276_DIO0_GPIO_Port;
  464. SX1276_hw.dio0.pin = SX1276_DIO0_Pin;
  465. SX1276_hw.nss.port = GPIOA;
  466. SX1276_hw.nss.pin = GPIO_PIN_15;
  467. SX1276_hw.reset.port = SX1276_RESET_GPIO_Port;
  468. SX1276_hw.reset.pin = SX1276_RESET_Pin;
  469. // SX1276_hw.spi = &hspi3;
  470. SX1276.hw = &SX1276_hw;
  471. printf("Configuring LoRa module\r\n");
  472. SX1276_begin(&SX1276, SX1276_917MHZ, SX1276_POWER_17DBM, SX1276_LORA_SF_8,
  473. SX1276_LORA_BW_20_8KHZ, 10);
  474. printf("Done configuring LoRaModule\r\n");
  475. if (master == 1) {
  476. ret = SX1276_LoRaEntryTx(&SX1276, 16, 2000);
  477. } else {
  478. ret = SX1276_LoRaEntryRx(&SX1276, 16, 2000);
  479. }
  480. while (1)
  481. {
  482. #if 1 // PYJ.2019.04.11_BEGIN --
  483. uartdatarecv = UartDataRecvGet();
  484. if(uartdatarecv != 0){
  485. if(uartdatarecv == 1){
  486. Uart_dataCheck(&count_in1);
  487. }else if(uartdatarecv == 2){
  488. Uart_dataCheck(&count_in2);
  489. }
  490. UartDataRecvSet(0);
  491. }
  492. #else
  493. #if 0 // PYJ.2019.04.13_BEGIN --
  494. if (master == 1) {
  495. message_length = sprintf(buffer, "Hello %d", message);
  496. ret = SX1276_LoRaEntryTx(&SX1276, message_length, 2000);
  497. ret = SX1276_LoRaTxPacket(&SX1276, (uint8_t *) buffer, message_length,
  498. 2000);
  499. message += 1;
  500. printf("Transmission: %d\r\n", ret);
  501. } else {
  502. ret = SX1276_LoRaRxPacket(&SX1276);
  503. printf("Received: %d\r\n", ret);
  504. if (ret > 0) {
  505. SX1276_read(&SX1276, (uint8_t *) buffer, ret);
  506. printf("Content (%d): %s\r\n", ret, buffer);
  507. }
  508. }
  509. #endif // PYJ.2019.04.13_END --
  510. UartDataBufferCheck();
  511. if(UartDataRecvGet() >= 1 && UartTimerCnt > 100){
  512. Uart_dataCheck(USART1_CNT,&count_in1);
  513. }
  514. #endif // PYJ.2019.04.11_END --
  515. else{
  516. if(LedTimerCnt > 500){
  517. if(RGB_SensorIDAutoGet() == 1){
  518. if(SensorID == 0){memset(&SensorID_buf[0],0x00,8);SensorID_Cnt = 0;}
  519. IDAutoSetRequest_data[blucell_srcid + 1] = ++SensorID;//DST ID
  520. if(IDAutoSetRequest_data[blucell_srcid + 1] > 8){
  521. RGB_SensorIDAutoSet(0);
  522. RGB_Sensor_PowerOnOff(0);
  523. SensorID = 0;
  524. }else{
  525. RGB_Sensor_PowerOnOff(IDAutoSetRequest_data[4]);
  526. HAL_Delay(1500);
  527. RGB_Controller_Func(&IDAutoSetRequest_data[blucell_stx]);
  528. HAL_Delay(500);
  529. }
  530. }
  531. else{
  532. StatusRequest_data[blucell_srcid + 1] = SensorID_buf[temp_sensorid++];
  533. if(temp_sensorid > (SensorID_Cnt)){
  534. temp_sensorid = 0;
  535. }
  536. RGB_Controller_Func(&StatusRequest_data[blucell_stx]);
  537. }
  538. HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_15);
  539. LedTimerCnt = 0;
  540. }
  541. }
  542. /* USER CODE END WHILE */
  543. /* USER CODE BEGIN 3 */
  544. }
  545. /* USER CODE END 3 */
  546. }
  547. /**
  548. * @brief System Clock Configuration
  549. * @retval None
  550. */
  551. void SystemClock_Config(void)
  552. {
  553. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  554. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  555. /**Initializes the CPU, AHB and APB busses clocks
  556. */
  557. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  558. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  559. RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  560. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  561. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  562. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  563. RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
  564. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  565. {
  566. Error_Handler();
  567. }
  568. /**Initializes the CPU, AHB and APB busses clocks
  569. */
  570. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  571. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  572. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  573. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  574. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  575. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  576. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  577. {
  578. Error_Handler();
  579. }
  580. }
  581. /**
  582. * @brief NVIC Configuration.
  583. * @retval None
  584. */
  585. static void MX_NVIC_Init(void)
  586. {
  587. /* USART2_IRQn interrupt configuration */
  588. HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
  589. HAL_NVIC_EnableIRQ(USART2_IRQn);
  590. /* USART1_IRQn interrupt configuration */
  591. HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
  592. HAL_NVIC_EnableIRQ(USART1_IRQn);
  593. /* TIM6_IRQn interrupt configuration */
  594. HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
  595. HAL_NVIC_EnableIRQ(TIM6_IRQn);
  596. }
  597. /**
  598. * @brief I2C2 Initialization Function
  599. * @param None
  600. * @retval None
  601. */
  602. static void MX_I2C2_Init(void)
  603. {
  604. /* USER CODE BEGIN I2C2_Init 0 */
  605. /* USER CODE END I2C2_Init 0 */
  606. /* USER CODE BEGIN I2C2_Init 1 */
  607. /* USER CODE END I2C2_Init 1 */
  608. hi2c2.Instance = I2C2;
  609. hi2c2.Init.ClockSpeed = 100000;
  610. hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
  611. hi2c2.Init.OwnAddress1 = 0;
  612. hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  613. hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  614. hi2c2.Init.OwnAddress2 = 0;
  615. hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  616. hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  617. if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  618. {
  619. Error_Handler();
  620. }
  621. /* USER CODE BEGIN I2C2_Init 2 */
  622. /* USER CODE END I2C2_Init 2 */
  623. }
  624. /**
  625. * @brief TIM6 Initialization Function
  626. * @param None
  627. * @retval None
  628. */
  629. static void MX_TIM6_Init(void)
  630. {
  631. /* USER CODE BEGIN TIM6_Init 0 */
  632. /* USER CODE END TIM6_Init 0 */
  633. TIM_MasterConfigTypeDef sMasterConfig = {0};
  634. /* USER CODE BEGIN TIM6_Init 1 */
  635. /* USER CODE END TIM6_Init 1 */
  636. htim6.Instance = TIM6;
  637. htim6.Init.Prescaler = 1600-1;
  638. htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  639. htim6.Init.Period = 10-1;
  640. htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  641. if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  642. {
  643. Error_Handler();
  644. }
  645. sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  646. sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  647. if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  648. {
  649. Error_Handler();
  650. }
  651. /* USER CODE BEGIN TIM6_Init 2 */
  652. /* USER CODE END TIM6_Init 2 */
  653. }
  654. /**
  655. * @brief USART1 Initialization Function
  656. * @param None
  657. * @retval None
  658. */
  659. static void MX_USART1_UART_Init(void)
  660. {
  661. /* USER CODE BEGIN USART1_Init 0 */
  662. /* USER CODE END USART1_Init 0 */
  663. /* USER CODE BEGIN USART1_Init 1 */
  664. /* USER CODE END USART1_Init 1 */
  665. huart1.Instance = USART1;
  666. huart1.Init.BaudRate = 115200;
  667. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  668. huart1.Init.StopBits = UART_STOPBITS_1;
  669. huart1.Init.Parity = UART_PARITY_NONE;
  670. huart1.Init.Mode = UART_MODE_TX_RX;
  671. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  672. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  673. if (HAL_UART_Init(&huart1) != HAL_OK)
  674. {
  675. Error_Handler();
  676. }
  677. /* USER CODE BEGIN USART1_Init 2 */
  678. /* USER CODE END USART1_Init 2 */
  679. }
  680. /**
  681. * @brief USART2 Initialization Function
  682. * @param None
  683. * @retval None
  684. */
  685. static void MX_USART2_UART_Init(void)
  686. {
  687. /* USER CODE BEGIN USART2_Init 0 */
  688. /* USER CODE END USART2_Init 0 */
  689. /* USER CODE BEGIN USART2_Init 1 */
  690. /* USER CODE END USART2_Init 1 */
  691. huart2.Instance = USART2;
  692. huart2.Init.BaudRate = 115200;
  693. huart2.Init.WordLength = UART_WORDLENGTH_8B;
  694. huart2.Init.StopBits = UART_STOPBITS_1;
  695. huart2.Init.Parity = UART_PARITY_NONE;
  696. huart2.Init.Mode = UART_MODE_TX_RX;
  697. huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  698. huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  699. if (HAL_UART_Init(&huart2) != HAL_OK)
  700. {
  701. Error_Handler();
  702. }
  703. /* USER CODE BEGIN USART2_Init 2 */
  704. /* USER CODE END USART2_Init 2 */
  705. }
  706. /**
  707. * @brief GPIO Initialization Function
  708. * @param None
  709. * @retval None
  710. */
  711. static void MX_GPIO_Init(void)
  712. {
  713. GPIO_InitTypeDef GPIO_InitStruct = {0};
  714. /* GPIO Ports Clock Enable */
  715. __HAL_RCC_GPIOC_CLK_ENABLE();
  716. __HAL_RCC_GPIOD_CLK_ENABLE();
  717. __HAL_RCC_GPIOA_CLK_ENABLE();
  718. __HAL_RCC_GPIOB_CLK_ENABLE();
  719. /*Configure GPIO pin Output Level */
  720. HAL_GPIO_WritePin(GPIOC, BOOT_LED_Pin|SX1276_DIO4_Pin|SX1276_DIO5_Pin|SENSOR_EN4_Pin
  721. |SENSOR_EN5_Pin|SENSOR_EN6_Pin|SENSOR_EN7_Pin|LED_CH1_Pin
  722. |LED_CH2_Pin|LED_CH3_Pin, GPIO_PIN_RESET);
  723. /*Configure GPIO pin Output Level */
  724. HAL_GPIO_WritePin(GPIOA, SX1276_DIO0_Pin|SX1276_DIO1_Pin|SX1276_DIO2_Pin|SX1276_DIO3_Pin
  725. |SENSOR_EN8_Pin|SX1276_NSS_Pin, GPIO_PIN_RESET);
  726. /*Configure GPIO pin Output Level */
  727. HAL_GPIO_WritePin(GPIOB, SX1276_RESET_Pin|LED_ALARM_Pin|SENSOR_EN1_Pin|SENSOR_EN2_Pin
  728. |SENSOR_EN3_Pin|SX1276_CLK_Pin|SX1276_MOSI_Pin|LED_CH5_Pin
  729. |LED_CH6_Pin|LED_CH7_Pin|LED_CH8_Pin, GPIO_PIN_RESET);
  730. /*Configure GPIO pin Output Level */
  731. HAL_GPIO_WritePin(LED_CH4_GPIO_Port, LED_CH4_Pin, GPIO_PIN_RESET);
  732. /*Configure GPIO pins : BOOT_LED_Pin SX1276_DIO4_Pin SX1276_DIO5_Pin SENSOR_EN4_Pin
  733. SENSOR_EN5_Pin SENSOR_EN6_Pin SENSOR_EN7_Pin LED_CH1_Pin
  734. LED_CH2_Pin LED_CH3_Pin */
  735. GPIO_InitStruct.Pin = BOOT_LED_Pin|SX1276_DIO4_Pin|SX1276_DIO5_Pin|SENSOR_EN4_Pin
  736. |SENSOR_EN5_Pin|SENSOR_EN6_Pin|SENSOR_EN7_Pin|LED_CH1_Pin
  737. |LED_CH2_Pin|LED_CH3_Pin;
  738. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  739. GPIO_InitStruct.Pull = GPIO_NOPULL;
  740. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  741. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  742. /*Configure GPIO pins : SX1276_DIO0_Pin SX1276_DIO1_Pin SX1276_DIO2_Pin SX1276_DIO3_Pin
  743. SENSOR_EN8_Pin SX1276_NSS_Pin */
  744. GPIO_InitStruct.Pin = SX1276_DIO0_Pin|SX1276_DIO1_Pin|SX1276_DIO2_Pin|SX1276_DIO3_Pin
  745. |SENSOR_EN8_Pin|SX1276_NSS_Pin;
  746. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  747. GPIO_InitStruct.Pull = GPIO_NOPULL;
  748. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  749. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  750. /*Configure GPIO pins : SX1276_RESET_Pin LED_ALARM_Pin SENSOR_EN1_Pin SENSOR_EN2_Pin
  751. SENSOR_EN3_Pin SX1276_CLK_Pin SX1276_MOSI_Pin LED_CH5_Pin
  752. LED_CH6_Pin LED_CH7_Pin LED_CH8_Pin */
  753. GPIO_InitStruct.Pin = SX1276_RESET_Pin|LED_ALARM_Pin|SENSOR_EN1_Pin|SENSOR_EN2_Pin
  754. |SENSOR_EN3_Pin|SX1276_CLK_Pin|SX1276_MOSI_Pin|LED_CH5_Pin
  755. |LED_CH6_Pin|LED_CH7_Pin|LED_CH8_Pin;
  756. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  757. GPIO_InitStruct.Pull = GPIO_NOPULL;
  758. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  759. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  760. /*Configure GPIO pin : LED_CH4_Pin */
  761. GPIO_InitStruct.Pin = LED_CH4_Pin;
  762. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  763. GPIO_InitStruct.Pull = GPIO_NOPULL;
  764. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  765. HAL_GPIO_Init(LED_CH4_GPIO_Port, &GPIO_InitStruct);
  766. /*Configure GPIO pin : SX1276_MISO_Pin */
  767. GPIO_InitStruct.Pin = SX1276_MISO_Pin;
  768. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  769. GPIO_InitStruct.Pull = GPIO_NOPULL;
  770. HAL_GPIO_Init(SX1276_MISO_GPIO_Port, &GPIO_InitStruct);
  771. }
  772. /* USER CODE BEGIN 4 */
  773. /* USER CODE END 4 */
  774. /**
  775. * @brief This function is executed in case of error occurrence.
  776. * @retval None
  777. */
  778. void Error_Handler(void)
  779. {
  780. /* USER CODE BEGIN Error_Handler_Debug */
  781. /* User can add his own implementation to report the HAL error return state */
  782. /* USER CODE END Error_Handler_Debug */
  783. }
  784. #ifdef USE_FULL_ASSERT
  785. /**
  786. * @brief Reports the name of the source file and the source line number
  787. * where the assert_param error has occurred.
  788. * @param file: pointer to the source file name
  789. * @param line: assert_param error line source number
  790. * @retval None
  791. */
  792. void assert_failed(uint8_t *file, uint32_t line)
  793. {
  794. /* USER CODE BEGIN 6 */
  795. /* User can add his own implementation to report the file name and line number,
  796. tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  797. /* USER CODE END 6 */
  798. }
  799. #endif /* USE_FULL_ASSERT */
  800. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/