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();
        
    }
}
相关推荐
Magnetic_h1 小时前
【iOS】锁的原理
笔记·学习·macos·ios·objective-c·cocoa·xcode
Olrookie1 小时前
ruoyi-vue(十一)——代码生成
笔记·后端
yuxb732 小时前
Ansible 学习笔记:变量事实管理、任务控制与文件部署
linux·运维·笔记
鸢栀w2 小时前
前端css学习笔记7:各种居中布局&空白问题
前端·css·笔记·学习·尚硅谷网课
之歆3 小时前
大模型微调分布式训练-大模型压缩训练(知识蒸馏)-大模型推理部署(分布式推理与量化部署)-大模型评估测试(OpenCompass)
人工智能·笔记·python
十行代码九行报错4 小时前
Docker基础学习笔记
笔记·学习·docker
所愿ღ9 小时前
JavaWeb-Servlet基础
笔记·servlet
岑梓铭10 小时前
考研408《计算机组成原理》复习笔记,第五章(2)——CPU指令执行过程
笔记·考研·408·计算机组成原理·计组
oe101913 小时前
读From GPT-2 to gpt-oss: Analyzing the Architectural Advances(续)
笔记·gpt·学习
Include everything16 小时前
Rust学习笔记(三)|所有权机制 Ownership
笔记·学习·rust