一、项目创建
1.在stm32cube选择对应型号单片机,本次实验采用stm32f103c8T6型号。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f69d2ecca77c40a787631e1ecafc64b7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) 2.选择要用到引脚,本次实验使用A4、B5、C14引脚。
- 点击对应的引脚
- 选择GPIO_output
![在这里插入图片描述](https://img-blog.csdnimg.cn/418da4bfa10a4d1cb2be8e32c94bad52.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) 最终效果 ![在这里插入图片描述](https://img-blog.csdnimg.cn/91eef47786a441cfb8eb762b28f1ba9a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) 3.配置系统调试接口,选择Serial Wire ![在这里插入图片描述](https://img-blog.csdnimg.cn/ce75f8ade0014e46a0c525ec67509600.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) 4.配置GPIO ![在这里插入图片描述](https://img-blog.csdnimg.cn/da0f2630ef4b456f87e3ad419c12e469.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16)
- GPIO output level:有low和high两种选择,一般选择low
- GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
- GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
- Maxinum output speed:最大的输出速度,一般选择low就可以了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e661b073a32449f0ae4f0b9145dbe48b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) 5.配置项目
![在这里插入图片描述](https://img-blog.csdnimg.cn/6af87aaeb65e412fb2d1a352ca2a22bc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16)
- 打开项目,会直接跳到keil。
![在这里插入图片描述](https://img-blog.csdnimg.cn/46a11af51bfa44419e03916e08030ed6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) - 项目打开后如图
![在这里插入图片描述](https://img-blog.csdnimg.cn/df71c4fa8d6b409e8f5e8b340a87ed5e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16)
二、使用
1.打开用cube生成的项目后打开main函数 ![在这里插入图片描述](https://img-blog.csdnimg.cn/1854f5c4376c4c29a52e9b99bc496907.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) 2.在main函数里面找到while循环,在循环体内部加入流水灯代码 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8df317f79dbe4f0eaeea5c1f04316b74.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16)
本次实验采用三个灯实现,亮灯状态用1表示,灭灯状态用0表示。 按照A4、B5、C14的顺序,初始状态为0 0 0, 状态一为1 0 0 状态二为0 1 0 状态三为0 0 1 状态三结束后继续进入状态一,一直循环达到流水灯效果。
while循环体代码如下
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET);
①延时函数(HAL_Delay) 函数原型: void HAL_Delay (__IO uint32_t Delay) 参数说明:Delay表示所要延时的时间大小,单位是毫秒 ②写管脚函数(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)
3.简单分析 参考使用c语言基于寄存器实现流水灯 当我们使用寄存器来达到上述效果的时候,需要使能时钟、配置输入输出模式等操作。而使用HAL库的时候,通过stm32CubeMX会自动生成对应引脚的配置代码。在main.c里面的MX_GPIO_Init函数即是。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b780576b0b2e400b97e45adddbbcfb21.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16)
三、效果
1.使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形。
①先build项目,然后点击debug ![在这里插入图片描述](https://img-blog.csdnimg.cn/db5fdf959a3e46fcbeef75b16508d956.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) ②点击System Analyzer Windows,选择Logic Analyzer ![在这里插入图片描述](https://img-blog.csdnimg.cn/9d138ae5fe7b4a75b688854e38b3a213.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) ③点击setup ![在这里插入图片描述](https://img-blog.csdnimg.cn/93638fab08164d0496e6f8ab6e719ef7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) ④添加需要观察的引脚
- 先点击添加
- 输入需要观察的引脚后回车。格式可以用GPIOx_IDR.n(x为端口,n为引脚号,GPIOA_IDR.4表示PA4)
- 在Display Type记住要选择bit
- 完成后点击close即可
![在这里插入图片描述](https://img-blog.csdnimg.cn/63b7c1bf884e4926ae6b8855e1bf1453.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) ⑤点击Run,观察波形。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/83557232d60a4d0da667c534cf76b40d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) ⑥波形图如下 可以看到按照A4、B5、C14的顺序依次先高电平再低电平,时间间隔约为1s。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/bc78af997e9246788f16516422a8b0cd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6YaJ5oSP5Li25Y2D5bGC5qKm,size_20,color_FFFFFF,t_70,g_se,x_16) 2.实物效果图 为了测试方便,我让c13的灯一直处于高电平状态。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/eacc33ee494d4589b91e9c171022ffb4.gif)
四、总结
通过使用HAL库可以大大减少我们配置对应引脚的时间和代码量,在操作方面也大为方便,不需要再翻资料查找每一个寄存器的基地址了。
五、参考
STM32实现LED闪烁——基于HAL库
|