arm: day8

这篇具有很好参考价值的文章主要介绍了arm: day8。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.中断实验:按键控制led灯

流程:

arm: day8,arm开发,单片机,嵌入式硬件

key.h

/*************************************************************************
    > File Name: include/key.h
    > Created Time: 2023年08月21日 星期一 17时03分20秒
 ************************************************************************/

#ifndef __KEY_H__
#define __KEY_H__

//引脚编号封装
#define EXTI7 7
#define EXTI8 8
#define EXTI9 9

#define GPIO_PIN_0 0
#define GPIO_PIN_1 1
#define GPIO_PIN_2 2
#define GPIO_PIN_3 3
#define GPIO_PIN_4 4
#define GPIO_PIN_5 5
#define GPIO_PIN_6 6
#define GPIO_PIN_7 7
#define GPIO_PIN_8 8
#define GPIO_PIN_9 9
#define GPIO_PIN_10 10
#define GPIO_PIN_11 11
#define GPIO_PIN_12 12
#define GPIO_PIN_13 13
#define GPIO_PIN_14 14
#define GPIO_PIN_15 15

#include "stm32mp1xx_exti.h"
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
#include "stm32mp1xx_gic.h"

typedef enum{
	FALL_DIS,	//禁用下降沿 0
	FALL_EN		//启用下降沿 1
}exti_ftsr1_t;

//RCC/GPIO/EXTI章节初始化
void HAL_EXTI_INIT(unsigned int pin, unsigned int gp, exti_ftsr1_t falling);

//GIC章节初始化
void HAL_GIC_INIT(unsigned int nod, unsigned int first);
 

//***************点灯***************//
//MODER模式寄存器
typedef enum{
	INPUT,	//输入 0
	OUPUT,	//输出 1
	ALT,	//复用 2
	ANALOG	//模拟 3
}gpio_moder_t;

//OTYPER输出类型寄存器
typedef enum{
	PP,		//推挽 0
	OD		//开漏 1
}gpio_otyper_t;

//OSPEEDR输出速率寄存器
typedef enum{
	LOW,		//低速 0
	MED,		//中速 1
	HIGH,		//高速 2 
	VERY_HIGH	//快速 3
}gpio_ospeedr_t;

//PUPDR是否需要上下拉电阻寄存器
typedef enum{
	NO_PU_PD,	//禁止 0 
	PU,			//上拉 1
	PD,			//下拉 2
	RES			//保留 3
}gpio_pupdr_t;

typedef struct{
	gpio_moder_t moder;		//模式寄存器
	gpio_otyper_t otyper;	//输出类型寄存器
	gpio_ospeedr_t ospeedr;	//输出速率寄存器
	gpio_pupdr_t pupdr;		//是否需要上下拉电阻寄存器
}gpio_init_t;


//GPIO引脚初始化函数 PE10 PF10 PE8
//void hal_gpio_init(GPIO组编号,引脚编号,初始化的值)
void hal_gpio_initl(gpio_t* gpiox, unsigned int pin, gpio_init_t *gpio_init);

//GPIO引脚写操作函数 0:熄灭 1:点亮
//void hal_gpio_write(GPIO组编号,引脚编号,操作的值)
void hal_gpio_writel(gpio_t* gpiox, unsigned int pin);



#endif

key.c

/*************************************************************************
    > File Name: src/key.c
    > Created Time: 2023年08月21日 星期一 17时03分20秒
 ************************************************************************/

#include "key.h"

//RCC/GPIO/EXTI章节初始化
void HAL_EXTI_INIT(unsigned int pin, unsigned int gp, exti_ftsr1_t falling)
{
	//RCC使能GPIOF组 MP_AHB4ENSETR[5] = 1
	RCC->MP_AHB4ENSETR |= (0x1 << 5);

	//设置GPIOF引脚模式为输出
	GPIOF->MODER &= (~(0x3 << (pin*2)));

	//EXTI外部中断选择GPIOF
	unsigned int n = pin/4 + 1;
	switch (n)
	{
		case 3 :
			EXTI->EXTICR3 &= (~(0xff << ((pin%4)*8)));
			EXTI->EXTICR3 |= (gp << ((pin%4)*8));
			break;
		case 2:
			EXTI->EXTICR2 &= (~(0xff << ((pin%4)*8)));
			EXTI->EXTICR2 |= (gp << ((pin%4)*8));
			break;
	}
	//EXTI事件触发为下降沿
	EXTI->FTSR1 |= (falling << pin);
	
	//EXTI设置不屏蔽 C1IMR1[9] = 1
	EXTI->C1IMR1 |= (0X1 << pin);

}

