目录

  • 一、实验原理
    • 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灯轮流闪烁相关推荐

  1. STM32F103C8T6核心板控制器下,通过电路搭建实现LED灯轮流闪烁的实验操作

    通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,控制LED灯实现轮流闪烁 文章目录 通过STM32F103C8T6+面板板+3只红绿蓝LED,搭建了电路,控制LED灯实现轮流闪烁 ...

  2. ZYNQ FPGA控制LED灯不闪烁

    1.1 ZYNQ FPGA控制LED灯不闪烁 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)ZYNQ FPGA控制LED灯不闪烁: 5)结束语. 1.1.2 本节引言 ...

  3. cc2530 定时器控制LED灯以不同的频率闪烁

    1.cc2530有两个LED灯: 定时器有4种工作方式; 可通过定时器 T1 以及 定时器 T3同时来分别控制LED灯的闪烁,我们让定时器1处于8分频的自由模式下,T1 为16位的计数器,计数器每8/ ...

  4. [RPi]树莓派GPIO入门之控制LED灯

    本文部分资料及图片来自网络 一.所需材料 树莓派4B.LED灯.面包板.杜邦线.电阻.Python程序 二.认识硬件材料 这里介绍下LED灯.面包板.杜邦线.电阻 LED灯:LED灯引脚长的一端为正极 ...

  5. stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭

    stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...

  6. 单片机IO口应用-独立按键控制LED以及控制LED灯闪烁

    目录 P1=0xdf: sbit LED=P1^5; 输出控制 P1并行口第5位引脚IO置为1 P1并行口第5位引脚IO置为0 输入检测 延时函数 控制LED灯闪烁 方法一 方法二 方法三 P1=0x ...

  7. c语言程序小灯从右向左闪烁,单片机控制LED灯点亮(C语言).PPT

    <单片机控制LED灯点亮(C语言).PPT>由会员分享,可在线阅读,更多相关<单片机控制LED灯点亮(C语言).PPT(45页珍藏版)>请在人人文库网上搜索. 1.1,单片机控 ...

  8. STM32定时器控制LED灯闪烁及PWM练习

    一.STM32定时器控制LED灯闪烁 1.相关配置 1)配置RCC和SYS 2)配置IO 配置PC15,并命名为D1. 3)配置定时器 选定时器2,配置Clock Source为Internal Cl ...

  9. 控制三色LED灯的闪烁——Arduino

    最近要弄下Arduino.动过手,知道问题,细节可能在哪. 知识点我不清楚,直接看程序.直接控制也相对简单. 程序 /*实战案例1:控制三色LED灯的闪烁2019/3/12 */ int redpin ...

最新文章

  1. 2019年春季学期第七周作业
  2. alibaba cloud is expensive
  3. 使用 .NET Core模板引擎创建自定义的模板和项目
  4. python车牌识别系统开源代码_天津谁做车牌识别系统供应商,伸缩栅栏门_郑州荣锋科技有限公司...
  5. 她穿着由自己17封拒稿信做成的裙子,通过了博士论文答辩!
  6. 提出建议Do you want to..._44
  7. PyTorch 1.0 中文文档:torch.distributed
  8. 土壤有机质空间分布数据
  9. 暴力裁员绝症员工,网易刚刚道歉!丁磊沉默,刘强东意外刷屏:说了这句硬气的话……
  10. 激光清洗的优点和实际案例
  11. java对网络图片进行签名
  12. HARK学习(八)--LoadSourceLocation
  13. Qt 免注册版本下载
  14. 有关计算机的介绍英语,与计算机有关的英语(国外英文资料).doc
  15. 在【此电脑】隐藏【设备和驱动器】中不需要的图标
  16. 变频电源是否要加功率补偿器?为什么?
  17. 磁场传感器(指北针)
  18. 【笔记/后端】谷粒商城基础篇
  19. 怎样让windows xp自动登录
  20. 新年寄语 给自己吧

热门文章

  1. 显卡的性能看哪些参数?
  2. 软件工程_东师站_总结
  3. 探索设计模式之六——单例模式
  4. 记录下公司刻录新版本/repo_kitkat 命令
  5. RDF 1.1 N-Triples
  6. linux如何卸载lightdm,在Linux Deepin上安装Pantheon Lightdm主题
  7. IT开发工程师的五个等级,你现在几级?
  8. Python 3 《dictionary》入门练习
  9. Oracle数据库(三)可插拔数据库使用
  10. 小数,分数,百分数及倍数的怎么表达?怎么读? kira86 于2010-07-07发布 l 已有1958人浏览增大字体 减小字体 常态文玩 数百名外教任意选,每天陪你练口语 一个积分学英语,您的账户