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

您所在的位置:网站首页 stlink连接stm32f103c8t6灯一直闪 【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解

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

2024-06-30 07:49| 来源: 网络整理| 查看: 265

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

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

一、题目简述

以 STM32最小系统核心板STM32F103C8T6+面板板+3只红绿蓝LED 搭建电路,使用GPIOB、GPIOC、GPIOD这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工程文件夹下。 在这里插入图片描述 我们找到 Target1→Source Group1→双击→设置打开文件类型为 Asm Source file→选择 startup_stm32f10x_hd.s→点击 Add,如下图所示 在这里插入图片描述 这里看到的 2 个文件夹:Listings 和 Objects,是 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,弹出对话框。 在上面对话框的中间栏,点新建(用红圈标出)按钮(也可以通过双击下面的空白处实现),新建 USER 和 SYSTEM 两个组。然后点击 Add Files 按钮,把 SYSTEM 文件夹三个子文件夹里面的:sys.c、usart.c、delay.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管脚,于是自己改成了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|=1ODR|=1


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3