寄存器版本的跑马灯操作流程(战舰开发板V3)

目录

寄存器版本的跑马灯操作流程(战舰开发板V3)

跑马灯需要配置的IO口

需要配置的寄存器

RCC_APB2ENR外设时钟使能寄存器

GPIOx_CRL端口配置低寄存器

ODR端口输出寄存器

BSRR端口位设置/清除寄存器

BRR端口位清除寄存器

IO口寄存器说明

配置IO口的流程

Led.c

Led.h

Main.c

为什么对寄存器操作会是这种格式?(以RCC为例)

RCC为何为指针?

RCC是什么类型的指针?

IO口配置的几种形式

GPIO_Pin_n的宏定义格式

GPIO_BRR_BRn的宏定义格式

配置寄存器时的巧法(以BSRR寄存器为例)


寄存器版本的跑马灯操作流程(战舰开发板V3)

跑马灯需要配置的IO口

 

PB5&PE5两个IO口。

需要配置的寄存器

RCC_APB2ENR外设时钟使能寄存器

 

GPIOx_CRL端口配置低寄存器

 

ODR端口输出寄存器

 

BSRR端口位设置/清除寄存器

 

BRR端口位清除寄存器

 

IO口寄存器说明

 

配置IO口的流程

Led.c

#include "led.h"  
#include "stm32f10x.h"  
  
void LED_Init(void)  // LED初始化函数体定义
{  
  
    RCC->APB2ENR|=1<<3;    // 使能时钟  
    RCC->APB2ENR|=1<<6; // 使能时钟  
      
    //GPIOB.5    
      
    GPIOB->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_MODE5); // 对相应的位进行清零操作  
    GPIOB->CRL |= GPIO_CRL_MODE5; // 配置IO口模式  
    GPIOB->BSRR |= GPIO_BSRR_BS5; // 配置IO口初始状态  
      
    //GPIOE.5  
      
    GPIOE->CRL &= ~(GPIO_CRL_CNF5|GPIO_CRL_MODE5); // 对相应的位进行清零操作  
    GPIOE->CRL |= GPIO_CRL_MODE5; // 配置IO口模式  
    GPIOE->BSRR |= GPIO_BSRR_BS5; // 配置IO口初始状态  
      
}  

 

Led.h

#ifndef __LED_H  
#define __LED_H  
  
void LED_Init(void);  // 在头文件中声明LED初始化函数
  
#endif  

 

Main.c

#include "delay.h"  
#include "stm32f10x.h"  
#include "led.h"  
  
int main(void)  
{  
  
    delay_init();  // 延迟函数初始化
    LED_Init();  // LED初始化
  
    while(1)  
    {  
        GPIOB->BSRR |= GPIO_BSRR_BS5;  // 对PB5进行置1操作
        GPIOE->ODR |= GPIO_BSRR_BS5;  // 对PE5进行置1操作
        delay_ms(500);  
          
        GPIOB->BRR &= ~GPIO_BRR_BR5;  // 对PB5进行置0操作
        GPIOE->BRR &= ~GPIO_BRR_BR5;  // 对PE5进行置0操作
        delay_ms(500);  
    }  
}  

 

为什么对寄存器操作会是这种格式?(以RCC为例)

RCC为何为指针?

 

RCC是什么类型的指针?

我们看到RCC本身就是个指针格式,指针类型为“RCC_TypeDef *”类型,那我们再看看“RCC_TypeDef”类型的结构体中的成员是什么:

 

我们可以看到RCC指针所指向的结构体类型有以下成员:

typedef struct  
{  
  __IO uint32_t CR;  
  __IO uint32_t CFGR;  
  __IO uint32_t CIR;  
  __IO uint32_t APB2RSTR;  
  __IO uint32_t APB1RSTR;  
  __IO uint32_t AHBENR;  
  __IO uint32_t APB2ENR;  
  __IO uint32_t APB1ENR;  
  __IO uint32_t BDCR;  
  __IO uint32_t CSR;  
  
#ifdef STM32F10X_CL    
  __IO uint32_t AHBRSTR;  
  __IO uint32_t CFGR2;  
#endif /* STM32F10X_CL */   
  
#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)     
  uint32_t RESERVED0;  
  __IO uint32_t CFGR2;  
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */   
} RCC_TypeDef;  

 

