STM32—使用HAL库点亮流水灯,并使用proteus仿真

一、搭建STM32开发环境(HAL库环境)

1、安装STM32CubeMX

1.1、下载STM32CubeMX: 

 官网下载地址:STM32CubeMX - STM32Cube initialization code generator - STMicroelectronics

 (1)进入官网下载STM32CubeMX软件

 (2)根据自己的电脑操作系统进行选择合适的软件包以及选择软件包的版本号:

 (3)点击ACCEPT:

(4)下载完成

1.2、安装STM32CubeMX:

(1)双击刚刚下载的STM32CubeMX包,打开如下界面,接着点击next:

(2)同意协议,一直点next,期间需要选择安装路径,选择自己想安装的路径即可

2、安装jdk环境:

 由于STM32CubeMX是Java实现的,需要安装Java jdk环境:

jdk环境下载官网:Java Downloads | Oracle

2.1、下载jdk环境:

(1)进入官网下载Java jdk环境:

(2)选第二个x64 Installer,等待下载

 2.2、安装jdk环境:

(1)打开刚刚下载好的jdk安装包,接着在弹出的界面上一直点下一步,直到安装完成

 3、配置STM32CubeMX:安装HAL库

 3.1、点击打开刚刚安装好的STM32CubeMX软件:

3.2、点击help,再点击Updater Settings:


3.3、按照图示步骤进行:
3.4、按照图示进行1与2步骤:

3.5、按照图示三步骤进行安装自己想要安装的HAL库版本号:

3.6、弹出登录错误,要求登录下载,点击OK:

3.7、在弹出的界面选择登录或者注册,本人没有注册,所以选择注册:

3.8、填写注册信息:

3.9、点击close,接着进入自己所注册的邮箱里面进行验证与设置密码即可:

3.10、重新返回进行登录即可解决那个登录报错了,之后就可以进行安装了:

3.11、重新点击进行下载自己想要的那个版本的HAL库:

3.12、HAL库下载完毕,HAL库环境安装完成:

 4、keil5的下载与安装:

 参考我的这篇博客:stm32通过寄存器方式利用GPIO端口点亮LED_-HSheng的博客-优快云博客

二、利用HAL库新建keil5工程

 (1)打开STM32CubeMX,在主界面点击:ACCESS TO MCU SELECTOR:

(2)选择的单片机型号以及点击开始工程项目:

(3)点击system core,进入SYS,在debug下选择serial wire:

(4)配置时钟,进入上面的rcc,有两个时钟,一个是hse和lse,将hse那里设为Crystal/Ceramic Resonator:

(5)打开时钟架构,APB2总线的时钟由hse控制,同时在这个界面得把PLLCLK右边选上。我们要用是GPIO接口,而这些接口都在APB2里:

(6)进入GPIO选择引脚 并且配置其工作模式:点击相应的引脚设置输出寄存器了,就是GPIO_output那一项

我这里一共选择了三个GPIO:PA0,PA1,PA2,均设置为了GPIO_output: 

(7)点击Project Manager,接着点击Code Grenerator,勾选上第三步的那一个选项:

(8) 点击Project Manager,接着点击Project,开始给项目取名字;选择存放位置;选择MDK-ARM,最后点击图示第五步生成项目:

(9)点击Open Project打开项目(keil工程):

(10)打开main.c文件,滑倒主函数那一部分,图中所圈住的main函数:

(11)在主函数while(1)循环中写入下列代码:

HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET);//PA0亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
HAL_Delay(1000);//延时1s
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//PA1亮灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//PA2熄灯
HAL_Delay(1000);//延时1s        
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET);//PA0熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//PA1熄灯
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);//PA2亮灯
HAL_Delay(1000);//延时1s

注意,如果识别不到中文,可做如下修改

进入Keil主界面,点击“Edit”
点击最后一个带有🔧的选项“Configuration”
进入配置页面后,找到“Editor”页中的“Encoding”--如图
点击 倒三角 下拉找到“Chinese GB2312(Simplified)”,这个就是简体中文
记得配置完后点击“OK”,随后打出中文验证
繁体字“Chinese BIG5(Trraditional)”

三、电路连接与烧录运行

 1、电路连接:

ST_Link与单片机的连接,如下图所示:

 连接好的电路实物图如下:

2、烧录与运行:

(1)点击图示1处进行编译,接着点击图示2处进行烧录:

(2)板子运行结果展示:

 四、利用keil5进行仿真实验:观察GPIO端口的输出波形

