文章目录

  • 一、题目简述
  • 二、简述:初始化GPIO,点亮LED灯
  • 三、工程文件模板的建立
  • 四、使用寄存器点亮LED灯——代码部分
    • 1、硬件连接设计
    • 2、打开之前建立的工程模板
    • 3、代码编写
    • 4、硬件连接
    • 5、烧录:STM32F103C8T6与PC端连接
  • 五、使用寄存器点亮LED灯——电路部分
    • 1、面包板介绍
    • 2、电路连接
  • 六、总结

关于STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤,请参考我的前一篇博客。
【嵌入式07】寄存器映射原理详解,GPIO端口的初始化设置步骤

一、题目简述

以 STM32最小系统核心板STM32F103C8T6+面板板+3只红绿蓝LED 搭建电路,使用GPIOBGPIOCGPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)分别用汇编语言,C语言编程实现。

二、简述:初始化GPIO,点亮LED灯

外设的功能都是完全不同的,但初始化都是大同小异的。
点灯是所有学单片机的人都应该学会的第一项技能,这样子才算入门。

51单片机的点灯是,通过控制寄存器将片外引脚(我们称之为IO口)拉低拉高,输出高低电平,以控制LED亮灭。
其过程:单片机给指令->控制寄存器->给IO口电平->控制LED亮灭

stm32的点灯则是,通过使能外设GPIO时钟,发出指令给外设GPIO,外设GPIO收到指令后,着手配置自己的寄存器,然后给IO口模式,让其实现各种功能。
其过程:CPU给指令->GPIO收到指令->配置内部寄存器->配置IO口模式(注意是模式)->控制LED亮灭

三、工程文件模板的建立


建立模板要用到的SYSTEM文件及启动文件,包括点灯时需要的C8T6数据手册,以及烧录用到的FlyMcu,网盘自取。
链接:https://pan.baidu.com/s/1jxbVCa_filfR9ZRlmP6SMw
提取码:k4lv


新建工程Light2文件,工程名为light,因为之后实验采用C8T6板,因此这里选择STM32F103C8
之后弹出的添加库文件窗口Manage Run-Time Environment,在这个界面,我们可以添加自己需要的组件,从而方便构建开发环境,不过这里我们不做介绍。选择Cancel即可。
到这里,我们还只是建了一个框架,还需要添加启动代码,以及.c 文件等。

先介绍一下启动代码:启动代码是一段和硬件相关的汇编代码。
主要作用如下:
1、堆栈(SP)的初始化;
2、初始化程序计数器(PC);
3、设置向量表异常事件的入口地址;
4、调用 main 函数。

ST 公司提供了 3 个启动文件给我们,分别用于不同容量的 STM32 芯片,这三个文件是:
startup_stm32f10x_ld.s,startup_stm32f10x_md.s,startup_stm32f10x_hd.s
其中,ld.s 适用于小容量 产品;md.s 适用于中等容量产品;hd 适用于大容量产品;
这里的容量是指 FLASH 的大小.判断方法如下:

小容量:FLASH≤32K
中容量:64K≤FLASH≤128K
大容量:256K≤FLASH

这里,我查看了一下C8T6的数据手册,
其Flash容量为128K,属于中容量,因此我在这里采用startup_stm32f10x_md.s作为启动文件。
启动文件借用了正点原子版本,上面网盘链接可下载。
或者可以到这个网址去下载:http://www.openedv.com/posts/list/313.htm,
将启动文件拷贝到Light2工程文件夹下。

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

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

先关闭 KEIL 软件

为了不让之后生成的文件显得混乱,在Light2文件夹下新建一个OBJ文件,用于存放生成的中间文件。

USER 文件夹专门用来存放启动文件(startup_stm32f10x_md.s)、工程文件(test.uvprojx)等不可缺少的文件,而 OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面)。然后把 Listings 和Objects 文件夹里面的东西全部移到 OBJ 文件夹下。

这一步我自己做的有点凌乱,最后的文件夹结果如图所示,文件夹跟下面差不多一般就没有问题。



