STM32
直播中

小镇故事多

12年用户 439经验值
擅长:模拟技术
私信 关注
[问答]

萌新求助,求stm32使用外部中断按键控制led灯的代码

萌新求助,求STM32使用外部中断按键控制led灯的代码

回帖(1)

王兰英

2021-11-17 09:47:05
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





同样 也是这个寄存器的发生了改变

举报

更多回帖

发帖
×
20
完善资料,
赚取积分