【MiniSTM32_HAL库版本_V1.0】实验1跑马灯代码解释(超详细,适合初识STM32的朋友)
引言:对于第一个实验跑马灯,就相当于代码界的打印“Holle word”,可以说非常重要和基础,理解了跑马灯实验,在后面的学习将非常有用。为此特意写下这篇文章来解释一下每个代码的作用,以及本人在理解时遇到的问题和解决思路。
1)实验平台:正点原子STM32mini开发板
2)摘自《正点原子STM32 不完全手册(HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子
led.h头文件代码:
#ifndef _LED_H //如果没有定义led.h头文件
#define _LED_H //定义led.h头文件
#include "sys.h" //引入sys.h头文件
#define LED0 PAout(8) //使LED0等于PAout(8),后面用到LED0=1,则PAout(8)=1
#define LED1 PDout(2) //同理void LED_Init(void); //自定义一个函数,用来初始化LED灯配置
#endif
led.c文件代码:
#include "led.h"void LED_Init(void)
{GPIO_InitTypeDef GPIO_Initure; //定义了一个结构体变量__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟__HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOD时钟GPIO_Initure.Pin=GPIO_PIN_8; //PB8GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速HAL_GPIO_Init(GPIOA,&GPIO_Initure); //配置PA8GPIO_Initure.Pin=GPIO_PIN_2; //PD2HAL_GPIO_Init(GPIOD,&GPIO_Initure); //配置PD2HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET); //PA8置1,默认初始化后灯灭HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); //PD2置1,默认初始化后灯灭
}
下面解释一些重要的代码:
1.
GPIO_InitTypeDef GPIO_Initure; //创建一个GPIO_InitTypeDef结构体
解释:GPIO_InitTypeDef结构体的内容
typedef struct
{
uint32_t Pin; /*指定要配置的GPIO引脚。*/uint32_t Mode; /*指定选定接点的工作模式*/
uint32_t Pull; /*指定选定接点的上拉或下拉激活。*/
uint32_t Speed; /*指定选定接点的速度。*/
} GPIO_InitTypeDef;
2.
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
__HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOD时钟
对于这两个时钟是一定要开的,相当于小开关,只开有用的GPIO,无用的不开,这样可以节省芯片功耗。 因为用到了GPIOA和GPIOB,所以打开相应的GPIO串口时钟。
3.
GPIO_Initure.Pin=GPIO_PIN_8; //PB8
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //配置PA8
由于LED0和PA8串口相连,LED1和PD2串口相连,先定义串口PA8,或者先定义串口PD2都可以,在上述代码中先定义了串口PA8。
4.
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
这里介绍一下几个Mode(寄存器) 模式的选择:
GPIO_MODE_INPUT 浮空输入
GPIO_Mode_OUTPUT_OD 开漏输出
GPIO_Mode_OUTPUT_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出
LED灯使用的是推挽输出,推挽输出可以输出高低电平。
5.
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //配置PA8
此函数的原型为
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
GPIO_TypeDef为一个结构体
typedef struct
{
__IO uint32_t CRL; //端口配置寄存器
__IO uint32_t CRH; //端口配置高寄存器
__IO uint32_t IDR; //端口输入数据寄存器
__IO uint32_t ODR; //端口输出数据寄存器
__IO uint32_t BSRR; //端口位设置/清除寄存器
__IO uint32_t BRR; //端口位清除寄存器
__IO uint32_t LCKR; //端口配置锁定寄存器
} GPIO_TypeDef; //七种寄存器
GPIOx可以用来设置GPIOA或GPIOB等等,根据这两个结构体就可以把GPIO口给配置好。
同理因为LED 1与PD2相连,所以设置:
GPIO_Initure.Pin=GPIO_PIN_2; //PD2 把结构体的Pin设置为2.
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
这样GPIO_Initure为PD2的串口设置。
6.
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET); //PA8置1,默认初始化后灯灭
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
GPIO写入函数。此函数前两个形参之前已经介绍过,第三个形参为一个结构体:
typedef enum
{
GPIO_PIN_RESET = 0u,
GPIO_PIN_SET
} GPIO_PinState; //枚举类型,第一个GPIO_PIN_RESET设置为0,则第二个自然为1.
main.c主函数的设置:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"int main(void)
{ HAL_Init(); //初始化HAL库 Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72Mdelay_init(72); //初始化延时函数LED_Init(); //初始化LED while(1){LED0=0; //LED0亮LED1=1; //LED1灭delay_ms(500);LED0=1; //LED0灭LED1=0; //LED1亮delay_ms(500);}
}
这样就可以完成一个跑马灯实验,大家还有什么不懂的欢迎评论。
【MiniSTM32_HAL库版本_V1.0】实验1跑马灯代码解释(超详细,适合初识STM32的朋友)相关推荐
- anaconda必须安装在c盘吗_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细) 前沿 Hello,各位看官,您是不是决定要学习Python数据分析,您是不是现在正在"学" ...
- Arduino IDE搭建合宙ESP32C3开发环境(最简单) 附跑马灯代码
Arduino IDE搭建合宙ESP32C3开发环境(最简单) 附跑马灯代码 一.安装Arduino IDE 二.搭建合宙简约版ESP32C3开发环境 1.产品示例&管脚定义&原理图 ...
- 第一个ARM实验(跑马灯)
要成功完成基于ARM板的跑马灯实验首先需要:硬件(ARM板),软件(ADS1_2,JLINK,GIVEIO) 现在我们准备好了软件,先对软件进行安装! 一.对ADS1_2的安装: 1.点击进行安装, ...
- 参考学习的各种跑马灯代码
实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入"<marquee>滚动的文字</marquee>"语句, ...
- python的集成开发环境搭建_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细) 前沿 Hello,各位看官,您是不是决定要学习Python数据分析,您是不是现在正在"学" ...
- html跑马灯编程,求一个HTML无缝的跑马灯代码。
属性要求:胆识.福缘.机敏 效果:中毒.抗毒 蛤蟆功: 首部曲 1.巳午未时点扬州武器商附近的全知道触发到对话..说有事情想请教,一阵对话后给他10万两.接着说要到华山去(若给他1000两的是昆仑剑法 ...
- [ENVI] 定量遥感实验-水体叶绿素浓度遥感反演 (超详细步骤)
实验目的 得到太湖区域的叶绿素浓度分布图 实验内容及实验步骤 HJ-CCD影像的辐射定标 插件:ENVI_HJ1A1B_Tools.sav 建议在classic版本下执行操作,自动完成定标及波段合成 ...
- Ubuntu20.04虚拟机使用Kubeadm从0到1搭建K8S集群(超详细)
前言 最近在读张磊老师的<深入剖析Kubernets>,在阅读4.2节的时候遇到了问题,由于书上使用的版本已经过时,很多命令的执行都失败了,在经历了长达两个星期的折磨以后,我终于把这一节需 ...
- 从0到1搭建一个个人网站超详细教程
前言 如何从0到1搭建一个可以外网访问的项目? 我就用自己的服务器给大家举例,怎么从0到1搭建一个学生和新手可以用来面试的项目,老手也可以回忆一下自己逝去的青春. 服务器在激活的时候会让你选系统,这个 ...
- phpstorm调试远程服务器代码(超详细版本)
本篇教程是我综合了多篇教程综合而成的产物,每篇教程都会有一些小细节没有写到,折腾了好久终于是整出来了...现在在这里做个记录,也是给后来人避一下坑,先讲一下远程debug的原理:(本段来自:可能是全网 ...
最新文章
- 关于django 如何实现简单api的restful 接口
- Android 10 中有关限制非 SDK 接口的更新
- Solaris IPMP 配置
- python gui打包exe pyinstaller打包运行失败 Failed to execute script pyi_rth_multiprocessing
- Webpack核心概念解析
- SpringBoot异常处理-自定义HandlerExceptionResolver
- java安全级别过高_Java应该是更高级别还是更低级别?
- leetcode74. 搜索二维矩阵(二分查找)
- iOS - Card Identification 银行卡号识别
- Delphi 2009 的反射单元(ObjAuto):
- Spring-Bean配置-使用外部属性文件(转)
- 继承(1)----《.NET 2.0面向对象编程揭秘 》学习
- web service中配置tcp/ip监视器
- linux运行bak,linux 备份学习
- SOAPUI使用教程-REST请求工作
- matlab平滑处理例题,(完整word版)matlab中smooth函数平滑处理数据实例
- 周末不知道学什么?这份 Android 优秀技术文章清单请收下
- handsome主题添加服务器信息,全屏响应式精美typecho主题handsome
- 推荐几个编程学习网站
- 阿里云oss使用cdn,节省oss下行流量
热门文章
- Ubuntu18.04安装gcc——史上最全安装教程
- visio 2010激活教程
- xp系统qq安装不上网络连接服务器,xp系统安装QQ提示“安装文件失败”如何解决...
- 计算机的3d软件家庭版,3DOne家庭版 64位
- 2020最新淘宝等级表图及商品发布限制数量类目表
- 金算盘加密狗维护信息
- dump文件 linux,linux使用MAT分析dump文件
- java对excel加密_java 加密 excel
- java基础学习的心得体会
- 《球球大作战》源码解析:服务器与客户端架构