433M无线收发模块实验
实验目的
按下遥控器A键,LED1亮/灭;按下遥控器B键,LED2亮/灭。
硬件
硬件清单
- 433M发送/接收模块
- 上官二号
- ST-Link
硬件接线
| STM32 | 433M |
|---|---|
| PB5 | D0 |
| PA12 | D1 |
| 5V | 5V |
| GND | GND |
代码
1.exti.c
#include "exti.h"
#include "sys.h"
#include "led.h"
uint8_t buttonA_flag = FALSE;
uint8_t buttonB_flag = FALSE;
void exti_init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef gpio_initstruct; //初始化GPIO函数中的结构体
//初始化GPIOA_12函数
gpio_initstruct.Mode =GPIO_MODE_IT_RISING; //上升沿触发中断①
gpio_initstruct.Pin =GPIO_PIN_12; //GPIOA_12
gpio_initstruct.Pull =GPIO_PULLDOWN; //下拉②
gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH;//高速
HAL_GPIO_Init(GPIOA,&gpio_initstruct); //GPIO初始化函数
HAL_NVIC_SetPriority(EXTI15_10_IRQn,2,0); //中断优先级设置③
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); //使能中断
//初始化GPIOB_5函数
gpio_initstruct.Mode =GPIO_MODE_IT_RISING;
gpio_initstruct.Pin =GPIO_PIN_5;
gpio_initstruct.Pull =GPIO_PULLDOWN;
gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB,&gpio_initstruct);
HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
//GPIOA_12的中断服务函数
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12); //调用回调函数
}
//GPIOB_5的中断服务函数
void EXTI9_5_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5); //调用回调函数
}
//回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_12) //判断是否是12引脚触发的中断
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_12) == GPIO_PIN_SET) //判断是否为高电平
{
buttonB_flag = TRUE; //将buttonB_flag赋值为TRUE
}
}
else if(GPIO_Pin == GPIO_PIN_5) //判断是否是5引脚触发的中断
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5) == GPIO_PIN_SET) //判断是否wield低电平
{
buttonA_flag = TRUE; //buttonA_flag赋值为TRUE
}
}
}
//返回标志buttonA_flag的函数
uint8_t buttonA_flag_get(void)
{
uint8_t temp = buttonA_flag; //将buttonA_flag赋值给temp④
buttonA_flag = FALSE; //将buttonA_flag赋值为FALSE
return temp; //返回temp
}
//得到buttonA_flag的函数
void buttonA_flag_set(uint8_t value)
{
buttonA_flag = value; //将得到的值赋值给buttonA_flag
}
//同上
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;
}
解释
①因为默认上电后接收装置为低电平,当按下按钮时,接收装置会发送高电平所以是上升沿触发。
②因为高电平会触发中断,所以初始状态设置为下拉,也就是低电平。
③EXTI15_10_IRQn这个中断号是引脚10到15的中断号。
④如果直接将buttonA_flag标志返回,在main函数中就会一直触发,所以要将buttonA_flag传给temp再将buttonA_flag赋值为FALSE
2.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();
exti_init();
while(1)
{
if(buttonA_flag_get() == TRUE)
{
led1_toggle();
}
else if(buttonB_flag_get() == TRUE)
{
led2_toggle();
}
}
}
3.led.c
#include "led.h"
#include "sys.h"
void led_init(void)
{
//打开时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
//GPIO初始化函数
GPIO_InitTypeDef gpio_initstruct;
gpio_initstruct.Mode =GPIO_MODE_OUTPUT_PP;
gpio_initstruct.Pin =GPIO_PIN_8 | GPIO_PIN_9;
gpio_initstruct.Pull =GPIO_PULLUP;
gpio_initstruct.Speed =GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &gpio_initstruct);
led1_off();
led2_off();
}
//打开led1函数
void led1_on(void)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8, GPIO_PIN_RESET);
}
//关闭led1函数
void led1_off(void)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8, GPIO_PIN_SET);
}
//翻转led1函数
void led1_toggle(void)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
//打开led1函数
void led2_on(void)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9, GPIO_PIN_RESET);
}
//关闭led1函数
void led2_off(void)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9, GPIO_PIN_SET);
}
//翻转led1函数
void led2_toggle(void)
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
}
4.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
5.led.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
7821

被折叠的 条评论
为什么被折叠?



