STM32F103的流水灯点亮版本1

题一: 了解STM32最小系统核心板(STM32F103C8T6,国际上又统称 STM32 Blue Bill开发板)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。

一、在keil 5中生成hex文件
1、新建keil工程
2、新建程序文件
3、关联工程和文件
4、编译程序
二、在Proteus8.9中新建工程
三、连接实验原理图
四、流水灯仿真测试实验要求8个led灯依次闪烁,然后8个灯同时闪烁8次,依次重复。
一、在keil 5中生成hex文件
1、新建keil工程
(1)打开keil5软件,新建工程
请添加图片描述

(2)选择保存路径并给工程命名,点击“保存”

(3)芯片选择“STM32F103R6”,点击“OK”进入下一步

请添加图片描述

(1)为了生成hex文件,选择Option for Target,然后勾选Create HEX file
请添加图片描述

(2)点击 “File” ,选中 “New…” 新建一个程序文件
(2)在文件中输入代码,点击保存图标保存程序文件
请添加图片描述

(3)选择保存路径并命名为.c文件
3、关联工程和文件
(1)右键点击选中“Target”下的“Source Group 1",点击 “Add Existing Files to Group…”
请添加图片描述

(2)选择之前保存的.c文件,点击“Add”加入到工程中
请添加图片描述

4、编译程序
(1)点击下图图标编译程序
请添加图片描述

(2)生成hex文件
二、在Proteus8.9中新建工程1、点击“File”,选择新建工程
2、给工程命名并选择保存路径
3、选择从选中的模板中创建原理图(DEFAULT)
4、选择不创建PCB布版设计
5、选择创建固件项目,其中:Family(系列)选择Cortex-M3,Controller选择STM32F103R6
请添加图片描述

6、点击下一步,然后创建成功

三、连接实验原理图1、添加实验所需LED灯,点击下图图标,在关键字中输入LED-YELLOW,并点击确认选中
2、添加实验所需电阻,在关键字中输入RES,并点击确认选中
3、将电阻和LED灯添加到原理图中,并将电阻的阻值设为50,按下图连接好电路
请添加图片描述

四、流水灯仿真测试1、双击STM32 F103R6芯片,然后进入Program File选择步骤一中生成的hex文件,并将Crystal Frequency改成8M(设置晶振为8M)
2、运行电路,进行仿真测试,仿真结果如下
请添加图片描述

题二:以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。

1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;

2)用C语言寄存器方式编程实现,代码须有详细注解。

3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。

一、准备工作
1.了解STM32最小系统核心板
2.GPIOx端口的各寄存器地址和详细参数
2.1 GPIO的配置寄存器CRL和CRH
2.2 工作模式的配置
3.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芯片简介
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地址:
请添加图片描述

时钟地址:
请添加图片描述

2.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

2.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

二、实验步骤
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 添加启动代码
将启动文件拷贝到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&amp;=0xFFFFFF0F;		//设置位 清零	
GPIOB_CRH|=0x00000020;		//PB9推挽输出
GPIOB_ODR|=0x1<<9;			//设置初始灯为灭

GPIOC_CRH&amp;=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文件:
在这里插入图片描述

5、成功调试:
在这里插入图片描述

总结
本次在STM32F103C8T6核心板控制器下,通过电路搭建实现LED灯轮流闪烁的实验是嵌入式系统开发中较为基础的东西;通过本次实验进一步加深了对GPIO寄存器的认识与运用。

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值