ARM_day9 按钮控制LED灯、蜂鸣器、风扇实验

这篇具有很好参考价值的文章主要介绍了ARM_day9 按钮控制LED灯、蜂鸣器、风扇实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

key.h

#ifndef __KEY__H__
#define __KEY__H__
#include"stm32mp1xx_gpio.h"
#include"stm32mp1xx_rcc.h"
#include"stm32mp1xx_gic.h"
#include"stm32mp1xx_exti.h"


void key_config();
void all_led_init();
void fan_init();
void sp_init();
#endif

key.c

 文章来源地址https://www.toymoban.com/news/detail-733797.html

#include"key.h"

void key_config()
{
	//RCC使能GPIOF时钟
	RCC->MP_AHB4ENSETR |= (0X1<<5);
	//设置PF9 PF7 PF8GPIO输入
	GPIOF->MODER&=(~(0x3<<18));   //设置key1->PF9;
	GPIOF->MODER&=(~(0x3<<14));   //设置key1->PF7;
	GPIOF->MODER&=(~(0x3<<16));   //设置key1->PF8;
	//设置PF9 PF7 PF8产生EXTI事件 EXTI EXTICRX
	//key1->PF9初始化
	EXTI->EXTICR3&=(~(0xff<<8));
	EXTI->EXTICR3|=(0x05)<<8;

	//key2->PF7初始化
	EXTI->EXTICR2&=(~(0xFF<<24));
	EXTI->EXTICR2|=(0x5)<<24;

	//key3->PF8初始化
	EXTI->EXTICR3&=(~(0xff)<<0);
	EXTI->EXTICR3|=(0x5)<<0;
	//设置事件触发方式为下降沿触发EXTI_FTSR1
	EXTI->FTSR1|=(0x1<<9);
	//key2->pf7初始化
	EXTI->FTSR1|=(0x1<<7);
	//key3->pf8初始化
	EXTI->FTSR1|=(0x1<<8);
	//设置EXTI事件触发不屏蔽EXTI_IMR1
	//key1->pf9初始化
	EXTI->C1IMR1|=(0x1<<9);
	//key2->pf7初始化
	EXTI->C1IMR1|=(0x1<<7);
	//key3->pf8初始化
	EXTI->C1IMR1|=(0x1<<8);

	//使能中断能转发到特定的CPU接口层GICD ISENABLERX
	GICD->ISENABLER[3]|=(0x1<<3);   //key1
	GICD->ISENABLER[3]|=(0x1<<1);   //key2
	GICD->ISENABLER[3]|=(0x1<<2);   //key3
	//GICD ISENABLERx设置中断优先级
	GICD->IPRIORITYR[24]&=(~(0x1f<<27));   //key1
	GICD->IPRIORITYR[24]&=(~(0x1f<<11));   //key2
	GICD->IPRIORITYR[24]&=(~(0x1f<<19));   //key3
	//设置当前中断被转发到哪一个CPu处理GICD_ITARGETSRX
	GICD->ITARGETSR[24]&=(~(0x3<<24));  //分配给cpu0
	GICD->ITARGETSR[24]|=(0x1<<24);   	//key1
	
	GICD->ITARGETSR[24]&=(~(0x3<<8));  //分配给cpu0
	GICD->ITARGETSR[24]|=(0x1<<8);   	//key2
 
	GICD->ITARGETSR[24]&=(~(0x3<<16));  //分配给cpu0
	GICD->ITARGETSR[24]|=(0x1<<16);   	//key3
	//使能cPu可以处理组0转发的中断GICC_CTLR
	GICC->CTRL|=(0x1<<0);
	//设置中断优先级掩码GICC_CTLR
	GICC->PMR|=(0x1f<<3);
	//使能组0转发中断GICD_CTLR
	GICD->CTRL|=(0x1<<0);
}
//GPIO初始化
void all_led_init()
{
	//RCC使能GPIOF时钟
	RCC->MP_AHB4ENSETR |= (0X3<<4);
    //设置PE10 PF10 PE8为输出
    GPIOE->MODER &= (~(0X3<<20));
    GPIOE->MODER |= (0X1<<20);
    GPIOF->MODER &= (~(0X3<<20));
    GPIOF->MODER |= (0X1<<20);
    GPIOE->MODER &= (~(0X3<<16));
    GPIOE->MODER |= (0X1<<16);
    //设置推挽输出
	GPIOE->OTYPER &= (~(0X1<<10));
    GPIOF->OTYPER &= (~(0X1<<10));
    GPIOE->OTYPER &= (~(0X1<<8));
    //设置三个管脚低速输出
    GPIOE->OSPEEDR &= (~(0X3<<20));
    GPIOF->OSPEEDR &= (~(0X3<<20));
    GPIOE->OSPEEDR &= (~(0X3<<16));
    //设置三个管脚输出时无上拉电阻和下拉电阻    
    GPIOE->PUPDR &= (~(0X3<<20));
    GPIOF->PUPDR &= (~(0X3<<20));
    GPIOE->PUPDR &= (~(0X3<<16));
	
//	GPIOE->ODR &= (~(0X1<<10));
//	GPIOF->ODR &= (~(0X1<<10));
//	GPIOE->ODR &= (~(0X1<<8));

}
//PE9风扇
void fan_init()
{
	//RCC使能GPIOE时钟
	RCC->MP_AHB4ENSETR |= (0X1<<4);
    //设置PE9为输出
    GPIOE->MODER &= (~(0X3<<18));
    GPIOE->MODER |= (0X1<<18);
    //设置推挽输出
	GPIOE->OTYPER &= (~(0X1<<9));
    //设置三个管脚低速输出
    GPIOE->OSPEEDR &= (~(0X3<<18));
    //设置三个管脚输出时无上拉电阻和下拉电阻    
    GPIOE->PUPDR &= (~(0X3<<18));

//	GPIOE->ODR &= (~(0X1<<9));
}

