# 微處理機期中 ## 第一題 D:\113_1_Class_course\微處理機實驗\113微處理機實驗_期中考資料包\113微處理機實驗_期中考資料包\實驗03 _ 基本設定與通用IO - GPIO\程式碼_範例\ **GPIO_EX.ioc** 到 ioc 打開 Timers -> 開啟 Timer4 - PSC: 42000 - Period: 6000 - Pulse: 2000 - PB7 -> TIM4_CH2 到 D:\113_1_Class_course\微處理機實驗\113微處理機實驗_期中考資料包\113微處理機實驗_期中考資料包\實驗03 _ 基本設定與通用IO - GPIO\程式碼_練習\ **GPIO_acceptance.c** ```c= uint8_t Status = 0; while (1) { /* USER CODE END WHILE */ Status = HAL_GPIO_ReadPin(buttom_GPIO_Port,buttom_Pin); if(Status) HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2); else HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_2); /* USER CODE BEGIN 3 */ } ``` ## 第二題 D:\113_1_Class_course\微處理機實驗\113微處理機實驗_期中考資料包\113微處理機實驗_期中考資料包\實驗05_EXTI\程式碼_範例\ **Timer_PWM.ioc** 將 GPIO 的 PC13 User Label 改成 B1 ![image](https://hackmd.io/_uploads/HJAMjGzZkg.png) 到 NVIC 調整參數 ![image](https://hackmd.io/_uploads/ryM6jGMZ1e.png) 到 D:\113_1_Class_course\微處理機實驗\113微處理機實驗_期中考資料包\113微處理機實驗_期中考資料包\實驗05_TIM\Timer_PWM\ **Timer_PWM.c** -> 找到 **呼吸燈**的程式碼 並進行修改 ```c= void LED_Process(void){ uint16_t i=0; switch(flag){ case(1): __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_2, 0); break; case(2): for(i=0;i<1000;i++){ __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_2, i); HAL_Delay(1); } for(i=1000;i>=1;i--){ __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_2, i); HAL_Delay(1); } flag = 1; break; } } while (1) { /* USER CODE END WHILE */ __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_2, 0); LED_Process(); /* USER CODE BEGIN 3 */ } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == B1_Pin && HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)) { flag++; HAL_Delay(200); if (flag==3){ flag=1; } }else{ __NOP(); } } ``` ## 第三題 ```c= void LED_Process(void){ uint16_t i = 0; switch(flag){ case(1): if(__HAL_TIM_GET_COUNTER(&htim6) <= 2000){ HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); } else if(__HAL_TIM_GET_COUNTER(&htim6) <= 4000) { HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); } else if(__HAL_TIM_GET_COUNTER(&htim6) <= 6000) { HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); } break; case(2): if(__HAL_TIM_GET_COUNTER(&htim6) <= 2000){ HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); } else if(__HAL_TIM_GET_COUNTER(&htim6) <= 4000) { HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); } else if(__HAL_TIM_GET_COUNTER(&htim6) <= 6000) { HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); } break; } } void LED_Process1(void){ uint16_t i = 0; uint8_t spin = 0; switch(flag){ case(1): if(__HAL_TIM_GET_COUNTER(&htim6) <= 2000){ if(spin){ HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); spin = 0; } else { HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); spin = 1; } } else if(__HAL_TIM_GET_COUNTER(&htim6) <= 4000) { if(spin){ HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); spin = 0; } else { HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); spin = 1; } } else if(__HAL_TIM_GET_COUNTER(&htim6) <= 6000) { if(spin){ HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); spin = 0; } else { HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); spin = 1; } } break; case(2): if(__HAL_TIM_GET_COUNTER(&htim6) <= 2000){ if(spin){ HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); spin = 0; } else { HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); spin = 1; } } else if(__HAL_TIM_GET_COUNTER(&htim6) <= 4000) { if(spin){ HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); spin = 0; } else { HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); } } else if(__HAL_TIM_GET_COUNTER(&htim6) <= 6000) { if(spin){ HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_SET); spin = 0; } else { HAL_GPIO_WritePin(GPIOB, LED_2_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB, LED_1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LED_3_Pin, GPIO_PIN_RESET); } } break; } } uint8_t Status = 0; uint8_t test = 0; while (1){ Status = HAL_GPIO_ReadPin(buttom_GPIO_Port,buttom_Pin); if(Status){ HAL_TIM_Base_Start(&htim7); if(__HAL_TIM_GET_COUNTER(&htim6) > 2000) test = 1; else{ test = 0; HAL_TIM_Base_Stop(&htim7); } } if(test) LED_Process1(); else LED_Process(); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == B1_Pin && HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)) { flag++; HAL_Delay(200); if (flag==2){ flag=0; } }else{ __NOP(); } } ```