STM32初识:使用Keil5和CubeMX开发工具入门指南

硬件介绍

今天开始,学习比52更复杂的STM32系列单片机:

软件介绍 

1. Keil 5 及其 固件包

使用之前的Keil4写STM32代码其实也可以,但需要比较复杂的设置,而如果用Keil5会比较方便。

(这里在打开POJIE软件的时候总是会报错“ 无法成功完成操作 因为文件包含病毒或潜在的垃圾软件",因此参考了这篇博文解决Win11“无法成功完成操作,因为文件包含病毒或潜在的垃圾软件“_'零'Bug的博客-CSDN博客)

另外安装的路径不要有中文!

安装完keil5和固件包之后打开keil5的界面:

小插曲:Keil怎样显示中文注释(简单 有图)_keil中文注释_小码1111的博客-CSDN博客

其实要Keil4一毛一样,只不过,对于32的编程不能像51那么简单,简单创建一个工程写个main就可以跑起来,STM32的模板工程

 在Keil5中长这样:

 mian中一些示例程序,将他编译之后,接下来就是烧录的方法了:

烧录其实有很多种方法,包括串口,J-Link,U-Link,ST-Link等,在这里我使用的烧录工具是ST-Link:

主要接的就是三根线,GND,SWCLKSWDIO。打开STM32最小系统的PCB图,查找SWCLKSWDIO就可以连接:

如图,即单片机的A13和A14分别和ST-Link的SWCLKSWDIO连接:

然后将ST-Link插入电脑的USB口之后,安装ST-Link的驱动:

右键STM32 STlink并选择“更新驱动程序”,并在电脑中找到驱动程序:

图标显示正常,说明安装成功!

 接下来回到Keil5进行下一步的配置:

点击这个图标:

选择“Debug”,选择“ST-Link Debugger":

选择“Output”,勾选上“Create HEX file”:

这就完成了设置,之后就可以进行程序的烧写:

1. 点击Load,就可以把程序烧写进入STM32:

2. 没有报错之后,点击单片机右下角最左侧的“复位按钮”:

3. 此时程序已经成功烧写,可以观察到代码使得LED灯交替闪烁:

2. STM32CubeMX

 CubeMX可以通过界面的方式快速的生成工程文件,首先安装并打开:(其实这里推荐将固件包的位置改到除了C盘之外的其他盘,但是我就一个C盘没有分盘,所以就跳过了这一步)

使用STM32CubeMX生成工程文件:

1. 点击“ACCESS TO MCU SELECTOR”

2.  点击之后,在新生成页面的左上角输入具体的芯片型号并双击:

然后CubeMX就会基于这个芯片生成一个新的界面:

接下来就可以通过在这个界面的操作,自动生成对应的代码,比如我要进行一个点灯的操作:

1. 同样,先通过STM32最小系统的PCB图,查找LED灯对应的电路:

 

可见LED1,2 分别接到了B8B9并且低电平灯亮高电平灯灭

2. 在CubeMX界面找到PB8和PB9的引脚,并左键点击:

 这其实就是引脚的复用,此处我希望点灯,那需要这个引脚行使“GPIO_Output”的功能:

此时,再点击左边的GPIO选项,就可以看到设置的引脚,并且CubeMX已经自动进行了一些初始化的配置了

 此时再点击PB8或PB9就可以进行进一步的设置:

 例如,可以设置

输出的是高电平还是低电平

输出的模式是“推挽输出”还是“开漏输出

是否要拉高或者拉低

最大传输速度

用户给的标签

3. 点击左侧的“SYS”选项,在“Debug”中选择“Serial Wire” (串口)

 

 如此一来,就可以进行一些重复的修改。

4. 点击上侧偏右的“Project Manager”大选项进行设置:

注意,项目的路径不能有中文!!这里我在C盘创建了一个新的‘ mjm_CubeMX_proj 文件夹用于保存Cube的项目文件:(Toolchain/IDE别忘了设置成MDK-ARM,这样在项目生成之后会自动调用Keil)

5. 同样在“Project Manager”大选项下,左侧的“Code Generator”中这样设置:

6. 最后,点击右上角的“GENERATE CODE” :

7. 生成完成之后,点击中间的“Open Project”:

此时就会自动调用Keil5打开:

8. 注意,先进行编译:

9. 按照STM32的烧写步骤,先点击LOAD,再点击单片机的复位:

可见LED1,2对应的D3,D5两盏灯常亮,说明CubeMX生成的代码没有问题!

既然代码没问题,那么现在可以回过头来看一下Cube到底生成了啥代码:

主要观察main函数:

发现就是在初始化,如果选中并右键点击这些调用的初始化函数,就可以跳转到这些函数定义的地方:

 

 其中下图这条语句就是亮灯的关键:

通过再次跳转这个函数查找定义之后就可以知道,这是一个写数据的函数,上图中是往GPIO口的8和9口写“0”,而经过刚刚的分析,LED灯低电平亮灯,所以这句话可以点灯。

那么既然知道了这个函数的作用,那就可以把这句话稍微修改然后复制到main函数的while 1循环中:

 while (1)
  {
    /* USER CODE END WHILE */
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET); //8口对应的LED亮
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET); //9口对应的LED灭
		HAL_Delay(1000);//HAL_Delay函数以毫秒为单位,这里delay 1 秒
		
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); //8口对应的LED灭
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET); //9口对应的LED亮
		HAL_Delay(1000);//HAL_Delay函数以毫秒为单位,这里delay 1 秒
		
    /* USER CODE BEGIN 3 */
  }

将代码烧录:

这就是最简单的,通过Cube代码进行二次开发,实现跑马灯的尝试。

同时,通过这个示例也可以看到CubeMX不是万能的,Cube只能生成初始化的代码,至于具体项目中main函数中具体的实现,还是要自己敲的!

物联沃分享整理
物联沃-IOTWORD物联网 » STM32初识:使用Keil5和CubeMX开发工具入门指南

发表评论