4.1、进入keil仿真:

 (1)点击第一步,Target界面中,选择跟正确的晶振大小,使用8MHz的外部晶振:

 (2)接着进行Debug页的设置: 

(3)点击图示圈住的地方进入仿真调试界面:  

(4)选择逻辑分析仪:

(5)点击Setup设置添加要进行观察的引脚:

添加引脚信息:添加引脚信息时候,PA脚输入:PORTA,PB脚输入PORTB,PC脚输入PORTC;接着输入".",接着在.后面输入对应引脚号,最后回车即可;例如:我这里要输入PA0,PA1,PA2这三个引脚的信息:依次分别添加三个引脚,分别添加三个引脚信息:PORTA.0;PORTA.1;PORTA.2,最后回车完成添加

接着对于每一个引脚的配置信息进行修改,如下图所示: 

4.2、开始仿真: 

(1)点击图示圈住的部分,进行仿真 

(2)仿真结果:

(3)仿真结果分析:

a.实物板子延时情况:

       首先我们来看看我们在代码里面设置的延时是多少时间;也就是烧录进入板子之后,各个GPIO口对应的LED灯亮的时间是多少?(意思就是:我设置了GPIO端口输出低电平,LED灯才亮,延时多久,LED灯就亮多久),我设置了PA0,PA1,PA2这三个端口的输出低电平的时间(延时)均为:1s:  

 b.仿真延时情况:

我们这里以PA1的仿真延时为例子:

进入低电平初始时间为:4.004256s;进入低电平之后的结束时间:5.000151s;

所以后者低电平结束时间减去前面低电平的起始时间,得到的差就是低电平的持续时间,也就是仿真得到的延时时间: 5.000151 - 4.004256=0.995895s;

c.基于仿真的GPIO端口的输出波形与时序状态分析:

 1、输出波形是每一个GPIO口:PA0、PA1、PA2的高低电平的变化情况。

  2、由图中可以看出显示PA0先进入低电平并且持续一段时间(LED闪烁期间);之后就是PA1进入低电平;最后是PA2进入低电平;在PA2的低电平结束之后完成了一次基于固件库的LED流水灯的闪烁;接着又进入下一个LED灯闪烁的周期。这与我在代码以及烧录在单片机上面的LED灯闪烁的时序一致,时序状态正确!

3.基于仿真与板子的延时时间误差分析:

       板子与代码上的延时(LED闪烁周期):使用的是定时计数器来进行精确的计时或者延时的,为:1s;

       仿真上面的延时(LED闪烁周期):测出来的延时为:0.995895s;

       可以看出仿真延时与真实板子上面的延时(LED闪烁周期)存在不足0.01s的误差,本次仿真得出的仿真延时几乎完美接近真实板子的延时。

五、利用proteus仿真

5.1、创建proteus工程

打开proteus,点击新建工程,选择合适的路径

点击next,直到这个界面,点击创建固件项目,controller选择STM32F103C6,系列选Cortex-M3

5.2、连接电路

电路图如下,连接即可

5.3、开始仿真

将hex文件导入芯片中,点击芯片,将Program File改为hex文件的地址,并将下面的频率全改为8M

仿真结果如下 

 

六、总结

通过这次实验,我完成了:

一.  了解并掌握STM32中断原理,HAL库函数开发方法。安装 stm32CubeMX,配合Keil,使用HAL库方式完成下列任务

1、重做上一个LED流水灯作业,即用GPIO端口完成3只LED红绿灯的周期闪烁。

2、用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;

接低电平时,LED流水灯停止工作。

二.  安装熟悉Proteus8.15,建立一个 stm32f103c8 的固件项目,绘制任务一(1)和(2)中的系统电路, 然后加载对应的 .hex 程序,

仿真运行,观察运行效果是否符合预期。

三.  (1)在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,更方便动态跟踪调试和定位代码故障点。

 请用此功能观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

(2)在proteus电路中加入示波器模块,观察GPIO端口波形,并分析时序周期。

通过这些操作,我不仅掌握了STM32中断的基本应用,还加深了对硬件电路和仿真调试的理解,尤其是在没有室内的条件下,学会了如何通过Keil软件分析和调试相关问题。同时,利用Proteus 进行了更深入的电路仿真,进一步加深了对实验结果的理解。

总的来说,这次实验增强了我在硬件调试、嵌入式开发、仿真分析等方面的能力,为今后的项目开发打下了坚实的基础。

七、参考文章

STM32F103的流水灯点亮版本1(寄存器地址操作)

Proteus8.9仿真运行stm32流水灯程序——实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值