STM32F03寄存器方式点亮LED流水灯

文章目录

    • STM32F03寄存器方式点亮LED流水灯
  • 一、题目内容
  • 二、STM32F03系列芯片的地址映射和寄存器映射映射原理;了解GPIO端口的初始化设置三步骤
    • 1、地址映射和寄存器映射原理
    • 2、GPIO端口初始化设置
  • 三、用STM32最小系统核心板STM32F103C8T6+面板板+3只红绿蓝LED 搭建电路,使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
    • 1、建立工程文件
    • 2、使用寄存器点亮LED灯(代码部分)
      • (1)硬件连接设计
      • (2)打开之前的工程文件
      • (3)代码
      • (4)硬件连接
      • (5)烧录
  • 四、实验总结
  • 五、参考文献

一、题目内容

1、学习和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。
2、以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)分别用汇编语言,C语言编程实现。

二、STM32F03系列芯片的地址映射和寄存器映射映射原理;了解GPIO端口的初始化设置三步骤

1、地址映射和寄存器映射原理

一、寄存器
寄存器是中央处理器内的组成部分。 寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
简单来说,寄存器就是存放东西的一个空间器物。寄存器可能存放的是指令、数据或地址。
  存放数据的寄存器是最好理解的,如果你需要读取一个数据,直接到这个寄存器所在的地方来问问他,数据是多少就行了。问寄存器这个动作,叫做访问寄存器。不同的数据会存放在不同的寄存器,例如引脚PA2与PB8的高低电平数据(1或0)肯定放在不同的寄存器里,那么怎么区分不同的寄存器呢?通过地址,不同的寄存器有不同的地址,就像老张行李寄存处在101号店铺,老王行李寄存处在258号店铺。
  指令、地址寄存器与数据寄存器类似,里边存放的都是0和1,毕竟单片机也只认识机器码,机器码都是0或1,只是特别的规定下,数据寄存器里面存放的0和1表示数据,指令寄存器里存放的表示指令。
二、地址映射和寄存器映射原理
(1)地址映射:由百度词条可知为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。
(2)寄存器映射:在存储器的区域单元中,每一个单元对应不同的功能,当我们控制这些单元时就可以驱动外设工作。我们可以找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,如果每次都是通过这种地址的方式来访问,不仅不好记忆还容易出错,这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是我们经常说的寄存器,这个给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。

2、GPIO端口初始化设置

(1)GPIO初始化步骤:
第一步:使能GPIOx口的时钟。
第二步:指明GPIOx口的哪一位,这一位的速度大小以及模式。
第三步:调用GPIOx初始化函数进行初始化。
第四步:调用GPIO-SetBits函数,进行相应位的置位。
(2)实例
单个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_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);第二步:设置GPIOA,GPIOE参数:输出OR输入,工作模式,端口翻转速率
第三步:调用GPIOA口初始化函数,进行初始化。
第四步:调用GPIO-SetBits函数,进行相应为的置位。把第二、三、四步合并分别设置GPIOA和GPIOE
先设置GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 第四个口,PA4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOA,&GPIO-InitST); //根据设定参数初始化GPIOA
GPIO_SetBits(GPIOA,GPIO_Pin_4); //输出高再设置GPIOE
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 第三个口,PE3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz
GPIO_Init(GPIOE,&GPIO-InitST); //根据设定参数初始化GPIOE
GPIO_SetBits(GPIOE,GPIO_Pin_3); //输出高

三、用STM32最小系统核心板STM32F103C8T6+面板板+3只红绿蓝LED 搭建电路,使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒。

1、建立工程文件

新建工程LLight文件,工程名为Light,选择STM32F103C8
之后弹出的添加库文件窗口Manage Run-Time Environment,在这个界面,选择Cancel即可。

我在这里采用startup_stm32f10x_md.s作为启动文件。我们可以到这个网址去下载:http://www.openedv.com/posts/list/313.htm,
将启动文件拷贝到Light2工程文件夹下。

我们找到 Target1→Source Group1→双击→设置打开文件类型为 Asm Source file→选择 startup_stm32f10x_hd.s→点击 Add,如下图所示:

这里看到的 2 个文件夹:Listings 和 Objects,是 KEIL 自行创建的,用于保存编译过程中生成的一些文件。
添加完之后,得到如下界面:

为了不让之后生成的文件显得混乱,在Light2文件夹下新建一个OBJ文件,用于存放生成的中间文件。
USER 文件夹专门用来存放启动文件(startup_stm32f10x_md.s)、工程文件(test.uvprojx)等不可缺少的文件,而 OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)。然后把 Listings 和Objects 文件夹里面的东西全部移到 OBJ 文件夹下。
在上面对话框的中间栏,点新建,新建 USER 和 SYSTEM 两个组。然后点击 Add Files 按钮,把 SYSTEM 文件夹三个子文件夹里面的:sys.c、usart.c、delay.c 加入到 SYSTEM 组中。注意:此时 USER 组下还是没有任何文件,我们只添加SYSTEM的三个。

点击 OK,退出该界面返回 IDE。
此时界面如图所示:

