一、STM32CubeMX配置(本文使用的STM32CubeMX版本为5.6.0)
思路:使用外部中断方式控制LED,当按下不同的按键触中断去控制相应的LED
1.MCU选型
本例程使用的为STM32L051C8T6型号
2.使能时钟
3.设置GPIO口
4.引脚参数配置
①配置状态
②NVIC开启(注;中断优先级用户可根据自行需要修改)
因为EXTI0与1是共用一个中断函数,EXTI4-EXTI15是共用一个中断函数,所以这里有两个都需要开启
5.配置STM32CubeMX生成工程文件
6.点击GENERATE CODE生成工程文件
二、KEIL程序
1.中断方式处理流程:
首先系统检测到有外部中断会进入中断函数
DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1
中断服务函数的原型
void EXTI0_1_IRQHandler(void)
{
/* USER CODE BEGIN EXTI0_1_IRQn 0 */
/* USER CODE END EXTI0_1_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
/* USER CODE BEGIN EXTI0_1_IRQn 1 */
/* USER CODE END EXTI0_1_IRQn 1 */
}
再进入中断处理函数
void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
/* EXTI line interrupt detected */
if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET)
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
HAL_GPIO_EXTI_Callback(GPIO_Pin);
}
}
处理函数中的HAL_GPIO_EXTI_Callback(GPIO_Pin);函数为中断回调函数,函数主要处理用户自己编写的逻辑代码
2.程序编写
1.在gpio.c文件中重写中断回调函数;
/* USER CODE BEGIN 2 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
switch(GPIO_Pin)
{
case GPIO_PIN_0:HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);//按键1中断
break;
case GPIO_PIN_8:HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);//按键2中断
break;
case GPIO_PIN_9:HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);//按键3中断
break;
default:
break;
}
}
/* USER CODE END 2 */
2.main.c中无需增加内容,相应的初始化在生成工程时已经处理好了,所以无需再做处理;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2.编译文件,下载。即可,效果与前面章节的按键输入类似。
源工程文件代码下载:https://download.youkuaiyun.com/download/cheng_nnan/12331048