/F1和F4的异同/
如果是基于HAL来开发,由于HAL的可移植性好,F1上的主程序代码和F4上基本没啥差别。
F1的内核时CortexM3,F4的内核时CortexM4
F4通过HAL库编程与F1最大的区别是在外设的时钟上。
不同内核所包含的指令集如下图
使用不同型号的Fx,相应的system文件例如delay.c delay.h sys.h 里面会有些许的差别 ,直接复制黏贴例程的就行
/ 自定义库 /
HAL库知识补充
/遇到并解决的错误/
出现: error: #29: expected an expression
一般是在前后行或者相关定义声明前后出现中文字符(很可能是中文括号或者看不见的空格字符)
出现“无法识别的预处理指令”错误
当一个头文件被多个头文件调用的时候,就会出现重复定义的情况
所以要使用#ifndef #define #endif 来避免重复定义
出现“error: #20: identifier "uint16_t" is undefined”
/ 位带操作 /
32MB的“位带别名区”对应1MB的“位带区”
对位带别名区每个字节的操作对应位带区比特位的操作
对位带别名区的访问操作,将“读-改-写”做成了硬件级别支持的操作,不能被中断打断。
/ 软件仿真 /
将上面的内容改为下面的,否则可能不能用逻辑分析仪对特定引脚进行分析
逻辑分析窗口:在serup里添加需要进行分析的引脚(如PORTB.5)
点击Peripherals可以查看寄存器设置
/ 外部中断的应用/
STM上的各种外设,是通过内部信号来协同工作的,这个信号,就可以理解为事件。
可以在寄存器中读取到事件状态的标志,称该事件是可见的。如无法读取,则该事件不可见。
在stm32中,绝大多数事件是不可见的,所以这些事件几乎都是与中断功能绑定在一起的。
EXTI外设大致可分为两种功能:
- 捕获外部输入事件
- 生成EXTI中断等中断请求
通过AFIO来设置中断源的输入,可以直接用cubeMX生成,不用了解太细,知道GPIO和中断线的对应关系就行。
AFIO(alternate function IO)
用cubeMX配置外部中断
(句柄的定义如下图)
NVIC(Nested vectoredinterrupt controller,即嵌套向量中断控制器):
相应寄存器
ISER(Interrupt Set-Enable Registers):用来设置使能某个中断
ICER(Interrupt Clear-Enable Registers:用来清除中断位
上面这些寄存器都是写1有效,写0无效的寄存器。所以只要往相应位写入1,即可以完成相应操作(只需要单一的“写”指令即可完成操作,而不需要“读-改-写”)
因此就可以很方便地通过调用宏定义来完成操作了
类似例子
中断触发流程
中断->查询中断向量表->获取入口地址->跳转中断服务函数
中断函数不需要声明
通过EXTI线捕获EXTI线,并且去生成中断,然后调用中断服务函数(翻转led等电平,后清除中断标志位)(如果不清除中断标志位,则会一直产生中断)
NVIC相关函数
HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority) // IRQ(中断请求)
第一个参数用来指定中断源,第二个参数用来设置抢占优先级,第三个函数用来设置响应优先级。
该函数通过设置SCB_SHP寄存器和NVIC_IPRx寄存器实现功能
HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
该函数用来在NVIC控制器中使能指定中断
HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
在NVIC控制器中禁用指定中断
HAL_NVIC_SystemReset(void)
用来初始化一个MCU复位要求
__HAL_GPIO_EXTI_CLEAR_IT(__EXTI_LINE__) //这里传入的参数是引脚号!!!
用来清除中断标志位,在响应中断后,执行句柄的函数,执行完后要清除中断标志位
遇到问题
1、出现identifier “GPIO_InitTypeDef” is undefine错误,可以通过添加“#include“stm32f1xx.h”来解决
2、st-link下载的程序,断开st-link链接电脑的usb口后无法正常运行:
需要把连在板子上的那头也断开,否则无法正常运行
3、使用三个按钮来触发中断,跳转到与蜂鸣器(KEY1控制)有关的中断函数并在执行完毕后可以正常跳转到主函数继续执行,但是另外两个与led等有关的中断服务函数(KEY_UP和KEY0控制)后,无法正常跳出(是清除中断标志位失效)。
在HAL_GPIO_EXTI_Callback 里面编写中断服务函数的所需实现的代码逻辑