为了配合NUCLEO-H503RB开发板,我去下载了最新版的CubeMX(6.11)和CubeIDE(1.15.0)软件。有了CubeMX就不需要通过模板方式自己建工程了。只需要在CubeMX中选好单片机型号或者开发板型号,在图形界面设置单片机各个设备的各个属性等必要的参数后,选择生成代码即可。操作过程以图示方式记录下来。
1、打开CubeMX
2、点击“INSTALL/REMOVE”,下载、安装你使用的开发板的单片机型号
这一步会稍微花点时间,等待新窗体。
在这个窗体,选择你需要安装的单片机型号。我之前已经安装完了STM32H5系列的,所以他左侧已经是绿色的标记状态。
本次为了显示完整的过程,我重新选择一个型号()STM32H7系列的),作为示例进行安装。
点击“Install”
等到下面那个进度条完全填满后,会出现安装完成的提示。中间会有提示,要统一协议之类的。
选择“同意”后,点击“Finish”。同样,安装过程会花些时间,您打可以出去喝口茶,歇歇气。我的理解,这个下载,其实就是下载库文件支持,方便你后续开发用到的资源。
安装完成后,可以关闭这个窗体了。接下来,开始配置工程中用到的资源了。以闪烁LED工程为例,在这里我以开发板为基础进行设置。点击“ACCESS TO BOARD SELECTOR”,
选择好后,点击右上角的“Start Project”
这个提示的恣意,大概是会自动按照开发板提供的资源(按钮、LED、串口等)做缺省配置。选择“Yes”后继续,
到这里,就可以进行配置了,画面上单片机的管脚已经变绿发的,就是之前选择“Yes”后,系统根据开发板提供的资源,进行了自动配置。在这里,假设我后面要使用两个GPIO口模拟I2C方式驱动OLED,以及在另外使用两个IO口模拟I2C方式驱动手势传感器。实际上只要I2C设备的地址不用,是可以使用一组I2C访问不同的外设的。但是由于开发板的排针在正常使用时,只能接一个排针只能接一个杜邦线,所以这里选择了两组I2C,即四个GPIO口来处理OLED和手势传感器。
在选择之前看一下电路图以及开发板已经用到的资源中使用的GPIO口,这样避免出现一个GPIO口被重复使用。
电路图:
被使用的资源
-------------------------------------------------------------------------------------------
1、用户按钮-------------B1 -------------PC13
2、用户LED2 ----------- LD2------------PA5
3、一组串口------------T_VCP_RX---- PA3
T_VCP_TX----- PA4
4、另一组串口--------ARD_D1_TX--PB14
ARD_D1_TX--PB15
5、被USB占用的资源---PA9、PA11、PA12、PC10、PD2
6、下载口使用得资源---PA13、PA14、PA15、PB3
--------------------------------------------------------------------------------------------
因此,我准备使用PC4、PB8、PC2、PC3作为两个I2C设备的接口使用。单片机的PIN分布图上,选择这两组引脚,作为OUTPUT,上拉模式使用,并分别命名为OLED_SCL、OLED_SDA、HAND_SCL、HAND_SDA。为此转到“System view”
点击“GPIO”,逐个修改我们刚添加的那几个GPIO的用户标签(User Label)。标签以外的属性设置,参考用户LED的就行,实际上不用改,使用默认值。
其它PIN、定时器、串口等配置,就默认使用系统提供的设置,不用改。
接下来,设置工程名称,进入“Project Manager”配置,设置好工程名称(Project Name)、保存地址(Project Location),开发用的工具IDE(Toolchain/IDE),其他项目不用改。
到这一步就可以用来生成代码了。在这里,我说明一下哈,我之前做单片机开发,习惯使用Keil,但对于一个用惯了Eclipse的人,既然ST公司提供了CubeIDE,那自然是要使用这个开发工具的。所以在生成代码的时候,我更喜欢用CubeIDE的方式生成工程代码。
点击右上角的“GENERATE CODE”,
到了这一步,代码的省城工作就已经完成了。我这里没有选择“Open Project”,而是选择“Close”,是因为我的电脑装了太多软件,对文件的扩展名可能有其它文件打开。我是在打开CubeIDE后,导入这个工程的。
另外为了以后能再次利用这个配置做扩展工作,可以考虑保存这次的而配置工作。通过菜单中的“File”的“Save Project”执行。
接下来,打开CubeIDE,
在“Project Explorer”区域,点击鼠标右键,在弹出菜单上选择“Import...”,或者在菜单“File”中选择“Import...”,
选择已经存在的项目(“Existing Projects into Workspace”),点击“Next”,
在根目录(Select root directory)那一栏输入你刚在在CubeMC中保存工程的地址,确认回车后,如果没有问题,在“Prohects”中会出现你刚刚由CubeMX生成的工程。点击“Finish”,执行导入处理。
如果在导入界面中勾选了“Copy projects into workspace”这个选项的话,那么由CubeMX生成的工程会被复制一分到CubeIDE所配置的工作空间中。以后通过CubeMX对工程的后续修改,将不会体现到CubeIDE中的这个工程上,因为是被复制过来的,在物理上没有任何关系了。如果不勾选这个选项,意味着在CubeIDE中是对工程的引用,是链接。
导入完成后,我们可以立即看看代码中对GPIO的声明和初始化,和之前在CubeMX中的设置是不是一样。
初始化的处理在main.c的MX_GPIO_Init函数中。
为了验证是否有问题,我们可以在main函数的主循环中,让这个四个GPIO口周期性交替输出高低电平,就是类似于让LED闪烁的方式来验证。编译程序并下载到开发板上,通过示波器,或者自己搭建类似于LED驱动的那种方式,通过观察LED亮灭来验证。
在main函数中加入的代码是:
... // 这部分代码是串口输出信息 usrtx=1; //printf("Hello EEPW & DigiKey! Hello STM32H503!\r\n"); printf("start test 1 ... \r\n"); usrtx=3; printf("Hello EEPW & DigiKey! Hello STM32H503!\r\n"); printf("start test 3 ... \r\n"); ... /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_GPIO_TogglePin(USER_LED_GPIO_Port, USER_LED_Pin); // 测试四个I2C用的GPIOK口 HAL_GPIO_TogglePin(HAND_SCL_GPIO_Port, HAND_SCL_Pin); HAL_GPIO_TogglePin(HAND_SDA_GPIO_Port, HAND_SDA_Pin); HAL_GPIO_TogglePin(OLED_SCL_GPIO_Port, OLED_SCL_Pin); HAL_GPIO_TogglePin(OLED_SDA_GPIO_Port, OLED_SDA_Pin); HAL_Delay(500); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ ...
主循环中加入的代码是/* USER CODE END WHILE */和/* USER CODE BEGIN 3 */之间的部分。
串口输出信息:
程序运行的效果:
到这里,就算完成初步的工作了。接下来是要追加OLED显示方面的代码和手势传感器的数据通讯以及判定用代码了。