小实验--433M无线收发模块实验

433M无线收发模块实验

实验目的

按下遥控器A键,LED1亮/灭;按下遥控器B键,LED2亮/灭。

硬件

硬件清单

  • 433M发送/接收模块
  • 上官二号
  • ST-Link

硬件接线

STM32433M
PB5D0
PA12D1
5V5V
GNDGND

代码

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wind_one2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值