接着,我们新建一个 test.c 文件,并保存在 USER 文件夹下。然后双击 USER 组,会弹出加载文件的对话框,此时我们在 USER 目录下选择 test.c 文件,加入到 USER 组下。

点击魔法棒,弹出 Options for Target’Target 1’对话框,选择 Output 选项卡→选中 Create Hex File(用于生成 Hex 文件,后面会用到)→点击 Select Folder for Objects→找到 OBJ 文件夹→点击 OK
接着,再设置 Listings 文件路径,在图 3.2.16 的基础上,打开 Listing 选项卡→点击 Select
Folder for Listings→找到 OBJ 文件夹→点击 OK

加入sys、delay、usart的include路径:

接下来我们就可以进行代码下载和仿真调试了。

2、使用寄存器点亮LED灯(代码部分)

(1)硬件连接设计

题目要求,使用GPIOB,GPIOC,GPIOD端口来控制LED灯,在查询C8T6数据手册后,我选用了PB5,PC4,PD8管脚分别连接红绿蓝三种颜色的灯(由于我只有红绿黄三个小灯,在之后实际硬件中,会用黄灯代替蓝灯)

图中从 3 个 LED 灯的阳极各经过 1 个限流电阻连接到 3.3V 电源,阴极连接STM32 的 3 个 GPIO 引脚中,所以我们只要控制这三个引脚输出高低电平,即可控制其所连接 LED 灯的亮灭。
目标是把 GPIO 的引脚设置成推挽输出模式并且默认下拉,输出低电平,这样就能让 LED 灯亮起来了。
但是之后连电路的时候发现并没有PD管脚,于是自己改成了PA1,PB0,PB5,只是在推挽输出、以及声明时代码有所不同,其他变化不大。

(2)打开之前的工程文件

接之前步骤。

(3)代码

在Light2文件夹下新建一个HARDWARE文件夹,用来存储以后与硬件相关的代码。

然后我们打开 USER 文件夹下的 test.uvprojx 工程,新建两个文件,然后保存在HARDWARE→LED 文件夹下面,保存为 led.c,led.h
我们将文件添加到工程中,步骤如下图:

在魔法棒这里将HARDWARE路径加进去,否则之后会报错。

下面来编写led.c文件,要用到GPIOB、GPIOC、GPIOD则,对应时钟设置:

在设置完时钟之后就是配置完时钟之后,LED_Init 配置了 目标三个端口 PB0 PB5 PA1 的模式为推挽输出,
并且默认输出 1。这样就完成了对这三个 IO 口的初始化。
led.c:

#include "led.h"
//初始化 PB1 PC4 PD8为输出口.并使能这三个口的时钟
//LED IO 初始化
void LED_Init(void)
{RCC->APB2ENR|=1<<2; //使能 PORTA 时钟 RCC->APB2ENR|=1<<3; //使能 PORTB 时钟
//  RCC->APB2ENR|=1<<4; //使能 PORTC 时钟
//  RCC->APB2ENR|=1<<5; //使能 PORTD 时钟 GPIOB->CRL&=0XFF0FFFFF; GPIOB->CRL|=0X00300000;//PB.5 推挽输出 GPIOB->ODR|=1<<5; //PB.5 输出高 GPIOB->CRL&=0XFFFFFFF0; GPIOB->CRL|=0X00000003;//PB.0 推挽输出 GPIOB->ODR|=1<<0; //PB.0 输出高GPIOA->CRL&=0XFFFFFF0F; GPIOA->CRL|=0X00000030;//PA.1 推挽输出 GPIOA->ODR|=1<<1; //PA.1 输出高
}

led.h

#ifndef __LED_H
#define __LED_H
#include "sys.h"
//LED 端口定义
#define LED0 PBout(5) // DS0
#define LED1 PBout(0) // DS1
#define LED2 PAout(1) // DS2
void LED_Init(void); //初始化
#endif

在USER文件夹的test.c中撰写main函数:

#include "sys.h"
#include "delay.h"
#include "led.h"
int main(void)
{ Stm32_Clock_Init(9); //系统时钟设置delay_init(72); //延时初始化LED_Init(); //初始化与 LED 连接的硬件接口while(1){LED0=0;LED1=1;LED2=1;delay_ms(1000);LED0=1;LED1=0;LED2=1;delay_ms(1000);LED0=1;LED1=1;LED2=0;delay_ms(1000);}
}

代码包含了#include "led.h"这句,使得 LED0、LED1、LED2、LED_Init 等能在 main 函数里被调用。
接下来,main 函数先调用 Stm32_Clock_Init 函数,配置系统时钟为 9 倍频,也就是 8*9=72M(外部晶振是 8Mhz),然后调用 delay_init 函数,初始化延时函数。接着就是调用 LED_Init 来初始化 三个管脚 为输出。最后在死循环里面实现 LED0 LED1 LED2 交替闪烁,间隔为 1s。

(4)硬件连接

TXD和RXD管脚位置
PA9——TX
PA10——RX
GND------GND
3V3------3V3
务必将boot0设为1,boot1设为0,利用跳线帽实现

(5)烧录



芯片面包板连好电路后,通电,LED工作。



四、实验总结

