学习、参考原视频:【STM32F4+CubeMX零基础快速入门】Keil常用操作 HAL底层知识_哔哩哔哩_bilibili
修改文字
Edit选项卡——Configuration——Color&Font
此时选择字体才是修改代码编辑框内字体
中文问题
Edit选项卡——Configuration
编码方式默认为ANSI,无法显示中文/将中文拆分成两个字符
可改用UTF-8编码,会将现有中文变成乱码(推测原因:已有中文不是用该编码写上去的?)或者国标编码(字体会变丑)
关键词
Edit选项卡——Configuration——User Keywords
可添加自定义关键词,在代码中会用特殊颜色标出。
快捷键自定义
Edit选项卡——Configuration——Shortcut Keys
选中某个操作即可查看对应快捷键,选择Create Shortcut还可以重新自定义
代码补全
Edit选项卡——Configuration——Text Completion
触发字符数量要有适当长度,不然敲一些常用语句如for,没敲完就自动弹出补全弹窗,需要用鼠标额外点掉弹窗,十分麻烦恶心。
查看函数定义
右键对应函数,选择go to definition
查看完后可以选这个回到光标先前位置
查找引用次数
ctrl+f中
点击find all
可得到该内容出现的所有行数并进行数量统计,双击即可跳转到该行
多行操作
选中多行,按Tab缩进/shift+Tab退格,整体注释/取消注释
工程配置
选中魔棒
Output部分
Create HEX File:生成16进制文件,只有使用ISP串口下载才必须要勾上
Browse Information:编译的时候生成浏览信息,只有勾上并把代码至少编译一次才可以使用go to definition 的功能。
Optimization:等级越高代码优化等级越高,系统自动调整部分语句的执行顺序,提高运行速度,但在调试中可能会带来问题
C99 Mode:开C99
Include Paths:在此填入所有使用的头文件的路径,用自己的头文件就需要加进来
Debug
主要要选对调试器,然后进入Settings正确连接调试器后就会在右侧SW Device栏里显示出
Flash Download界面,勾选上Reset and Run,在下载完代码后就能够自动开始运行,不用手动按下Reset
调整完所有设置后不要直接关闭页面,点确定
DEBUG
电脑连接好单片机,点击上方的debug选项,将自动下载程序并进入调试界面
一开始并不会自动开始,点击Run令程序全速运行
按下stop就会令程序停在当前执行到的位置
添加变量到监视框操作如上:选中,右键,添加到watch
可以看到目前该变量为500,此时可以直接在这修改变量的值并体现在实际程序运行中。
程序运行中左侧行数处的灰色标识指示该行允许打断点
Step:一行一行执行,并且如果遇到函数,会进入到函数中一行一行执行
Step over:一条语句一条语句的执行,如果遇到函数,不会进入,直接将函数执行完
再次点击调试按钮就能退出调试界面,同时单片机还会继续运行下去。
HAL理论知识
什么是寄存器?
单片机上的存储空间每个字节都被分配地址,就可以将整个存储空间组合成一条线性的存储空间
存储空间从0000 0000一直到FFFF FFFF,被分为8个小块
第一个小块Code,用于存储程序
进一步展开就是这一小块内的存储空间的进一步细分,其中Flash是用于存储指令的部分
第二小块SRAM,相当于电脑内存,用于存储程序运行中产生的临时数据,例如自定义的变量,断电后就会消失
第三小块Peripherals,外设部分
展开后有如下部分,以AHB1为例进一步展开
可以看到每一个GPIO口都占有一定存储空间,对每个GPIO口中特定位置的地址中的特定二进制位进行操作修改,就能令GPIO口表现出不同功能(如输出高低电平),这些特定的地址就是寄存器(拥有特殊作用的存储空间,用于对外设的控制)。
HAL库如何操纵寄存器?
HAL库用结构体封装好了寄存器,并提供函数进行操作。
HAL_GPIO_WritePin(GPIOF,GPIO_PIN_10,GPIO_PIN_RESET);
其中GPIOF是一个宏定义,实际为一个结构体指针(GPIO_TypeDef本身是一个结构体)。其中的GPIOF_BASE实际上也是一个指针宏定义,本身为GPIOF对应的存储空间首地址。将其转换为一个GPIO_TypeDef类型的结构体指针,在GPIO_TypeDef内部通过成员变量的方式,就能把GPIOF占用的地址划分出来。操作GPIOF的成员变量,就能够操作整个内存空间。
每一个小段对应着一个32位,即4个字节的存储空间。每一小段4个字节就对应着一个寄存器,根据变量名和旁边的注释可以看出其对应控制的功能是什么,对寄存器进行位运算操作或者改写以读取或者修改。如ODR,其中的低16位用于控制GPIO的16个引脚对应的输出状态,对其中的某一位进行改写,就能实现对应引脚输出高低电平的设置。
HAL库实际上就是通过封装好的结构体和函数简化这些寄存器操作。
如该函数就是对传进来的GPIO首地址,对其中控制输出的那段地址进行修改。
HAL库中对中断的处理
真正的中断服务函数都在这个文件里
其中包括cube生成的真正的中断服务函数,对应中短线4上的中断服务函数。触发中断后进入,并调用HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4)。其是HAL库提供的GPIO外部中断集中处理函数(无论开哪条中断线,都是调用这个函数)。该函数功能:1、检查是否发生中断并清除标志位(用于记录是否发生中断的寄存器)2、调用回调函数(即先前所重写的那个弱函数)
补充
.it.c文件内还包含了一个中断函数
当单片机运行发生错误(一般是内存非法访问引起的,如数组越界,或用了野指针),就会调用该中断进入死循环停止单片机运行。实际调试中如发现死循环可作为检查内容。