当前位置: 首页 > news >正文

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

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

专栏目录:记录自己的嵌入式学习之路-CSDN博客


目录

1    Keil设置

1.1    字体设置

1.2    快捷键设置

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

2    宏定义

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

3    函数

3.1    形参

4    编写时的注意事项

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

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

5.2    中断服务函数不执行

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函数;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JSON数据格式介绍及如何在java中解析、转换、使用(fastjson工具类和hutools工具类使用教程)
  • 干部画像要包括什么
  • 大模型实战-FinGLM解析金融财报做RAG经验参考篇
  • 8月29日wpf
  • Spring Boot项目中集成Geth与以太坊区块链进行交互操作实例
  • 字典查找对应输入的字符
  • linux每个memory cgroup的lru链表是什么创建的
  • 11.舵机控制
  • 【Linux】CodeServer:云IDE部署
  • word并排查看,同步滚动
  • springboot定时任务@scheduled自定义配置定时开关
  • 软考高项彻底没用了?谁说的?站出来,我保证不笑场!
  • 微知-nandflash和norflash名字为什么叫nand和nor?主要区别是什么?
  • Java Script网页设计案例
  • MySQL大量数据偏移查询优化:从LIMIT偏移到基于ID的数据读取
  • [译]CSS 居中(Center)方法大合集
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • Apache Spark Streaming 使用实例
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • create-react-app项目添加less配置
  • create-react-app做的留言板
  • IP路由与转发
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • vuex 学习笔记 01
  • XForms - 更强大的Form
  • 闭包,sync使用细节
  • 缓存与缓冲
  • 将 Measurements 和 Units 应用到物理学
  • 前端js -- this指向总结。
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 我从编程教室毕业
  • 鱼骨图 - 如何绘制?
  • 栈实现走出迷宫(C++)
  • 带你开发类似Pokemon Go的AR游戏
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #{} 和 ${}区别
  • #includecmath
  • #pragma data_seg 共享数据区(转)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (1)bark-ml
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (八)c52学习之旅-中断实验
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)Oracle存储过程编写经验和优化措施
  • (转)编辑寄语:因为爱心,所以美丽
  • .gitignore文件使用
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)