STM32F407ZET6+CubeMX学习笔记3——Keil常用操作+HAL底层知识

学习、参考原视频:【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文件内还包含了一个中断函数

当单片机运行发生错误(一般是内存非法访问引起的,如数组越界,或用了野指针),就会调用该中断进入死循环停止单片机运行。实际调试中如发现死循环可作为检查内容。

  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值