//GIC章节初始化
void HAL_GIC_INIT(unsigned int nod, unsigned int first)
{
	//1.GICD层
	//使能GICD层 CTRL[0] = 1
	GICD->CTRL |= (0x1 << 0);

	//中断设置使能(99) ISENABLER[3]第3位写1
	GICD->ISENABLER[nod/32] |= (0X1 << (nod%32));

	//中断优先级设置  IPRIORITYR[24]第[31:27] = 0b00000
	GICD->IPRIORITYR[nod/4] &= (~(0x1f << ((nod%4)*8+3)));
	GICD->IPRIORITYR[nod/4] |= (first << ((nod%4)*8+3));

	//选择CPU0  ITARGETSR[24]第[25:24] = 0b01
	GICD->ITARGETSR[nod/4] &= (~(0X3 << ((nod%4)*8)));
	GICD->ITARGETSR[nod/4] |= (0X1 << ((nod%4)*8));
	
	//2.GICC层
	//使能GICC层  CTRL[0] = 1
	GICC->CTRL |= (0X1 << 0);

	//输入中断优先级 PMR[7:3] = 0b11111
	GICC->PMR |= (0x1f << 3);
}




//**************点灯******************//
void hal_gpio_initl(gpio_t* gpiox, unsigned int pin, gpio_init_t *gpio_init)
{
	//1.设置gpio引脚模式MODER 每两位管理一个引脚
	gpiox->MODER &= (~(0x3 << (pin * 2)));
	gpiox->MODER |= (gpio_init->moder << (pin * 2));

	//2.设置gpio引脚输出类型
	gpiox->OTYPER &= (~(0x1 << pin));
	gpiox->OTYPER |= (gpio_init->otyper << pin);

	//3.设置gpio引脚输出速率
	gpiox->OSPEEDR &= (~(0x3 << (pin * 2)));
	gpiox->OSPEEDR |= (gpio_init->ospeedr << (pin * 2));
	
	//4.设置gpio引脚禁止上下拉电阻
	gpiox->PUPDR &= (~(0x3 << (pin * 2)));
	gpiox->PUPDR |= (gpio_init->pupdr << (pin * 2));
}

void hal_gpio_writel(gpio_t* gpiox, unsigned int pin)
{	
		gpiox->ODR ^= (0x1 << pin);
}

do_lrq.c

#include "key.h"
 
extern void printf(const char *fmt, ...);
unsigned int i = 0;

void do_irq(void) 
{
	unsigned int num = 0;
 
	//获取中断号
	num = GICC->IAR & 0X3FF;
	switch (num)
	{
		case 99:
			{
				printf("***key1***\n");

				hal_gpio_writel(GPIOE, GPIO_PIN_8);

				//清除EXTI层挂起标志位
				EXTI->FPR1 |= (0x1 <<9);
 
				//清除GICD层挂起标志位
				GICD->ICPENDR[3] |= (0X1 <<3);
			}
			break;

		case 97:
			{
				printf("***key2***\n");
				hal_gpio_writel(GPIOF, GPIO_PIN_10);

				//清除EXTI层挂起标志位
				EXTI->FPR1 |= (0x1 <<7);

				//清除GICD层挂起标志位
				GICD->ICPENDR[3] |= (0X1 <<1);
			}
			break;

		case 98:
			{
				printf("***key3***\n");
				hal_gpio_writel(GPIOE, GPIO_PIN_10);

				//清除EXTI层挂起标志位
				EXTI->FPR1 |= (0x1 <<8);

				//清除GICD层挂起标志位
				GICD->ICPENDR[3] |= (0X1 <<2);
			}
			break;
	}
	//清除中断号
	GICC->EOIR &= (~(0X3FF));
	GICC->EOIR |= num;
}

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

#include "key.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}
 
void led_init()
{
	//初始化时钟 GPIOE和GPIOF组时钟使能
	RCC->MP_AHB4ENSETR |= (0x3 << 4);
	//结构体进行初始化
	//gpio_init_t init;
	//init.moder = OUPUT;
	//init.otyper = PP;
	//init.ospeedr = LOW;
	//init.pupdr = NO_PU_PD;
	gpio_init_t init = {OUPUT, PP, LOW, NO_PU_PD};
	hal_gpio_initl(GPIOE, GPIO_PIN_10, &init);
	hal_gpio_initl(GPIOF, GPIO_PIN_10, &init);
	hal_gpio_initl(GPIOE, GPIO_PIN_8, &init);
}
 
int main()
{
	led_init();

	HAL_EXTI_INIT(EXTI9, 0x05, FALL_EN);
	HAL_EXTI_INIT(EXTI7, 0x05, FALL_EN);
	HAL_EXTI_INIT(EXTI8, 0x05, FALL_EN);

	HAL_GIC_INIT(99, 9);
	HAL_GIC_INIT(97, 7);
	HAL_GIC_INIT(98, 8);

	while(1)
	{
	
	}
	return 0;
}