//PB6蜂鸣器
void sp_init()
{
    //RCC使能
    RCC->MP_AHB4ENSETR  |= (0x1<<1);
    //设置PE9为输出
    GPIOB->MODER &= (~(0X3<<12));
    GPIOB->MODER |= (0X1<<12);
    //设置推挽输出
    GPIOB->OTYPER &= (~(0X1<<6));
    //设置三个管脚低速输出
    GPIOB->OSPEEDR &= (~(0X3<<12));
    //设置三个管脚输出时无上拉电阻和下拉电阻    
    GPIOB->PUPDR &= (~(0X3<<12));

//	GPIOB->ODR &= (~(0X1<<6));
}

do_irq.c

#include"key.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void do_irq(void) 
{
	//获取终端号
	int GICC_num=GICC->IAR&0x3ff;
	//判断终端号
	switch (GICC_num)
	{
	case 99:    //key1
		printf("key1\n");
		GPIOE->ODR ^= (0X1<<10);
		GPIOF->ODR ^= (0X1<<10);
		GPIOE->ODR ^= (0X1<<8);
		//清除EXTI
		EXTI->FPR1|=(0x1<<9);   //key1
		//清除终端挂起标志位,清除终端号
		GICD->ICPENDR[3]|=(0x1<<3);                //key1

		break;

	case 97:    //key2
		printf("key2\n");
		GPIOB->ODR ^= (0X1<<6);
		//清除EXTI
		EXTI->FPR1|=(0x1<<7);   //key2
		//清除终端挂起标志位,清除终端号
		GICD->ICPENDR[1]|=(0x1<<1); 			   //key2

		break;
	case 98:
		printf("key3\n");
		GPIOE->ODR ^= (0X1<<9);
		//清除EXTI
		EXTI->FPR1|=(0x1<<8);   //key3
		//清除终端挂起标志位,清除终端号
		GICD->ICPENDR[2]|=(0x1<<2); 			   //key3

		break;
	}
		//清除GICC
		GICC->EOIR=GICC_num;
}

main.c

 

#include "uart.h"
#include "key.h"
int main()
{
	
	key_config();
	all_led_init();
	fan_init();
	sp_init();

    while(1)
    {
     	
	}

	return 0;
}

