当前位置: 首页 > news >正文

【STM32单片机_(HAL库)】3-2-3【中断EXTI】【电动车报警器项目】433M无线收发模块实验

1.硬件

  • STM32单片机最小系统
  • 433M无线收发模块
  • LED灯模块

2.软件

  • 驱动文件添加
  • GPIO常用函数
  • 中断配置流程
  • main.c程序
#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();                        /* 初始化EXTI */

    while(1)
    { 
        if(buttonA_flag_get() == TRUE)  //如果检测到A键按下
            led1_toggle();              //则翻转LED1状态
        
        if(buttonB_flag_get() ==  TRUE) //如果检测到B键按下
            led2_toggle();              //则翻转LED2状态
    }
}


  • exti.c程序
#include "exti.h"
#include "sys.h"
#include "delay.h"
#include "led.h"

uint8_t buttonA_flag = FALSE;                               // 按键A按下的标志位
uint8_t buttonB_flag = FALSE;                               // 按键B按下的标志位

void exti_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();                           // 使能GPIOA时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟

    //按键B(D1)中断配置PA12
    gpio_initstruct.Pin = GPIO_PIN_12;                      // 按键B对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_IT_RISING;             // 上升沿触发,未按下为低,按下输出高
    gpio_initstruct.Pull = GPIO_PULLDOWN;                   // 下拉
    HAL_GPIO_Init(GPIOA, &gpio_initstruct);

    HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);             // 设置EXTI15_10中断线的优先级
    HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);                     // 使能中断

    //按键A(D0)中断配置PB5
    gpio_initstruct.Pin = GPIO_PIN_5;                       // 按键A对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_IT_RISING;             // 上升沿触发
    gpio_initstruct.Pull = GPIO_PULLDOWN;                   // 下拉
    HAL_GPIO_Init(GPIOB, &gpio_initstruct);

    HAL_NVIC_SetPriority(EXTI9_5_IRQn, 2, 0);               // 设置EXTI9_5中断线的优先级
    HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);                       // 使能中断
}

void EXTI15_10_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
}

void EXTI9_5_IRQHandler(void)
{
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    //delay_ms(20);
    if (GPIO_Pin == GPIO_PIN_12)                                    //PA12,检测到B键按下
    {
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_12) == GPIO_PIN_SET)    //按键未按下为低,按下输出高
            //led2_toggle();
            buttonB_flag = TRUE;
    }
    else if (GPIO_Pin == GPIO_PIN_5)                                //检测到A键按下
    {
        if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5) == GPIO_PIN_SET)     //按键未按下为低,按下输出高
            //led1_toggle();
            buttonA_flag = TRUE;
    }
}

uint8_t buttonA_flag_get(void)
{
    uint8_t temp = buttonA_flag;
    buttonA_flag = FALSE;           //使用过buttonA_flag的值为1后再将其置为0
    return temp;
}

void buttonA_flag_set(uint8_t value)
{
    buttonA_flag = value;
}

uint8_t buttonB_flag_get(void)
{
    uint8_t temp = buttonB_flag;
    buttonB_flag = FALSE;
    return temp;
}

void buttonB_flag_set(uint8_t value)
{
    buttonB_flag = value;
}





  • exti.h程序
#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


  • led.c
#include "led.h"
#include "sys.h"

//初始化GPIO函数
void led_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    //打开时钟
    __HAL_RCC_GPIOB_CLK_ENABLE();                           // 使能GPIOB时钟
    
    //调用GPIO初始化函数
    gpio_initstruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;          // 两个LED对应的引脚
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;             // 推挽输出
    gpio_initstruct.Pull = GPIO_PULLUP;                     // 上拉
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;           // 高速
    HAL_GPIO_Init(GPIOB, &gpio_initstruct);
    //关闭LED
    led1_off();
    led2_off();
}

//点亮LED1的函数
void led1_on(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);   // 拉低LED1引脚,点亮LED1
}

//熄灭LED1的函数
void led1_off(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);     // 拉高LED1引脚,熄灭LED1
}

//翻转LED1状态的函数
void led1_toggle(void)
{
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
}

//点亮LED2的函数
void led2_on(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);   // 拉低LED2引脚,点亮LED2
}

//熄灭LED2的函数
void led2_off(void)
{
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);     // 拉高LED2引脚,熄灭LED2
}

//翻转LED2状态的函数
void led2_toggle(void)
{
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
}

  • led.h
#ifndef __LED_H__
#define __LED_H__

void led_init(void);
void led1_on(void);
void led1_off(void);
void led1_toggle(void);
void led2_on(void);
void led2_off(void);
void led2_toggle(void);

#endif

3.实物效果

  • 硬件模块接线
    433M—>STM32
    D0—>PB5
    D1—>PA12
    5V—>5V
    GND—>GND
    ST-Link下载方式
  • 实验现象
    按下遥控器A键,LED1亮/灭;按下遥控器B键,LED2亮/灭。

keil源文件

相关文章:

  • 使用Virtio Driver实现一个计算阶乘的小程序——QEMU平台
  • Python-数据爬取(爬虫)
  • Ceph篇之利用shell脚本实现批量创建bucket桶
  • 《区块链与监管合规:在创新与规范之间寻求平衡》
  • 单片机大小端模式
  • 100个练习学习Rust!可变性・循环・溢出
  • Nuxt3【项目配置】nuxt.config.ts
  • Spring Cloud全解析:配置中心之springCloudConfig配置存储
  • leetcode 41-50(2024.08.19)
  • 嵌入式软件--模电基础 DAY 2
  • 手撕C++入门基础
  • PyTorch分布式训练全攻略:DistributedDataParallel精解与实战
  • 数据结构——单链表
  • (计算机网络)网络层
  • 【Unity教程】使用 Animation Rigging实现IK制作程序化的动画手臂跟随手自动移动等效果
  • JS DOM、点击事件
  • redis列表若干记录
  • 如何使用用户名和密码访问salesforce的api
  • 【C++】C++11新增特性
  • 云计算实训31——playbook(剧本)基本应用、playbook常见语法、playbook和ansible操作的编排
  • 特朗普考虑任命副幕僚长米勒任国安顾问,曾策划驱逐移民行动
  • 特朗普:对所有在国外制作进入美国的电影征收100%关税
  • 上海成五一国内最热门的入境游目的地,国际消费明显提升
  • 执掌伯克希尔60年,股神巴菲特宣布年底交出最终决定权:阿贝尔将接任CEO
  • 对华小额包裹免税取消=更高价格+更慢物流,美消费者为关税政策买单
  • 韩国前国务总理韩德洙正式宣布参加总统选举