通过这次实验,学会了流水灯的点亮,这次实验遇到了很多的问题,但是经过网上参考,问同学,还是将实验完成,这次实验收获还是挺多的。

五、参考文献

https://blog.csdn.net/asdfg1075511750/article/details/79663568
https://blog.csdn.net/geek_monkey/article/details/86293880
https://blog.csdn.net/qq_46467126/article/details/120791793

STM32F03寄存器方式点亮LED流水灯相关推荐

  1. STM32F103寄存器方式点亮LED流水灯

    实验要求:以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB.GPIOC.GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒.1)写出 ...

  2. STM32F103C8T6以寄存器方式借助面包板搭建电路点亮LED流水灯详解

    文章目录 一.寄存器原理 1.什么是寄存器 2.如何访问寄存器 二.GPIO端口的初始化设置 1.时钟配置 (1)找到时钟使能寄存器映射基地址 (2)找到端口偏移地址以及对应端口所在位置 (3)使能对 ...

  3. GPIO端口初始化设置,STM32F103点亮LED流水灯过程

    文章目录 一.STM32F103系列芯片地址映射和寄存器映射原理 1.什么是寄存器 2.地址映射和寄存器映射 3.寄存器地址查找 二.GPIO端口初始化设置 1.GPIO简介 2.配置时钟 3.输入输 ...

  4. 用寄存器HAL库完成LED流水灯程序

    重庆交通大学信息科学与工程学院 <嵌入式系统开发>课程 作业报告(第4周) 班 级: 通信工程2001 姓名-学号 : 阎桂董-632007030622 实验项目名称: 作业题目 实验项目 ...

  5. 【stm32cubeMX】使用HAL库点亮LED流水灯

    stm32cubeMX使用HAL库点亮LED流水灯 1.安装STM32CubeMX 2.安装HAL库 3.新建项目 4.keil仿真调试 五.实现 六.参考资料 1.安装STM32CubeMX 官网下 ...

  6. STM32Cubemx的安装及用寄存器HAL库完成LED流水灯程序

    目录 一.STM32CubeMx安装 (一)简介 (二)下载地址 1.官方下载地址 2.网盘下载地址 二.STM32CubeMX安装过程 三.HAL库安装 四.HAL库实现LED流水灯 (一)新建项目 ...

  7. 【嵌入式04】用寄存器HAL库完成LED流水灯程序

    目录 一.原理学习 1.寄存器映射原理 2.GPIO端口的初始化设置步骤 二.LED流水灯 1.程序设计思路 2.寄存器方式编程实现 3.HAL库编程实现 4.软件仿真 三.总结 四.参考链接 一.原 ...

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

    STM32的地址映射.寄存器映射原理以及GPIO端口的初始化设置三步骤 ​(一)STM32F103系列芯片的地址映射及寄存器映射原理 1.STM32F103C8T6简要介绍 ● STM32F103C8 ...

  9. 【嵌入式知识07】借助stm32CubeMX,使用STM32F103C8T6点亮LED流水灯

    本文目录 一.简述 二.STM32CubeMX简介 1.利用CubeMX新建工程点亮LED灯 1)前期准备 2)新建工程 2.界面讲解 3.配置引脚 4.时钟源配置 5.工程管理 三.点亮LED 1. ...

最新文章

  1. mysql语句生成工具_强烈推荐一款MySQL语句优化辅助工具,值得收藏
  2. 压缩 20M 文件从 30 秒到 1 秒的优化过程!
  3. 程序员部落酋长 Joel 之洞见
  4. springboot整合mysql5.7_springboot整合mybatis访问mysql,数据库
  5. hive export import
  6. [BZOJ3998][TJOI2015]弦论
  7. Spring MVC 入门
  8. mysql 踩过的坑_MySQL数据库踩过的一些坑
  9. C++ 类访问控制(public/protected/private)
  10. mysql主从延迟时间是多少_MySQL主从延迟
  11. https://www.usb.org/
  12. TypeScript 的声明文件的使用与编写
  13. 用自己的数据集训练Mask-RCNN实现过程中的坑
  14. 2's complement 与 1's complement
  15. 机房交换机网络测试软件,国内IDC机房带宽测试工具和方案
  16. [计算机网络-03] 数据链路层
  17. [Typecho]更换头像源及显示QQ显示头像
  18. 游戏行业如何上云?阿里云架构师解读四大主流游戏架构
  19. Combining Deep Learning with Information Retrieval to Localize Buggy Files for Bug Reports
  20. 数学建模常见的综合评价方法及预测方法

热门文章

  1. idea如何设置代理实现管理突破呢
  2. Alpha测试和Beta测试的区别
  3. 【C++】野指针及其危害
  4. 疯狂java讲义(李刚)6.2
  5. 安卓开发———打开相机拍照或者打开相册选择照片并显示出来
  6. DOTS支持的shader
  7. 正则表达式匹配仅包含某些字符或者包含某些字符
  8. 基于http-flv的抖音直播端到端延迟优化实践
  9. HDFS成员的工作机制
  10. codesys工程ST语言学习笔记(五)打开压缩文件projectarchive失败,指定的工程不能被加载