前言:
1、軟體:keil5,STM32CubeMX
2、STM32闆子:STM32F103VET6
4、按鍵管腳:PA0 PC13
5、LED管腳: PB0 PB1 PB5
文章目錄
- 怎麼用外部中斷點燈?
-
- 1.知道原理:
- 2.配置STM32CubeMX:
- 3.你要寫的代碼:
- 4.實作的效果:
- 具體過程:
- 1.配置CubeMX
-
-
- 1.打開軟體
- 2.選擇闆子類型
- 3.選擇serial wire:
- 4.選擇外部時鐘:
- 5.選擇GPIO的IO口:
- 6.打開外部中斷:
- 7.檔案名和選擇檔案位址:
-
- 2.在keil中編寫代碼實作功能:
-
-
- 1.配置keil
- 2.寫代碼:
-
怎麼用外部中斷點燈?
1.知道原理:
綠燈的io口是PB0,藍燈的io口是PB1,紅燈的io口是PB5,外部中斷按鍵KEY1:PA0,外部中斷按鍵KEY2:PC13,
當按鍵按下PA0或者PC13IO口輸入高電平,檢測到上升沿,或者松開檢測到下降沿,使PB0,PB1,PB5,IO口為低電平就能點亮
2.配置STM32CubeMX:
找到LED的IO口配置為高電平(輸出模式),找到按鍵的IO口配置(外部中斷模式)。
3.你要寫的代碼:
我這裡用KEY1和KEY2來控制綠燈藍燈切換。
void Delay(unsigned int i)//延時
{
while(i--);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_0)
{
Delay(100);/* 延時一小段時間,消除抖動 */
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==SET)
{
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_1 ,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_0 ,GPIO_PIN_SET);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
}
if(GPIO_Pin==GPIO_PIN_13)
{
Delay(100);/* 延時一小段時間,消除抖動 */
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==SET)
{
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_1 ,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_0 ,GPIO_PIN_RESET);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
}
}
4.實作的效果:
具體過程:
1.配置CubeMX
1.打開軟體
2.選擇闆子類型
3.選擇serial wire:
用于DAP和J-Link做下載下傳
4.選擇外部時鐘:
高速時鐘(HSE)選擇外部晶振
5.選擇GPIO的IO口:
按鍵管腳:PA0 PC13 (EXTI模式)
LED管腳: PB0 PB1 PB5(輸出模式)
模式:
上升沿觸發的外部中斷
下降沿觸發的外部中斷
上升/下降沿觸發的外部中斷
上升沿觸發的事件中斷
下降沿觸發的事件中斷
上升/下降沿觸發的事件中斷
6.打開外部中斷:
7.檔案名和選擇檔案位址:
建議用英文名
2.在keil中編寫代碼實作功能:
1.配置keil
2.寫代碼:
隻能在begin和end之間寫代碼,不然再次啟動CubeMX會把寫在begin和end外的代碼覆寫掉(删掉)
/* USER CODE BEGIN 1 */
void Delay(unsigned int i)//延時
{
while(i--);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==GPIO_PIN_0)
{
Delay(100);/* 延時一小段時間,消除抖動 */
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==SET)
{
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_1 ,GPIO_PIN_RESET);
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_0 ,GPIO_PIN_SET);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
}
if(GPIO_Pin==GPIO_PIN_13)
{
Delay(100);/* 延時一小段時間,消除抖動 */
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==SET)
{
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_1 ,GPIO_PIN_SET);
HAL_GPIO_WritePin (GPIOB,GPIO_PIN_0 ,GPIO_PIN_RESET);
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_13);
}
}
/* USER CODE END 1 */
點選下載下傳就能通過按鍵點亮燈了!!!
最後:
要自己寫一個短暫的延時
void Delay(unsigned int i)
{
while(i--);
}
不能用庫的延時
HAL_Delay (1000);
不然會卡死。