Advertisement
Dashe

Lab 3 main.c Part A

Apr 24th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.81 KB | None | 0 0
  1. /**
  2. ******************************************************************************
  3. * File Name : main.c
  4. * Description : Main program body
  5. ******************************************************************************
  6. *
  7. * COPYRIGHT(c) 2017 STMicroelectronics
  8. *
  9. * Redistribution and use in source and binary forms, with or without modification,
  10. * are permitted provided that the following conditions are met:
  11. * 1. Redistributions of source code must retain the above copyright notice,
  12. * this list of conditions and the following disclaimer.
  13. * 2. Redistributions in binary form must reproduce the above copyright notice,
  14. * this list of conditions and the following disclaimer in the documentation
  15. * and/or other materials provided with the distribution.
  16. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  17. * may be used to endorse or promote products derived from this software
  18. * without specific prior written permission.
  19. *
  20. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  23. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  24. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  26. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  27. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  28. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. *
  31. ******************************************************************************
  32. */
  33. /* Includes ------------------------------------------------------------------*/
  34. #include "stm32f4xx_hal.h"
  35. #include "cmsis_os.h"
  36.  
  37. /* USER CODE BEGIN Includes */
  38. #include "semphr.h"
  39.  
  40. /* USER CODE END Includes */
  41.  
  42. /* Private variables ---------------------------------------------------------*/
  43. osThreadId defaultTaskHandle;
  44.  
  45. /* USER CODE BEGIN PV */
  46. /* Private variables ---------------------------------------------------------*/
  47.  
  48. /* USER CODE END PV */
  49.  
  50. /* Private function prototypes -----------------------------------------------*/
  51. void SystemClock_Config(void);
  52. void Error_Handler(void);
  53. static void MX_GPIO_Init(void);
  54.  
  55. void StartDefaultTask(void const * argument);
  56.  
  57. /* USER CODE BEGIN PFP */
  58. /* Private function prototypes -----------------------------------------------*/
  59.  
  60. /* USER CODE END PFP */
  61.  
  62. /* USER CODE BEGIN 0 */
  63. SemaphoreHandle_t xSemaphore1 = NULL;
  64. SemaphoreHandle_t xSemaphore2 = NULL;
  65. SemaphoreHandle_t xSemaphore3 = NULL;
  66. extern uint16_t isRunning = 0;
  67. void northSouthLights(void const * argument){
  68. HAL_GPIO_WritePin(GPIOD, PD0_Pin, 1);
  69. HAL_GPIO_WritePin(GPIOD, PD1_Pin, 0);
  70. HAL_GPIO_WritePin(GPIOD, PD2_Pin, 0);
  71. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 0);
  72. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 1);
  73. HAL_GPIO_WritePin(GPIOE, PE7_Pin, 1);
  74. HAL_GPIO_WritePin(GPIOE, PE8_Pin, 0);
  75. HAL_GPIO_WritePin(GPIOE, PE9_Pin, 0);
  76. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 0);
  77. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 1);
  78. while(1)
  79. {
  80. if (xSemaphoreTake(xSemaphore1, portMAX_DELAY) == pdTRUE)
  81. {
  82. vTaskDelay(pdMS_TO_TICKS(1000));
  83. HAL_GPIO_WritePin(GPIOD, PD0_Pin, 0);
  84. HAL_GPIO_WritePin(GPIOD, PD1_Pin, 0);
  85. HAL_GPIO_WritePin(GPIOD, PD2_Pin, 1);
  86. if (isRunning == 1){
  87. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 1);
  88. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 0);
  89. vTaskDelay(pdMS_TO_TICKS(2000));
  90. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 0);
  91. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 1);
  92. vTaskDelay(pdMS_TO_TICKS(500));
  93. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 0);
  94. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 0);
  95. vTaskDelay(pdMS_TO_TICKS(500));
  96. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 0);
  97. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 1);
  98. vTaskDelay(pdMS_TO_TICKS(500));
  99. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 0);
  100. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 0);
  101. vTaskDelay(pdMS_TO_TICKS(500));
  102. isRunning = 0;
  103. }else{
  104. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 0);
  105. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 1);
  106. vTaskDelay(pdMS_TO_TICKS(4000));
  107. }
  108. HAL_GPIO_WritePin(GPIOD, PD0_Pin, 0);
  109. HAL_GPIO_WritePin(GPIOD, PD1_Pin, 1);
  110. HAL_GPIO_WritePin(GPIOD, PD2_Pin, 0);
  111. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 0);
  112. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 1);
  113. vTaskDelay(pdMS_TO_TICKS(1500));
  114. HAL_GPIO_WritePin(GPIOD, PD0_Pin, 1);
  115. HAL_GPIO_WritePin(GPIOD, PD1_Pin, 0);
  116. HAL_GPIO_WritePin(GPIOD, PD2_Pin, 0);
  117. HAL_GPIO_WritePin(GPIOD, PD3_Pin, 0);
  118. HAL_GPIO_WritePin(GPIOD, PD6_Pin, 1);
  119. xSemaphoreGive(xSemaphore2);
  120. }
  121.  
  122. }
  123. }
  124. void eastWestLights(void const * argument){
  125. xSemaphoreGive(xSemaphore1);
  126. while(1){
  127. if (xSemaphoreTake(xSemaphore2, portMAX_DELAY) == pdTRUE)
  128. {
  129. vTaskDelay(pdMS_TO_TICKS(1000));
  130. HAL_GPIO_WritePin(GPIOE, PE7_Pin, 0);
  131. HAL_GPIO_WritePin(GPIOE, PE8_Pin, 0);
  132. HAL_GPIO_WritePin(GPIOE, PE9_Pin, 1);
  133. if (isRunning == 1){
  134. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 1);
  135. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 0);
  136. vTaskDelay(pdMS_TO_TICKS(2000));
  137. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 0);
  138. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 1);
  139. vTaskDelay(pdMS_TO_TICKS(500));
  140. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 0);
  141. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 0);
  142. vTaskDelay(pdMS_TO_TICKS(500));
  143. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 0);
  144. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 1);
  145. vTaskDelay(pdMS_TO_TICKS(500));
  146. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 0);
  147. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 0);
  148. vTaskDelay(pdMS_TO_TICKS(500));
  149. isRunning = 0;
  150. }else{
  151. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 0);
  152. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 1);
  153. vTaskDelay(pdMS_TO_TICKS(4000));
  154.  
  155. }
  156.  
  157. HAL_GPIO_WritePin(GPIOE, PE7_Pin, 0);
  158. HAL_GPIO_WritePin(GPIOE, PE8_Pin, 1);
  159. HAL_GPIO_WritePin(GPIOE, PE9_Pin, 0);
  160. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 0);
  161. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 1);
  162. vTaskDelay(pdMS_TO_TICKS(1500));
  163. HAL_GPIO_WritePin(GPIOE, PE7_Pin, 1);
  164. HAL_GPIO_WritePin(GPIOE, PE8_Pin, 0);
  165. HAL_GPIO_WritePin(GPIOE, PE9_Pin, 0);
  166. HAL_GPIO_WritePin(GPIOE, PE10_Pin, 0);
  167. HAL_GPIO_WritePin(GPIOE, PE11_Pin, 1);
  168. xSemaphoreGive(xSemaphore1);
  169. }
  170.  
  171. }
  172. }
  173.  
  174. /* USER CODE END 0 */
  175.  
  176. int main(void)
  177. {
  178.  
  179. /* USER CODE BEGIN 1 */
  180.  
  181. /* USER CODE END 1 */
  182.  
  183. /* MCU Configuration----------------------------------------------------------*/
  184.  
  185. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  186. HAL_Init();
  187.  
  188. /* Configure the system clock */
  189. SystemClock_Config();
  190.  
  191. /* Initialize all configured peripherals */
  192. MX_GPIO_Init();
  193.  
  194. /* USER CODE BEGIN 2 */
  195.  
  196. /* USER CODE END 2 */
  197.  
  198. /* USER CODE BEGIN RTOS_MUTEX */
  199. /* add mutexes, ... */
  200. /* USER CODE END RTOS_MUTEX */
  201.  
  202. /* USER CODE BEGIN RTOS_SEMAPHORES */
  203. /* add semaphores, ... */
  204. /* USER CODE END RTOS_SEMAPHORES */
  205.  
  206. /* USER CODE BEGIN RTOS_TIMERS */
  207. /* start timers, add new ones, ... */
  208. /* USER CODE END RTOS_TIMERS */
  209.  
  210. /* Create the thread(s) */
  211. /* definition and creation of defaultTask */
  212. //osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  213. //defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
  214. //xTaskCreate(StartDefaultTask, (signed char*)"aTask", 128, NULL, 1, NULL);
  215.  
  216. /* USER CODE BEGIN RTOS_THREADS */
  217. /* add threads, ... */
  218. /* USER CODE END RTOS_THREADS */
  219.  
  220. /* USER CODE BEGIN RTOS_QUEUES */
  221. /* add queues, ... */
  222. /* USER CODE END RTOS_QUEUES */
  223.  
  224.  
  225. /* Start scheduler */
  226. //osKernelStart();
  227. xSemaphore1 = xSemaphoreCreateBinary();
  228. xSemaphore2 = xSemaphoreCreateBinary();
  229. //xSemaphore3 = xSemaphoreCreateBinary();
  230. if (xSemaphore1 != NULL || xSemaphore2 != NULL) {
  231. //xSemaphoreGive(xSemaphore1);
  232. //xSemaphoreGive(xSemaphore2);
  233. xTaskCreate(northSouthLights, "Light1", 128, NULL, 1, NULL);
  234. xTaskCreate(eastWestLights, "Light2", 128, NULL, 1, NULL);
  235. vTaskStartScheduler();
  236.  
  237. }
  238.  
  239. /* We should never get here as control is now taken by the scheduler */
  240.  
  241. /* Infinite loop */
  242. /* USER CODE BEGIN WHILE */
  243. while (1)
  244. {
  245. /* USER CODE END WHILE */
  246.  
  247. /* USER CODE BEGIN 3 */
  248.  
  249. }
  250. /* USER CODE END 3 */
  251.  
  252. }
  253.  
  254. /** System Clock Configuration
  255. */
  256. void SystemClock_Config(void)
  257. {
  258.  
  259. RCC_OscInitTypeDef RCC_OscInitStruct;
  260. RCC_ClkInitTypeDef RCC_ClkInitStruct;
  261.  
  262. __HAL_RCC_PWR_CLK_ENABLE();
  263.  
  264. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
  265.  
  266. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  267. RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  268. RCC_OscInitStruct.HSICalibrationValue = 16;
  269. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  270. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  271. RCC_OscInitStruct.PLL.PLLM = 8;
  272. RCC_OscInitStruct.PLL.PLLN = 50;
  273. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  274. RCC_OscInitStruct.PLL.PLLQ = 7;
  275. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  276. {
  277. Error_Handler();
  278. }
  279.  
  280. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  281. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  282. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  283. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  284. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  285. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  286. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  287. {
  288. Error_Handler();
  289. }
  290.  
  291. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  292.  
  293. HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  294.  
  295. /* SysTick_IRQn interrupt configuration */
  296. HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
  297. }
  298.  
  299. /** Configure pins as
  300. * Analog
  301. * Input
  302. * Output
  303. * EVENT_OUT
  304. * EXTI
  305. */
  306. static void MX_GPIO_Init(void)
  307. {
  308.  
  309. GPIO_InitTypeDef GPIO_InitStruct;
  310.  
  311. /* GPIO Ports Clock Enable */
  312. __HAL_RCC_GPIOH_CLK_ENABLE();
  313. __HAL_RCC_GPIOA_CLK_ENABLE();
  314. __HAL_RCC_GPIOE_CLK_ENABLE();
  315. __HAL_RCC_GPIOD_CLK_ENABLE();
  316.  
  317. /*Configure GPIO pin Output Level */
  318. HAL_GPIO_WritePin(GPIOE, PE7_Pin|PE8_Pin|PE9_Pin|PE10_Pin
  319. |PE11_Pin, GPIO_PIN_RESET);
  320.  
  321. /*Configure GPIO pin Output Level */
  322. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15|PD0_Pin|PD1_Pin|PD2_Pin
  323. |PD3_Pin|PD6_Pin, GPIO_PIN_RESET);
  324.  
  325. /*Configure GPIO pin : PA0 */
  326. GPIO_InitStruct.Pin = GPIO_PIN_0;
  327. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  328. GPIO_InitStruct.Pull = GPIO_NOPULL;
  329. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  330.  
  331. /*Configure GPIO pins : PE7_Pin PE8_Pin PE9_Pin PE10_Pin
  332. PE11_Pin */
  333. GPIO_InitStruct.Pin = PE7_Pin|PE8_Pin|PE9_Pin|PE10_Pin
  334. |PE11_Pin;
  335. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  336. GPIO_InitStruct.Pull = GPIO_NOPULL;
  337. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  338. HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
  339.  
  340. /*Configure GPIO pins : PD15 PD0_Pin PD1_Pin PD2_Pin
  341. PD3_Pin PD6_Pin */
  342. GPIO_InitStruct.Pin = GPIO_PIN_15|PD0_Pin|PD1_Pin|PD2_Pin
  343. |PD3_Pin|PD6_Pin;
  344. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  345. GPIO_InitStruct.Pull = GPIO_NOPULL;
  346. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  347. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  348.  
  349. /* EXTI interrupt init*/
  350. HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 1);
  351. HAL_NVIC_EnableIRQ(EXTI0_IRQn);
  352.  
  353. }
  354.  
  355. /* USER CODE BEGIN 4 */
  356. /* USER CODE END 4 */
  357.  
  358. /* StartDefaultTask function */
  359. void StartDefaultTask(void const * argument)
  360. {
  361.  
  362. /* USER CODE BEGIN 5 */
  363. /* Infinite loop */
  364. for(;;)
  365. {
  366. osDelay(1);
  367. }
  368. /* USER CODE END 5 */
  369. }
  370.  
  371. /**
  372. * @brief This function is executed in case of error occurrence.
  373. * @param None
  374. * @retval None
  375. */
  376. void Error_Handler(void)
  377. {
  378. /* USER CODE BEGIN Error_Handler */
  379. /* User can add his own implementation to report the HAL error return state */
  380. while(1)
  381. {
  382. }
  383. /* USER CODE END Error_Handler */
  384. }
  385.  
  386. #ifdef USE_FULL_ASSERT
  387.  
  388. /**
  389. * @brief Reports the name of the source file and the source line number
  390. * where the assert_param error has occurred.
  391. * @param file: pointer to the source file name
  392. * @param line: assert_param error line source number
  393. * @retval None
  394. */
  395. void assert_failed(uint8_t* file, uint32_t line)
  396. {
  397. /* USER CODE BEGIN 6 */
  398. /* User can add his own implementation to report the file name and line number,
  399. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  400. /* USER CODE END 6 */
  401.  
  402. }
  403.  
  404. #endif
  405.  
  406. /**
  407. * @}
  408. */
  409.  
  410. /**
  411. * @}
  412. */
  413.  
  414. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement