STM32F103VET6流水灯
文章目录
- 一、实验原理
- 1.STM32VET6简介
- 2.地址映射,寄存器映射和GPIO初始化
- 二、实验步骤
- 1.查看原理图
- 2.时钟使能
- 3.LED灯的点亮熄灭
- 4.延时函数
- 三、C语言实现流水灯
- 1.创建项目
- 2.项目配置
- 3.C语言代码编写
- 四、烧录程序
- 五、小结
一、实验原理
1.STM32VET6简介
STM32F103VET6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。
1.型号说明: 该款芯片 为 100引脚 , 512KFlash 64kSRAM LQFP 封装 32位 Cortex内核
2.简要说明:
内核 | Cortex-M3 |
---|---|
Flash | 512K×8bit |
SRAM | 64K×8bit |
GPIO | 80个 |
ADC | 12位 ADC 三路 共有 16个通道 |
CPU | 72MHz |
通讯方式 | 两个SPI,两个I2C,五个USART, 一个USB,一个CAN通信,一个SDIO |
Timer | 4个通用定时器 ,两个高级定时器,两个基本定时器 |
2.地址映射,寄存器映射和GPIO初始化
具体的STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)在下面博客当中都有详细解释:
STM32F103系列芯片的地址映射和寄存器映射原理,GIPO初始化设置
二、实验步骤
1.查看原理图
根据下图我们可以看到STM32F103VET6开发板的外设LED灯是RGB三色灯,LED灯的颜色和亮灭都通过GPIOB端口控制,想要实现流水灯就需要对相应的引脚进行操作,对相应的引脚进行时钟使能配置、端口配置(高or低)寄存器配置、端口输出寄存器配置
2.时钟使能
1.流水灯操作的引脚位于GPIO端口,AHB总线包含RCC时钟控制,GPIO是属于APB2的。需要使用的端口的复位和时间控制受RCC控制
2.寄存器起始地址表,查询RCC地址范围,控制的寄存器位于APB2中
3.外设时钟使能寄存器,通过基址加变址方式进行寻址,设置对应位的电平使GPIOB开启
4.把RCC_APB2ENR的位3赋值为1,就是开启GPIOB时钟,对应代码:
# define RCC_APB2ENR *((unsigned int*)0x40021018)
RCC_APB2ENR |= (1<<3);
3.LED灯的点亮熄灭
根据前面的LED原理图可知PB端口引脚的不同控制着LED的颜色不同,而引脚的高低电平控制等的亮灭,所以可以根据一种颜色的亮灭控制就可以以同样方法控制其它颜色的亮灭
下面以PB_5端口显现LED_R为例
1.配置引脚PB5,使用的寄存器是GPIOB_CRL。下面我们来寻找这个寄存器的地址。配置工作模式
那么需要的寄存器是低位的寄存器GPIOB_CRL,它的地址是0x4001 0c00,端口号为5
找到需要操作的寄存器后,把它配置为通用输出。 我们需要的是输出高低电平,所以要设置为输出。输出模式又有好几种输出:
00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式
由此可得:
// 开启GPIOB 端口时钟RCC_APB2ENR |= (1<<3);//清空控制PB5的端口位GPIOB_CRL &= ~( 0x0F<< (4*5)); // 配置PB5为通用推挽输出,速度为10MGPIOB_CRL |= (1<<4*05);
这样就把对应的IO口输入输出模式调好了
2. 设置输出值
查看GPIO输出文档(GPIOx_ODR)
地址偏移量0x0c,由于低电平有效所以需要将第5位设置成0,其它端口设置成1,可以实现LED的点亮
// PB0 输出 低电平GPIOB_ODR &= ~(1<<5);
所有端口设置成1,可以实现LED的熄灭了
GPIOB_ODR |= 0xFF
4.延时函数
我们知道程序执行指令的速度是很快的,若需要将灯的亮灭以及颜色的切换让人眼可观就需要设置延时函数,延时函数的延时时间跟stm32的晶振频率有关,程序执行指令需要一定时间,以此可以设计一个简单函数:
void Delay_wxc( volatile unsigned int t)
{unsigned int i;while(t--)for (i=0;i<800;i++);
}
当t=1000000时就延时一段时间,该函数延时t较小时不太精确,考虑到本实验对延时精度要求不高,可以采用该延时方法
通过这个延时函数就可以实现亮灭延时,流水灯再在亮灭基础上变化颜色
三、C语言实现流水灯
1.创建项目
创建项目出现弹窗,勾选setup项和core项
2.项目配置
1.在output里选择create hex file
3.C语言代码编写
source group里创建led.c,并写入代码,注意项目结构,使用的引脚是PB0,PB1,PB5
1.首先宏定义对应GPIO各个配置端口,以及时钟RCC配置端口地址指针方便下面调用
#define RCC_APB2ENR *((unsigned int*)0x40021018) //定义时钟使能
#define GPIOB_CRL *((unsigned int*)0x40010C00) //定义GPIOB低位寄存器
#define GPIOB_ODR *((unsigned int*)0x40010C0C) //定义GPIOB输出寄存器
2.时钟使能
RCC_APB2ENR |=(1<<3); //时钟使能
3.配置PB0,1,5引脚模式
GPIOB_CRL |=(1<<(4*0)); //PB0配置成推挽输出
GPIOB_CRL |=(1<<(4*1)); //PB1配置成推挽输出
GPIOB_CRL |=(1<<(4*5)); //PB5配置成推挽输出
4.配合延时函数循环每个颜色灯的亮灭
while(1)
{/*红灯闪烁
*/// PB5 输出 低电平GPIOB_ODR &= ~(1<<5);Delay_wxc(5000000);// PB5 输出低电平GPIOB_ODR |=0xFFFF;Delay_wxc(5000000);
/*绿灯闪烁
*/GPIOB_ODR &= ~(1<<0);Delay_wxc(5000000);GPIOB_ODR |=0xFFFF;Delay_wxc(5000000);/*蓝灯闪烁
*/GPIOB_ODR &= ~(1<<1);Delay_wxc(5000000);GPIOB_ODR |=0xFFFF;Delay_wxc(5000000);
}
整体代码:
#define RCC_APB2ENR *((unsigned int*)0x40021018) //定义时钟使能
#define GPIOB_CRL *((unsigned int*)0x40010C00) //定义GPIOB低位寄存器
#define GPIOB_ODR *((unsigned int*)0x40010C0C) //定义GPIOB输出寄存器void Delay_wxc( volatile unsigned int t)
{unsigned int i;while(t--)for (i=0;i<800;i++);
}int main()
{RCC_APB2ENR |=(1<<3); //时钟使能GPIOB_CRL |=(1<<(4*0)); //PB0配置成推挽输出GPIOB_CRL |=(1<<(4*1)); //PB1配置成推挽输出GPIOB_CRL |=(1<<(4*5)); //PB5配置成推挽输出GPIOB_ODR |=0xFFFF; //输出位全置为1while(1){/*红灯闪烁*/// PB5 输出 低电平GPIOB_ODR &= ~(1<<5);Delay_wxc(5000000);// PB5 输出低电平GPIOB_ODR |=0xFFFF;Delay_wxc(5000000);/*绿灯闪烁*/GPIOB_ODR &= ~(1<<0);Delay_wxc(5000000);GPIOB_ODR |=0xFFFF;Delay_wxc(5000000);/*蓝灯闪烁*/GPIOB_ODR &= ~(1<<1);Delay_wxc(5000000);GPIOB_ODR |=0xFFFF;Delay_wxc(5000000);}}
四、烧录程序
使用驱动进行烧录操作
连接到电脑,打开mcuisp,烧录HEX文件到stm32f103vet6上:
运行结果:
五、小结
GPIO初始化步骤
使能GPIOx口的时钟
指明GPIOx口的哪一位,这一位的速度大小以及模式
调用GPIOx初始化函数进行初始化
调用GPIO-SetBits函数,进行相应位的置位
STM32F103VET6流水灯相关推荐
- 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯
本文主要介绍STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤.利用C语言编程和寄存器点亮流水灯以及stm32CubeMX+Keil使用HAL库点灯 目录 一.STM3 ...
- STM32F103的映射的介绍、GPIO端口初始化设置和点流水灯详细操作
文章目录 一.STM32F103的映射介绍 1.地址映射介绍 2.寄存器映射的介绍 二.GPIO端口的初始化设置 1.GIPO简介 2.时钟配置 3.输入输出模式设置 4.最大速率设置 三.实例--流 ...
- 一步步玩pcDuino3--mmc下的裸机流水灯
第一部分是玩pcduino3下的裸机.这个过程能够让我们更好的理解嵌入式系统,熟悉我们使用的这个平台. 首先介绍下开发环境: 虚拟机:VMware® Workstation 10.0.2 build- ...
- 经典模式流水灯实验的个人总结和思考
问题叙述: 当拨码开关SW3处于OFF时, LED停止不动,只有一个LED处于点亮,并且点亮的LED不会变化:而SW3处于ON状态时,流水灯处于流动状态.导航按键S2被按下后,LED流动方向是从上到下 ...
- 记录使用Spartan-6进行流水灯控制的实验
整个过程我没有记录,因为之前记录过了,都是一样的,这里只是记录了下思路.之前的博文:全过程实现一个最简单的FPGA项目之PWM蜂鸣器控制 这些LED的正极连接510欧姆限流电阻到3.3V电压,负极都连 ...
- 【原创】基于ARM的流水灯仿真示例
本设计使用的仿真工具是Proteus 7.4,IDE是ADS 1.2,芯片是LPC2134 在Proteus中的电路图如下图所示: 本设计使用的是周立功的LPC2131的工程模板.LPC2131的RA ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】【实验一】流水灯模块
实验一:流水灯模块 对于发展商而言,动土仪式无疑是最重要的任务.为此,流水灯实验作为低级建模II的动土仪式再适合不过了.废话少说,我们还是开始实验吧. 图1.1 实验一建模图. 如图1.1 所示,实验 ...
- ISIS 7 Professional仿真——键控流水灯
功能:K1是总开关,当K1首次按下时,流水灯由下往上流动:当K2按下时停止流动,且全部灯灭,当K3按下时使灯由上往下流动,K4则使灯由下往上流动. LED灯循环速度可以调整延时函数的整型调用参数值来改 ...
- 流水灯实例,点亮发光管LED并闪烁(查表操作)
功能:流水灯实例,点亮发光管LED并闪烁
最新文章
- 第十五届全国大学生智能车安徽赛区参赛须知和竞赛日程安排
- Android短信操作(通过内容提供者)
- MySQL_控制台操作_01
- mysql 表与表之间的条件比对_Mysql分库分表面试题(mysql高可用方案解析)
- commit(), commitNow()和commitAllowingStateLoss()
- SQL Plus的使用详解(登录和常用命令)
- 用IDEA进行git版本控制
- docker安装wechat微信、wxwork企业微信脚本整理
- python中output使用_如何在Python中使用subprocess.check_output()?
- RE:Working outside of application context
- 启动计算机按住del不放,电脑开机需要按del进入系统怎么办
- Chrome插件(扩展)开发全攻略(干货)
- 樊登读书分享ppt_樊登读书会
- GEE5:kNDVI植被指数的获取
- DebugView在win7下没有输出内核信息解决办法
- Bigtable: a distributed storage system for structured data论文阅读
- 舅妈的计算机课1-9,山东省济南市历下区2017届九年级教学三模语文试题(word版含答案)...
- 手机中必备的黑科技App,个个好用至极,现在的你一定需要 1
- Java实现 LeetCode 502 IPO(LeetCode:我疯起来连自己都卖)
- CANopen2.0-SYNC