---
# System prepended metadata

title: 微處理機期中

---

# 微處理機期中

## 第一題
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();
  }
}
```