STM32-笔记8-433M点灯

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();
        
    }
}
相关推荐
DanB2431 分钟前
Java笔记4
java·开发语言·笔记
UpUpUp……2 小时前
Linux--JsonCpp
linux·运维·服务器·c++·笔记·json
qq_5982117572 小时前
Unity.UGUI DrawCall合批笔记
笔记·unity·游戏引擎
Suckerbin3 小时前
基于HTTP头部字段的SQL注入:SQLi-labs第17-20关
网络·笔记·网络协议·安全·http·网络安全
孤寂大仙v5 小时前
【Linux笔记】——进程信号的产生
linux·服务器·笔记
愚戏师5 小时前
Linux复习笔记(三) 网络服务配置(web)
linux·运维·笔记
scdifsn6 小时前
动手学深度学习12.4.硬件-笔记&练习(PyTorch)
pytorch·笔记·深度学习·缓存·内存·硬盘·深度学习硬件
北温凉6 小时前
【学习笔记】机器学习(Machine Learning) | 第六章(2)| 过拟合问题
笔记·机器学习
lwewan7 小时前
26考研——中央处理器_异常和中断机制(5)
笔记·考研
潇-xiao9 小时前
流体力学绪论(期末复习)
笔记