【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲

【STM32】STM32标准库与HAL库对照学习教程一--使用寄存器操控LED闪烁详讲


STM32全部教程【STM32】标准库与HAL库对照学习系列教程大全

前言

本教程文章是我在学习STM32标准库和HAL库后写的,想通过标准库与HAL库的对照学习加强我对STM32的理解与使用,让自己对STM32的认识不只会停留在表面,出文章的目的是为方便自己记录以及相帮助更多的人学习单片机,本篇文章先介绍寄存器的使用,在以后的章节中会使用库函数开发,有问题的地方希望大家在评论区指出。

前期准备
1、STM32F103(我用的是普中的Z200板)
2、IDE Keil5(MDK-ARM)软件
3、STM32固件库、STM32数据手册、STM32中文参考手册、开发板原理图(参考自己的开发板)

所需文件百度网盘链接:https://pan.baidu.com/s/1bYdnK9j6b8ze4wAFs0FRdQ
密码:6muu

keil软件的安装教程请看上一章。

一、新建工程

1、打开keil5,点击左上方Project,选择New uVision Project,文件自己命名,点击保存,我这里是已建好的文件。
在这里插入图片描述
2、选择自己的芯片型号,这里我的是STM32F103ZE,点击OK。
在这里插入图片描述

如果没有需要自己在软件中或者在官网上下载,这里不过多介绍

3、点击Cancel退出
在这里插入图片描述
4、添加起动文件
启动文件是 startup_stm32f10x_hd.s 这个文件,在我网盘文件:STM32最新固件库v3.5\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
这个路径下。
在这里插入图片描述
选择复制并粘贴到自己所创的文件下。
在这里插入图片描述
右键左侧文件目录选择第3个选项,找到启动文件并添加,文件类型选择All files。
在这里插入图片描述
4、新建main.c文件
右键左侧文件目录选择第2个选项,选择C文件并命名为main.c,点击Add。
在这里插入图片描述
到这里文件建立结束

二、寄存器讲解

1、什么是寄存器映射
存储器本身不具有地址信息,它的地址是由芯片厂商或
用户分配,给存储器分配地址的过程称为存储器映射,如果
再分配一个地址就叫重映射。

stm32f103芯片总共有4个G的内存,内存被分为了8块,每块具有512M的内存,分别被分配了自己的功能地址。
在这里插入图片描述

详情可以在我发布文件的STM32中文参考手册第28页。

2、寄存器的程序控制
要使用特定的功能需要用 “*” 取出相应功能地址中的值,然后进行位操作,例如:

*(unsigned int *)0x40021018 |=(1<<3);

由于STM32是32位处理机,因此在地址中取出的值是32位,后面会继续讲到。

三、使用寄存器配置引脚

1、STM32引脚的说明
stm32引脚与51单片机的引脚不同的地方是,51单片机可以直接控制输入输出,而32单片机需要打开对应的引脚时钟,配置输入和输出模式,再配置引脚的电平。因此STM32引脚寄存器的配置步骤为:
(1)打开GPIO引脚时钟
(2)配置输入和输出模式
(3)配置电平
对于本开发板的引脚,分为A、B、C、D、E、F、G类,每类最多16个引脚,为什么是16个一会儿说。

2、LED原理图
在这里插入图片描述
在这里插入图片描述
这里请参考自己开发板的原理图
我们选择LED1进行配置,当LED1的引脚为低电平时,电流流通发光二级管,小灯点亮,反过来一样。

3、LED1引脚配置
(1)B类引脚时钟使能配置
引脚时钟地址RCC的范围
在这里插入图片描述

图片在发布文件的32数据手册第38页

在这里插入图片描述

图片在发布文件的STM32中文参考手册第70页

APB2外设时钟使能地址=基地址+偏移地址

基地址是RCC的范围首地址0x4002 1000,偏移地址是0x18。
因此RCC地址=0x4002 1000+0x0000 0018 = 0x4002 1018
在这里插入图片描述
上图是指针地址取出的数据,可以看出是32位,每位对应不同功能的时钟,我们需要B类引脚的时钟,在第三位,让这个位为1就可以使能B类引脚的时钟了。因此操控程序为:

*(unsigned int *)0x40021018 |=(1<<3);

(2)PB5引脚(B类第5引脚)功能配置在这里插入图片描述

图片在发布文件的STM32中文参考手册第28页

