# 微處理機期中
## 第一題
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

到 NVIC 調整參數

到 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();
}
}
```