文章目录
- 1
- 2
- 2.1
- 2.2
- 2.3
- 2.4
- 2.5
- 2.6
- 2.6.1
- 2.6.2
- 3
- 3.1
- 3.2
- 3.3
- 4.1
- 4.3
- 5
- 6
- 7
- 8
- 8.1
- 8.2
- NVIC 管理所有中断
- EXTI 外部中断事件控制器 针对外部 可以看成NVIC 下属
1
- 中断和 中止(不回去了)不一样
- 搁一段时间就
- 如果不用中断 用while() 可能夹半天 还没执行完下面的
- 用while + if 的话 if前卡着 如 30ms 但接收数据只10ms 可能接受不到
- AFIO 把GPIO 映射到 EXTI
- 后面会反向介绍
2
2.1
- 和内核紧密耦合在一起 可以看成内核一部分
- 内核由NVIC管理中断
- ST 把256个优先级裁剪为16个
- 没用的中断 保留
- 中断服务函数 中断入口 执行相应程序 被定义在中断向量表里
- 固定的 不是动态的
- 4字节 因为32位 每次取地址也是这么多
- 自动执行
- 下面这几个handler都在.s文件里
- 如果给main也分优先级 那它是最低的
- 启动文件里有 中断向量表 -> 中断服务函数
- DCD 4字节对齐
- 0 保留
- 内核中断 外部中断
- 也可以去参考手册里找 中断服务函数
- 灰色的是 内核中断
2.2
-
ISER 256位 对应外部中断 240个 16个保留
-
IPR 对应240个外部中断 只用高4位 2^4 对应16个中断优先级
-
nxp 和st都是 芯片公司
-
参考开发指南
-
IPR 4个位 又分为抢占优先级 和 响应优先级
-
具体分配 由AIRCR分 控制五种分组
2.3
2.4
- 自然优先级
2.5
- 优先级分组本来8 种 但IPR削了四位
- 不同的分组 总优先级个数居然不同
2.6
- 包含NVIC配置步骤 和 NVIC相关HAL库介绍
- IRQ 是中断请求
2.6.1
- NVIC函数 定义在这cortex
- 这个 .c 文件对内核底层头文件进行重新封装
- 参数有五个可选
- 但是HAL_Init 中已设置分组为2
- 上面那个是断言 判断形参是否有效 HAL库里经常用
- 真正实现的是下面那个
- 还有一层封装
- m3 内核的头文件 包含内核里 所有底层函数?
- 比较奇怪 函数放在.h里
2.6.2
- 中断号 或者叫中断请求号
- 对应中断向量表位置一栏
- 感觉都是这种断言 + 真正实现(都在m3 那)所以cortex.c就是对cm3.h进行再次封装
- 第一个是获取分组
- 得到分组后通过最后一个设置
- 一个外部 一个内核中断
- 只用了IPR 60个寄存器
- NVIC相关寄存器 以数组形式定义
- IPR 8位
- IP[0] 对应中断向量表位置为1的中断
- 使能操作这个寄存器
3
3.1
- 两种叫法 扩展好像更合理
- 这是主线 具体对应哪一个port 后面映射说
- F1虽然是20个线 但这就19个 因为正点这f1不是互联型的 线19 没勾上
- EXTI 作用 管理芯片内部外部 唤醒事件或者中断
- 底下是外设的信号 所以是内部
3.2
- 好像是信号来了 EXTI 来产生 是中断 还是事件
- 挂起状态位 对应寄存器位置1了 就说明 产生EXTI中断了
3.3
- 输入线就是EXTI线
- 上升沿和下降沿都是32位的 19个位有效 置1代表选择
- 清中断 也是由请求挂起寄存器整的 变成0
- 6个寄存器 主要用到4个 那两用的少
- 线也是从0开始的 位也是 正好对上
- 这个是 挂起寄存器
- F1由AFIO来配置
4.1
- 配置就是操作一些寄存器
4.3
- 引脚号 和 分组号 这配置选的是分组 , 引脚号 和 线的那个是对应的
- 分时一对一
- 正好16个
5
介绍中断配置步骤和整体情况
- 这个外设中断由其寄存器 开启
- 直接到 NVIC 了 EXTI就像更硬件的去开启中断 这已经开启了 所以就不走了?
- 5-9 10-15分别共用一个handler
- handler 在.s 文件里面找
6
- GPIO外部中断 用到 1 4 (为啥不用2 前面不都设置输入模式了)
7
- 硬件中断服务函数 是因为 中断向量表 里位置固定?
- 51里面一般服务函数 最后清标志位了
- 如串口接收回调函数 串口发送回调函数 串口接收到一半也有回调函数
8
- 按键来模拟上升沿和下降沿
8.1
- 复制跑马灯的文件夹
- BSP里新建EXTI
- 再在keil里面添加分组
- 固定开头整上
- 初始化外部中断 写1哈
- 把LED里的拷过来了 这里面包含 开启GPIO时钟和 HAL_GPIO_Init
- 中断 下面是事件
- 又几把说输入了 输入不用 读函数?
- 例程里面已设置分组 跳过这步
然后又设置勾子优先级
- 说 PE4 对应这个EXTI4 我一看就几把4个 不是说好的 GPIO用16个吗 然后就觉得是映射的那个寄存器 后来一想是因为那后面的线共用了handler
去启动文件里找到 对应中断服务函数叫什么名
- 公用处理函数在 hal_gpio.c 里
- 因为这个 所以EXTI 0~15 驱动和GPIO 驱动写到一起了
- 上面那个是判断那一位是否为1
- 下面是往位里面写1(先几把别管为啥写1可以了 可能又有取反?)
- 这个参数不一般
- 很明显不是简单排的 估计和位置有关
-
弱定义
-
用户逻辑代码 在callback里完成
-
要消抖 再加上include delay的头文件
- 在led.h 里定义了LED0是PB5
- 编译错了一次 回调函数刚才在这也加上weak了 重复了好像
- 然后main.c 里include 调用exti_init(现在exti.h里声明)
- 判断一下 这个引脚调用的callback
- 中断服务函数已在.s 中声明
- callback 已在gpio.h 里声明
- main.c这么写
- led0 是红灯
- 这回BSP里面就没KEY 感觉就是 实现了对应函数就行 (都写了GPIO)
8.2
- 看着这个 又在自己上面那个里面服务函数加了这个
- 也算按键在中断里消抖(后面的)
- HAL库公用中断处理函数就是 先清中断 再调用回调
然后又试了一下优先级
- 中断里不要延时 这只是演示(可能这就是中断 就要快? 理念?这蜂鸣器响了再按key1 在这5s里 按key up 没反应 这可能也是原因)
== 懂了为啥没读函数(封装GPIO??)了 没有专门写一个函数就是为了读==