main.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. #include <string.h>
  2. #include "main.h"
  3. #include "cmsis_os.h"
  4. #include "data_types.h"
  5. #include "main_functions.h"
  6. #include "constants.h"
  7. #include "color.h"
  8. void SystemClock_Config(void);
  9. static void MX_GPIO_Init(void);
  10. void inferenceTask(void const *argument);
  11. void blinkTask(void const *argument);
  12. void UARTTask(void const *argument);
  13. osThreadId defaultTaskHandle;
  14. osThreadId UARTTaskHandle;
  15. osThreadId blinkTaskHandle;
  16. UART_HandleTypeDef UartHandle;
  17. void UARTTask(void const *argument)
  18. {
  19. char *hello_string = "Hello World\n";
  20. volatile HAL_StatusTypeDef err;
  21. while (1) {
  22. HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_SET);
  23. HAL_Delay(500);
  24. err = HAL_UART_Transmit(&UartHandle, (uint8_t *)hello_string,
  25. sizeof(hello_string) + 1,
  26. HAL_MAX_DELAY);
  27. if (err == HAL_OK)
  28. HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin,
  29. GPIO_PIN_RESET);
  30. HAL_Delay(500);
  31. }
  32. }
  33. void inferenceTask(void const *argument)
  34. {
  35. circle_t *tmp_circle;
  36. int count = 0;
  37. uint16_t screen_height = BSP_LCD_GetYSize();
  38. uint16_t screen_width = BSP_LCD_GetXSize();
  39. uint16_t x_pos, y_pos;
  40. setup();
  41. for (;;) {
  42. tmp_circle = loop();
  43. if (tmp_circle) {
  44. x_pos = (uint16_t)(tmp_circle->x * screen_width /
  45. (2 * PI));
  46. y_pos = (uint16_t)((screen_height / 2) +
  47. tmp_circle->y * screen_height / 2);
  48. BSP_LCD_FillCircle(x_pos, y_pos, tmp_circle->size);
  49. }
  50. count++;
  51. if (count == 40)
  52. vTaskSuspend(NULL);
  53. else
  54. HAL_Delay(100);
  55. }
  56. }
  57. void blinkTask(void const *argument)
  58. {
  59. int count = 0;
  60. HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
  61. HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET);
  62. HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
  63. HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_RESET);
  64. for (;;) {
  65. count %= 10;
  66. switch (count++) {
  67. case 0:
  68. HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin,
  69. GPIO_PIN_SET);
  70. break;
  71. case 1:
  72. HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin,
  73. GPIO_PIN_SET);
  74. break;
  75. case 2:
  76. HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin,
  77. GPIO_PIN_SET);
  78. break;
  79. case 3:
  80. break;
  81. case 5:
  82. HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin,
  83. GPIO_PIN_RESET);
  84. break;
  85. case 6:
  86. HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin,
  87. GPIO_PIN_RESET);
  88. break;
  89. case 7:
  90. HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin,
  91. GPIO_PIN_RESET);
  92. break;
  93. case 8:
  94. break;
  95. default:
  96. break;
  97. }
  98. HAL_Delay(100);
  99. }
  100. }
  101. int main(void)
  102. {
  103. HAL_Init();
  104. BSP_LCD_Init();
  105. BSP_LCD_DisplayOn();
  106. BSP_LCD_Clear(LCD_COLOR_WHITE);
  107. BSP_LCD_Clear(LCD_COLOR_WHITE);
  108. SystemClock_Config();
  109. UartHandle.Instance = USARTx;
  110. UartHandle.Init.BaudRate = 9600;
  111. UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
  112. UartHandle.Init.StopBits = UART_STOPBITS_1;
  113. UartHandle.Init.Parity = UART_PARITY_ODD;
  114. UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  115. UartHandle.Init.Mode = UART_MODE_TX_RX;
  116. UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
  117. if (HAL_UART_Init(&UartHandle) != HAL_OK) {
  118. Error_Handler();
  119. }
  120. MX_GPIO_Init();
  121. osThreadDef(defaultTask, inferenceTask, osPriorityNormal, 0, 256);
  122. defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
  123. osThreadDef(UARTTaskHandle, UARTTask, osPriorityNormal, 0, 256);
  124. UARTTaskHandle = osThreadCreate(osThread(UARTTaskHandle), NULL);
  125. osThreadDef(blinkTaskHandle, blinkTask, osPriorityNormal, 0, 256);
  126. blinkTaskHandle = osThreadCreate(osThread(blinkTaskHandle), NULL);
  127. /* Start scheduler */
  128. osKernelStart();
  129. while (1) {
  130. }
  131. }
  132. void SystemClock_Config(void)
  133. {
  134. RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };
  135. RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };
  136. /** Configure the main internal regulator output voltage
  137. * */
  138. __HAL_RCC_PWR_CLK_ENABLE();
  139. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  140. /** Initializes the CPU, AHB and APB busses clocks
  141. * */
  142. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  143. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  144. RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  145. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  146. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  147. RCC_OscInitStruct.PLL.PLLM = 8;
  148. RCC_OscInitStruct.PLL.PLLN = 168;
  149. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  150. RCC_OscInitStruct.PLL.PLLQ = 7;
  151. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
  152. Error_Handler();
  153. }
  154. /** Initializes the CPU, AHB and APB busses clocks
  155. * */
  156. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK |
  157. RCC_CLOCKTYPE_SYSCLK |
  158. RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  159. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  160. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  161. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  162. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  163. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) !=
  164. HAL_OK) {
  165. Error_Handler();
  166. }
  167. }
  168. static void MX_GPIO_Init(void)
  169. {
  170. GPIO_InitTypeDef GPIO_InitStruct = { 0 };
  171. /* GPIO Ports Clock Enable */
  172. __HAL_RCC_GPIOE_CLK_ENABLE();
  173. __HAL_RCC_GPIOB_CLK_ENABLE();
  174. __HAL_RCC_GPIOG_CLK_ENABLE();
  175. __HAL_RCC_GPIOD_CLK_ENABLE();
  176. __HAL_RCC_GPIOC_CLK_ENABLE();
  177. __HAL_RCC_GPIOA_CLK_ENABLE();
  178. __HAL_RCC_GPIOI_CLK_ENABLE();
  179. __HAL_RCC_GPIOH_CLK_ENABLE();
  180. __HAL_RCC_GPIOF_CLK_ENABLE();
  181. /*Configure GPIO pin Output Level */
  182. HAL_GPIO_WritePin(GPIOG, LED2_Pin | LED1_Pin, GPIO_PIN_RESET);
  183. /*Configure GPIO pin Output Level */
  184. HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET);
  185. /*Configure GPIO pin Output Level */
  186. HAL_GPIO_WritePin(LED4_GPIO_Port, LED4_Pin, GPIO_PIN_RESET);
  187. /*Configure GPIO pins : FSMC_NE1_Pin FSMC_NWAIT_Pin D2_Pin FSMC_NWE_Pin
  188. D3_Pin FSMC_NOE_Pin FSMC_CLK_Pin D1_Pin
  189. D0_Pin A18_Pin A17_Pin A16_Pin
  190. D15_Pin D14_Pin D13_Pin */
  191. GPIO_InitStruct.Pin = FSMC_NE1_Pin | FSMC_NWAIT_Pin | D2_Pin |
  192. FSMC_NWE_Pin | D3_Pin | FSMC_NOE_Pin |
  193. FSMC_CLK_Pin | D1_Pin | D0_Pin | A18_Pin |
  194. A17_Pin | A16_Pin | D15_Pin | D14_Pin | D13_Pin;
  195. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  196. GPIO_InitStruct.Pull = GPIO_NOPULL;
  197. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  198. GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
  199. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  200. /*Configure GPIO pin : FSMC_NL_Pin */
  201. GPIO_InitStruct.Pin = FSMC_NL_Pin;
  202. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  203. GPIO_InitStruct.Pull = GPIO_NOPULL;
  204. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  205. GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
  206. HAL_GPIO_Init(FSMC_NL_GPIO_Port, &GPIO_InitStruct);
  207. /*Configure GPIO pin : User_Button_Pin */
  208. GPIO_InitStruct.Pin = User_Button_Pin;
  209. GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
  210. GPIO_InitStruct.Pull = GPIO_NOPULL;
  211. HAL_GPIO_Init(User_Button_GPIO_Port, &GPIO_InitStruct);
  212. /*Configure GPIO pins : LED2_Pin LED1_Pin */
  213. GPIO_InitStruct.Pin = LED2_Pin | LED1_Pin;
  214. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  215. GPIO_InitStruct.Pull = GPIO_NOPULL;
  216. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  217. HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  218. /*Configure GPIO pins : FSMC_NE3_Pin FSMC_NE2_Pin A15_Pin A14_Pin
  219. A13_Pin A12_Pin A11_Pin A10_Pin */
  220. GPIO_InitStruct.Pin = FSMC_NE3_Pin | FSMC_NE2_Pin | A15_Pin | A14_Pin |
  221. A13_Pin | A12_Pin | A11_Pin | A10_Pin;
  222. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  223. GPIO_InitStruct.Pull = GPIO_NOPULL;
  224. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  225. GPIO_InitStruct.Alternate = GPIO_AF12_FSMC;
  226. HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
  227. /*Configure GPIO pin : LED3_Pin */
  228. GPIO_InitStruct.Pin = LED3_Pin;
  229. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  230. GPIO_InitStruct.Pull = GPIO_NOPULL;
  231. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  232. HAL_GPIO_Init(LED3_GPIO_Port, &GPIO_InitStruct);
  233. /*Configure GPIO pin : LED4_Pin */
  234. GPIO_InitStruct.Pin = LED4_Pin;
  235. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  236. GPIO_InitStruct.Pull = GPIO_NOPULL;
  237. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  238. HAL_GPIO_Init(LED4_GPIO_Port, &GPIO_InitStruct);
  239. /*Configure GPIO pin : SW1_Pin */
  240. GPIO_InitStruct.Pin = SW1_Pin;
  241. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  242. GPIO_InitStruct.Pull = GPIO_NOPULL;
  243. HAL_GPIO_Init(SW1_GPIO_Port, &GPIO_InitStruct);
  244. }
  245. void Error_Handler(void)
  246. {
  247. while (1) {
  248. }
  249. }
  250. #ifdef USE_FULL_ASSERT
  251. void assert_failed(uint8_t *file, uint32_t line)
  252. {
  253. }
  254. #endif /* USE_FULL_ASSERT */