bt_6701_commands.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. /********************************* (C) РОТЕК ***********************************
  2. * @module bt_6701_commands
  3. * @file bt_6701_commands.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief bt_6701_commands
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
  10. *******************************************************************************
  11. */
  12. #include "common_config.h"
  13. #include "stm32f4xx.h"
  14. #include "bt_6701_commands.h"
  15. #include "commands_api.h"
  16. #include "gpio.h"
  17. #include "buttons.h"
  18. #include "led.h"
  19. #include "netconf.h"
  20. #include "stm32f4x7_eth_bsp.h"
  21. #include "http_server.h"
  22. #include "rtc.h"
  23. #include "sntp_api.h"
  24. #include "d_inouts.h"
  25. #include "config_service.h"
  26. #include "usart.h"
  27. #include "spi_flash.h"
  28. #include "FreeRTOS.h"
  29. #include "task.h"
  30. #include "lwip/opt.h"
  31. #include "lwip/api.h"
  32. #include "lwip/sys.h"
  33. #ifdef PRINTF_STDLIB
  34. #include <stdio.h>
  35. #endif
  36. #ifdef PRINTF_CUSTOM
  37. #include "tinystdio.h"
  38. #endif
  39. #include <string.h>
  40. bool ntpResult = false;
  41. uint32_t SNTP_Time;
  42. extern uint8_t DefCounter;
  43. extern BUTTON_NO_FIX_t defButton;
  44. extern uint8_t SetCounter;
  45. extern BUTTON_NO_FIX_t setButton;
  46. /**
  47. * @brief Флаг ининциализации Eth интерфейса
  48. */
  49. extern unsigned char eth_ready_flag;
  50. static bool test_pair_pins(void);
  51. static void set_pin_as_output(GPIO_TypeDef *port, uint8_t pin);
  52. static void set_pin_as_input(GPIO_TypeDef *port, uint8_t pin);
  53. // -------------------------------------------------------------------------- //
  54. // __weak функции
  55. /**
  56. * @brief
  57. */
  58. void TestProcessing(void)
  59. {
  60. vTaskDelay(200);
  61. }
  62. /**
  63. * @brief
  64. */
  65. void Test_U232(void)
  66. {
  67. // Отправляем символы в RS232
  68. for (uint16_t i = 0; i < 1023; i++)
  69. ups_putchar('A');
  70. vTaskDelay(10);
  71. for (uint16_t i = 0; i < 1023; i++)
  72. {
  73. if (ups_getchar(500) != 'A') {
  74. printf("U232 FAIL\r\n");
  75. TEST_SetTest(TEST_WAIT);
  76. return;
  77. }
  78. }
  79. printf("U232 OK\r\n");
  80. TEST_SetTest(TEST_WAIT);
  81. }
  82. #ifdef DALLAS_SENSOR_ENABLE
  83. void COM_TestOW(void)
  84. {
  85. uint8_t inputState;
  86. uint8_t start_state = 0;
  87. uint8_t end_state = 1;
  88. gpio_hw_config_pin(gpio_pins[WDATA1].port, gpio_pins[WDATA1].pin, GPIO_MODE_IN_CFG |
  89. GPIO_SPEED_HIGH_CFG);
  90. gpio_hw_config_pin(gpio_pins[WDATA2].port, gpio_pins[WDATA2].pin, GPIO_MODE_IN_CFG |
  91. GPIO_SPEED_HIGH_CFG);
  92. for (uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) {
  93. vTaskDelay(100);
  94. gpio_set((DOUT1 + i), start_state);
  95. vTaskDelay(100);
  96. if (get_state_din_outs((WDATA1 + i)) != start_state) {
  97. printf("OW FAIL\r\n");
  98. TEST_SetTest(TEST_WAIT);
  99. return;
  100. }
  101. gpio_set((DOUT1 + i), end_state);
  102. vTaskDelay(100);
  103. if (get_state_din_outs((WDATA1 + i)) != end_state) {
  104. printf("OW FAIL\r\n");
  105. TEST_SetTest(TEST_WAIT);
  106. return;
  107. }
  108. }
  109. vTaskDelay(100);
  110. printf("OW OK\r\n");
  111. TEST_SetTest(TEST_WAIT);
  112. }
  113. #endif
  114. #ifdef DINS_ENABLE || DOUTS_ENABLE
  115. /**
  116. * @brief
  117. */
  118. void Test_DRY(void)
  119. {
  120. uint8_t inputState;
  121. uint8_t start_state = 0;
  122. uint8_t end_state = 1;
  123. #ifdef DOUTS_ENABLE
  124. #if defined RELAY_NC
  125. start_state = 0;
  126. end_state = 1;
  127. for (uint8_t i = 0; i < OUTPUTS_TOTAL_COUNT; i ++) {
  128. set_state_douts((DOUT1 + i), 1);
  129. }
  130. #endif
  131. #ifdef RELAY_NO
  132. start_state = 1;
  133. end_state = 0;
  134. #endif
  135. for (uint8_t i = 0; i < OUTPUTS_TOTAL_COUNT; i ++) {
  136. #ifdef HARDWARE_BT6703
  137. if(i == 2) { // функционал определяющий аппаратную часть контроллера BT-6703 (выпущено 120 шт. переделанных из BT-6702, различия в релейных выходах)
  138. break;
  139. }
  140. #endif
  141. vTaskDelay(100);
  142. inputState = get_state_din_outs(DIN1);
  143. set_state_douts((DOUT1 + i), start_state);
  144. vTaskDelay(100);
  145. if (get_state_din_outs(DIN1) == inputState) {
  146. #ifdef HARDWARE_BT6703
  147. if(i == 0) {
  148. set_state_douts((DOUT1 + 2), start_state);
  149. vTaskDelay(100);
  150. if (get_state_din_outs(DIN1) == inputState) {
  151. printf("DRY FAIL\r\n");
  152. TEST_SetTest(TEST_WAIT);
  153. return;
  154. }
  155. } else
  156. #endif
  157. {
  158. printf("DRY FAIL\r\n");
  159. TEST_SetTest(TEST_WAIT);
  160. return;
  161. }
  162. }
  163. set_state_douts((DOUT1 + i), end_state);
  164. vTaskDelay(100);
  165. if (get_state_din_outs(DIN1) != inputState) {
  166. #ifdef HARDWARE_BT6703
  167. if(i == 0) {
  168. set_state_douts((DOUT1 + 2), end_state);
  169. vTaskDelay(100);
  170. if (get_state_din_outs(DIN1) == inputState) {
  171. printf("DRY FAIL\r\n");
  172. TEST_SetTest(TEST_WAIT);
  173. return;
  174. }
  175. } else
  176. #endif
  177. {
  178. printf("DRY FAIL\r\n");
  179. TEST_SetTest(TEST_WAIT);
  180. return;
  181. }
  182. }
  183. }
  184. #else
  185. for (uint8_t i = 0; i < INPUTS_TOTAL_COUNT; i ++) {
  186. vTaskDelay(100);
  187. gpio_set((DOUT1 + i), start_state);
  188. vTaskDelay(100);
  189. if (get_state_din_outs((DIN1 + i)) != start_state) {
  190. printf("DRY FAIL\r\n");
  191. TEST_SetTest(TEST_WAIT);
  192. return;
  193. }
  194. gpio_set((DOUT1 + i), end_state);
  195. vTaskDelay(100);
  196. if (get_state_din_outs((DIN1 + i)) != end_state) {
  197. printf("DRY FAIL\r\n");
  198. TEST_SetTest(TEST_WAIT);
  199. return;
  200. }
  201. }
  202. #endif
  203. vTaskDelay(100);
  204. printf("DRY OK\r\n");
  205. TEST_SetTest(TEST_WAIT);
  206. }
  207. #endif
  208. /**
  209. * @brief
  210. */
  211. void vTest_DEF(void *params)
  212. {
  213. static uint32_t timeout = 0;
  214. for (;;)
  215. {
  216. if (timeout++ > BUTTON_TIMEOUT) {
  217. timeout = 0;
  218. DefCounter = 0;
  219. #ifdef LED_INIT_ERR
  220. LED_Off(LED_INIT_ERR);
  221. #endif
  222. #ifdef LED_ALARM
  223. LED_Off(LED_ALARM);
  224. #endif
  225. #ifdef LED_RED_MINOR
  226. LED_Off(LED_RED_MINOR);
  227. #endif
  228. printf("DEF FAIL\r\n");
  229. TEST_SetTest(TEST_WAIT);
  230. ifTest_DEF = false;
  231. vTaskDelete(NULL);
  232. }
  233. BUTTON_NoFixHandler(&defButton);
  234. if (DefCounter == 3)
  235. {
  236. timeout = 0;
  237. DefCounter = 0;
  238. printf("DEF OK\r\n");
  239. /* Завершение теста T0 */
  240. /* Устанавливаем статус T0READY, сохраняем статус во флеш */
  241. COM_SetTestState(T0READY);
  242. TEST_SetTest(TEST_WAIT);
  243. ifTest_DEF = false;
  244. vTaskDelete(NULL);
  245. }
  246. vTaskDelay(10);
  247. }
  248. }
  249. /**
  250. * @brief
  251. */
  252. void vTest_SET(void *params)
  253. {
  254. static uint32_t timeout_set = 0;
  255. for (;;)
  256. {
  257. if (timeout_set++ > BUTTON_TIMEOUT) {
  258. timeout_set = 0;
  259. SetCounter = 0;
  260. #ifdef LED_INIT_OK
  261. LED_Off(LED_INIT_OK);
  262. #endif
  263. #ifdef LED_GREEN_MINOR
  264. LED_Off(LED_GREEN_MINOR);
  265. #endif
  266. printf("SET FAIL\r\n");
  267. TEST_SetTest(TEST_WAIT);
  268. ifTest_SET = false;
  269. vTaskDelete(NULL);
  270. }
  271. BUTTON_NoFixHandler(&setButton);
  272. if (SetCounter == 3)
  273. {
  274. timeout_set = 0;
  275. SetCounter = 0;
  276. printf("SET OK\r\n");
  277. /* Завершение теста T0 */
  278. /* Устанавливаем статус T0READY, сохраняем статус во флеш */
  279. COM_SetTestState(T0READY);
  280. TEST_SetTest(TEST_WAIT);
  281. ifTest_SET = false;
  282. vTaskDelete(NULL);
  283. }
  284. vTaskDelay(10);
  285. }
  286. }
  287. /**
  288. * @brief Тестирование RTC
  289. */
  290. void COM_TestRtc(void)
  291. {
  292. /* Пытаемся синхронизироваться с NTP сервером */
  293. SNTP_Enable(true);
  294. SNTP_Poll();
  295. vTaskDelay(1000);
  296. /* Синхронизация удалась */
  297. if (ntpResult) {
  298. printf("RTC OK\r\n");
  299. }
  300. else
  301. printf("RTC FAIL SYNC\r\n");
  302. TEST_SetTest(TEST_WAIT);
  303. }
  304. /**
  305. * @brief Тестирование SPIFLASH
  306. */
  307. void COM_TestSPIflash(void)
  308. {
  309. if (spi_flash_test()) {
  310. printf("SPIFLASH OK\r\n");
  311. }
  312. else
  313. printf("SPIFLASH FAIL SYNC\r\n");
  314. TEST_SetTest(TEST_WAIT);
  315. }
  316. /**
  317. * @brief
  318. */
  319. void Test_Ethernet(void)
  320. {
  321. static bool ethernetInit = false;
  322. int timeout = 100; /* 10 sec timeout */
  323. // if (ethernetInit == false)
  324. {
  325. if (eth_ready_flag == 0) {
  326. if(!ethernetInit){
  327. ethernetInit = true;
  328. ETH_BSP_Config();
  329. LwIP_Init();
  330. }
  331. else{
  332. init_get_ip_address_controller();
  333. }
  334. }
  335. /* Waiting ETH init */
  336. while ((eth_ready_flag == 0) && (timeout-- > 0)) {
  337. vTaskDelay(100);
  338. }
  339. if (eth_ready_flag == 0) {
  340. printf("ETH FAIL\r\n");
  341. }
  342. else {
  343. sys_thread_new("HTTP", vTaskTcpServer, NULL, 4*configMINIMAL_STACK_SIZE, tskIDLE_PRIORITY);
  344. ethernetInit = true;
  345. }
  346. }
  347. /* else {
  348. printf("ETH OK\r\n");
  349. }*/
  350. TEST_SetTest(TEST_WAIT);
  351. }
  352. /**
  353. * @brief
  354. */
  355. void Test_Serno(void)
  356. {
  357. macWaiting = true;
  358. macIsInstalled = false;
  359. // Устанавливаем статус тестирования "T1OK"
  360. COM_SetTestState(T0OK);
  361. // Отправляем udp пакет с информацией
  362. //COM_TestSerno();
  363. // Пауза. В это время должен прийти GET запрос с MAC адресом.
  364. //vTaskDelay(8000);
  365. //macWaiting = false;
  366. //if (!macIsInstalled)
  367. // printf("SERNO FAIL\r\n");
  368. for (uint8_t i = 0; i < 4; i++)
  369. {
  370. // Отправляем udp пакет с информацией
  371. COM_TestSerno();
  372. // Пауза. В это время должен прийти GET запрос с MAC адресом.
  373. vTaskDelay(8000);
  374. if (macIsInstalled)
  375. break;
  376. }
  377. if (!macIsInstalled)
  378. printf("SERNO FAIL\r\n");
  379. TEST_SetTest(TEST_WAIT);
  380. }
  381. // -------------------------------------------------------------------------- //
  382. typedef struct
  383. {
  384. GPIO_TypeDef *first_port;
  385. uint16_t first_pin;
  386. GPIO_TypeDef *second_port;
  387. uint16_t second_pin;
  388. } pair_pin_t;
  389. typedef struct
  390. {
  391. GPIO_TypeDef *first_port;
  392. uint16_t first_pin;
  393. } single_pin_t;
  394. /*
  395. 1 - PE2 - не используется
  396. 2 - PE3 - не проверяем, не используется
  397. 3 - PE4 - не проверяем, не используется
  398. 4 - PE5 - не проверяем, не используется
  399. 5 - PE6 - проверять с PE5 и проверяем с VBAT (КЗ с +)
  400. 6 - VBAT - не проверяем
  401. 7 - PC13 - не проверяем, не используется
  402. 8 - OSC_IN - не проверяем
  403. 9 - OSC_OUT - не проверяем
  404. 10 - VSS - не проверяем
  405. 11 - VDD - не проверяем
  406. 12 - OSC_IN - не проверяем
  407. 13 - OSC_OUT - не проверяем, не используется
  408. 14 - PE3 - NRST - не проверяем
  409. 15 - PC0 - не проверяем, не используется
  410. 16 - PC1 - не проверяем ethernet phy
  411. 17 - PC0 - не проверяем, не используется
  412. 18 - PC0 - не проверяем, не используется
  413. 19 - VDD - не проверяем
  414. 20 - VSSA - не проверяем
  415. 21 - VREF - не проверяем
  416. 22 - VDDA - не проверяем
  417. 23 - PA0 - проверяем с 22 (КЗ с +)
  418. 24 - PA1 - не проверяем ethernet phy
  419. 25 - PA2 - не проверяем ethernet phy
  420. 26 - PA3 - проверяем с 27 (КЗ с -)
  421. 27 - VSS - не проверяем
  422. 28 - VDD - не проверяем
  423. 29 - PA4 - проверяем с 28 (кз с +), проверяем с 30
  424. 30 - PA5 - проверяем с 29, проверяем с 31
  425. 31 - PA6 - не проверяем, не используется
  426. 32 - PA7 - не проверяем ethernet phy
  427. 33 - PС4 - не проверяем ethernet phy
  428. 34 - PС5 - не проверяем ethernet phy
  429. 35 - PB0 - не проверяем, не используется
  430. 36 - PB1 - не проверяем, не используется
  431. 37 - PB2 - BOOT1 - не проверяем
  432. 38 - PE7 - не проверяем, там всегда +
  433. 39 - PE8 - не проверяем, не используется
  434. 40 - PE9 - не проверяем, не используется
  435. 41 - PE10 - не проверяем, не используется
  436. 42 - PE11 - не проверяем, не получится
  437. 43 - PE12 - не проверяем, не получится
  438. 44 - PE13 - не проверяем ethernet phy
  439. 45 - PE14 - не проверяем, не используется
  440. 46 - PE15 - проверяем с 47
  441. 47 - PB10 - проверяем с 46
  442. 48 - PB11 - не проверяем ethernet phy
  443. 49 - Vcap1 - не проверяем
  444. 50 - VDD - не проверяем
  445. 51 - PB12 - не проверяем ethernet phy
  446. 52 - PB13 - не проверяем ethernet phy
  447. 53 - PB14 - проверяем с 54 (но 53 должен быть только входом)
  448. 54 - PB15 - проверяем с 53 (54 - как вход)
  449. 55 - PD8 - не проверяем, не используется
  450. 56 - PD9 - не проверяем, не используется
  451. 57 - PD10 - не проверяем, не используется
  452. 58 - PD11 - не проверяем, не используется
  453. 59 - PD12 - не проверяем, не используется
  454. 60 - PD13 - не проверяем, не используется
  455. 61 - PD14 - не проверяем
  456. 62 - PD15 - не проверяем
  457. 63 - PС6 - не проверяем, не используется
  458. 64 - PC7 - не проверяем, не используется
  459. 65 - PC8 - не проверяем, не используется
  460. 66 - PC9 - не проверяем, не используется
  461. 67 - PA8 - не проверяем, не используется
  462. 68 - PA9 - не проверяем, это DEBUG UART
  463. 69 - PA10 - не проверяем, это DEBUG UART
  464. 70 - PA11 - не проверяем, не используется
  465. 71 - PA12 - не проверяем, не используется
  466. 72 - PA13 - SWDIO - не проверяем
  467. 73 - Vcap2 - не проверяем
  468. 74 - VSS - не проверяем
  469. 75 - VDD - не проверяем
  470. 76 - PA14 - SWCLK - не вроверяем
  471. 77 - PA15 - не проверяем, не используется
  472. 78 - PC10 - не проверяем, не используется
  473. 79 - PC11 - не проверяем, не используется
  474. 80 - PC12 - не проверяем, не используется
  475. 81 - PD0 - не проверяем, не используется
  476. 82 - PD1 - не проверяем, не используется
  477. 83 - PD2 - не проверяем, не используется
  478. 84 - PD3 - не проверяем, не используется
  479. 85 - PD4 - не проверяем, не используется
  480. 86 - PD5 - проверяем с 87
  481. 87 - PD6 - проверяем с 86
  482. 88 - PD7 - не проверяем, не используется
  483. 89 - PB3 - проверяем с 90
  484. 90 - PB4 - проверяем с 89, проверяем с 91
  485. 91 - PB5 - проверяем c 90, проверяем с 92
  486. 92 - PB6 - проверяем с 91
  487. 93 - PB7 - не проверяем, не используется
  488. 94 - BOOT0 - не проверяем
  489. 95 - PB8 - не проверяем, не используется
  490. 96 - PB9 - не проверям, т.к. соседние пины не используются
  491. 97 - PE0 - не проверяем, не используется
  492. 98 - PE1 - не проверяем, не используется
  493. 99 - VSS - не проверяем
  494. 100 - VDD - не проверяем
  495. */
  496. #define PAIR_PINS_SIZE 14
  497. pair_pin_t pins_with_pair[PAIR_PINS_SIZE] = {
  498. {GPIOE, GPIO_Pin_6, GPIOE, GPIO_Pin_5}, // проверить уровень на PE5
  499. {GPIOE, GPIO_Pin_2, GPIOE, GPIO_Pin_3}, /* 1 */ // 2, 3 - не тестировать, они не используются
  500. {GPIOE, GPIO_Pin_4, GPIOE, GPIO_Pin_5}, /* 2 */ // 4, 5 - не тестировать, они не используются
  501. {GPIOA, GPIO_Pin_4, GPIOA, GPIO_Pin_5}, /* 3 */ // 29, 30 - ОК
  502. {GPIOB, GPIO_Pin_2, GPIOE, GPIO_Pin_7}, /* 4 */ // 37, 38 - не будет работать
  503. {GPIOE, GPIO_Pin_11, GPIOE, GPIO_Pin_12}, /* 5 */ // 42, 43 - не получилось, это LED не будет работать, это LED не будем тестировать
  504. {GPIOE, GPIO_Pin_15, GPIOB, GPIO_Pin_10}, /* 6 */ // 46, 47 - OK
  505. {GPIOB, GPIO_Pin_13, GPIOB, GPIO_Pin_14}, /* 7 */ // 52, 53 - не получилось
  506. {GPIOB, GPIO_Pin_14, GPIOB, GPIO_Pin_15}, /* 8 */ // 53, 54 - не получилось
  507. {GPIOD, GPIO_Pin_14, GPIOD, GPIO_Pin_15}, /* 9 */ // 61, 62 - не будет работать
  508. {GPIOA, GPIO_Pin_9, GPIOA, GPIO_Pin_10}, /* 10 */ // 68, 69 - не тестировать, это DEBUG UART
  509. {GPIOD, GPIO_Pin_5, GPIOD, GPIO_Pin_6}, /* 11 */ // 86, 87 - OK
  510. {GPIOB, GPIO_Pin_3, GPIOB, GPIO_Pin_4}, /* 12 */ // 89, 90 - OK
  511. {GPIOB, GPIO_Pin_5, GPIOB, GPIO_Pin_6}, /* 13 */ // 91, 92 - OK
  512. {GPIOB, GPIO_Pin_8, GPIOB, GPIO_Pin_9}, /* 14 */ // 95, 96 - не получилось
  513. };
  514. #if 0
  515. pair_pin_t pins_with_pair[PAIR_PINS_SIZE] = {
  516. {GPIOE, GPIO_Pin_2, GPIOE, GPIO_Pin_3}, /* 1 */ // 2, 3 - не тестировать, они не используются
  517. {GPIOE, GPIO_Pin_4, GPIOE, GPIO_Pin_5}, /* 2 */ // 4, 5 - не тестировать, они не используются
  518. {GPIOA, GPIO_Pin_4, GPIOA, GPIO_Pin_5}, /* 3 */ // 29, 30 - ОК
  519. {GPIOB, GPIO_Pin_2, GPIOE, GPIO_Pin_7}, /* 4 */ // 37, 38 - не будет работать
  520. {GPIOE, GPIO_Pin_11, GPIOE, GPIO_Pin_12}, /* 5 */ // 42, 43 - не получилось, это LED не будет работать, это LED не будем тестировать
  521. {GPIOE, GPIO_Pin_15, GPIOB, GPIO_Pin_10}, /* 6 */ // 46, 47 - OK
  522. {GPIOB, GPIO_Pin_13, GPIOB, GPIO_Pin_14}, /* 7 */ // 52, 53 - не получилось
  523. {GPIOB, GPIO_Pin_14, GPIOB, GPIO_Pin_15}, /* 8 */ // 53, 54 - не получилось
  524. {GPIOD, GPIO_Pin_14, GPIOD, GPIO_Pin_15}, /* 9 */ // 61, 62 - не будет работать
  525. {GPIOA, GPIO_Pin_9, GPIOA, GPIO_Pin_10}, /* 10 */ // 68, 69 - не тестировать, это DEBUG UART
  526. {GPIOD, GPIO_Pin_5, GPIOD, GPIO_Pin_6}, /* 11 */ // 86, 87 - OK
  527. {GPIOB, GPIO_Pin_3, GPIOB, GPIO_Pin_4}, /* 12 */ // 89, 90 - OK
  528. {GPIOB, GPIO_Pin_5, GPIOB, GPIO_Pin_6}, /* 13 */ // 91, 92 - OK
  529. {GPIOB, GPIO_Pin_8, GPIOB, GPIO_Pin_9}, /* 14 */ // 95, 96 - не получилось
  530. };
  531. #endif
  532. uint8_t pair_pin_resut[PAIR_PINS_SIZE];
  533. // Возможно замыкание на линию питания. Эти пины проверяются отдельно.
  534. single_pin_t pins_with_power[] = {
  535. {GPIOA, GPIO_Pin_4}, // 29 - это LED не будем тестировать
  536. };
  537. // Возможно замыкание на землю. Эти пины проверяются отдельно.
  538. single_pin_t pins_with_ground[] = {
  539. {GPIOA, GPIO_Pin_3}, // 26 - это LED не будем тестировать
  540. };
  541. //
  542. void Test_Pins(void)
  543. {
  544. printf("\r\nThis is PINS test\r\n");
  545. //printf("Size of pair pins struct: %u\r\n", sizeof(pins_for_test)/16);
  546. //printf("Size of power pins struct: %u\r\n", sizeof(pins_with_power)/8);
  547. //printf("Size of ground pins struct: %u\r\n", sizeof(pins_with_ground)/8);
  548. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  549. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  550. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  551. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  552. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
  553. test_pair_pins();
  554. TEST_SetTest(TEST_WAIT);
  555. }
  556. //
  557. static bool test_pair_pins(void)
  558. {
  559. uint8_t res_1 = Bit_RESET;
  560. uint8_t res_2 = Bit_RESET;
  561. set_pin_as_input(GPIOE, GPIO_Pin_5);
  562. res_1 = GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_5);
  563. printf("PE_5 level: %u\r\n", res_1);
  564. #if 0
  565. for (int i = 0; i < PAIR_PINS_SIZE; i++)
  566. {
  567. set_pin_as_output(pins_with_pair[i].first_port, pins_with_pair[i].first_pin);
  568. set_pin_as_input(pins_with_pair[i].second_port, pins_with_pair[i].second_pin);
  569. GPIO_SetBits(pins_with_pair[i].first_port, pins_with_pair[i].first_pin);
  570. vTaskDelay(1);
  571. res_1 = GPIO_ReadInputDataBit(pins_with_pair[i].second_port, pins_with_pair[i].second_pin);
  572. GPIO_ResetBits(pins_with_pair[i].first_port, pins_with_pair[i].first_pin);
  573. vTaskDelay(1);
  574. res_2 = GPIO_ReadInputDataBit(pins_with_pair[i].second_port, pins_with_pair[i].second_pin);
  575. if (res_1 != res_2)
  576. pair_pin_resut[i] = 1;
  577. else
  578. pair_pin_resut[i] = 0;
  579. set_pin_as_input(pins_with_pair[i].first_port, pins_with_pair[i].first_pin);
  580. }
  581. #if 1
  582. // Вывод результата
  583. printf("Pair pin result:\r\n");
  584. for (int i = 0; i < PAIR_PINS_SIZE; i++) {
  585. printf("%u ", pair_pin_resut[i]);
  586. }
  587. printf("\r\n");
  588. printf("Port %X\r\n", GPIOA);
  589. #endif
  590. #endif
  591. }
  592. //
  593. static void set_pin_as_output(GPIO_TypeDef *port, uint8_t pin)
  594. {
  595. GPIO_InitTypeDef GPIO_InitStructure = {0};
  596. GPIO_InitStructure.GPIO_Pin = pin;
  597. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  598. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  599. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  600. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  601. GPIO_Init(port, &GPIO_InitStructure);
  602. }
  603. //
  604. static void set_pin_as_input(GPIO_TypeDef *port, uint8_t pin)
  605. {
  606. GPIO_InitTypeDef GPIO_InitStructure = {0};
  607. GPIO_InitStructure.GPIO_Pin = pin;
  608. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  609. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  610. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  611. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  612. GPIO_Init(port, &GPIO_InitStructure);
  613. }
  614. /********************************* (C) РОТЕК **********************************/