由于上面我们还没有任何代码在工程里面,这里我们把系统代码 copy 过来(即 SYSTEM文件夹,该文件夹由 ALIENTEK 提供,这些代码在任何 STM32F10x 的芯片上都是通用的,可以用于快速构建自己的工程。

同样在本节开头网盘链接内。
注意一定要拷贝寄存器版本

在 USER 文件夹下面找到 test.uvprojx,打开它,然后在 Target 目录树上点击右键→Manage Project Items,弹出对话框。

在上面对话框的中间栏,点新建(用红圈标出)按钮(也可以通过双击下面的空白处实现),新建 USERSYSTEM 两个组。然后点击 Add Files 按钮,把 SYSTEM 文件夹三个子文件夹里面的:sys.cusart.cdelay.c 加入到 SYSTEM 组中。注意:此时 USER 组下还是没有任何文件,我们只添加SYSTEM的三个。

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

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

如果我们此时编译的话,生成的中间文件,还是会存放在 Listings 和 Objects 文件夹下,所以,我们先设置输出路径,再编译。

点击魔法棒,弹出 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路径:

注意!我们必须根据所用 STM32F1 型号的容量,来输入相关宏定义,对于STM32F103 系列芯片,设置原则如下:

16KB≤FLASH≤32KB 选择:STM32F10X_LD 64KB≤FLASH≤128KB 选择:STM32F10X_MD
256KB≤FLASH≤512KB 选择:STM32F10X_HD

我们要将三个路径都加入

至此,一个完整的 STM32F1 开发工程模板下建立好了。接下来我们就可以进行代码下载和仿真调试了。

四、使用寄存器点亮LED灯——代码部分

1、硬件连接设计

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

图中从 3 个 LED 灯的阳极各经过 1 个限流电阻连接到 3.3V 电源,阴极连接STM32 的 3 个 GPIO 引脚中,所以我们只要控制这三个引脚输出高低电平,即可控制其所连接 LED 灯的亮灭。

目标是把 GPIO 的引脚设置成推挽输出模式并且默认下拉,输出低电平,这样就能让 LED 灯亮起来了。


但是之后连电路的时候发现并没有PD管脚,于是自己改成了PA1PB0PB5只是在推挽输出、以及声明时代码有所不同,其他变化不大。

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 输出高
}

这段代码里面最关键就是 3 个推挽输出代码的撰写

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

这段代码里面最关键就是 3 个宏定义:

#define LED0 PBout(5) // DS0
#define LED1 PBout(0) // DS1
#define LED2 PAout(1) // DS2

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

#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、硬件连接

5、烧录:STM32F103C8T6与PC端连接

打开C8T6数据手册,查找TXD和RXD管脚位置
PA9——TX
PA10——RX

务必将boot0设为1,boot1设为0,利用跳线帽实现


借助FLYMCU下载软件,即可将light.hex载入,软件资料同样可在网盘下载。
这里我利用FlyMcu进行。

五、使用寄存器点亮LED灯——电路部分

1、面包板介绍

面包板是由于板子上有很多小插孔,专为电子电路的无焊接实验设计制造的。由于各种电子元器件可根据需要随意插入或拔出,免去了焊接,节省了电路的组装时间,而且元件可以重复使用,所以非常适合电子电路的组装、调试和训练。


常见的最小单元面包板分上、中、下三部分, 上面和下面部分一般是由一行或两行的插孔构成的窄条,中间部分是由中间一条隔离凹 槽和上下各 5 行的插孔构成的宽条。

窄条上下两行之间电气不连通。

面包板背面示意图,看到背面示意图的情况,应当就很容易理解面包板之后应当如何接线了。

每 5 个插孔为一组,通常的面包板上有 10 组或 11 组。
对于 10 组的结构,左边 5 组内部电气连通,右边 5 组内部电气连通,但左右两边之间不连通,这种结构通常称为 5-5 结构。
还有一种 3-4-3 结构即左边 3 组内部电气连通,中间 4 组内部电气连通,右边 3 组内部电气连通,但左边 3 组、中间 4 组以及右边 3 组之间是不连通的。
对于 11 组的结构,左边 4 组内部电气连通,中间 3 组内部电气连通,右边 4 组内部电气连通,但左边 4 组、中间 3 组以及右边 4 组之间是不连通的,这种结构称为 4-3-4 结构。

中间部分宽条是由中间一条隔离凹槽和上下各 5 行的插孔构成。在同一列中的 5 个 插孔是互相连通的,列和列之间以及凹槽上下部分则是不连通的。

2、电路连接

