今天开始,学习比52更复杂的STM32系列单片机:
使用之前的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,SWCLK和SWDIO。打开STM32最小系统的PCB图,查找SWCLK和SWDIO就可以连接:
如图,即单片机的A13和A14分别和ST-Link的SWCLK和SWDIO连接:
然后将ST-Link插入电脑的USB口之后,安装ST-Link的驱动:
右键STM32 STlink并选择“更新驱动程序”,并在电脑中找到驱动程序:
图标显示正常,说明安装成功!
选择“Debug”,选择“ST-Link Debugger":
选择“Output”,勾选上“Create HEX file”:
1. 点击Load,就可以把程序烧写进入STM32:
2. 没有报错之后,点击单片机右下角最左侧的“复位按钮”:
3. 此时程序已经成功烧写,可以观察到代码使得LED灯交替闪烁:
CubeMX可以通过界面的方式快速的生成工程文件,首先安装并打开:(其实这里推荐将固件包的位置改到除了C盘之外的其他盘,但是我就一个C盘没有分盘,所以就跳过了这一步)
1. 点击“ACCESS TO MCU SELECTOR”
2. 点击之后,在新生成页面的左上角输入具体的芯片型号并双击:
然后CubeMX就会基于这个芯片生成一个新的界面:
可见LED1,2 分别接到了B8和B9并且低电平灯亮,高电平灯灭
这其实就是引脚的复用,此处我希望点灯,那需要这个引脚行使“GPIO_Output”的功能:
此时,再点击左边的GPIO选项,就可以看到设置的引脚,并且CubeMX已经自动进行了一些初始化的配置了
此时再点击PB8或PB9就可以进行进一步的设置:
例如,可以设置
输出的是高电平还是低电平;
输出的模式是“推挽输出”还是“开漏输出”;
是否要拉高或者拉低;
最大传输速度;
用户给的标签
如此一来,就可以进行一些重复的修改。
注意,项目的路径不能有中文!!这里我在C盘创建了一个新的‘ mjm_CubeMX_proj ’文件夹用于保存Cube的项目文件:(Toolchain/IDE别忘了设置成MDK-ARM,这样在项目生成之后会自动调用Keil)
此时就会自动调用Keil5打开:
可见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函数中具体的实现,还是要自己敲的!