到了这里,关于ARM_day9 按钮控制LED灯、蜂鸣器、风扇实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习笔记|认识蜂鸣器|控制原理|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(上):蜂鸣器应用

    反面包上黑胶的是有源蜂鸣器。 在背面裸露的一块线路板的是无源蜂鸣器。 YX55675-无源蜂鸣器模块的资料 提取码:nl73 1、有源蜂鸣器内部带震荡源,所以只要一通电就会叫(一边高电平,一边低电平),而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫(必须不断给高

    2024年02月11日
    浏览(58)
  • 【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

    注:本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时,可输入或输出数字信号 例如: 检测按键输入信号(Read_Pin)输出信号(Write_Pin) 输出信号点亮或熄灭LED GPIO引脚内部结构图 GPIO状态 输入浮空状态 :上拉下拉电阻均不使用(复位时

    2024年01月20日
    浏览(53)
  • 基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

    这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关;本文从原理图开始到最后实现功能,内容详细。 本栏目的所有都是基于STM32F407ZET6芯片,博主采用的是普中的天马F407开发板。 实现功能:LED0与LED1默认熄灭,蜂鸣器默认关闭。按下按键KEY0,控LED0亮灭;按下按

    2024年02月16日
    浏览(52)
  • ARM day7 day8 UART串口、PWM蜂鸣器、WDT看门狗、ADC数模转换

            GPA1_0: RXD2         GPA1_1: TXD2         1)对外设置 (GPIO)             GPA1CON: 0x11400020   3:0-0x2(RXD2)  7:4-0x2(TXD2)         2)对内设置(uart)             ULCON2: 0x13820000   0x3             UCON2:  0x13820004   1:0-01(polling)  3:2-01(polling)             UTRSTAT2: 0-1(r

    2024年02月21日
    浏览(37)
  • 3、stm32:GPIO输出——LED闪烁、LED流水灯、蜂鸣器

    目录 一、GPIO简介 二、GPIO基本结构 三、GPIO模式 四、GPIO常用寄存器 (1)端口配置低高寄存器(GPIOx_CRL/GPIOx_CRH)(x=A…E) (2)端口输入数据寄存器(GPIOx_IDR)(x=A…E) (3)端口输出数据寄存器(GPIOx_ODR)(x=A…E) (4)端口位设置/清除寄存器(GPIOx_BERR)(x=A…E) (5)端口位清除寄存器(GP

    2024年02月09日
    浏览(45)
  • (STM32基础)STM32实现LED闪烁&LED流水灯&蜂鸣器

    1、按照新建工程步骤创建工程,新建start、library、user三个文件夹,从固件库添加相应文件 2、keilkil小程序用来清理listings和objects文件夹中编译产生的中间文件,以后需要打包工程的话可以先用keilkill先清理,这样文件夹会大大缩小所占内存。 在library中可以查看外设函数库,

    2024年02月07日
    浏览(58)
  • 【STM32】STM32学习笔记-LED闪烁 LED流水灯 蜂鸣器(06-2)

    电路图示例1 电路图示例2 main.c 接线图如下图所示: 点击下载,现象为LED闪烁。 main.c main.c stm32F103工程模板 01-LED闪烁.rar 02-LED流水灯.rar 03-蜂鸣器示例程序.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年03月19日
    浏览(59)
  • 嵌入式系统项目设计——基于LED、按键、蜂鸣器的打地鼠游戏(完整代码)

    内容摘自上学期嵌入式系统课程设计最终的实验报告,因为CSDN不支持上传word资料,所以我就摘录下来写进文章里了,希望可以帮助到你 1.1选题背景 打地鼠游戏是一种非常受小孩子欢迎的游戏,拥有数量极其广大的受众,所以它的市场前景非常广阔。当今社会虽然存在各种各

    2024年02月09日
    浏览(55)
  • 基于C51控制蜂鸣器

    🐋 前言:本实验基于STC89C52RC单片机,根据电路原理图编程控制蜂鸣器。由于51系列单片机结构大同小异,读者可根据此博客举一反三,实现所需完成的功能。 🐬 目录: 一、蜂鸣器介绍 二、电路原理图分析 三、实现蜂鸣器鸣叫 🐇 实验所选单片机及结构展示(以普中C51为例,

    2024年02月05日
    浏览(40)
  • 蜂鸣器分类及声音控制说明

    有源蜂鸣器:         内部还有震荡电路(震荡源),可将恒定的直流电转化成一定频率的脉冲信号 无源蜂鸣器:         内部不带震荡源,直流信号无法令其鸣叫 1. 有源蜂鸣器 是直流电压驱动,不需要利用交流信号进行驱动,只需要对驱动口输出驱动电平并通过三

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包