STM32寄存器方式实现流水灯

目录

一、寄存器和寄存器映射

二、寄存器的相关配置

1.配置时钟

 2.配置输出

三、用C语言代码实现流水灯

1.代码如下:

 2.烧录程序

四、结果演示

五、总结

六、参考文献 


一、寄存器和寄存器映射

给有特定功能的内存单元取一个别名,这个别名就是我们常说的寄存器,取名的过程就叫寄存器映射。寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。

二、寄存器的相关配置

1.配置时钟

为什么配置时钟?为了省电,默认的时钟都是关闭的。配置STM32的任何资源前,都必须首先使能时钟。

时钟控制名字叫做RCC,属于AHB总线。GPIOB属于APB2。

时钟系统框图: 

 

 2.配置输出

控制LED需要输出高电平或是低电平,所以需要配置为输出。
  由于STM32的每个IO都需要4个位来配置,所以一个32位的寄存器最大只能配置8个IO(32位的单片机的寄存器就是32位的)。STM32中,用端口配置低寄存器(GPIOx_CRL)来配置引脚Px0-Px7, 用端口配置高寄存器(GPIOx_CRH)来配置引脚Px8-Px15。

STM32的四种输出方式

1、普通推挽输出(GPIO_Mode_Out_PP):

使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。

使用方法:直接使用

输出电平:推挽输出的低电平是0V,高电平是3.3V。

2、普通开漏输出(GPIO_Mode_Out_OD):

使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。

使用方法:就需要再外部接一个上拉电阻,电源为5V,把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。

输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则既不输出高电平 也不输出低电平,为高组态。为正常使用,必须在外部接一个上拉电 阻。

特性: 它具“线与”特性,即很多个开漏模式 引脚连接到一起时,只有当所有 引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部 上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当 于短路接地,使得整条线路都为低电平,0 伏。

3、复用推挽输出(GPIO_Mode_AF_PP):用作串口的输出。

4、复用开漏输出(GPIO_Mode_AF_OD):用在IIC。

所有的开漏输出都需要接上拉电阻。

我这里设置为普通推挽输出

三、用C语言代码实现流水灯

1.代码如下:

#define RCC_APB2ENR *(unsigned int*)0x40021018
#define GPIOA_CRL	*(unsigned int*)0x40010800
#define GPIOB_CRL *(unsigned int*)0x40010C00
#define GPIOC_CRH *(unsigned int*)0x40011004
#define GPIOA_ODR *(unsigned int*)0x4001080C
#define GPIOB_ODR *(unsigned int*)0x40010C0C
#define GPIOC_ODR *(unsigned int*)0x4001100C
	
int  Delay_ms(volatile unsigned int time)
{    
	int i;
   while(time--)
   {
      i=20000;  
      while(i--) ;    
   }
	 return 0;
}
 
int main()
{
	RCC_APB2ENR |=(1<<2);
	RCC_APB2ENR |=(1<<3);
	RCC_APB2ENR |=(1<<4);
	
	while(1)
	{		
	GPIOA_CRL &=0xFFFFFFF0;
	GPIOA_CRL	|=0xFFFFFFF3;
	GPIOA_ODR =0x0<<0;
	Delay_ms(10000000);
	GPIOA_ODR =0x1<<0;
	Delay_ms(10000000);
	
	GPIOB_CRL &=0xFFFFFFF0;
	GPIOB_CRL |=0xFFFFFFF3;
	GPIOB_ODR =0;
	Delay_ms(10000000);
	GPIOB_ODR =1;
	Delay_ms(10000000);
	
	GPIOC_CRH &=0xF0FFFFFF;
	GPIOC_CRH |=0xF3FFFFFF;
  GPIOC_ODR =0<<14;
	Delay_ms(10000000);
	GPIOC_ODR =1<<14;
	Delay_ms(10000000);
}
}

 2.烧录程序

注意:要在keil中生成hex文件

 我这里使用的mcusip烧录软件

1.运行mcuisp

2.点击搜索串口,将自动找到电路板串口

3.在 bps 中选择 波特率为 256000,左下角设置:DTR 的低电平复位,RTS 高电平进 BootLoader。

4.读器件信息

 5.选择一个 hex 文件

 6.点击开始编程就可以下载程序(此过程不需要按复位键)

四、结果演示

 

五、总结

本次实验用寄存器方式实现了流水灯,了解了寄存器的相关知识和使用方法,并进行了实践操作,加深了对STM32的了解

六、参考文献 

STM32寄存器的简介、地址查找,与直接操作寄存器_geekYatao-CSDN博客_stm32寄存器

小白学ARM实操三:基于STM32F103流水灯的实现(寄存器版)_Lc-Yusheng的博客-CSDN博客

STM32串口下载程序_lengyuefeng212的博客-CSDN博客_stm32串口下载程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值