已經實現GPIO口輸出高低電平控制LED,這里實現按鍵觸發中斷來改變LED閃亮的頻率,因為PB3連着LED,所以PB3的輸出模式沒有改變,隨意選一個GPIO口PA7接按鍵產生中斷。因為nucleo開發板是裸板,所以按鍵、上拉電阻是另找在面包上連接起來再連到開發板上,連接方法在下圖表明。
GPIO設置






在 stm32f0xx_it.c添加如下代碼
/* USER CODE BEGIN 0 */
uint16_t KEY_DOWN = 0;
uint16_t ms_Delay = 300;
/* USER CODE END 0 */
void EXTI4_15_IRQHandler(void)
{
/* USER CODE BEGIN EXTI4_15_IRQn 0 */
if(ms_Delay == 300)
ms_Delay = 1000;
else
ms_Delay = 300;
/* USER CODE END EXTI4_15_IRQn 0 */
在main.c里添加如下代碼
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
extern uint16_t KEY_DOWN ;
//uint16_t KEY_UP = 1;
extern uint16_t ms_Delay ;
/* USER CODE END PV */
稍微改動一下while(1)中代碼:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
HAL_Delay(ms_Delay);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
HAL_Delay(ms_Delay);
}
/* USER CODE END 3 */
}
另一種方案是直接改動main.c的代碼,無需改動其他代碼
/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint16_t KEY_DOWN = 0;
//uint16_t KEY_UP = 1;
uint16_t ms_Delay = 300;
/* USER CODE END PV */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);
HAL_Delay(ms_Delay);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
HAL_Delay(ms_Delay);
}
/* USER CODE END 3 */
添加以下函數
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
// if(HAL_GPIO_ReadPin(PA7_GPIO_Port,PA7_Pin)==KEY_DOWN)
// {
// HAL_Delay(20);/* 延時一小段時間,消除抖動 */
// if(HAL_GPIO_ReadPin(PA7_GPIO_Port,PA7_Pin)==KEY_DOWN)
// {
if(ms_Delay == 300)
ms_Delay = 1000;
else
ms_Delay = 300;
// }
// __HAL_GPIO_EXTI_CLEAR_IT(PA7_Pin);
// }
}
以上能夠實現改動LED閃動頻率,其實更完美的方案對按鍵進行消抖,但在這里的中斷消抖不成功,還待后續學習調試
