STM32实现LED流水灯
文章目录
- 一、实验原理
- 1、STM32F103C8T6简介
- 2、地址映射
- 3、寄存器映射
- 4、GPIO端口初始化设置
- 1.时钟配置
- 2.输入输出模式和输出速率设置
- 二、C语言实现LED流水灯
- 1.流水灯原理
- 2.前期准备
- 3.C语言实现
- 4.烧录程序
- 三、效果
- 四、总结
- 五、参考资料
一、实验原理
1、STM32F103C8T6简介
STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。
2、地址映射
1.M3存储器映射
LED灯程序中,宏定义:
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define PERIPH_BASE ((uint32_t)0x40000000)
注:PERIPH_BASE 外设基地址:因为stm32是32位的,宏展开为0x40000000并转化为 uint32_t
APB2PERIPH_BASE 总线基地址:宏展开为PERIPH_BASE加上偏移地址 0x10000
2.寄存器寻址
GPIOB基址:
GPIOB相关的寄存器,都住在0x4001 0C00到0x4001 0FFF范围内。
端口输入寄存器地址偏移:
存储数据的位置:0X40010C00+0X0x =
地址为: GPIOC_BASE +0x0x
数据
3.地址映射
GPIO_TypeDef * GPIOx; //定义一个 GPIO_TypeDef 型结构体指针 GPIOx
GPIOx = GPIOA; //把指针地址设置为宏 GPIOA 地址
GPIOx->CRL = 0xffffffff; //通过指针访问并修改 GPIOA_CRL 寄存器
3、寄存器映射
给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫寄存器映射。
会有GPIOA->CRL=0x0000 0000这种写法,表示将16进制数0赋值给GPIOA的CRL寄存器所在的存储单元
#define PERIPH_BASE ((uint32_t)0x40000000)
1.这里属于存储器级别的映射,将外设基地址映射到0x40000000,可对应图2
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
2.这里对外设基地址进行偏移量为0x10000的地址偏移,偏移到APB2总线对应外设区。
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
3.这里对APB2外设基地址进行偏移量为0x0800的地址偏移,偏移到GPIOA对应区域。
4、GPIO端口初始化设置
1.时钟配置
本次实验采用GPIOA、B、C三个端口。该三个端口都属于APB2总线
1.找到时钟使能寄存器映射基地址
2.找到端口偏移地址以及对应端口所在位置
3.使能对应端口时钟
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能
2.输入输出模式和输出速率设置
本次实验采用通用推挽输出模式,最高输出时钟频率2Mhz。分别用到A4、B5、C14三个引脚。其中A4、B5属于端口配置低寄存器偏移地址为0x00,C13属于端口配置高寄存器偏移地址为0x04。
1.找到GPIOx端口基地址
2.配置对应引脚寄存器,基地址+偏移量
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
3.设置输出模式为推挽输出,输出速度为2Mhz
GPIOA_CRL&=0xFFF0FFFF; //设置位 清零 GPIOA_CRL|=0x00020000; //PA4推挽输出,把第19、18、17、16位变为0010GPIOB_CRL&=0xFF0FFFFF; //设置位 清零 GPIOB_CRL|=0x00200000; //PB5推挽输出,把第23、22、21、20变为0010GPIOC_CRH&=0xFF0FFFFF; //设置位 清零 GPIOC_CRH|=0x00200000; //PC14推挽输出,把第23、22、21、20变为0010
二、C语言实现LED流水灯
1.流水灯原理
本次实验采用三个灯实现,亮灯状态用1表示,灭灯状态用0表示。
初始状态为0 0 0,
状态一为1 0 0
状态二为0 1 0
状态三为0 0 1
状态三结束后继续进入状态一,一直循环达到流水灯效果。
2.前期准备
1.创建项目
2.选择STM32F103C8开发板
注:创建项目出现弹窗,不勾选setup项,只勾选core项
3.在output里选择create hex file
添加驱动文件
拷贝到工程目录下
右击文件夹,选择Add Existing Files to Group Source Group 1
选择All FIles,选择刚刚添加的启动文件,Add,Add之后Close
4.线路连接
对于USB转TTL模块和stm32f103c8t6连接
3.C语言实现
代码如下
#include "stm32f10x.h"
//----------------APB2使能时钟寄存器 ---------------------
#define RCC_APB2ENR *((unsigned volatile int*)0x40021018)
//----------------GPIOA配置寄存器 -----------------------
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
#define GPIOA_ODR *((unsigned volatile int*)0x4001080C)
//----------------GPIOB配置寄存器 -----------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C)
//----------------GPIOC配置寄存器 -----------------------
#define GPIOC_CRH *((unsigned volatile int*)0x40011004)
#define GPIOC_ODR *((unsigned volatile int*)0x4001100C)//延时函数void Delay(){u32 i=0;for(;i<5000000;i++);}int main(void){ RCC_APB2ENR|=1<<2|1<<3|1<<4; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能 GPIOA_CRL&=0xFFF0FFFF; //设置位 清零 GPIOA_CRL|=0x00020000; //PB5推挽输出GPIOA_ODR&=~(1<<4); //设置初始灯为灭GPIOB_CRL&=0xFF0FFFFF; //设置位 清零 GPIOB_CRL|=0x00200000; //PB5推挽输出GPIOB_ODR&=~(1<<5); //设置初始灯为灭GPIOC_CRH&=0xF0FFFFFF; //设置位 清零 GPIOC_CRH|=0x02000000; //PB5推挽输出GPIOC_ODR&=~(1<<14); //设置初始灯为灭 while(1){//A灯GPIOA_ODR|=1<<4; //PB5高电平Delay();GPIOA_ODR&=~(1<<4); //PB5低电平,因为是置0,所以用按位与//B灯GPIOB_ODR|=1<<5; //PB5高电平Delay();GPIOB_ODR&=~(1<<5); //PB5低电平,因为是置0,所以用按位与//C灯GPIOC_ODR|=1<<14; //PB5高电平Delay();GPIOC_ODR&=~(1<<14); //PB5低电平,因为是置0,所以用按位与}
}
4.烧录程序
生成hex文件
使用驱动进行烧录操作
连接到电脑,打开mcuisp,上传HEX文件到stm32f103c8t6上:
三、效果
四、总结
通过本次实验,我学会了了如何对GPIO进行初始化(时钟配置、输入输出模式设置、最大速率设置),同时也学习和理解了STM32F103系列芯片的地址映射和寄存器映射原理。
五、参考资料
stm32寄存器实现流水灯
stm32寄存器实现流水灯
STM32寄存器的简介、地址查找,与直接操作寄存器
STM32从地址到寄存器
STM32实现LED流水灯相关推荐
- STM32应用开发实践教程:可控 LED 流水灯的设计与实现
任务 2.1 LED 流水灯的应用开发 2.1.1 任务分析 本任务要求设计一个 LED 流水灯系统,具体要求如下. 系统通电时,两个 LED 以 2s 为周期(亮 1s,灭 1s)交替闪烁,并逐渐缩 ...
- 基于Proteus无实物STM32入门自学教程(二)--LED流水灯
本教程面向新手,前期没有用到stm32的内部库,源程序尽量使用单文件.方便从51直接转过来的同学有个适应期.proteus仿真stm32总所周知没有51仿真的那么完美.笔者在51年代进行仿真时基本与实 ...
- 4、Proteus仿真STM32串口通信,发送数据控制LED流水灯的启动和停止
一.实验说明 本次实验建立在第三个实验基础上,稍加修改,通过串口调试助手发送数据到Proteus来实现对流水灯的启动和停止,所以实验采用2个通信串口,实验原理非常简单,只要熟悉第三次实验的过程,就非常 ...
- 基于STM32安装Stm32CubeMX,配合Keil完成LED流水灯和USART串口通讯程序,及其管脚的时序波形观察
目录 一.使用HAL库完成LED流水灯 (一).用STM32CUBEMX生成工程文件 (二).用Keil仿真调试并生成hex文件 (三).用STM32串口烧录程序 (四).实物连接 二.使用HAL库完 ...
- STM32:制作LED流水灯
1.系统设计说明 本系统利用Proteus内的STM32F103C4作为微控制器,使用了7个按键和九个LED灯,根据不同按键的触发将会显示出不同颜色的流水灯.每完成一次流水灯循环都会对按键进行一次检测 ...
- STM32Cubemx的安装及用寄存器HAL库完成LED流水灯程序
目录 一.STM32CubeMx安装 (一)简介 (二)下载地址 1.官方下载地址 2.网盘下载地址 二.STM32CubeMX安装过程 三.HAL库安装 四.HAL库实现LED流水灯 (一)新建项目 ...
- STM32F103C8T6以寄存器方式借助面包板搭建电路点亮LED流水灯详解
文章目录 一.寄存器原理 1.什么是寄存器 2.如何访问寄存器 二.GPIO端口的初始化设置 1.时钟配置 (1)找到时钟使能寄存器映射基地址 (2)找到端口偏移地址以及对应端口所在位置 (3)使能对 ...
- FPGA第一天的学习-LED流水灯
FPGA第一天的学习-LED流水灯 每一次玩一块新的开发板我们都会首先做出一个流水灯,所以我也做出一个流水灯并且结合网上教程和自己的理解来试着将代码理解得更透彻. 1.硬件部分 由原理图我们可以知道时 ...
- 【嵌入式04】用寄存器HAL库完成LED流水灯程序
目录 一.原理学习 1.寄存器映射原理 2.GPIO端口的初始化设置步骤 二.LED流水灯 1.程序设计思路 2.寄存器方式编程实现 3.HAL库编程实现 4.软件仿真 三.总结 四.参考链接 一.原 ...
最新文章
- 2021年大数据ELK(四):Lucene的美文搜索案例
- 国务院学位委员会关于授予具有研究生毕业同等学力人员硕士、博士学位的规定
- elasticsearch 6.6 安装(CentOS 7.5) 修订
- python的replace第i个位置_《原神》第80个绯红玉髓位置一览 第80个绯红玉髓如何获取...
- CodeForces - 434D Nanami's Power Plant
- LeetCode 2086. 从房屋收集雨水需要的最少水桶数(贪心)
- 矩形法_教程 | 三个案例教会你大师都爱用的矩形造字法!
- 三星Galaxy S20系列机模上手视频曝光:不再单独设置Bixby按键
- 依赖dll_DLL攻击漫谈
- 江西直播源PHP代理,直播源更新平台
- 复旦退休教授直播间吸烟被举报:此前因违规吸烟被学校要求做检讨
- 国内超强JS框架正在开源免费申请中
- linux远程主机拒绝连接,linux – Telnet [无法连接到远程主机:拒绝连接]
- [02]Hello World!
- Unity烘焙基础操作
- mysql slave running_MySQL主从复制出现Slave_IO_Running,Slave_SQL_Running解决方法
- JSON实例类 key可带中文
- 【ROS】Ubuntu18.04 + ROS操作系统安装
- 黄杏元《地理信息系统概论》考研复习考点精讲(七)
- xp和Ubantu双系统删掉Ubantu (mbrfix工具)