STM32CubeMX基于HAL库的流水灯实验
CubeMX是基于Java实现的,需要JDK环境
JDK下载地址:https://www.oracle.com/java/technologies/javase-downloads.html
STM32CubeMX下载地址:https://www.st.com/en/development-tools/stm32cubemx.html
安装过程一路Next就能搞定,这里不再赘述。
一、创建项目
- 进入Cube,点击
ACCESS TO MCU SELECTOR
进入创建项目页面
- 这里我使用的是STM32F103C8t6,就在搜索框里搜索STM32F103C8,出现结果后双击进入配置页面
如果你常用这个开发板的话可以点击小星星⭐收藏它,这样会方便很多
- 选择引脚:根据上一篇文章,本次实验采用
A4
、B5
、C14
三个引脚- 点击对应引脚,选择GPIO_output
- 配置调试接口:
- 左侧栏中点击
A-Z
->SYS
->Debug
这里选择Serial Wire
- 左侧栏中点击
- 配置GPIO(此步骤在最新的Cube中可以省略,因为默认配置本是如此)
- 左侧栏中点击
A-Z
->GPIO
->System View
->GPIO √
->依次查看三个接口是否处于以下状态:
- 左侧栏中点击
GPIO output level
:有low和high两种选择,一般选择low
GPIO mode
:推挽输出和开漏输出两者模式,两者模式的区别在于
推挽输出中1代表VCC,0表示GND;
开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down
:输入需要上下拉,输出一般没有上下拉
Maxinum output speed
:最大的输出速度,一般选择low就可以了。
- 配置项目
- 上侧栏中选择
Peoject Manager
- 配置项目名称->
Application Stucture
选择Basic
->IDE选择MDK-ARM
VersionV5
以上->Framware Package…中选择STM32Cube FW_f1 v1.8.4
- 上侧栏中选择
- 点击GENERATE CODE生成项目
- 弹窗后选择Open project会直接在Keil中打开
打开后如下图所示
图八
二、实现效果
本次实验采用三个灯轮流发光->熄灭循环实现,每一次间隔1s
,大致意思如下:(1亮,0灭)
1 0 0
->0 1 0
->0 0 1
->1 0 0
->.....
1. 代码
- 如图所示进入
main.c
,找到while(1)循环,输入以下代码
//高电平点亮A4
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
//延时一秒
HAL_Delay(1000);
//低电平熄灭A4
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
//高电平点亮B5
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
//延时一秒
HAL_Delay(1000);
//低电平熄灭B5
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
//高电平点亮C14
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);
//延时一秒
HAL_Delay(1000);
//低电平熄灭C14
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);
//HAL库函数注释:
延时函数 HAL_Delay:
- 函数原型: void HAL_Delay (__IO uint32_t Delay)
- 参数说明:Delay表示所要延时的时间大小,单位是毫秒
- 实例:HAL_Delay(1000):延时一秒再进行下一步操作
1秒(s)= 100分秒(ds)= 1000 毫秒(ms) = 1,000,000 微秒(μs) = 1,000,000,000 纳秒(ns) = 1,000,000,000,000 皮秒(ps)
写管脚函数 HAL_GPIO_WritePin:
-
函数原型:void HAL_GPIO_WritePin (
GPIO_TypeDef * GPIOx
,uint16_t GPIO_Pin
,GPIO_PinState PinState
) -
参数说明:
- GPIOx:管脚组(x的取值为A~G)
- GPIO_Pin:管脚编号(x的取值为0~15)
- PinState:管脚的状态(取值为GPIO_BIT_RESET表示0, GPIO_BIT_SET表示1)
-
实例:
-
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
管脚组A,4号引脚,亮起
-
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);
管脚组C,14号引脚,熄灭
-
图九
2. 仿真示波器
.在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形。
- 魔法棒设置(很容易忘记的一步骤,因为Keil老是重置它。。。)
这里我看其他很多博客里都把右边的DLL和Parameter也填了,其实没必要:很明显左边对应的Use Simulator仿真器,而右边的对应Use ST-link之类的,不使用右边的调试方式就没必要改写了
-
配置完成后build->debug
-
点击图中这一按钮
System Analyzer Windows
,选择Logic
-
点击setup设置三个引脚信息
- 点击添加按钮
- 输入引脚信息:GPIOx_IDR.n(x为端口,n为引脚号,GPIOA_IDR.4表示PA4)
- Display Type一栏中选择bit
- Closer
- 点击
Run
,观察波形
如果发现没有波儿,可能是因为Grid的值太小了,导致波形图太大,当前小窗展示不全,所以可以使用滚轮滑动调试grid的值,这里推荐0.5s和0.2s
3. 实物效果
三、 总结
当我们通过寄存器来实现流水灯时,我们需要通过手敲代码来设置寄存器到达上述效果,会用到使能时钟、配置输入输出模式等一系列相对繁杂的操作,而当我们使用STM32CubeMX时,通过简单的可视化操作,就能生成对应的代码,无论是寄存器还是时钟或者输入输出模式都已经帮你用代码编写好(更别提翻手册查引脚信息了),而且更加全面、完整,对于初学者来说明显更加友好。