​用寄存器&HAL库完成LED流水灯程序

这篇博客介绍了如何使用STM32F103C8T6微控制器通过寄存器和HAL库实现LED流水灯程序。内容涵盖了STM32的地址映射、寄存器映射原理,详细阐述了GPIO端口的初始化步骤,包括时钟配置、输入输出模式设置。此外,还讲解了STM32CubeMX的使用以及HAL库编程实现LED流水灯的过程,包括在Keil环境下进行仿真运行和硬件实现。
摘要由CSDN通过智能技术生成

STM32的地址映射、寄存器映射原理以及GPIO端口的初始化设置三步骤

​(一)STM32F103系列芯片的地址映射及寄存器映射原理

1.STM32F103C8T6简要介绍
● STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。除了被我们熟知的STM32,ST公司还有SPC5X系列、STM8系列等。
2. 地址映射
● 地址映射这个过程是在设计芯片的时候就要进行考虑的,地址总线接口如果是32位,则内核可访问的外设空间最大就是4G,芯片设计者为每一个外设会映射一段地址空间,比如GPIOA映射到0x0000000-0x0000FFFF,则CPU在访问0x0000000-0x0000FFFF地址空间时会被GPIOA外设捕获到,至于外设想做什么由外设的硬件设计者来决定。如果地址总线接口如果是64位,则内核可访问外设的地址空间为2^64bit。
● STM32地址总线接口为32位,则可以访问4Gbit的外设空间,下面为STM32F10X外设地址映射表。有很多还没有被映射的地址空间,ST公司后期可能用来扩展新外设,而扩展过程Cortex内核是不需要进行任何修改的。

3.寄存器映射原理
※存储器在产家制作完成后是一片没有任何信息的物理存储器,而CPU要进行访存就涉及到内存地址的概念,因此存储器映射就是为物理内存按一定编码规则分配地址的行为。值得注意,存储器映射一般是由产家规定,用户不能随意更改。
注意:寄存器映射是在存储器映射的基础上进行的。
● STM32,操作硬件本质上就是操作寄存器。在存储器片上外设区域,四字节为一个单元,每个单元对应不同的功能。当我们控制这些单元时就可以驱动外设工作,我们可以找到每个单元的起始地址,然后通过C 语言指针的操作方式来访问这些单元。但若每次都是通过这种方式访问地址,不好记忆且易出错。这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名实质上就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫寄存器映射。

(二)GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)

1.什么是GPIO
● GPIO(general porpose intput output):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。

IO端口位基本结构
①保护二极管。
②上/下拉电阻。
③施密特触发器:整形作用,使不规则波形成为规则方波。
④ P/N mos管。
MOS是压控型元件,通过控制Vgs来实现导通或关闭。

2.STM32时钟设置
2.1 什么是时钟?
● 单片机如果要正常运行,时钟信号是必不可少的。作为CPU的脉搏,时钟的快慢决定了CPU的运行速率,执行指令的速度。一般时钟源会被分频器或倍频器分成多种频率的时钟,以满足系统的不同应用。

● 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。
|

时钟源 介绍
HSI 高速内部时钟,RC振荡器,频率为8MHz
HSE 高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz
LSE 低速外部时钟,接频率为32.768kHz的石英晶体
LSI 低速内部时钟,RC振荡器,频率为40kHz
PLL 锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz

2.2 为什么进行时钟配置?
● stm32配置时钟,就可以把不需要那些功能的功耗去掉。当你想关闭某个IO的时候,关闭它相对应的时钟使能就是了,不过在51里面,在使用IO的时候是没有设置IO的时钟的,还有在STM32中,有外部和内部时钟之分。ARM的芯片都是这样,外设通常都是给了时钟后,才能设置它的寄存器(即才能使用这个外设)。STM32、LPC1XXX等等都是这样。这么做的目的是为了省电,使用了所谓时钟门控的技术。这也属于电路里同步电路的范畴:同步电路总是需要1个时钟。

(三)GPIO输入输出模式设置

3.1GPIO输入输出模式简介
● GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。同时,GPIO还支持三种最大翻转速度(2MHz、10MHz、50MHz)。
注意:每个I/O口可以自由编程,但I/O口寄存器必须按32位字被访问。

程序中标识 模式
GPIO_Mode_AIN 模拟输入
GPIO_Mode_IN_FLOATING 浮空输入
GPIO_Mode_IPD 下拉输入
GPIO_Mode_IPU 上拉输入
GPIO_Mode_Out_OD 开漏输出
GPIO_Mode_Out_PP 推挽输出
GPIO_Mode_AF_OD 复用开漏输出
GPIO_Mode_AF_PP 复用推挽输出

(四)在STM32中选用怎样选择I/O模式

● 浮空输入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
● 带上拉输入_IPU——IO内部上拉电阻输入
● 带下拉输入_IPD—— IO内部下拉电阻输入
● 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
● 开漏输出_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
● 推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
● 复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL、SDA)
● 复用功能的开漏输出_AF_OD——片内外设功能(TX1、MOSI、MISO.SCK.SS)

(五)GPIO初始化步骤

步骤 操作
A 操作
B 指明GPIOx口的哪一位,这一位的速度大小以及模式
C 调用GPIOx初始化函数进行初始化
D 调用GPIO-SetBits函数,进行相应位的置位

(六)代码实操

※ 对单个GPIO口的初始化:

GPIO_InitTypeDef GPIO_InitStructure;
第一步:使能GPIOA的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

第二步:设置GPIOA参数:输出OR输入,工作模式,端口翻转速率
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8; //设定要操作的管脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz

第三步:调用GPIOA口初始化函数,进行初始化。
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA

第四步:调用GPIO-SetBits函数,进行相应为的置位。
GPIO_SetBits(GPIOA,GPIO_Pin_0); //输出高

※ 对于多个GPIO口的初始化如下:

GPIO_InitTypeDef GPIO_InitStructure;
第一步:使能GPIOA,GPIOE的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Per
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值