前情回顾
野火指南者实现流水灯:https://blog.csdn.net/weixin_54435584/article/details/127236470?spm=1001.2014.3001.5501
最小开发板实现流水灯:https://blog.csdn.net/weixin_54435584/article/details/127258841?spm=1001.2014.3001.5501
前言
在前面的博客中,笔者介绍了通过野火指南者以及C8T6最小开发板上的流水灯实现。它们每一个都离不开这几个步骤:时钟配置,工作模式配置,输出设置以及寄存器映射。
之前说过stm32不会自动生成这样一个寄存器映射文件,这使得我们在编写代码的时候会变得异常的困难。HAL库解决了这个问题。我们可以先使用STM32CubeMX软件创建一个项目而不是在KEIL5中创建,该软件为用户提供了图形化的配置功能,我们不用手动编写配置相关的代码,只需要在软件上进行可视化配置并生成项目,它就会自动编写相对应的配置代码。不仅如此,生成的项目还会调用HAL库,它将我们对GPIO口的各种操作封装成可引用的函数,让我们更方便地编写代码。
除此之外,在KEIL5的调试功能中,可以选择特定的GPIO端口,
STM32CubeMX下载
软件的下载链接在这里:点我下载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EQCZZv8y-1665476776281)(E:\学习资料\嵌入式作业\04_流水灯\m0.png)]
根据不同的操作系统选择不同的按钮。我选择的系统与版本是Windows,6.4.0。
下载好后,这是一个安装器。根据下面的图例进行傻瓜式安装:
到这一步等待安装完成即可。
使用STM32CubeMX制作项目
1、安装HAL库
首先打开刚刚安装好的软件,按下图的流程安装hal库:
2、制作项目
新建项目
为STM32CubeMX下载了hal库后,就可以通过它创建项目了。
首先,点击正中间的Start My project from MCU,创建一个使用KEIL5编辑的项目。
点击后到下面这个页面:
在这个页面,根据你所使用的芯片类型,选择对应的芯片。例如我这里是最小开发板STM32F103C8T6,就在左边的过滤器上选择C8系列,并在列表中选出我的芯片。最后点击创建项目。
如果你看到这个页面,说明你前面的步骤成功了。下面开始配置项目,具体配置系统时钟,GPIO工作模式等等。
配置
(1)在这个页面,首先配置系统时钟与调试。
在System Core -> RCC -> HSE中,将HSE配置为Crystal/Ceramic Resonator。
然后点击上方的Clock Configuration,勾选PLLCLK。
回到Pinout&Configuration,点击WWDG,按图设置调试。
(2)接下来配置GPIO端口。
点击SystemCore下的GPIO,进入到这个页面:
在这个页面的右边,是你所选的芯片的引脚图。点击你要使用的引脚,选择它们的工作模式:
例如,我要使用PA5,PB9,PC14:
在按上述方法选择了GPIO引脚后,左边出现上图这样的信息,说明已经选择成功。现在可以看见每个被选中的GPIO口有自己的一行配置信息。
相关参数如下:
参数 | 描述 |
---|---|
output level | 初始电平 |
mode | 引脚模式 |
Pull up/Pull down | 上拉下拉电阻 |
Maximum output speed | 引脚输出速率 |
User Label | 引脚名称 |
这里默认配置即可。
(3)现在进行项目设置
这一步是选择项目路径与命名,并让它生成初始化.c/.h文件。
点击Project Manager,按图中的顺序进行配置:
点击generate code,生成代码。
出现上图的弹窗,说明项目生成成功了。现在打开它。
代码编写
生成的项目结构如下:
与传统的流水灯项目不同,它添加了许多头文件,用于调用hal库。
双击main.c进入主文件,找到main函数:
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
}
}
前面说到过,hal库封装了一些列的方法供我们调用。这里它已经自动地调用了三个。顾名思义,它们的作用分别是初始化hal库,配置时钟以及配置GPIO工作模式。显而易见,这种创建项目的方式不需要手动制作寄存器映射与系统配置,并将对GPIO的操纵封装为函数调用,极大地方便了我们代码的编写。
在死循环中就是我们要编写的代码。我们要实现流水灯,需要有两种函数:一种用来设置GPIO电平,另一种用来延时。这两种函数在HAL库中都已经封好了。
这是它们的函数调用方式:
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//将PA4设置为0
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//将PA4设置为1
HAL_Delay(1000);//延迟1000ms
对于HAL_GPIO_WritePin(),第一个参数填写GPIO组名称,第二个填写GPIO的编号,最后写对它的操作。SET表示置高电平,RESET表示置低电平。
对于HAL_Delay(),它传入一个参数x,使程序暂停x毫秒。
实现流水灯,让他们以1s的频率闪烁,就在死循环中这样写:
while(1){
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_RESET);//PA5亮灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9熄灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);//PC14亮灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,GPIO_PIN_SET);//PA5熄灯
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9亮灯
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);//PC14熄灯
HAL_Delay(1000);//延时1s
}
根据我上一篇博客的方法,编译程序并烧录到最小开发板中,程序顺利执行。
KEIL5逻辑分析仪
在KEIL5的仿真调试功能中,有一种功能是对选定的GPIO引脚输出它的电平变化。视觉效果就跟示波器一样。有这个功能,我们可以更好地调试项目。
在进行调试之前。我们需要进行相应的配置。
配置
按图中的顺序进行配置。
调试
(1)点击调试按钮
(2)在调试页面,进入逻辑分析仪
(3)点击创建,并设置显示的GPIO口
不用手动打代码,用PORTX.Y的形式输入就行。例如PORTA.5,表示建立对GPIOA_5的显示。
将PORTA.5,PORTB.9,PORTC.14三个端口加入进去。加入后,可以看到它自动变成了地址。
添加完成后,分别将它们三个的显示模式设置为bit,即显示高低电平。
最后点击close。
现在运行程序,可以看到三个引脚的输出电平每1秒发生高低电平变化。
参考资料
- https://blog.csdn.net/weixin_54435584/article/details/127236470?spm=1001.2014.3001.5501
- https://blog.csdn.net/weixin_54435584/article/details/127258841?spm=1001.2014.3001.5501
- https://blog.csdn.net/weixin_46129506/article/details/120780184