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();
        
    }
}
相关推荐
moringlightyn7 小时前
基础开发工具--编译器g++/gcc 自动化构建make/Makefile
linux·运维·笔记·自动化·c·编译器·make/makefile
_dindong8 小时前
牛客101:递归/回溯
数据结构·c++·笔记·学习·算法·leetcode·深度优先
**蓝桉**9 小时前
服务器管理
linux·笔记
lingggggaaaa9 小时前
小迪安全v2023学习笔记(一百四十三讲)—— Win系统权限提升篇&AD内网域控&NetLogon&ADCS&PAC&KDC&CVE漏洞
windows·笔记·学习·安全·内网安全·权限提升
71-39 小时前
牛客上的练习题——打印X形图案(有说明scanf返回值)
c语言·笔记·学习
NON-JUDGMENTAL9 小时前
DiverseVul
笔记·学习
lkbhua莱克瓦2412 小时前
Java练习——正则表达式2
java·开发语言·笔记·正则表达式·github·学习方法
degen_12 小时前
DXE流程
c语言·笔记·bios
十五学长12 小时前
程序设计C语言
c语言·开发语言·笔记·学习·考研
我先去打把游戏先1 天前
ESP32开发指南(基于IDF):连接AWS,乐鑫官方esp-aws-iot-master例程实验、跑通
开发语言·笔记·单片机·物联网·学习·云计算·aws