IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103寄存器方式实现流水灯 -> 正文阅读

[嵌入式]STM32F103寄存器方式实现流水灯

目录

一、相关寄存器配置

1.1首先配置时钟效能

?1.2配置为通用输出

二、C语言实现流水灯

2.1创建新项目

2.2烧录程序

2.3运行结果

?三、总结

四、参考文献


一、相关寄存器配置

1.1首先配置时钟效能

因为默认的时钟都是关闭的,所以在配置STM32之前,都必须先配置时钟。这些我们都i可以在参考手册里查。时钟控制叫做RCC,是属于AHB总线的,我们使用的是GPIOA/B/C端口都是属于APB2.

下面以GPIOB口为例,GPIO端口B的地址从0x4001 0C00开始,我们从手册中可以得知复位和时钟控制RCC的地址从0x4002 1000开始,再找到APB2外设时钟使能寄存器,可以看到其偏移地址为0x18,所以APB2的地址就是0x4002 1018。

?

根据手册可以知道IO端口B时钟使能是RCC_APB2ENR的位3,我们把RCC_APB2ENR位的3赋值为1,就能开启GPIOB时钟。

#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018)
RCC_AP2ENR|=1<<2;

?1.2配置为通用输出

由于STM32的每个IO都需要4个位来配置,所以一个32位的寄存器最大只能配置8个IO(32位的单片机的寄存器就是32位的)。STM32中,用端口配置低寄存器(GPIOx_CRL)来配置引脚Px0-Px7, 用端口配置高寄存器(GPIOx_CRH)来配置引脚Px8-Px15。
  我使用的是引脚PB8,使用的寄存器是GPIOB_CRKL。然后我们需要找到这个寄存器的地址。

?偏移地址是0x00,意思是在基地址的基础上再加0x00,所以,对于GPIOB来说就是0x4001 0c00。配置PB7,那么需要的寄存器是低位的寄存器GPIOB_CRL,它的地址是0x4001 0c00。找到需要操作的寄存器后,把它配置为通用输出。

我们设置输出模式,这里设置成推免输出。

?点亮LED的话需要输出低电平所以我们找到端口输出数据寄存器,然后将第8位输出0

?

?

#define GPIOB_CRL	*((unsigned volatile int*)0x40010C00)
#define	GPIOB_ORD	*((unsigned volatile int*)0x40010C0C)
GPIOB_CRL&=0x0FFFFFFF;		//设置清零
	GPIOB_CRL|=0x20000000;		//PB7推免输出
	GPIOB_ORD|=1<<7;

GPIOB的基本的配置就是这样,其他口则查找参考手册如上即可,再加上延迟函数即可实现流水灯。

二、C语言实现流水灯

2.1创建新项目

先再keil中新建一个项目,再添加新的项目

注意一定要勾选output中的生成hex文件

?

?代码如下


#define RCC_AP2ENR	*((unsigned volatile int*)0x40021018)
#define GPIOA_CRL	*((unsigned volatile int*)0x40010800)
#define	GPIOA_ORD	*((unsigned volatile int*)0x4001080C)
#define GPIOB_CRL	*((unsigned volatile int*)0x40010C00)
#define	GPIOB_ORD	*((unsigned volatile int*)0x40010C0C)
#define GPIOC_CRH	*((unsigned volatile int*)0x40011004)
#define	GPIOC_ORD	*((unsigned volatile int*)0x4001100C)
//-------------------???????-----------------------
void  Delay_ms( volatile  unsigned  int  t)
{
     unsigned  int  i;
     while(t--)
         for (i=0;i<800;i++);
}
void A_LED_LIGHT(){
	GPIOA_ORD=0x0<<5;		
	GPIOB_ORD=0x1<<7;		
	GPIOC_ORD=0x1<<14;		
}
void B_LED_LIGHT(){
	GPIOA_ORD=0x1<<5;		
	GPIOB_ORD=0x0<<7;		
	GPIOC_ORD=0x1<<14;		
}
void C_LED_LIGHT(){
	GPIOA_ORD=0x1<<5;		
	GPIOB_ORD=0x1<<7;		
	GPIOC_ORD=0x0<<14;			
}
int main()
{
	int j=100;
	RCC_AP2ENR|=1<<2;			
	RCC_AP2ENR|=1<<3;			
	RCC_AP2ENR|=1<<4;			
	GPIOA_CRL&=0xFF0FFFFF;			
	GPIOA_CRL|=0x00200000;		
	GPIOA_ORD|=1<<5;			
	
	GPIOB_CRL&=0x0FFFFFFF;			
	GPIOB_CRL|=0x20000000;		
	GPIOB_ORD|=1<<7;		
	
	GPIOC_CRH&=0xF0FFFFFF;		
	GPIOC_CRH|=0x02000000;   	
	GPIOC_ORD|=0x1<<14;			
	while(j)
	{	
		A_LED_LIGHT();	
		Delay_ms(10000000);
		B_LED_LIGHT();
		Delay_ms(10000000);
		C_LED_LIGHT();
		Delay_ms(10000000);
	}
}


2.2烧录程序

生成hex文件后,打开烧录软件

?

?烧录是要把板子上的boot0置1,boot1置0,并且要按下reset键

这时候我们就可以进行编程

?

?这时我们就已经烧录成功了。

2.3运行结果

?三、总结

本次实验中我对寄存器的端口地址和具体的用法有了一定的了解,还学会了用寄存器的方式来点亮流水灯,在实验的过程中也遇到了不少的困难也有许多不理解的地方,查阅了参考手册和一些大佬,第一次做流水灯做得不好。

四、参考文献

https://blog.csdn.net/junseven164/article/details/120804940?spm=1001.2014.3001.5501

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:04:06  更:2021-10-24 15:04:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:30:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码