1、复制06工程文件,重命名为09-433M点灯(中断法)
2、代码(无flag)
exti.c
cpp
#include "sys.h"
#include "exti.h"
#include "delay.h"
#include "led.h"
void exti_init(void)
{
//使能GPIO时钟
GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct
//打开时钟-使能GPIO时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
//设置GPIO输入模式
//设置AFIO(开启时钟,IO口映射)
//设置EXTI(屏蔽,上/下沿)
//调用GPIO初始化函数-D0
gpio_initstruct.Mode = GPIO_MODE_IT_RISING;//上升沿输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.Pin = GPIO_PIN_12;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLDOWN;//下拉
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
//设置NVIC(优先级分组,设置优先级,使能中断)
HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
//调用GPIO初始化函数-D1
gpio_initstruct.Mode = GPIO_MODE_IT_RISING;//上升沿输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.Pin = GPIO_PIN_5;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLDOWN;//下拉
HAL_GPIO_Init(GPIOB,&gpio_initstruct);
//设置NVIC(优先级分组,设置优先级,使能中断)
HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
//设置中断服务函数-D0
void EXTI15_10_IRQHandler(void)//中断服务函数可以在.s文件中查看到
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}
//设置中断服务函数-D1
void EXTI9_5_IRQHandler(void)//中断服务函数可以在.s文件中查看到
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
}
//回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//delay_ms(20);
//-D0
if(GPIO_Pin == GPIO_PIN_12)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12) == GPIO_PIN_SET)
led2_Toggle();
}
//-D1
if(GPIO_Pin == GPIO_PIN_5)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_SET)
led1_Toggle();
}
}
exti.h
cpp
#ifndef __EXTI_H__
#define __EXTI_H__
void exti_init(void);
#endif
main.c
cpp
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "exti.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init();//初始化led灯
exti_init();
while(1)
{
}
}
3、代码(有flag)
为什么代码里要有flag?
因为在一个项目中,一个模块是处理自己的模块的东西,不可以跟其他模块有联动的。
联动在哪里?
就是在这个模块下,加入了其他模块的函数,属于一种联动
联动应该在主函数实现
代码如下:
exti.c
cpp
#include "sys.h"
#include "exti.h"
#include "delay.h"
#include "led.h"
uint8_t buttonA_flag = FALSE;
uint8_t buttonB_flag = FALSE;
void exti_init(void)
{
//使能GPIO时钟
GPIO_InitTypeDef gpio_initstruct;//定义一个结构体gpio_initstruct
//打开时钟-使能GPIO时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
//设置GPIO输入模式
//设置AFIO(开启时钟,IO口映射)
//设置EXTI(屏蔽,上/下沿)
//调用GPIO初始化函数-D1
gpio_initstruct.Mode = GPIO_MODE_IT_RISING;//上升沿输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.Pin = GPIO_PIN_12;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLDOWN;//下拉
HAL_GPIO_Init(GPIOA,&gpio_initstruct);
//设置NVIC(优先级分组,设置优先级,使能中断)
HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
//调用GPIO初始化函数-D0
gpio_initstruct.Mode = GPIO_MODE_IT_RISING;//上升沿输出//结构体函数的四种类型,引脚模式、引脚、引脚上拉下拉、引脚速度
gpio_initstruct.Pin = GPIO_PIN_5;//LED1对应的引脚
gpio_initstruct.Pull = GPIO_PULLDOWN;//下拉
HAL_GPIO_Init(GPIOB,&gpio_initstruct);
//设置NVIC(优先级分组,设置优先级,使能中断)
HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
//设置中断服务函数-D1
void EXTI15_10_IRQHandler(void)//中断服务函数可以在.s文件中查看到
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}
//设置中断服务函数-D0
void EXTI9_5_IRQHandler(void)//中断服务函数可以在.s文件中查看到
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
}
//回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//delay_ms(20);
//-D0
if(GPIO_Pin == GPIO_PIN_12)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12) == GPIO_PIN_SET)
//led2_Toggle();
buttonB_flag = TRUE;
}
//-D1
if(GPIO_Pin == GPIO_PIN_5)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_SET)
//led1_Toggle();
buttonA_flag = TRUE;
}
}
//按键A的传出和接入函数
uint8_t buttonA_flag_get(void)
{
uint8_t temp = buttonA_flag;
buttonA_flag = FALSE;//当外界把flag的值置TRUE,需要内部手动把flag的值置FALSE
return temp;
}
void buttonA_flag_set(uint8_t value)
{
buttonA_flag = value;
}
//按键B的传出和接入函数
uint8_t buttonB_flag_get(void)
{
uint8_t temp = buttonB_flag;
buttonB_flag = FALSE;//当外界把flag的值置TRUE,需要内部手动把flag的值置FALSE
return temp;
}
void buttonB_flag_set(uint8_t value)
{
buttonB_flag = value;
}
exti.h
cpp
#ifndef __EXTI_H__
#define __EXTI_H__
#include "stdint.h"
#define TRUE 1
#define FALSE 0
void exti_init(void);
uint8_t buttonA_flag_get(void);
void buttonA_flag_set(uint8_t value);
uint8_t buttonB_flag_get(void);
void buttonB_flag_set(uint8_t value);
#endif
main.c
cpp
#include "sys.h"
#include "delay.h"
#include "led.h"
#include "exti.h"
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */
led_init();//初始化led灯
exti_init();
while(1)
{
//在main函数里面一直检测那两个flag是不是被置位了,flag = TRUE就点灯
if(buttonA_flag_get() == TRUE)
led1_Toggle();
if(buttonB_flag_get() == TRUE)
led2_Toggle();
}
}