单片机学习小组
直播中

王凯

7年用户 1278经验值
私信 关注

怎样使用寄存器去配置STM32的引脚呢

怎样使用寄存器去配置STM32的引脚呢?怎样使用寄存器去操控LED闪烁呢?


回帖(1)

张帅

2022-2-23 15:38:03
前期准备
1、STM32F103(我用的是普中的Z200板)
2、IDE Keil5(MDK-ARM)软件
3、STM32固件库、STM32数据手册、STM32中文参考手册、开发板原理图(参考自己的开发板)
keil软件的安装网上有很多,这里我就不过多介绍了。
一、新建工程

1、打开keil5,点击左上方Project,选择New uVision Project,文件自己命名,点击保存,我这里是已建好的文件。

2、选择自己的芯片型号,这里我的是STM32F103ZE,点击OK。



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

3、点击Cancel退出

4、添加起动文件
启动文件是 startup_stm32f10x_hd.s 这个文件,在我网盘文件:STM32最新固件库v3.5LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm
这个路径下。

选择复制并粘贴到自己所创的文件下。

右键左侧文件目录选择第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的对照学习中,后面会进行更新。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分