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();
        
    }
}
相关推荐
明明真系叻2 小时前
第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题
人工智能·笔记·深度学习·机器学习·1024程序员节
mashagua4 小时前
RPA系列-uipath 学习笔记3
笔记·学习·rpa
nikoni234 小时前
828考研资料汇总
笔记·其他·硬件工程
青い月の魔女6 小时前
数据结构初阶---二叉树
c语言·数据结构·笔记·学习·算法
qq_589568106 小时前
node.js web框架koa的使用
笔记·信息可视化·echarts
stm 学习ing7 小时前
HDLBits训练6
经验分享·笔记·fpga开发·fpga·eda·verilog hdl·vhdl
stm 学习ing8 小时前
HDLBits训练4
经验分享·笔记·fpga开发·课程设计·fpga·eda·verilog hdl
炸毛的飞鼠8 小时前
汇编语言学习
笔记·学习
风无雨8 小时前
react杂乱笔记(一)
前端·笔记·react.js
胡西风_foxww8 小时前
【ES6复习笔记】Class类(15)
javascript·笔记·es6·继承··class·静态成员