点开我们的main.c档案,可以看到里面密密麻麻的注解,第一次看到还真令人害怕,但其实他就真的只是注解而已,但可不能因为他是注解就把这些删光光喔,它可是有大用处的。
先前提到过CubeIDE可以把我们对於脚位的配置自动生成程序码,我们只需要在filename.ioc(filename为专案名称)点一点,储存後他就会自动生成程序码了。(後面会更详细的介绍)。那如果今天你的程序码已经数百行,IDE怎麽知道要将自动生成的程序码放在哪呢?实际上程序已经将程序码做初步的分类,以下是程序码最上面的几行。
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
我们可以看到每个类别的开头都会有长长的虚线,由上到下依序是Includes、Private Includes、Private typedef、Private define,只要该类别是Private开头的话,後面一定会有USER CODE BEGIN与USER CODE END这两个注解,我们的程序码就需要写在这里,而生成程序码时就会安插在这个区间以外的地方。
举例来说:如果你要定义一个常数你就可以放在Private define内部,如下:
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
#define PI 3.14159265358
/* USER CODE END PD */
所以很重要很重要很重要的就是你的程序码一定要放在BEGIN和END之间,否则只要你一生成程序码,那你的程序码就会不见了。如果你很不信邪的话可以试试看,我的同学已经帮你试过了,当然结果就是会不见...
不过我们还是有几点需要观念澄清
我们写程序在debug时候,经常会把你想要监看的变数print/cout出来,但是在STM32CubeIDE在预设情况下是不允许你这麽做的,需要自己做一些设定,与安装额外软件。(当时我尝试了很久仍然没有成功,索性我就放弃了),那我们要怎麽进行debug呢?
就是用现场表达式(live expression)这个功能了,他就是一个变数监测的小视窗,但他只能对全域变数(没有被任何大括号框住的变数)进行监测。而由於他是一个debug的工具,因此正常执行的情况下式是不能使用的,需要点选工具列那排小虫虫的图示以debug的方式执行(快捷键为F11),执行的时候可能会产生一些视窗提醒,都按Yes即可。接着我们在上面工具列那排的Window->Short View->现场表达式,就会出现在右边的小视窗了。
接下来你会看到你的程序码停在main函式里面的第一行,在我这里的情况下是HAL_Init()这一行
非常重要!!!这个时候你的程序码还没有开始执行,需要按F8才会开始执行
非常重要!!!这个时候你的程序码还没有开始执行,需要按F8才会开始执行
非常重要!!!这个时候你的程序码还没有开始执行,需要按F8才会开始执行
真的很重要所以讲3次,经常会按F11後发现脚位怎麽没有正常的输出,原来是忘了按F8了><
我们来实际使用看看这个功能吧
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
i++;
HAL_Delay(1000);
}
/* USER CODE END 3 */
要记得在全域的地方新增变数 i
HAL_Delay()
这个函式就像是Arduino的delay(),单位为ms
用debug的方式执行,并在现场表达式的视窗内增加新表达式,就可以看到 i 每隔一秒增加1了
这个现场表达式还有个厉害的功能,可以直接打上&var(var为你要监测的变数),这样可以直接获取这个变数的记忆体位置,接下来会来应用这个功能。
这个工具的目的是取代Arduino的序列阜的功能,由於STM32并没有提供人和单晶片沟通的介面,我们在测试的过程中经常会需要调整参数,因此就需要频繁的上传程序,而用这个功能就可以直接更改变数的值。
变数是存放在RAM当中,因此我们这个动作就是直接更改RAM的数值
一样是在debug的模式下才可以使用,预设会在底下的视窗,若没有出现一样可以从Window->Short View->Memory里面找到。
首先点绿色的+新增一个你要监测的记忆体位置
接着右边就会跑出许多框框,预设会是用Hex(十六进位)来表达记忆体的值。右边New Renderings的地方新增你要解读这个记忆体的方式,如果你要监测的变数是有号的整数,就选Signed Integer。
我们来实际使用看看这个功能吧
在全域的地方宣告一个变数x,并用现场表达式的方式获取他的记忆体位置,以我来说,x这个变数放在0x20000028这个位置(不过实际上是0x20000028~0x2000002B,因为int是四个bytes嘛)
接着就按照上面的步骤新增要监看的记忆体位置
选择Signed Integer作为解读的方式
就可以顺利看到0x20000028~0x2000002B的值啦,并且会以int的方式解读
我们可以直接更改这个位置的值,直接点你要更改的记忆体位置,输入新的值就OK了,顺便使用现场表达式来确认这个值是法顺利地被更动了。我顺利的将x更改为31415926~
今天顺利地执行了程序码,并且介绍两个好用的小工具,明天开始我们就要真正的开始来使用STM32单晶片了
啓程的原因? 关於让你出发去旅行的原因是什麽呢? 人际关系交流?家庭工作上的安排?个人的探索?还是其...
前言: ConstraintLayout讲完了,画面画好了那是用在那呢? 那就是要放在 Activi...
以下是我至少rack pi 4的崩溃的教训┴┴︵╰(°Д°)╯︵┴┴ 官网和论坛仅供参考(例如: 上...
TP-LINK ARCHER C60及TL-WR841N有线接WAN的AP模式和有线桥接差在那? 主...
运算式(Expression) 在 Day11 - 陈述式与表达式 中有提到运算式为表达式,会回传一...