嵌入式STM32F1学习-驱动led灯(寄存器版本)

STM32F1的IO可以配置成8种模式,三种最大输出速度。也就是每组IO口有7个寄存器,也就是说7个寄存器可以控制一组16个IO口。

这个7个寄存器分别是:

位配置寄存器,主要是:模式的选择以及输出速度的选择。

GPIOx_CRL

GPIOx_CRH

数据寄存器,主要是:一个是输入数据寄存器。一个是输出数据寄存器。

GPIOx_IDR

GPIOx_ODR

一个32位置位/复位数据寄存器

GPIOx_BSRR

一个16位复位寄存器

GPIOx_BRR

一个32位锁存器

GPIOx_LCKR

 

假设:PB5和PE5和外部的LED相连。通过配置相应的寄存器来驱动LED灯。

寄存器版本步骤是三部:

第一步:使能IO端口时钟。

在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。 GPIO 是挂载在 APB2 总线上的外设,相应的寄存器是:APB2  外设时钟使能寄存器(RCC_APB2ENR)

GPIOB与GPIOE是在寄存器:RCC_APB2ENR的第三位和第六位。我们只需要把相应的位设置为1即可。

 

通过查找相应的寄存器使能GPIOB。

RCC->APB2ENR  |= 1<<3 ;     //一般情况下我们不直接赋值,主要是为了保持其他位不变。

同样我们可以使能GPIOE:RCC->APB2ENR  |= 1<<6;

 

第二步:初始化IO口模式

在使能了相应的端口以后,我们需需要设置相应的IO口模式。配置模式有2个32位的寄存器CRL和CRH。GPIOB与GPIOE都是低八位,因此只需要我们配置寄存器CRL。

每个IO口需要配置4位,低两位输出模式选择,高两位是配置模式。

 

选择模式:输出模式,最大速度50MHZ。复用推挽输出。

程序可以写成:

在我们设置相应的位之前,我们先把要设置的位清零。(利用和1相与不变,和0相与清零)

GPIOB->CRL &=0xFF0FFFFF;

然后选择模式:

GPIOB->CRL |=0x00300000;      //PB5的工作模式

初始化我们设置输出为1,通过寄存器ODR设置。

GPIOB->ODR |= 1<<5; 

同样可以设置GPIOE的模式以及PE5的状态。

GPIOE->CRL &=0xFF0FFFFF;

GPIOE->CRL |= 0x00300000;      //PE5的工作模式

GPIOE->ODR |= 1<<5; 

 

第三步骤:操作IO口

操作寄存器ODR或者寄存器BRR/BSRR.

通过配置PB5和PE5相应输出寄存器ODR的位置位或者清零。

GPIOE->ODR |= 1<<5; 

调用延时函数delay;

GPIOB->ODR &= ~(1<<5);

 

或者配置寄存器BRR/BSRR.

通过BSRR的低16位置1,
GPIOB->BSRR |= 1<<5;

调用延时函数delay;

通过BSRR的低16位置0,
GPIOB->BRR |= 1<<5;

 

【补充C语言操作符号】

CRL寄存器所有位清零:  GPIOB->CRL &= 0x0;

CRL寄存器所有位置1:   GPIOB->CRL |=  0xFFFFFFFF

CRL寄存器的第1位置1:GPIOB->CRL |= 1<<1;

CRL寄存器的第1位清零:GPIOB->CRL &= ~(1<<1) ;

CRL寄存器的第0-3位设置成A,其他保持不变:  GPIOB->CRL |=  0x0000000A;(为了举例,没有实际意义)

 创客学院全新视频尽在:www.makeru.com.cn

嵌入式学习交流群:561213221

原文地址:https://www.cnblogs.com/huan-huan/p/8316182.html