STM32F103C8T6核心板控制器下,通过电路搭建实现LED灯轮流闪烁的实验操作
通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,控制LED灯实现轮流闪烁
文章目录
- 通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,控制LED灯实现轮流闪烁
- 前言
- 一、准备工作
- 1.题目要求
- 2.什么是STM32芯片?
- 3.GPIOx端口的各寄存器地址和详细参数
- 3.1 GPIO的配置寄存器CRL和CRH
- 3.2 工作模式的配置
- 4.GPIO端口初始化设置及输入输出模式
- 二、实验步骤
- 1.工程文件的创建
- 2.启动代码
- 2.1 启动代码介绍
- 2.2 添加启动代码
- 3.功能分析
- 4.代码编写
- 三、工程调试编译及问题解决
- 1.工程调试编译
- 2.调试问题
- 3.解决办法
- 总结
前言
51单片机的点灯
是通过控制寄存器将片外引脚(IO口
)拉低拉高,输出高低电平,以控制LED亮灭:
其过程:单片机给指令->控制寄存器->给IO口电平->控制LED亮灭stm32的点灯
则是通过使能外设GPIO时钟
,发出指令给外设GPIO,外设GPIO收到指令后,着手配置自己的寄存器,然后给IO口模式,让其实现各种功能:
其过程:CPU给指令->GPIO收到指令->配置内部寄存器->配置IO口模式(注意是模式)->控制LED亮灭
一、准备工作
1.题目要求
- 假设你手中已有 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED,并搭建了电路,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒:
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数
2)用C语言 寄存器方式编程实现
2.什么是STM32芯片?
- STM32,从字面上来理解,ST 是意法半导体,M 是 Microelectronics 的缩写,32 表示32 位,合起来理解,STM32 就是指 ST 公司开发的
32 位微控制
器 - STM32 属于一个微控制器,自带了各种常用通信接口,比如 USART、I2C、SPI 等,可连接非常多的传感器,可以控制很多的设备。现实生活中,我们接触到的很多电器产品都有 STM32 的身影,比如智能手环,微型四轴飞行器,平衡车、移动 POST 机,智能电饭锅,3D 打印机等等
- STM32 有很多系列,可以满足市场的各种需求,从内核上分有 Cortex-M0、M3、M4和 M7 这几种,每个内核又大致分为主流、高性能和低功耗
- 单纯从学习的角度出发,可以选择 F1和 F4,F1代表了基础型,基于 Cortex-M3内核,主频为 72MHZ,F4 代表了高性能,基于 Cortex-M4 内核,主频 180M
- 本文则选择的F1下的
STM32F103C8T6
3.GPIOx端口的各寄存器地址和详细参数
- 首先需要知道的是,STM32中对于GPIO口的操作,无非就是操作下面的寄存器而已,所谓的标准库也好,HAL库也好,它们都只是对操作寄存器的过程进行了封装,目的是为了减轻编程时的工作负担:
两个32位的配置寄存器:GPIOx_CRL、GPIOx_CRH两个32位数据寄存器:GPIOx_IDR、GPIOx_ODR一个32位的置位/复位寄存器:GPIOx_BSRR一个16位复位寄存器:GPIOx_BRR一个32位锁定寄存器:GPIOx_LCKR
- GPIO地址:
- 时钟地址:
3.1 GPIO的配置寄存器CRL和CRH
- STM32的一组GPIO有16个IO口,比如GPIOA这一组,有GPIOA0~GPIOA15一共16个IO口。每一个IO口需要
寄存器的4位
用来配置工作模式 - 那么一组GPIO就需要16x4=64位的寄存器来存放这一组GPIO的工作模式的配置,但STM32的寄存器都是32位的,所以只能使用2个32位的寄存器来存放了。
CRL
用来存放低八位的IO口
(GPIOx0—GPIOx7)的配置,CRH
用来存放高八位的IO口
(GPIOx8—GPIOx15)的配置 - 这两个寄存器的全称是:端口配置低寄存器(GPIOx_CRL) (x=A…E) 和 端口配置高寄存器(GPIOx_CRH) (x=A…E)
- 也就是每一组GPIO都有两个32位的寄存器是用来配置IO口的工作模式的。
- 我们都清楚STM32的GPIO有
八种工作模式
,4个二进制数可以组合出16种情况,而我们只需要8种就行了
例1:配置GPIOA0,使用GPIOA和CRL
例2:配置GPIOB12,代码如下:使用GPIOB和CRH
3.2 工作模式的配置
- 可以看出,4位中又分为了CNFx和MODEx(x表示这组GPIO的第几个IO口)
- CNFx:
在输入模式(MODE[1:0]=00):
00:模拟输入模式
01:浮空输入模式(复位后的状态)
10:上拉/下拉输入模式
11:保留
在输出模式(MODE[1:0]>00):
00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式
- MODEx:
00:输入模式(复位后的状态)
01:输出模式,最大速度10MHz
10:输出模式,最大速度2MHz
11:输出模式,最大速度50MHz
例:将GPIOB9配置成推挽输出模式,且最大速度为2MHz
首先,其为GPIOB9端口,其属于端口配置高寄存器模块,则由图8.2.2可知,CNF9和MODE9位为0,其余位为F,即:GPIOB_CRH&=0xFFFFFF0F;又因其为推挽输出模式,且最大速度为2MHz,所以4位寄存器的配置就是CNF9【00】MODE9【10】,0010换成十进制数就是2,即:GPIOB_CRH|=0x00000020
4.GPIO端口初始化设置及输入输出模式
- 这部分内容可以参考本人前一篇博客进行学习:
https://blog.csdn.net/qq_53112972/article/details/127137358
二、实验步骤
1.工程文件的创建
- 新建
Text1文件夹
—> 点击Project
下的New uVision Project
—> 输入文件名Text1
- 因本次实验采用C8T6板,所以选择
STM32F103C8
:
- 在界面左侧的Project栏,打开Target1,鼠标右键单击Source Group1, 选择
Add New Item to Group…
- 添加.c文件:
2.启动代码
2.1 启动代码介绍
启动代码是一段和硬件相关的汇编代码
主要作用
如下:
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
作为启动文件
2.2 添加启动代码
- STM32F103C8T6核心板启动文件下载链接:
链接:https://pan.baidu.com/s/1Elgc4nvxXjiHLSZ2nXnSCQ
提取码:bmba
- 下载安装包并解压:
- 将启动文件拷贝到Text1工程文件夹下:
- 回到Keil,展开Target1→双击Source Group1→设置打开文件类型为 Asm Source file→选择 startup_stm32f10x_md.s→点击 Add:
- 点击魔法棒设置生成HEX文件(后面烧录需要!):
3.功能分析
- 根据题目要求,使用
GPIOA-5、GPIOB-9、GPIOC-14
这3个引脚来控制LED灯,在查询C8T6数据手册后,管脚分别连接红绿蓝三种颜色的LED灯 - 目标是把 GPIO 的引脚设置成推挽输出模式并且默认下拉,输出低电平,这样就能让 LED 灯亮起来
4.代码编写
- 代码:
//--------------APB2使能时钟寄存器------------------------
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018)//----------------GPIOA配置寄存器 ------------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRH *((unsigned volatile int*)0x40010C04)
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 ------------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C)
//-------------------简单的延时函数-----------------------
void SystemInit(void);
void Delay_ms(volatile unsigned int);
void A_LED_LIGHT(void);
void B_LED_LIGHT(void);
void C_LED_LIGHT(void);
void Delay_ms( volatile unsigned int t)
{unsigned int i;while(t--)for (i=0;i<800;i++);
}
void A_LED_LIGHT(){GPIOA_ODR=0x0<<5; //PA5低电平GPIOB_ODR=0x1<<9; //PB9高电平GPIOC_ODR=0x1<<14; //PC14高电平
}
void B_LED_LIGHT(){GPIOA_ODR=0x1<<5; //PA5高电平GPIOB_ODR=0x0<<9; //PB9低电平GPIOC_ODR=0x1<<14; //PC14高电平
}
void C_LED_LIGHT(){GPIOA_ODR=0x1<<5; //PA5高电平GPIOB_ODR=0x1<<9; //PB9高电平GPIOC_ODR=0x0<<14; //PC14低电平
}
//------------------------主函数--------------------------
int main()
{int j=100;RCC_APB2ENR|=1<<2; //APB2-GPIOA外设时钟使能RCC_APB2ENR|=1<<3; //APB2-GPIOB外设时钟使能 RCC_APB2ENR|=1<<4; //APB2-GPIOC外设时钟使能//这两行代码可以合为 RCC_APB2ENR|=1<<3|1<<4;GPIOA_CRL&=0xFF0FFFFF; //设置位 清零 GPIOA_CRL|=0X00200000; //PA5推挽输出GPIOA_ODR|=1<<5; //设置PA5初始灯为灭GPIOB_CRH&=0xFFFFFF0F; //设置位 清零 GPIOB_CRH|=0x00000020; //PB9推挽输出GPIOB_ODR|=0x1<<9; //设置初始灯为灭GPIOC_CRH&=0xF0FFFFFF; //设置位 清零GPIOC_CRH|=0x02000000; //PC14推挽输出GPIOC_ODR|=0x1<<14; //设置初始灯为灭 while(j){ A_LED_LIGHT(); Delay_ms(1000000);B_LED_LIGHT();Delay_ms(1000000);C_LED_LIGHT();Delay_ms(1000000);}
}
void SystemInit(){}
三、工程调试编译及问题解决
1.工程调试编译
- 写入.c工程文件中,build生成hex文件:
2.调试问题
- 当我们进行调试时,会出现下面的问题:
3.解决办法
1、首先点击“魔法棒”:
2、电脑没有连接设备,所以勾选Use Simulator:
3、在Utilities中取消勾选Use Debug Driver,点击Settings:
4、勾选Reset and Run,点击OK:
5、成功调试:
总结
本次在STM32F103C8T6核心板控制器下,通过电路搭建实现LED灯轮流闪烁的实验是嵌入式系统开发中较为基础的东西;通过本次实验进一步加深了对GPIO寄存器的认识与运用。
同时也期待大家能够积极留言,指出我存在的问题,谢谢!
参考文献:
https://blog.csdn.net/qq_61682562/article/details/120835573
https://blog.csdn.net/qq_45697316/article/details/123109859
STM32F103C8T6核心板控制器下,通过电路搭建实现LED灯轮流闪烁的实验操作相关推荐
- STM32F103C8T6控制LED灯轮流闪烁
目录 一.实验原理 1.STM32F103C8T6单片机简介 2.地址映射和寄存器映射原理 3.GPIO端口初始化设置 (1)时钟配置 (2)输入与输出设置 输入模式 输出模式 (3)最大速率设置 ( ...
- 【开源硬件篇】STM32F103C8T6核心板
STM32F103C8T6核心板 文章目录 STM32F103C8T6核心板 一.STM32F103C8T6芯片 1.1 STM32F103C8T6简介 1.2 芯片引脚说明 二.去耦电路 2.1 原 ...
- 嵌入式系统实验——【玄武F103开发板】按key1熄灭两个LED灯、松开恢复点亮
这里写目录标题 一.任务目标 (一)分析 二.设计思路 (一)开启`KEY1`对应的`GPIOx`时钟 1.找到`KEY1(PE3)`所在的`GPIOx`端口 2.开启`GPIOE`端口时钟 3.清空 ...
- 备战全国电子设计大赛-自制STM32F103C8T6核心板
市场上的STM32开发板,最小系统核心板种类很多,价格十几到几百不等.喜欢DIY的同学,不妨自己DIY一块低成本的.能够满足入门要求的,适合用于自制的小项目的STM32核心板. 选择的STM32芯片是 ...
- ARM裸机开发——Linux环境搭建和LED灯闪烁实验
写在前面 本文为学校开展的嵌入式系统设计课程,本文主要是记录课程中的相关作业与学习记录,本课程采用了S3C2440A嵌入式系统开发板,由于主要以学校开展课程为主,本文内容可能有一定的课程资料辅助以及 ...
- linux 心跳灯_Linux下点亮第一个LED灯
第一步: 在window下编写汇编代码,点亮第一颗led灯: .text .global _start _start: /* * */ /*设置GPF4 输出*/ ldr r1, =0x560000 ...
- STM32上手-STWingSKIT_BC28学习笔记(一)环境搭建和LED灯点亮
嵌入式STM32上手学习笔记(一)LED灯点亮 STM32开发环境的搭建 1. 安装keil5 IDE 2. 下载STM32F1的支持包 3. 在Pack installer中找到F1支持包下载 4. ...
- Linux下LED设备驱动开发(LED灯实现闪烁)
文章目录 一.配置连接说明 二.更新设备树 (1)将led灯引脚添加到pinctrl子系统 (2)设备树中添加LDE灯的设备树节点 (3)编译更新设备树 三.驱动开发与测试 (1)编写设备驱动代码 ( ...
- mini2440开发板学习裸机开发——day1 裸机运行LED灯程序
开发背景:系统:ubuntu18.04系统 开发板:mini2440 串口连接工具 J-link连接工具 工具:secureCRT J-link 本次学习基于韦东山老师的嵌入式linux应用开发手册书 ...
最新文章
- SQL Server 事务、异常和游标
- ps怎么制作流体_PS实例教程:制作流体质感背景
- delphi 中怎么知道某一个月有多少天
- mysql bin日志备份_mysql之binlog日志备份还原
- unity中怎么做河流_【干货】工作中怎么做工业设计的?(一)
- java中与接口类,Java中类与类、类与接口、接口与接口的关系
- 你们的前端是怎么入门的?(并且找到工作)?
- 数据中心机房建设项目技术方案
- gis核密度分析工具_Arcgis软件支持下的核密度估计
- 【期末大作业】简单的学生网页作业源码 基于html css javascript南京大学网页校园教育网站html模板(3页)
- WPF流程图制作系列相关基础一
- ubuntu 16.04 gtx1060 显卡安装
- 最极致Windows仿Mac2.0【win11可用】——30分钟完成(W001)
- Win10系统程序以管理员身份开机自启动配置
- KindEditor编辑器上传图片超过限制
- 列表页面的展开以及收起
- PJzhang:关闭wps小广告和快速关闭445端口
- 2015最新经典语句搞笑段子
- L1-068 调和平均 (10 分)
- bash: vagrant_重新引入Vagrant:从PHP开始的正确方法
热门文章
- 一文弄懂Hive中谓词下推(on与where的区别)
- Wireshark学习十:应用Wireshark显示过滤器分析特定数据流(下)
- 数据基础设施加速数字经济,“河图”引擎推进鲲鹏计算产业
- mac怎么设置桌面提醒|mac系统提醒事项设置闹钟方法
- halcon介绍以及与opencv比较
- ​手机微信可以批量删除好友了!(文末送书)
- 笨办法学Python(二十)
- 图文手把手教程--ESP32 MQTT连接阿里云生活物联网平台
- 电脑资料打印怎么操作打印步骤
- EXCEL中使用index+match函数进行查找匹配