通过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灯轮流闪烁的实验操作相关推荐

  1. STM32F103C8T6控制LED灯轮流闪烁

    目录 一.实验原理 1.STM32F103C8T6单片机简介 2.地址映射和寄存器映射原理 3.GPIO端口初始化设置 (1)时钟配置 (2)输入与输出设置 输入模式 输出模式 (3)最大速率设置 ( ...

  2. 【开源硬件篇】STM32F103C8T6核心板

    STM32F103C8T6核心板 文章目录 STM32F103C8T6核心板 一.STM32F103C8T6芯片 1.1 STM32F103C8T6简介 1.2 芯片引脚说明 二.去耦电路 2.1 原 ...

  3. 嵌入式系统实验——【玄武F103开发板】按key1熄灭两个LED灯、松开恢复点亮

    这里写目录标题 一.任务目标 (一)分析 二.设计思路 (一)开启`KEY1`对应的`GPIOx`时钟 1.找到`KEY1(PE3)`所在的`GPIOx`端口 2.开启`GPIOE`端口时钟 3.清空 ...

  4. 备战全国电子设计大赛-自制STM32F103C8T6核心板

    市场上的STM32开发板,最小系统核心板种类很多,价格十几到几百不等.喜欢DIY的同学,不妨自己DIY一块低成本的.能够满足入门要求的,适合用于自制的小项目的STM32核心板. 选择的STM32芯片是 ...

  5. ARM裸机开发——Linux环境搭建和LED灯闪烁实验

    写在前面  本文为学校开展的嵌入式系统设计课程,本文主要是记录课程中的相关作业与学习记录,本课程采用了S3C2440A嵌入式系统开发板,由于主要以学校开展课程为主,本文内容可能有一定的课程资料辅助以及 ...

  6. linux 心跳灯_Linux下点亮第一个LED灯

    第一步:  在window下编写汇编代码,点亮第一颗led灯: .text .global _start _start: /* * */ /*设置GPF4 输出*/ ldr r1, =0x560000 ...

  7. STM32上手-STWingSKIT_BC28学习笔记(一)环境搭建和LED灯点亮

    嵌入式STM32上手学习笔记(一)LED灯点亮 STM32开发环境的搭建 1. 安装keil5 IDE 2. 下载STM32F1的支持包 3. 在Pack installer中找到F1支持包下载 4. ...

  8. Linux下LED设备驱动开发(LED灯实现闪烁)

    文章目录 一.配置连接说明 二.更新设备树 (1)将led灯引脚添加到pinctrl子系统 (2)设备树中添加LDE灯的设备树节点 (3)编译更新设备树 三.驱动开发与测试 (1)编写设备驱动代码 ( ...

  9. mini2440开发板学习裸机开发——day1 裸机运行LED灯程序

    开发背景:系统:ubuntu18.04系统 开发板:mini2440 串口连接工具 J-link连接工具 工具:secureCRT J-link 本次学习基于韦东山老师的嵌入式linux应用开发手册书 ...

最新文章

  1. SQL Server 事务、异常和游标
  2. ps怎么制作流体_PS实例教程:制作流体质感背景
  3. delphi 中怎么知道某一个月有多少天
  4. mysql bin日志备份_mysql之binlog日志备份还原
  5. unity中怎么做河流_【干货】工作中怎么做工业设计的?(一)
  6. java中与接口类,Java中类与类、类与接口、接口与接口的关系
  7. 你们的前端是怎么入门的?(并且找到工作)?
  8. 数据中心机房建设项目技术方案
  9. gis核密度分析工具_Arcgis软件支持下的核密度估计
  10. 【期末大作业】简单的学生网页作业源码 基于html css javascript南京大学网页校园教育网站html模板(3页)
  11. WPF流程图制作系列相关基础一
  12. ubuntu 16.04 gtx1060 显卡安装
  13. 最极致Windows仿Mac2.0【win11可用】——30分钟完成(W001)
  14. Win10系统程序以管理员身份开机自启动配置
  15. KindEditor编辑器上传图片超过限制
  16. 列表页面的展开以及收起
  17. PJzhang:关闭wps小广告和快速关闭445端口
  18. 2015最新经典语句搞笑段子
  19. L1-068 调和平均 (10 分)
  20. bash: vagrant_重新引入Vagrant:从PHP开始的正确方法

热门文章

  1. 一文弄懂Hive中谓词下推(on与where的区别)
  2. Wireshark学习十:应用Wireshark显示过滤器分析特定数据流(下)
  3. 数据基础设施加速数字经济,“河图”引擎推进鲲鹏计算产业
  4. mac怎么设置桌面提醒|mac系统提醒事项设置闹钟方法
  5. halcon介绍以及与opencv比较
  6. ​手机微信可以批量删除好友了!(文末送书)
  7. 笨办法学Python(二十)
  8. 图文手把手教程--ESP32 MQTT连接阿里云生活物联网平台
  9. 电脑资料打印怎么操作打印步骤
  10. EXCEL中使用index+match函数进行查找匹配