stm32f4 外部中断寄存器控制操作,解读芯片手册,达到从零写程序

stm不是有HAL库吗,为啥写寄存器版本的?

在arm里面可没有HAL库一说,都是直接操控寄存器,所以理解芯片手册很重要,当然HAL库很好用
这次解读的stm32 使用外部中断按键控制led灯的代码

开始使用源码分析

先进个main函数
在这里插入图片描述
看见我们的重要函数EXTIX_INIT();
同时使用文档解读

在这里插入图片描述
简单来说
1 初始化io口 :设置已经存在的状态
2 让io口和中断线建立映射 :我们外部io中断只有5个,不可能每个io口都能触发
3 设置什么时候io口会触发中断
4 配置nvic(写arm好像没这么复杂啊)

让io口初始化

在这里插入图片描述
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //控制PA(0)为输入
#define WK_UP PAin(0) //看看PA(0)是不是输入

分析 EXTI->PR=1<<0;
EXTI 在芯片手册里查找
在这里插入图片描述
哎呀还没给base_address 没事继续上去查找
进入寄存器地址
在这里插入图片描述
在这里插入图片描述
所以base_address 就是 0x40013c00
验证 进入教程的代码查看
#define EXTI ((EXTI_TypeDef *) EXTI_BASE) // 在EXTI base_address 的基础上 构建一个结构体
#define EXTI_BASE (APB2PERIPH_BASE + 0x3C00)//0x40013C00
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
#define PERIPH_BASE ((uint32_t)0x40000000)
把上面的地址找出来,和我们算的地址一样,芯片手册没看错

我们接着设置 exit_pr
在这里插入图片描述
那么pr寄存器就是base_address + 0x14
验证 在这个结构体里 pr的偏移值也是14
在这里插入图片描述
给我们的中断线1 初始化

设置触发方式

怎么又帮我把函数写好了,正真开发的时候,还是要自己写这样的函数的
在这里插入图片描述
1.使用sys时钟,
2.清零外部中断寄存器
3.在这个寄存器赋值,表示外部中断1,用PC中短线控制

从芯片手册上看,要用外部中断源还是要配制时钟的外部中断寄存器
Ex_NVIC_Config(GPIO_C,13,FTIR);
13/4=3 放在外部中断寄存器3才能配置13口 = EXTICR[3]
并且使用外部中断线1 清零我们的PC SYSCFG->EXTICR[BITx/4]&=~(0x000F0);
配置我们的外部中断线1 接上PC[13] SYSCFG->EXTICR[BITx/4]&=~(0x04<<4);
在这里插入图片描述
在这里插入图片描述
验证 打开debug 的watch窗口 用这个窗口查看变量值,确实这个值是0x04
在这里插入图片描述
同样 也是这个寄存器的发生了改变在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值