【Day4】:来使用STM32CubeIDE吧!

程序码导读

点开我们的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之间,否则只要你一生成程序码,那你的程序码就会不见了。如果你很不信邪的话可以试试看,我的同学已经帮你试过了,当然结果就是会不见...

不过我们还是有几点需要观念澄清

  1. 他毕竟就只是注解,它的功用就只是让IDE知道他生成程序码的时候要放在哪里,因此如果你不放在BEGIN和END之间,你依然可以执行,而且是完全正确的。但是只要一生成程序码就是会不见。
  2. 虽然他已经帮你分类好了,但你完全可以不照他的分类来写程序,例如上面定义的圆周率,你也可以放在Includes的BEGIN和END里面,也可以顺利执行。最大的原则就是把程序码放在BEGIN和END里面就好。

好用小工具-现场表达式

我们写程序在debug时候,经常会把你想要监看的变数print/cout出来,但是在STM32CubeIDE在预设情况下是不允许你这麽做的,需要自己做一些设定,与安装额外软件。(当时我尝试了很久仍然没有成功,索性我就放弃了),那我们要怎麽进行debug呢?
就是用现场表达式(live expression)这个功能了,他就是一个变数监测的小视窗,但他只能对全域变数(没有被任何大括号框住的变数)进行监测。而由於他是一个debug的工具,因此正常执行的情况下式是不能使用的,需要点选工具列那排小虫虫的图示以debug的方式执行(快捷键为F11),执行的时候可能会产生一些视窗提醒,都按Yes即可。接着我们在上面工具列那排的Window->Short View->现场表达式,就会出现在右边的小视窗了。
https://ithelp.ithome.com.tw/upload/images/20210905/20141525zOnZReabaa.jpg
接下来你会看到你的程序码停在main函式里面的第一行,在我这里的情况下是HAL_Init()这一行
https://ithelp.ithome.com.tw/upload/images/20210905/201415258JalAZAn0o.jpg
非常重要!!!这个时候你的程序码还没有开始执行,需要按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为你要监测的变数),这样可以直接获取这个变数的记忆体位置,接下来会来应用这个功能。

好用工具-Memory

这个工具的目的是取代Arduino的序列阜的功能,由於STM32并没有提供人和单晶片沟通的介面,我们在测试的过程中经常会需要调整参数,因此就需要频繁的上传程序,而用这个功能就可以直接更改变数的值。
变数是存放在RAM当中,因此我们这个动作就是直接更改RAM的数值

一样是在debug的模式下才可以使用,预设会在底下的视窗,若没有出现一样可以从Window->Short View->Memory里面找到。
首先点绿色的+新增一个你要监测的记忆体位置
https://ithelp.ithome.com.tw/upload/images/20210905/20141525D8UhFjLo5E.jpg
https://ithelp.ithome.com.tw/upload/images/20210905/20141525JtQBMbOfCo.jpg
接着右边就会跑出许多框框,预设会是用Hex(十六进位)来表达记忆体的值。右边New Renderings的地方新增你要解读这个记忆体的方式,如果你要监测的变数是有号的整数,就选Signed Integer。
我们来实际使用看看这个功能吧
在全域的地方宣告一个变数x,并用现场表达式的方式获取他的记忆体位置,以我来说,x这个变数放在0x20000028这个位置(不过实际上是0x20000028~0x2000002B,因为int是四个bytes嘛)
https://ithelp.ithome.com.tw/upload/images/20210905/20141525pUryotdXvu.jpg
接着就按照上面的步骤新增要监看的记忆体位置
https://ithelp.ithome.com.tw/upload/images/20210905/201415255ewtNzojOT.jpg
选择Signed Integer作为解读的方式
https://ithelp.ithome.com.tw/upload/images/20210905/20141525v3JPeXDqbe.jpg
就可以顺利看到0x20000028~0x2000002B的值啦,并且会以int的方式解读
https://ithelp.ithome.com.tw/upload/images/20210905/20141525icjvjp44kE.jpg
我们可以直接更改这个位置的值,直接点你要更改的记忆体位置,输入新的值就OK了,顺便使用现场表达式来确认这个值是法顺利地被更动了。我顺利的将x更改为31415926~
https://ithelp.ithome.com.tw/upload/images/20210905/20141525Y9zeDN7OmH.jpg

小结

今天顺利地执行了程序码,并且介绍两个好用的小工具,明天开始我们就要真正的开始来使用STM32单晶片了


<<:  css float

>>:  蚂蚁集团始终走在某国传统借贷业者前

大共享时代系列_015_旅行进行式

啓程的原因? 关於让你出发去旅行的原因是什麽呢? 人际关系交流?家庭工作上的安排?个人的探索?还是其...

Kotlin Android 第13天,从 0 到 ML - Activity 和 Activity 生命周期

前言: ConstraintLayout讲完了,画面画好了那是用在那呢? 那就是要放在 Activi...

[Day3]Rock pi 4「扑街」学到的教训 (°Д°)╯╯︵┴┴

以下是我至少rack pi 4的崩溃的教训┴┴︵╰(°Д°)╯︵┴┴ 官网和论坛仅供参考(例如: 上...

TP-LINK ARCHER C60及TL-WR841N有线接WAN的AP模式和有线桥接差在那?

TP-LINK ARCHER C60及TL-WR841N有线接WAN的AP模式和有线桥接差在那? 主...

[Day14] 运算式与运算子

运算式(Expression) 在 Day11 - 陈述式与表达式 中有提到运算式为表达式,会回传一...