【STM32】写Keil程序的注意事项

看正点原子的资料使用Keil写STM32程序的时候,总是在不断学习,不断探索。后续又学到啥再更新······

目录

[1 Keil设置](#1 Keil设置)

[1.1 字体设置](#1.1 字体设置)

[1.2 快捷键设置](#1.2 快捷键设置)

[1.3 快速前往前一操作位置/后一操作位置](#1.3 快速前往前一操作位置/后一操作位置)

[2 宏定义](#2 宏定义)

[2.1 宏定义函数时为什么使用do{...}while{0}](#2.1 宏定义函数时为什么使用do{…}while{0})

[3 函数](#3 函数)

[3.1 形参](#3.1 形参)

[4 编写时的注意事项](#4 编写时的注意事项)

[5 程序出错的日常原因排查](#5 程序出错的日常原因排查)

[5.1 不执行(连主程序while循环体内都不执行)](#5.1 不执行(连主程序while循环体内都不执行))

[5.2 中断服务函数不执行](#5.2 中断服务函数不执行)

[5.3 卡在中断服务函数出不来](#5.3 卡在中断服务函数出不来)


1 Keil设置

1.1 字体设置

下载了JetBrains Mono字体想用于Keil,但发现Configuration中设置字体可能会无效,需要将Encoding从GB2312改为ANSI才能生效。但同时,使用ANSI就无法使用中文输入了,中文的输入会变成问号。如果用UTF-8编码的话,原有使用GB2312编码的文件中的中文又会乱码,算了,最终还是默认的好用。

1.2 快捷键设置

见 Edit -- Configuration -- Shortcut Keys

1.3 快速前往前一操作位置/后一操作位置

工具栏按钮的蓝色左右直箭头,也可使用快捷键ctrl + -- 以及ctrl + shift + -- 来实现。貌似不支持鼠标的前进后退按钮。

2 宏定义

2.1 宏定义函数时为什么使用do{...}while{0}

复杂逻辑需要使用do{...}while{0}保证宏在替换时的代码合理性以及其不会违反使用者的操作逻辑。

详见这位大佬的文章:【嵌入式C语言】--do{...}while(0)的学习_do{ x ?-CSDN博客

3 函数

3.1 形参

定义和声明函数时,若形参列表是空,就应该设置形参为void,而不是保留为空,否则编译可能出错。

4 编写时的注意事项

  • 无论是.c文件还是.h文件,都需要在文件末尾有新行,否则会warnning。
  • 应尽量别用HAL_Delay函数,可以使用正点原子的delay代替,因为HAL_Delay是基于系滴答计时器的中断实现的,而其中断优先级太低,若在某个外设的中断中使用了HAL_Delay,其就会因为HAL_Delay的中断无法触发而陷入阻塞。

5 程序出错的日常原因排查

5.1 不执行(连主程序while循环体内都不执行)

  • 自己写的中断是否实现了中断服务函数;
  • 中断服务函数中是否调用了公共中断服务函数;

5.2 中断服务函数不执行

  • 是否__HAL_PPP_ENABLE_IT了相应的中断;
  • 是否HAL_NVIC_SetPriority和HAL_NVIC_EnableIRQ了相应的中断服务;
  • 如果和PPPx有关,即同类外设有多个且自带编号,则检查中断服务函数、中断回调处理函数名和函数内容中的x是否写错,再检查NVIC相关的函数内容中是否写错了PPPx_IRQn的x;

5.3 卡在中断服务函数出不来

  • 是否在中断服务函数中使用了HAL_Delay函数;
相关推荐
mk01523 分钟前
单片机同步降压稳压器输出最低1V,关断时损耗3uA
单片机·嵌入式硬件·硬件工程·智能硬件·pcb工艺
然后,是第八天1 小时前
platformio使用使用pioarduino流程
单片机
糖糖单片机设计1 小时前
基于 STM32 + LU-ASR01 的智能台灯
stm32·单片机·嵌入式硬件·51单片机·语音识别
en.en..2 小时前
Keil 文件管理避坑(基于 STM32F4 HAL 通用模板讲解)
单片机·嵌入式硬件
女神下凡4 小时前
芯参谋(87):Linux 系统(SPI NOR)驱动开发指南
linux·运维·arm开发·驱动开发·嵌入式硬件·设计规范
起个网名真难~14 小时前
STM32F103_Bootloader_从零到UART升级成功_博客原稿
stm32·单片机·嵌入式硬件
二本咕咕-机械转码15 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
Zwawa16 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
c语言·单片机·嵌入式
小李不想当小白16 小时前
BKP备份寄存器与RTC实时时钟(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
Zw-awa18 小时前
串口命令如何从字符串长成协议:帧头、长度、校验和与状态机
stm32