arm: day8

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

流程:

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,	//禁用下降沿 0FALL_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,	//输入 0OUPUT,	//输出 1ALT,	//复用 2ANALOG	//模拟 3
}gpio_moder_t;//OTYPER输出类型寄存器
typedef enum{PP,		//推挽 0OD		//开漏 1
}gpio_otyper_t;//OSPEEDR输出速率寄存器
typedef enum{LOW,		//低速 0MED,		//中速 1HIGH,		//高速 2 VERY_HIGH	//快速 3
}gpio_ospeedr_t;//PUPDR是否需要上下拉电阻寄存器
typedef enum{NO_PU_PD,	//禁止 0 PU,			//上拉 1PD,			//下拉 2RES			//保留 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] = 1RCC->MP_AHB4ENSETR |= (0x1 << 5);//设置GPIOF引脚模式为输出GPIOF->MODER &= (~(0x3 << (pin*2)));//EXTI外部中断选择GPIOFunsigned 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] = 1EXTI->C1IMR1 |= (0X1 << pin);}//GIC章节初始化
void HAL_GIC_INIT(unsigned int nod, unsigned int first)
{//1.GICD层//使能GICD层 CTRL[0] = 1GICD->CTRL |= (0x1 << 0);//中断设置使能(99) ISENABLER[3]第3位写1GICD->ISENABLER[nod/32] |= (0X1 << (nod%32));//中断优先级设置  IPRIORITYR[24]第[31:27] = 0b00000GICD->IPRIORITYR[nod/4] &= (~(0x1f << ((nod%4)*8+3)));GICD->IPRIORITYR[nod/4] |= (first << ((nod%4)*8+3));//选择CPU0  ITARGETSR[24]第[25:24] = 0b01GICD->ITARGETSR[nod/4] &= (~(0X3 << ((nod%4)*8)));GICD->ITARGETSR[nod/4] |= (0X1 << ((nod%4)*8));//2.GICC层//使能GICC层  CTRL[0] = 1GICC->CTRL |= (0X1 << 0);//输入中断优先级 PMR[7:3] = 0b11111GICC->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

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/53627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…

图神经网络与分子表征:番外——基组选择

学过高斯软件的人都知道&#xff0c;我们在撰写输入文件 gjf 时需要准备输入【泛函】和【基组】这两个关键词。 【泛函】敲定计算方法&#xff0c;【基组】则类似格点积分中的密度&#xff0c;与计算精度密切相关。 部分研究人员借用高斯中的一系列基组去包装输入几何信息&am…

图论(基础)

知识&#xff1a; 顶点&#xff0c;边 | 权&#xff0c;度数 1.图的种类&#xff1a; 有向图 | 无向图 有环 | 无环 联通性 基础1&#xff1a;图的存储&#xff08;主要是邻接矩阵和邻接表&#xff09; 例一&#xff1a;B3643 图的存储 - 洛谷 | 计算机科学教育新生态 (…

如何实现24/7客户服务自动化?建设智能客服知识库

客户自助服务是指用户通过企业或者第三方建立的网络平台或者终端&#xff0c;实现相关的自定义处理。实现客户服务自动化&#xff0c;对提高客户满意度、维持客户关系至关重要。客户服务自动化可以帮助企业以更快的速度和更高的效率来满足客户的售后服务要求&#xff0c;以进一…

常见的移动端布局

流式布局&#xff08;百分比布局&#xff09; 使用百分比、相对单位&#xff08;如 em、rem&#xff09;等来设置元素的宽度&#xff0c;使页面元素根据视口大小的变化进行调整。这种方法可以实现基本的自适应效果&#xff0c;但可能在不同设备上显示不一致。 <!DOCTYPE ht…

Enable Secure boot on software

User Guide&#xff1a; Secure Boot V1Secure Boot V2espsecure.py Please follow these steps: 1、Query the chip version esptool.py chip_idThe V1.0 version chip only supports Secure boot V1 The V3.0 or later version chip support Secure boot V2 2、You need…

成集云 | 畅捷通T+cloud连接器自动同步财务费用单至畅捷通 | 解决方案

源系统成集云目标系统 方案介绍 财务管理作为企业管理中重要的组成部分&#xff0c;在企业的发展和成长中扮演着重要角色&#xff0c;成集云以钉钉费用单OA审批与畅捷通TCloud系统为例&#xff0c;与钉钉连接器深度融合&#xff0c;通过数据处理和字段匹配实现了费用…

【C51 GPIO的原理和内部结构】

51单片机项目基础篇 中篇&#xff1a;介绍GPIO1、认识GPIO2、GPIO 结构框图与工作原理2.1、P0端口结构框图与工作原理2.1.1、剖析组成 P0 口的每个单元的作用2.1.2、 P0 口做为 I/O 口及地址/数据总线使用时的具体工作过程 2.2、P1 端口结构框图与工作原理2.3、P2 端口结构框图…

73 # 发布自己的 http-server 到 npm

1、添加 .npmignore 文件&#xff0c;忽略不需要的文件 public2、去官网https://www.npmjs.com/检查自己的包名是否被占用 3、切换到官方源&#xff0c;然后检查确认 nrm use npm nrm ls4、登录 npm 账号 npm login5、发布 npm publish6、查看发布情况&#xff0c;发布成功…

波奇学C++:stl的list模拟实现

list是双向带头链表。所以迭代器end()相当于哨兵卫的头。 list不支持和[]重载&#xff0c;原因在于list空间不是连续的&#xff0c;和[]的代价比较大。 访问第n个节点&#xff0c;只能用for循环&#xff0c;来实现 list<int> l; l.push_back(0); l.push_back(1); l.pu…

Matlab图像处理-加法运算

加法运算 图像加法运算的一个应用是将一幅图像的内容叠加到另一幅图像上&#xff0c;生成叠加图像效果&#xff0c;或给图像中每个像素叠加常数改变图像的亮度。 在MATLAB图像处理工具箱中提供的函数imadd()可实现两幅图像的相加或者一幅图像和常量的相加。 程序代码 I1 i…

k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC

文章目录 1、工作负载1.1、定义1.2、分类 2、Deployment2.1、定义2.2、Deployment创建2.3、Deployment 更新机制2.3.1、比例缩放&#xff08;Proportional Scaling&#xff09;2.3.2、HPA&#xff08;动态扩缩容&#xff09;2.3.2.1、需要先安装metrics-server2.3.2.2、配置hpa…

剪枝基础与实战(2): L1和L2正则化及BatchNormalization讲解

1. CIFAR10 数据集 CIFAR10 是深度学习入门最先接触到的数据集之一,主要用于图像分类任务中,该数据集总共有10个类别。 图片数量:6w 张图片宽高:32x32图片类别:10Trainset: 5w 张,5 个训练块Testset: 1w 张,1 个测试块Pytorch 集成了很多常见数据集的API, 可以通过py…

P1065 [NOIP2006 提高组] 作业调度方案

[NOIP2006 提高组] 作业调度方案 题目描述 我们现在要利用 m m m 台机器加工 n n n 个工件&#xff0c;每个工件都有 m m m 道工序&#xff0c;每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。 每个工件的每个工序称为一个操作&#xff0c;…

函数式编程-Stream流学习第一节

1 为什么学习 1.现在很多公司在编程中大量使用函数式编程-Stream流格式代码&#xff0c;所以为了能够看懂公司的代码 2.大量数据下处理集合效率高--因为有并行流 3.代码可读性高 4.消灭嵌套地狱 2 函数式编程思想 2.1 概念 面向对象编程是关注于用对象完成什么事情。而函数式…

联想小新Pro 16笔记本键盘失灵处理方法

问题描述&#xff1a; 联想小新Pro 16新笔记本开机准备激活&#xff0c;到连接网络的时候就开始触控板、键盘失灵&#xff0c;但是有意思的是键盘的背光灯是可以调节关闭的&#xff1b;外接鼠标是正常可以移动的&#xff0c;但是只要拔掉外接鼠标再插回去的时候就不能用了&…

VUE笔记(十)Echarts

一、Echarts简介 1、什么是echarts ECharts是一款基个基于 JavaScript 的开源可视化图表库 官网地址&#xff1a;Apache ECharts 国内镜像&#xff1a;ISQQW.COM x ECharts 文档&#xff08;国内同步镜像&#xff09; - 配置项 示例&#xff1a;echarts图表集 2、第一个E…

mysql 查询的字段值太长显示不全 group_concat

当前这个字段非常的长&#xff0c;在数据库看的时候也只是显示一部分内容&#xff0c;这是由于group_concat的group_concat_max_len参数的值太小造成的&#xff0c;默认值如下&#xff1a; show VARIABLES like group_concat_max_len 我们需要将这个值调大一点就可以解决上面这…

无涯教程-PHP - 简介

PHP 7是最期待的&#xff0c;它是PHP编程语言的主要功能版本。 PHP 7于2015年12月3日发布。本教程将以简单直观的方式教您PHP 7的新功能及其用法。 无涯教程假设您已经了解旧版本的PHP&#xff0c;现在就可以开始学习PHP 7的新功能。 使用下面的示例- <html><head&…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持 UDP 、TCP 、WebSocket 三种协议&#xff0c;支持 iOS、Android、H5、标准Java、小程序、Uniapp&#xff0c;服务端基于Netty编写。 工程…