让 STM32 一按复位键就开始跑代码,则需要配置 BOOT0 为 0,BOOT1 随便设置都可以。

在将C8T6连接到电路板之前,一定要先将BOOT0置位0,否则电路无效!!!

面包板连线,按照这个图连接,只不过我在实际电路时手头没有电阻,于是就没有连接电阻。

实际图连接


点灯实况

成功!

六、总结

面包板是个很方便的东西,比焊接快多了,以后可以多多利用。


建立模板要用到的SYSTEM文件及启动文件,包括点灯时需要的C8T6数据手册,以及烧录用到的FlyMcu,网盘自取。
链接:https://pan.baidu.com/s/1jxbVCa_filfR9ZRlmP6SMw
提取码:k4lv


参考
[1] https://blog.csdn.net/asdfg1075511750/article/details/79663568
[2] https://blog.csdn.net/countofdane/article/details/82561478
[3] https://blog.csdn.net/weixin_44784157/article/details/107448624

【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解相关推荐

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

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

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

    STM32F03寄存器方式点亮LED流水灯 文章目录 STM32F03寄存器方式点亮LED流水灯 一.题目内容 二.STM32F03系列芯片的地址映射和寄存器映射映射原理:了解GPIO端口的初始化设置 ...

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

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

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

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

  5. 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯

    本文主要介绍STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤.利用C语言编程和寄存器点亮流水灯以及stm32CubeMX+Keil使用HAL库点灯 目录 一.STM3 ...

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

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

  7. 【嵌入式系统基础实验一】-----led流水灯及串口通信的HAL库方式和寄存器编程方式实现,输出波形检测

    文章目录 1.实验知识点简要解析 1.1串口通信协议 1.2 RS232.485电平与TTL电平的区别 1.3 USB/TTL转232"模块 2.LED流水灯的寄存器地址 和HAL库这两种方 ...

  8. 最小系统开发板——利用STM32F103C8T6实现LED流水灯

    WeChat:[嵌入式工程师成长日记] https://mp.weixin.qq.com/s?__biz=Mzg4Mzc3NDUxOQ==&mid=2247484101&idx=3&a ...

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

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

最新文章

  1. 独家 | 为什么大多数分析工作都以失败告终
  2. 【简单数论】H - A^X mod P_HRBUST - 2049_31行代码AC
  3. linux每日命令(17):which命令
  4. 深入学习SAP UI5框架代码系列之三:HTML原生事件 VS UI5 Semantic事件
  5. php与mysql关系大揭秘_【慕课笔记】PHP与MySQL关系大揭秘
  6. 大工17春计算机基础,大工12春《计算机应用基础》在线测试3答案
  7. linux网络问题-子网掩码与网关不在同一段的处理
  8. java操作hbase使用hbase-client2依赖
  9. 浅析计算机应用管理及前景,论计算机应用技术的现状及前景
  10. python编程第一站-简单密码字典生成
  11. ZCANPRO-CAN/CANFD收发软件:安装及使用
  12. 怎么使用水经注万能地图下载器制作百度兴趣点个性化地图
  13. 以太网测试仪的RFC2544测试你了解吗?
  14. 一名优秀的测试工程师,应具备那些能力
  15. ASC计算机比赛报名,新闻|2019 ASC 世界大学生超级计算机竞赛(ASC19)报名通知|信息与软件工程学院...
  16. uipath对SAP的抓取
  17. 通信协议晦涩难懂搞不定?看完这些动图恍然大悟
  18. More effective C++学习总结
  19. C++没落了?学习C++没有前途了?从业者给你揭晓答案
  20. CentOS7下的网络设定方法

热门文章

  1. 秒懂!看机器学习如何净化处理文本
  2. “易融窃贼”--网贷平台隐私窃取
  3. 与 WordPress 的美妙相遇
  4. mac word 保存文件丢失,明明保存啦,但是就是没啦,不见啦。这个怎么解决。
  5. This may cause NPE so Data Binding will safely unbox it.
  6. 通报1422人!论文无实质贡献挂名认定为学术不端,科技部发布新规!
  7. 检测色卡饱和度和色彩偏差
  8. SVN 报错:does not support the HTTP/DAV protocol
  9. MFC、WTL、WPF、wxWidgets、Qt、GTK 对比
  10. SPSS是什么?SPSS软件的功能有哪些?