从上图这里可以知道B类引脚的首地址(基地址)是0x4001 0C00
在这里插入图片描述
在这里插入图片描述

图片在发布文件的STM32中文参考手册第113、114页

为什么引脚寄存器会有低寄存器和高寄存器之分呢?
原因是地址取出的数据是32位,每4位为一组代表一个引脚,其中低两位为输入输出模式配置
在这里插入图片描述
另外高两位为引脚输入模式的上下拉配置
在这里插入图片描述
因此低端寄存器配置0-7引脚,高端寄存器配置8-15引脚,总共16个引脚,这就是为什么每类引脚只能有16个。
PB5引脚在低端寄存器配置。
低端寄存器地址=B类引脚基地址+偏移地址=0x4001 0C00 + 0x00=0x4001 0C00
控制程序为:

*(unsigned int *)0x40010C00 &=~(0x0F<<(4*5));  //先清零
*(unsigned int *)0x40010C00 |=(1<<(4*5));      //在置位

(3)配置PB5引脚(B类第5引脚)输出低电平
在这里插入图片描述

图片在发布文件的STM32中文参考手册第115页

由上图可以看出,取出数据的第5位是PB5,让这个为置0就可以让PB5引脚输出低电平。
端口输出寄存器地址=B类引脚基地址+偏移地址=0x4001 0C00+0x0C=0x4001 0C0C
控制程序为:

*(unsigned int *)0x40010C0C &=~(1<<5);

到这里引脚的寄存器配置算讲完了。

4、整体程序

(1)延时函数

/*************************************************
*函数名:delay()
*函数功能:延时函数,通过while循环占用CPU,达到延时功能
*输入:i
*返回值:无
**************************************************/
void delay(int i)
{
	while(i--);
}

(2)初始化空函数

void SystemInit(void)  
{

}

这个是启动文件运行使要调用的函数,必须要,在后面章节使用库函数时,其它文件有,但在本节课程里,必须要在main.c文件中给出。
(3)主函数

int main()
{
	*(unsigned int *)0x40021018 |=(1<<3);   //打开GPIO时钟
	*(unsigned int *)0x40010C00 &=~(0x0F<<(4*5));  //配置输出模式,先清0,在置位
	*(unsigned int *)0x40010C00 |=(1<<(4*5));
	*(unsigned int *)0x40010C0C &=~(1<<5);    //配置输出低电平
	
	while(1)
	{
		delay(0xFFFFF);
		*(unsigned int *)0x40010C0C |=(1<<5);//高电平
		delay(0xFFFFF);
		*(unsigned int *)0x40010C0C &=~(1<<5);//低电平
	}
}

5、程序烧入

(1)配置生成hex文件
点击魔术棒
在这里插入图片描述
点击生成hex文件
在这里插入图片描述
(2)程序烧入
我这里使用普中提供的烧入软件烧入
在这里插入图片描述
6、实验结果
在这里插入图片描述

到此寄存器配置的介绍基本讲完,接下来正式进入标准库与HAL的对照学习中,后面会进行更新。

  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
STM32标准库HAL库都是针对STM32系列微控制器的库,但是它们的设计思路和使用方法有所不同。STM32标准库是由ST公司提供的一套基于寄存器操作的低层驱动库,而HAL库则是基于标准库的封装,提供了更加高级的API接口,使得开发者可以更加方便地进行开发。 具体来说,STM32标准库主要包括以下几个部分: 1. CMSIS(Cortex Microcontroller Software Interface Standard):这是一套由ARM公司提供的针对Cortex-M系列微控制器的标准接口,包括了一些通用的API接口和一些与具体芯片相关的头文件和链接脚本等。 2. 寄存器操作库:这是STM32标准库的核心部分,通过对芯片内部寄存器的直接操作,实现了对外设的控制和数据传输等功能。 3. 外设驱动库:这是对一些常用外设(如USART、SPI、I2C等)的封装,提供了更加方便的API接口,使得开发者可以更加方便地进行开发。 相比之下,HAL库则提供了更加高级的API接口,使得开发者可以更加方便地进行开发。HAL库主要包括以下几个部分: 1. HAL库核心:这是HAL库的核心部分,提供了一些通用的API接口,如时钟配置、中断控制等。 2. 外设驱动库:这是对一些常用外设(如USART、SPI、I2C等)的封装,提供了更加方便的API接口,使得开发者可以更加方便地进行开发。 3. 扩展库:这是一些额外的功能库,如USB库、文件系统库等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修成真

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值