到了这里,关于arm: day8的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Day 1. 51单片机的学习和相关概念

    驱动 裸机驱动:51——s3c2440——linux Linux驱动 寄存器:全局变量 :按位与 :指定位置0 | :按位或 :指定位置1 ^ :按位异或 : 指定位翻转 MCU:是一种集成了处理器、存储器、输入/输出接口和其他外设的单芯片计算机系统。MCU通常用于嵌入式系统中,如智能家居、智能手表

    2024年04月13日
    浏览(39)
  • day07 51单片机-18B20温度检测

    本案例讲解如何从18B20传感器获取温度信息并显示在LCD上。 1.2.1 硬件原理图 1.2.3 18B20工作原理 可以看到18B20有两根引脚负责供电,一根引脚负责数据交换。18B20就是通过数据线和单片机进行数据交换的。 1)18B20工作时序 2)初始化信号 3)写数据时序 写‘1’时序 写‘0’时序

    2024年04月23日
    浏览(33)
  • 51单片机定时器使用与计算-----day3

    51单片机定时器-----day3 8051单片机介绍: 集成 8位CPU、 4K字节ROM(掉电不丢失)、 128字节RAM(掉电丢失)、 4个8位并口、 1个全双工串行口、2个16位定时/计数器。 寻址范围64K, 并有控制功能较强的布尔处理器(带位操作)。 单片机结构内部框图: 机器周期和指令周期 ( 1)

    2024年02月03日
    浏览(44)
  • 001_区分单片机、arm、DSP、FPGA(零基础也能区分)

    单片机是指一个集成在一个芯片上的完整计算机系统,最早的单片机由微处理器核心、存储器、输入输出端口和计时电路等基本部分组成。例如,Intel公司推出的第一款单片机是Intel 8048,它于1976年发布,包括一个8位的中央处理器、ROM、RAM、输入输出端口和计时电路等基本模

    2024年02月08日
    浏览(43)
  • arm: day8

    1.中断实验:按键控制led灯 流程: key.h key.c do_lrq.c main.c

    2024年02月11日
    浏览(35)
  • 如果STM32/GD32一类的ARM单片机解除读写保护的方法

    有时候啊,使用ST-Link给STM32一类的ARM单片机下载程序的时候,发现怎么也下载不了,可能是由于芯片被写保护了。那怎么办呢?可以使用STM32 ST-LINK Utility工具解除芯片的写保护,本篇博文介绍操作步骤,文章最后有工具下载链接。 双击“STM32 ST-LINK Utility.exe”,打开软件。 软

    2024年02月09日
    浏览(53)
  • 【ARM】Day8 中断

    1. 思维导图 2. 实验要求: 实现KEY1/LEY2/KE3三个按键,中断触发打印一句话,并且灯的状态取反 key1 ---- LED3灯状态取反 key2 ---- LED2灯状态取反 key3 ---- LED1灯状态取反 key3.h led.h key3.c led.c do_irq.c main.c 运行结果:

    2024年02月11日
    浏览(44)
  • 51单片机数字旋转编码器内部原理应用与实现------day5

    51单片机数字旋转编码器内部原理应用与实现 1.数字旋转编码器 可实现按下确认,旋转加减。 不按状态为高电平,按下为低电平。 时序图: 顺时针 逆时针 A B A B 1 1 1 1 0 1 1 0 0 0 0 0 1 0 0 1 电路原理图如下所示: 实现程序如下图所示:效果不错,无丢数情况,很顺畅。功能顺时

    2024年02月12日
    浏览(44)
  • proteus结合keil-arm编译器构建STM32单片机项目进行仿真

        proteus是可以直接创建设计图和源码的,但是源码编译它需要借助keil-arm编译器,也就是我们安装keil-mdk之后自带的编译器。     下面给出一个完整的示例,主要是做一个LED灯闪烁的效果。     新建工程指定路径,Schematic,PCB layout都选择默认,在最后创建项目工程向导的时

    2024年02月13日
    浏览(65)
  • 32 位 ARM® Cortex®-M0+ 单片机,PY32F002B 系列微控制器

    PY32F002B 系列微控制器采用高性能的 32 位 ARM® Cortex®-M0+内核,宽电压工作范围的 MCU。嵌入24Kbytes Flash 和 3Kbytes SRAM 存储器,最高工作频率 24MHz。包含多种不同封装类型多款产品。 芯片集成I2C、SPI、USART 等通讯外设,1 路 12bit ADC,2 个 16bit 定时器,以及 2 路比较器。PY32F002B 系

    2024年02月05日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包