STM32F103寄存器方式点亮LED流水灯

·

一、相关寄存器介绍

(1)芯片选择

芯片:STM32F103C8T6
材料:以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路。
要求:使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
需要工具:USB 转串口驱动和mcuisp软件。
https://pan.baidu.com/s/1WyvtnCJad_BqXbwTzhcofw
提取码:h2xc

(2)寄存器原理

1.流水灯要操作的引脚都是在GPIO端口的,所以根据系统结构图,属于AHB总线,所以所要用的端口的复位和时间控制都受RCC控制。
在这里插入图片描述

2.再看寄存器组起始地址表,可以看到RCC的地址范围,且可以看到要控制的寄存器(我的板子上只有ABC三种)都是在APB2总线。
在这里插入图片描述

3.跳到这里,就是外设时钟使能寄存器,,偏移量为0x18,而在前面一个表可以看到起始地址为0x4002 1000,偏移量为0x18,所以该寄存器的地址为0x4002 1018
在这里插入图片描述

4、 介绍5.2.1端口配置低寄存器
stm32f103引脚有多有少,多则144个,少则48个(本实验用的48脚芯片),所以会把这些引脚分成组,A、B、C、D…每组最多16个引脚,注意,是最多,并不是一定要有16个引脚!
在这里插入图片描述
48引脚的单片机只分成了A、B、C、D(PA、PB、PC、PD)组。GPIO英语的全称是General-purpose input/output,翻译过来就是通用的IO口。GPIOA_CRL的意思是控制A口的CRL寄存器。
在这里插入图片描述

再回到上面的CTRL寄存器图,“偏移地址0x00”。那么偏移是相对于谁偏移的,应该有个基准!在提供的手册中(P18页)可以看到GPIOC的地址范围是0x4001 1000~0x4001 13FF。所以它的起始地址是0x4001 1000,也就是基地址!偏移0x00后可以得出GPIOC->CRL的地址(GPIOC端口的起始地址+偏移地址)为0x40011000。所谓的复位值,就是指如果没有操作这个寄存器时,寄存器存放的默认值。复位值按位拆分0x4 = 0b0100,0x表示16进制,0b表示二进制,也就是默认CNF 01,MODE 00,是浮空输入。
在这里插入图片描述
因为每个GPIO组只有16个引脚,所以ODR寄存器只用了低16位,高16位保留。
在这里插入图片描述
这个寄存器功能很简单,控制输出的数据为0或者1 。
所以我们控制LED延时闪烁也很简单,就是控制ODR寄存器先输出1,LED灯亮,延时一段时间,控制ODR寄存器先输出0,LED灯灭,一直循环,就能实现流水灯的效果。

二、点亮流水灯实验部分

(1)keil创建项目及配置

1、打开keil,Project->new μVision Project:
在这里插入图片描述

2、设置项目工程的路径和名称,点击保存
在这里插入图片描述

(2)配置环境

1、设置工程的目标环境,本实验基于STM32F103C8T6,因此在弹出的窗口选择相应的选项,这里没有STM32F103C8T6,所以选择STM32F103C8,点击保存即可:
在这里插入图片描述

2、ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可:
在这里插入图片描述

3、鼠标右键单击Source Group 1,具体如下图所示:
在这里插入图片描述
在这里插入图片描述
最后add,创建文件完成!

4.将代码粘贴进.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,所以用按位与


		
		}
}


(3)魔法棒配置

1.打开魔法棒:
在这里插入图片描述

2.output里勾上create HEX File:
在这里插入图片描述

3.debug里,将图中改为DARMSTM.DLL和-pSTM32F103C8,OK:
在这里插入图片描述

(4)编译

1.rebuild,会创建一个.hex文件:
在这里插入图片描述

2.打开mucisp,需要下载串口和USB驱动,按下面步骤:
1选择生成的hex文件。
2把面包板和芯片插线安装好,把USB插入电脑端口,搜索串口。
3点击STMISP
4校验和编程后执行两个选项都要√
5选择DTR的低电平复位,DTR高电平进BootLoader
6点击读器件信息
7连接成功后开始编程
在这里插入图片描述
连接串口过后,需要将boot0置1,boot1置0,点击reset。

3.点击开始编程,出现右边信息就成功了!
在这里插入图片描述

(5)流水灯点亮成功结果

在这里插入图片描述

三、个人总结

这一次通过使用STM32芯片做LED流水灯实验,加深了对keil软件的使用熟练,对寄存器的相关知识更深入学习了,做流水灯实验给我最大的感受就是实验过程有点繁琐,很多细节不注意都会造就实验的失败,经常就会面对灯不亮,代码运行不起等等问题,但是通过自己一一解决,还是有很大成就感,本次实验我只做了C语言的,汇编语言由于本人的汇编知识缺乏,所以没做,下次还是希望能尝试一下汇编。

四、参考文献

1、https://blog.csdn.net/lxy13608322474/article/details/111773624
2、https://blog.csdn.net/geek_monkey/article/details/86291377

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值