当前位置: 首页 > 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)中断配置PA12gpio_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)中断配置PB5gpio_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后再将其置为0return 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   0void 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);//关闭LEDled1_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亮/灭。
    在这里插入图片描述

433M无线收发模块实验keil源文件


http://www.mrgr.cn/news/5919.html

相关文章:

  • Flutter Listview 缓存item滑动后不进行重新渲染
  • SQL - 索引
  • Thinkphp6 反序列化漏洞分析
  • 【数学建模备赛】Ep06:多元线性回归分析
  • 80页WORD方案深入了解大数据治理+大数据资产管理+数据运营
  • 阿里云ubuntu系统安装jdk + tomcat
  • 单例模式 详解
  • 128. 最长连续序列
  • 科技大通缩
  • 框架——MyBatis(!!!MyBatis 环境搭建步骤)
  • JAVA设计模式之【单例模式】
  • 一文掌握 Web 测试:功能、界面、兼容与安全的综合测试指南!
  • 【数据分析】数据的离中趋势之一 - 极差、分位距、平均差
  • Jenkins配置SSH凭据
  • CSS的:required和:optional伪类:增强表单字段的视觉识别
  • 【设计模式】建造者模式和单例模式
  • Redis笔记-分布式存储方案中哨兵模式配置
  • oracle数据库缓存区高速缓存区
  • Java导出分类到Excel
  • 从HTTP到HTTPS:SSL加密如何重塑互联网安全格局