---
# System prepended metadata

title: 微處理機期末考

---

# 微處理機期末考

## 第一題
調整可變電阻可控制兩個燈相互閃爍的快慢，兩個燈分別為LED1與LED3，轉動可變電阻後，再按下藍色(USER)按鈕改變速度。
- 可變電阻順時針(面向旋鈕)為速度最快，反之，逆時針為速度最慢。
- 初始狀態不閃爍
- 使用按鈕中斷

C:\Users\User\Downloads\期末考資料包\實驗07_電壓偵測—ADC\ADC_EX.ioc
![image](https://hackmd.io/_uploads/SynLBvaE1g.png)
![image](https://hackmd.io/_uploads/H1HDBD6E1l.png)

```c=
uint32_t adc_value=0;
uint8_t flag=0;
  while (1)
  {
	  if(flag){
		  print(adc_value,flag);
		  HAL_GPIO_WritePin(LED1_GPIO_Port, LED3_Pin, 0);
		  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);
		  HAL_Delay(adc_value/10);
		  HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, 1);
		  HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);
		  HAL_Delay(adc_value/10);
	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == buttom_Pin && HAL_GPIO_ReadPin(buttom_GPIO_Port,buttom_Pin)) {
	  adc_value = HAL_ADC_GetValue(&hadc1);
	  flag = 1;
  }else{
      __NOP();
  }

}
```

## 第二題
按下藍色(USER)按鈕會將字元”A”儲存至EEPROM，資料會依序疊加，三秒內未按下則讀取到目前為止儲存的資料並顯示於螢幕一次
- 按下五次則顯示”AAAAA”
- 使用I2C傳輸資料
- 使用按鈕中斷
- 計時使用TIMER中斷


將 ioc PB8 改成I2C1_SCL
![image](https://hackmd.io/_uploads/SyXj9I6V1l.png)

開啟 htim6 的 Interrupt 
![image](https://hackmd.io/_uploads/SyZ6_2fHyg.png)

timer6 設定 
![image](https://hackmd.io/_uploads/ByQJYhGBkg.png)


```c=
uint8_t write_data[100];
uint8_t read_data[100];
uint8_t flag = 0;

int main(){
    HAL_TIM_Base_Start_IT(&htim6);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin == B1_Pin && HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin)) {
	  flag++;
	  __HAL_TIM_SET_COUNTER (&htim6 , 0);
	  HAL_Delay(200);
  }else{
      __NOP();
  }
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim == &htim6){
		for(i=0; i<flag; i++){
			// 傳資料
			write_data[i] = 'A'; // AAA
		}
//		 寫入資料到 EEPROM (假設從第 0 頁，第 0 位元組開始)
		if(flag){
			EEPROM_Write(0, 0, write_data, strlen(write_data));
			HAL_Delay(100);

			// 讀取資料從 EEPROM
			EEPROM_Read(0, 0, read_data, strlen(write_data));
			HAL_UART_Transmit(&huart3, read_data, strlen(write_data), 100);
			HAL_UART_Transmit(&huart3, (uint8_t*)"\r\n", strlen("\r\n"), 100);
			HAL_Delay(100);
		     

	    }
    }
}
```

## 考題三
在AccessPort輸入三個字母後傳送至板子，分別”r”、”g”、”b”(不依順序輸入)，傳入到板子後，依字母亮LED燈。字母”r”、”g”、”b”分別對應到紅燈、綠燈、藍燈

> 輸入”rgb”後，紅燈呼吸燈一次>綠燈呼吸燈一次>藍燈呼吸燈一次。
輸入”rgg”後，紅燈呼吸燈一次>綠燈呼吸燈一次>綠燈呼吸燈一次。
能進行第一個對應燈的呼吸燈=>5分
輸入”r”，紅燈呼吸一次
能進行三個對應輸入的呼吸燈=>15分
能持續循環=>30分