因此才有了我们程序中的代码的:

RCC->APB2ENR|=1<<3;    // 使能时钟  
RCC->APB2ENR|=1<<6; // 使能时钟  

 

这种形式的写法。

IO口配置的几种形式

#include "delay.h"  
#include "stm32f10x.h"  
#include "led.h"  
  
int main(void)  
{  
  
    delay_init();  
    LED_Init();  
  
    while(1)  
    {  
        GPIOB->BSRR |= GPIO_BSRR_BS5;  
        GPIOE->ODR |= GPIO_BSRR_BS5;  
        delay_ms(500);  
          
        //GPIOB->BRR &= ~GPIO_BRR_BR5;  // 形式一
        GPIOB->BRR &= ~GPIO_Pin_5;  // 形式二
        GPIOE->BRR &= ~GPIO_BRR_BR5;  
        delay_ms(500);  
    }  
}  

 

我们看预定义格式就知道了:

GPIO_Pin_n的宏定义格式

#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */  
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */  
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */  
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */  
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */  
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */  
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */  
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */  
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */  
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */  
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */  
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */  
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */  
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */  
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */  
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */  
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */ 

 

GPIO_BRR_BRn的宏定义格式

/*******************  Bit definition for GPIO_BRR register  *******************/  
#define GPIO_BRR_BR0                         ((uint16_t)0x0001)            /*!< Port x Reset bit 0 */  
#define GPIO_BRR_BR1                         ((uint16_t)0x0002)            /*!< Port x Reset bit 1 */  
#define GPIO_BRR_BR2                         ((uint16_t)0x0004)            /*!< Port x Reset bit 2 */  
#define GPIO_BRR_BR3                         ((uint16_t)0x0008)            /*!< Port x Reset bit 3 */  
#define GPIO_BRR_BR4                         ((uint16_t)0x0010)            /*!< Port x Reset bit 4 */  
#define GPIO_BRR_BR5                         ((uint16_t)0x0020)            /*!< Port x Reset bit 5 */  
#define GPIO_BRR_BR6                         ((uint16_t)0x0040)            /*!< Port x Reset bit 6 */  
#define GPIO_BRR_BR7                         ((uint16_t)0x0080)            /*!< Port x Reset bit 7 */  
#define GPIO_BRR_BR8                         ((uint16_t)0x0100)            /*!< Port x Reset bit 8 */  
#define GPIO_BRR_BR9                         ((uint16_t)0x0200)            /*!< Port x Reset bit 9 */  
#define GPIO_BRR_BR10                        ((uint16_t)0x0400)            /*!< Port x Reset bit 10 */  
#define GPIO_BRR_BR11                        ((uint16_t)0x0800)            /*!< Port x Reset bit 11 */  
#define GPIO_BRR_BR12                        ((uint16_t)0x1000)            /*!< Port x Reset bit 12 */  
#define GPIO_BRR_BR13                        ((uint16_t)0x2000)            /*!< Port x Reset bit 13 */  
#define GPIO_BRR_BR14                        ((uint16_t)0x4000)            /*!< Port x Reset bit 14 */  
#define GPIO_BRR_BR15                        ((uint16_t)0x8000)            /*!< Port x Reset bit 15 */  

 

配置寄存器时的巧法(以BSRR寄存器为例)

 

我们要配置Port B的Pin5引脚为高电平,我们可以这样配置:

GPIOB->BSRR |= GPIO_BSRR_BS5;

或者

GPIOB->BSRR |= 0x00000020;

这两种方法都可以,但是第一种方法更简单一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥肥胖胖是太阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值