STM32F103C8T6控制LED灯轮流闪烁
目录
- 一、实验原理
- 1、STM32F103C8T6单片机简介
- 2、地址映射和寄存器映射原理
- 3、GPIO端口初始化设置
- (1)时钟配置
- (2)输入与输出设置
- 输入模式
- 输出模式
- (3)最大速率设置
- (4)GPIO初始化步骤
- 二、程序设计原理
- 三、C语言实现流水灯
- 1、创建项目
- 2、线路连接
- 3、烧录生成hex文件
- 4、结果
一、实验原理
1、STM32F103C8T6单片机简介
STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。除了被我们熟知的STM32,ST公司还有SPC5X系列、STM8系列等,具体参数如下:
2、地址映射和寄存器映射原理
以STM32为例,操作硬件本质上就是操作寄存器。在存储器片上外设区域,四字节为一个单元,每个单元对应不同的功能。当我们控制这些单元时就可以驱动外设工作,我们可以找到每个单元的起始地址,然后通过C 语言指针的操作方式来访问这些单元。但若每次都是通过这种方式访问地址,不好记忆且易出错。这时我们可以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名实质上就是寄存器名字。给已分配好地址(通过存储器映射实现)的有特定功能的内存单元取别名的过程就叫寄存器映射。
3、GPIO端口初始化设置
(1)时钟配置
时钟配置决定了程序执行的速度,给芯片提供一个稳定的执行频率。
PLL的倍频因子:HSE * PLLMUL = 72M Hz
AHB的频率:72M Hz
APB2的频率:72M Hz
APB1的频率:36M Hz
(2)输入与输出设置
输入是进行数据的采集,外部电路通过IO口输入模拟量,然后通过“TTL肖特基触发器”(肖特基触发器是将相对缓慢变化的模拟信号变成矩形信号,便于后面读取),进入输入数据寄存器,最后就能给CPU读取数据。
输出 GPIO的输出与51的 IO口是差不多的概念,都是输出高、低电平来控制外部电路:
处理过程:CPU下达输出高或低电平指令,指令配置“位设置/清除寄存器(GPIOx_BSRR)”(设置就是“1”高电平,清除就是“0”低电平),再由位寄存器配置输出数据寄存器(GPIOx_ODR),经过一个选择器(选择是一般输出还是复用功能输出),然后进行输出控制,控制是什么模式:推挽、开漏或者关闭,然后输出高或低电平到IO口。
输入模式
输入浮空(GPIO_Mode_IN_FLOATING)
输入上拉(GPIO_Mode_IPU)
输入下拉(GPIO_Mode_IPD)
模拟输入(GPIO_Mode_AIN)
输入浮空:浮空就是逻辑器件与引脚即不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚悬空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议悬空,易受干扰。通俗讲就是浮空就是浮在空中,就相当于此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。浮空最大的特点就是电压的不确定性,它可能是0V,页可能是VCC,还可能是介于两者之间的某个值(最有可能) 浮空一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响。
输入上拉:上拉就是把点位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平。电阻同时起到限流的作用。弱强只是上拉电阻的阻值不同,没有什么严格区分。
输入下拉:就是把电压拉低,拉到GND。与上拉原理相似。
模拟输入:模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。
输出模式
开漏输出(GPIO_Mode_Out_OD)
开漏复用功能(GPIO_Mode_AF_OD)
推挽式输出(GPIO_Mode_Out_PP)
推挽式复用功能(GPIO_Mode_AF_PP)
输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般20mA以内)。
开漏复用功能:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。端口必须配置成复用功能输出模式(推挽或开漏)。
推挽式输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三级管分别受到互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形方法任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小,效率高。输出即可以向负载灌电流。推拉式输出级即提高电路的负载能力,又提高开关速度。
推挽式复用功能:可以理解为GPIO口被用作第二功能时的配置情况(并非作为通用IO口使用)
(3)最大速率设置
GPIO的输出速率:GPIO电平每秒切换的最大次数, 单纯GPIO意义不大,不过在通讯方面对于GPIO是有要求的。GPIO口的驱动电路响应速度,不是输出信号的速度。输出信号的速度与程序有关,通过选择速度来选择不同的驱动电路,降低功耗控制噪声。
这个输出速率主要体现I/O驱动电路的输出反应能力,通过选择不同的输出驱动速率,实现最佳的噪声与和功耗控制。不难理解,选择输出驱动速率越高,噪声也越大,相应的芯片功耗也会越大。所以对于这个输出频率的选择,不要太随意,合适就好。在满足应用的需求的前提下,就不要随意往高端速率选择。
当STM32的GPIO端口设置为输出形式时,有三种速度能够挑选:2MHz、10MHz和50MHz,这个速度是指I/O口驱动电路的速度,是用来挑选不同的输出驱动模块,到达最佳的噪声控制和降低功耗的意图。
(4)GPIO初始化步骤
1、使能GPIOx口的时钟
2、指明GPIOx口的哪一位,这一位的速度大小以及模式
3、调用GPIOx初始化函数进行初始化
4、调用GPIO-SetBits函数,进行相应位的置位
二、程序设计原理
1、STM32开发板中包含较多寄存器,实现流水灯操作,需要对相应的引脚进行操作。
(1)配置时钟使能
(2)配置端口配置
(3)配置端口输出寄存器
(4)烧录程序
(5)运行
2、流水灯操作的引脚位于GPIO端口:AHB总线包含RCC时钟控制,GPIO是属于APB2的。需要使用的端口的复位和时间控制受RCC控制。
3、通过寄存器起始地址表,查询RCC地址范围,控制的寄存器位于APB2中。
4、外设时钟使能寄存器,设偏移量为0x18,起始地址0x4002 1000,该寄存器地址为0x4002 1018
5、手册RCC_APB2ENR,位3是IOPBEN,名字是IO端口B时钟使能,就是我们想要的。把RCC_APB2ENR的位3赋值为1,就是开启GPIOB时钟
#define RCC_AP2ENR *((unsigned volatile int*)0x40021018) #时钟使能寄存器
RCC_AP2ENR|=1<<2;
6、端口配置寄存器
我们采用通用推挽输出模式,最高输出时钟频率2Mhz。分别用到A5、B9、C14三个引脚。其中A5属于端口配置低寄存器偏移地址为0x00,B9、C14属于端口配置高寄存器偏移地址为0x04。
7、相应端口配置器GPIOA_CRL地址为GPIOA的基址+上偏移量
设置推挽输出并设置最大速度为2Mhz
#define GPIOA_CRL *((unsigned volatile int*)0x40010800)
GPIOA_CRL=0x20000000; //PA7推挽输出,2Mhz
8、配置端口输出寄存器
点亮LED需要输出低电平,地址的偏移是0x0C,所以这个数据寄存器的地址就是0x4001 0C0C,把第8位写为0就行。默认就是0,高电压赋值为1
9、本次实验采用三个灯实现,亮灯状态用1表示,灭灯状态用0表示。
初始状态为0 0 0,
状态一为1 0 0
状态二为0 1 0
状态三为0 0 1
状态三结束后继续进入状态一,一直循环达到流水灯效果。
三、C语言实现流水灯
1、创建项目
输入代码:
#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_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 Delay(){u32 i=0;for(;i<2000000;i++);}int main(void){ RCC_APB2ENR|=1<<2; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能RCC_APB2ENR|=1<<3; //APB2-GPIOA、GPIOB、GPIOC外设时钟使能RCC_APB2ENR|=1<<4;GPIOA_CRL&=0xFF0FFFFF; //设置位 清零GPIOA_CRL|=0x00300000; //PA5推挽输出,把第23、22、21、20位变为0010GPIOA_ODR |= 1<<5; //设置初始灯为灭GPIOB_CRH&=0xFFFFFF0F; //设置位 清零GPIOB_CRH|=0x00000020; //PB9推挽输出,把第7、6、5、4变为0010GPIOB_ODR |= 1<<9; //设置初始灯为灭GPIOC_CRH&=0xF0FFFFFF; //设置位 清零GPIOC_CRH|=0x02000000; //PC14推挽输出,把第27、26、25、24变为0010GPIOC_ODR |= 1<<14; //设置初始灯为灭while(1){//A灯 //PA5高电平GPIOA_ODR&=~(1<<5); //PA5低电平,因为是置0,所以用按位与Delay();GPIOA_ODR|=1<<5;//B灯 //PB9高电平GPIOB_ODR&=~(1<<9); //PB9低电平,因为是置0,所以用按位与Delay();GPIOB_ODR|=1<<9; //C灯GPIOC_ODR&=~(1<<14); //PC14低电平,因为是置0,所以用按位与Delay();GPIOC_ODR|=1<<14; //PC14高电平}
}
void SystemInit(void){
}
添加驱动文件:
复制到这里来:
然后添加:
2、线路连接
3、烧录生成hex文件
连接到电脑,打开mcuisp,上传HEX文件到stm32f103c8t6上:
4、结果
流水灯
STM32F103C8T6控制LED灯轮流闪烁相关推荐
- STM32F103C8T6核心板控制器下,通过电路搭建实现LED灯轮流闪烁的实验操作
通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,控制LED灯实现轮流闪烁 文章目录 通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,控制LED灯实现轮流闪烁 ...
- ZYNQ FPGA控制LED灯不闪烁
1.1 ZYNQ FPGA控制LED灯不闪烁 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)ZYNQ FPGA控制LED灯不闪烁: 5)结束语. 1.1.2 本节引言 ...
- cc2530 定时器控制LED灯以不同的频率闪烁
1.cc2530有两个LED灯: 定时器有4种工作方式; 可通过定时器 T1 以及 定时器 T3同时来分别控制LED灯的闪烁,我们让定时器1处于8分频的自由模式下,T1 为16位的计数器,计数器每8/ ...
- [RPi]树莓派GPIO入门之控制LED灯
本文部分资料及图片来自网络 一.所需材料 树莓派4B.LED灯.面包板.杜邦线.电阻.Python程序 二.认识硬件材料 这里介绍下LED灯.面包板.杜邦线.电阻 LED灯:LED灯引脚长的一端为正极 ...
- stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭
stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...
- 单片机IO口应用-独立按键控制LED以及控制LED灯闪烁
目录 P1=0xdf: sbit LED=P1^5; 输出控制 P1并行口第5位引脚IO置为1 P1并行口第5位引脚IO置为0 输入检测 延时函数 控制LED灯闪烁 方法一 方法二 方法三 P1=0x ...
- c语言程序小灯从右向左闪烁,单片机控制LED灯点亮(C语言).PPT
<单片机控制LED灯点亮(C语言).PPT>由会员分享,可在线阅读,更多相关<单片机控制LED灯点亮(C语言).PPT(45页珍藏版)>请在人人文库网上搜索. 1.1,单片机控 ...
- STM32定时器控制LED灯闪烁及PWM练习
一.STM32定时器控制LED灯闪烁 1.相关配置 1)配置RCC和SYS 2)配置IO 配置PC15,并命名为D1. 3)配置定时器 选定时器2,配置Clock Source为Internal Cl ...
- 控制三色LED灯的闪烁——Arduino
最近要弄下Arduino.动过手,知道问题,细节可能在哪. 知识点我不清楚,直接看程序.直接控制也相对简单. 程序 /*实战案例1:控制三色LED灯的闪烁2019/3/12 */ int redpin ...
最新文章
- 2019年春季学期第七周作业
- alibaba cloud is expensive
- 使用 .NET Core模板引擎创建自定义的模板和项目
- python车牌识别系统开源代码_天津谁做车牌识别系统供应商,伸缩栅栏门_郑州荣锋科技有限公司...
- 她穿着由自己17封拒稿信做成的裙子,通过了博士论文答辩!
- 提出建议Do you want to..._44
- PyTorch 1.0 中文文档:torch.distributed
- 土壤有机质空间分布数据
- 暴力裁员绝症员工,网易刚刚道歉!丁磊沉默,刘强东意外刷屏:说了这句硬气的话……
- 激光清洗的优点和实际案例
- java对网络图片进行签名
- HARK学习(八)--LoadSourceLocation
- Qt 免注册版本下载
- 有关计算机的介绍英语,与计算机有关的英语(国外英文资料).doc
- 在【此电脑】隐藏【设备和驱动器】中不需要的图标
- 变频电源是否要加功率补偿器?为什么?
- 磁场传感器(指北针)
- 【笔记/后端】谷粒商城基础篇
- 怎样让windows xp自动登录
- 新年寄语 给自己吧
热门文章
- 显卡的性能看哪些参数?
- 软件工程_东师站_总结
- 探索设计模式之六——单例模式
- 记录下公司刻录新版本/repo_kitkat 命令
- RDF 1.1 N-Triples
- linux如何卸载lightdm,在Linux Deepin上安装Pantheon Lightdm主题
- IT开发工程师的五个等级,你现在几级?
- Python 3 《dictionary》入门练习
- Oracle数据库(三)可插拔数据库使用
- 小数,分数,百分数及倍数的怎么表达?怎么读? kira86 于2010-07-07发布 l 已有1958人浏览增大字体 减小字体 常态文玩 数百名外教任意选,每天陪你练口语 一个积分学英语,您的账户