点亮LED灯案例(基于寄存器)

i首先,我们使用寄存器开发的方式点亮一个LED灯,期间会涉及到一些寄存器知识,目前不用深究,后续会详细介绍。目前咱就是快速体验STM32开发,点亮一个LED灯就行了。

一、需求描述

快速体验STM32开发:点亮LED灯

二、硬件电路设计

 根据硬件电路原理图可知,LED-1连接端口为PAO,只要控制连接PA0引脚为低电平(0)即可点亮LED-1黄灯

三、创建项目工程

3.1 创建工程准备

1、创建需要的目录

在电脑磁盘创建一个工程目录STM32,并创建第一个项目文件夹01_led_reisgter

2、准备启动文件 

STM32程序需要启动文件,我们需要提前准备。因为都是一些汇编文件以及其他核心文件,如果自己编写就比较麻烦了,所以我们需要去ST官网下载好标准库外设文件,然后copy一份我们需要的相关文件即可。

标准外设库下载地址:https://www.st.com/zh/embedded-software/stm32-standard-peripheral-libraries/products.html

选择3.6.0版本下载标准外设库压缩包,然后解压以后找到相应文件,copy即可。

3、创建目录存放启动文件和其他核心文件

为了方便管理,我们把启动文件放入专门目录中。在刚才创建的工程目录中创建一个目录Start

然后顺便创建好放置代码文件的用户目录User,并可以手动创建一个.c文件

 

 然后根据自己芯片类型在标准外设库中找到我们需要的汇编文件

 还有这些

 以及这些

 将上述文件都copy到Start目录中

 

4、 keil中创建工程

打开Keil,点击项目,如图

 选择对应芯片,确认

OK后,会跳出工程创建助手,暂时不需要

 创建完毕后

3.2 工程配置

修改project group,添加两个工程文件组,方便管理启动文件以及代码文件

 给工程我文件组添加文件

选择文件对应目录,全选所有文件,点击Add,此时软件没有任何提示,不要担心,然后直接Close即可。 (如果发现全选后添加不成功,可以不选择文件类型,一个一个类型的添加就可以成功了)

 Start目录添加完毕,User的话同理,这里不再赘述

 创建完毕

如果上面不是在磁盘上手动创建main.c文件的话,直接在keil中创建,方法如下

最终磁盘目录中的文件

 

3.3 编译器配置

1、编译器版本修改为5

目前最新的Keil ARM用的是 Compiler version 6,与前面的core_cm3.c不兼容,所以需要提前准备好Compiler version 5。

下载地址:Downloads - Arm Developer

下载的arm5_compiler内容格式与keil原有的编译器6的内容格式一致

2、其他配置

选中 Creaye HEX File,使运行后创建.hex文件,方便直接在调试助手中使用

添加包含路径 

C/c++旁边的(AC6)有没有是不影响的,和你的编译器版本有关,如果把编译器版本改成5以后则这个AC6就会消失,如果还是6版本则会显示

添加好后

 四、软件设计

1、main.c

接下来,咱就正式开始写代码了。由于是快速体验STM32开发,所以咱只需要把LED灯点亮就行,至于代码为什么要这样写,目前还不用深究,等后面学完GPIO后自会明白。

前面观察硬件电路设计时我们发现,只要让GPIOA的0口处于低电平0即可把灯点亮了。接下来按照下面的步骤来即可,中间涉及到的一些知识,先了解一下,后续会慢慢理解。

1.1 开启时钟

在STM32中,要控制IO口工作,就必须要开启时钟。因为STM32对于不同的端口工作会给不同的时钟频率,有利于降低能耗,使得物尽所用,减少浪费。我们现在使用的是GPIOA的0口,那就要找到控制GPIOA时钟开关的寄存器,然后通过控制该寄存器去开启对应的时钟。

查阅STM32 F10X通用中文技术参考手册,找到对应时钟寄存器RCC_APB2ENR

 现在,我们查到了该寄存器,那么如何去找到这个寄存器的地址呢?我们看见寄存器介绍有个偏移地址。其实,只需找到该外设对应的基地址,然后加上寄存器对应的偏移地址就可以了

由图可知,该寄存器中数据取低16位,且时钟未启用时数据始终为0x00(即0)

 通过翻阅技术手册的存储器映像可知,如上图。RCC的基地址是0x4002100,而APB2外设寄存器偏移地址是0x18,所以RCC_APB2ENR外设寄存器的地址值就是0x4002100+0x18了

有了地址,我们再给寄存器写入数据,我们要控制的是GPIOA端口,所以给这个数据的二进制第二位写个1,其他位是0就可以了。也就是给个4。这样就可以开启GPIOA口的时钟了

在代码中,因为0x4002100+0x18是寄存器的地址值,所以我们需要对此进行强转成uint32_t的指针,然后解引用赋值就可以了。(在STM32开发中,数值都是无符号32位的数,如uint32_t...)

*(uint32_t *)(0x40021000 + 0x18) = 4;

1.2 配置GPIOA的工作模式

开启时钟后,就要设置GPIOA引脚的工作模式,要想使GPIOA的0口输出低电平(或高电平),就得将工作模式设为输出模式。根据前面的思路,我们通过技术手册找到控制GPIOA的寄存器的基地址值0x40010800,控制PA0的寄存器是GPIOx_CRL

 如图,我们将PA0引脚设为最大速度的输出模式,MODEO的两位要设为11,然后设为通用推挽输出模式,CNF0的两位要设为00,也就是说给这个CRL寄存器的数据二进制最后四位是0011即3;

*(uint32_t *)(0x40010800 + 0x00) = 3;

1.3 控制PA0引脚为低电平

紧接着,控制PA0输出低电平就可以点亮LED-1灯了,此时,要找到控制数据输出的寄存器ODR

 相应的,都是GPIOA端口的基地址值,然后加上偏移地址,即ODR的地址值为0x40010800+0x0C,要使PA0口输出低电平,则如图的ODR0即第0位写0,其他位为1就好了。也就是1111111111111110,0xfffe

*(uint32_t *)(0x40010800+0x0C) = 0xfffe;

1.4 死循环空转保持状态

while(1){}

完整代码如下

#include <stdint.h>

int main(void)

{

    // 开启时钟

    *(uint32_t *)(0x40021000 + 0x18) = 4;

    // 配置GPIOA的工作模式

    *(uint32_t *)(0x40010800 + 0x00) = 3;

    // 给PA0引脚处于低电平

    *(uint32_t *)(0x40010800 + 0x0c) = 0xfffe;

    // 死循环保持点亮状态

    while (1)

    {

    }

}

2、编译工程

 点击编译,发现错误倒没有,但有一个警告,我们要尽量保证0警告0错误,避免后续警告影响代码运行

 根据警告提示,我们在末尾多加一行,直接会回车,然后编译

OK,很明显,编译得很好,没有一点问题了。

3、安装ST-LINK驱动

1、我们使用ST-LINK仿真器下载程序

 2、Keil的安装目录下自带了ST-link的USB驱动,双击安装即可。

 3、升级ST-LINK固件

 

4、在Keil中配置ST-LINK

 还需要在Keil中对ST-LINK进行一些相关配置,否则点击下载将会报错。

 点击settings后,进入

 然后点击Flash Download

 接着进入Pack

 至此,关于ST-LINK的相关配置就做完了。

4、下载程序

五、实验现象

完成以上所有步骤后,点击编译、运行、下载程序,若成功,则能看见板子上黄灯亮起,证明我们点灯案例取得初步成果啦!

至此,本次初步点灯案例结束了! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值