STM32的GPIO控制寄存器开发

寄存器GPIO控制

寄存器地址在这里插入图片描述

寄存器地址计算

某个寄存器地址,由三个参数决定:1、总线基地址(BUS_BASE_ADDR);2,外设基于总线基地址的偏移量(PERIPH_OFFSET);3,寄存器相对外设基地址的偏移量(REG_OFFSET)。可以表示为:
寄存器地址 = BUS_BASE_ADDR + PERIPH_OFFSET + REG_OFFSET

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

相关寄存器

APB2外设时钟使能寄存器(RCC_APB2ENR)

  • 复位和时钟控制(RCC) 0x4002 1000 - 0x4002 13FF

  • 偏移地址:0x18 ;其地址为0x4002 1018

  • 复位值:0x0000 0000

在这里插入图片描述

端口配置低寄存器(GPIOx_CRL) (x=A…E)

控制GPIOx的0-7针脚

  • 偏移地址:0x00 复位值:0x4444 4444

在这里插入图片描述

端口配置高寄存器(GPIOx_CRH) (x=A…E)

控制GPIO的8-15针脚

  • 偏移地址:0x04 复位值:0x4444 4444

在这里插入图片描述

端口输入数据寄存器(GPIOx_IDR) (x=A…E)

  • 地址偏移:0x08 复位值:0x0000 XXXX

在这里插入图片描述

端口输出数据寄存器(GPIOx_ODR) (x=A…E)

  • 地址偏移:0Ch 复位值:0x0000 0000

在这里插入图片描述

端口位设置/清除寄存器(GPIOx_BSRR) (x=A…E)

  • 地址偏移:0x10 复位值:0x0000 0000

在这里插入图片描述

端口位清除寄存器(GPIOx_BRR) (x=A…E)

  • 地址偏移:0x14 复位值:0x0000 0000

在这里插入图片描述

端口配置锁定寄存器(GPIOx_LCKR) (x=A…E)

  • 地址偏移:0x18 复位值:0x0000 0000
  • 当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。

在这里插入图片描述

2.简单GPIO控制

每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。

  • 输入浮空
  • 输入上拉
  • 输入下拉
  • 模拟输入
  • 开漏输出
  • 推挽式输出
  • 推挽式复用功能
  • 开漏复用功能
  • 每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。
//#define GPIOB_CRH_addr  0X40010C04
//#define GPIOB_IDR_addr  0X40010C08
//#define GPIOB_ODR_addr  0X40010C0C
//#define GPIOB_BSRR_addr 0X40010C10
//#define GPIOB_BRR_addr  0X40010C14
//#define GPIOB_LCKR_addr 0X40010C18
//#define RCC_APB2ENR_addr    0X4002 1018  //偏移0x18

//#define GPIOB_CRL       (*(unsigned int *)(0X40010C00))
//#define GPIOB_CRH       (*(unsigned int *)(0X40010C04))
//#define GPIOB_IDR       (*(unsigned int *)(0X40010C08))
//#define GPIOB_ODR       (*(unsigned int *)(0X40010C0C))
//#define GPIOB_BSRR      (*(unsigned int *)(0X40010C10))
//#define GPIOB_BRR       (*(unsigned int *)(0X40010C14))
//#define GPIOB_LCKR      (*(unsigned int *)(0X40010C18))
#define RCC_APB2ENR     (*(unsigned int *)(0X40021018))
#define GPIOB_BASE_addr  0X40010C00    

typedef struct{

    volatile unsigned int CRL;
    volatile unsigned int CRH;
    volatile unsigned int IDR;
    volatile unsigned int ODR;
    volatile unsigned int BSRR;
    volatile unsigned int BRR;
    volatile unsigned int LCKR;
}GPIO;

GPIO *GPIO_B=(GPIO*)(GPIOB_BASE_addr);
//由于结构体连续分配内存,并且GPIO配置寄存器也是连续的相隔4个字节,故寄存器地址能完整映射到结构体。

int main()
{ 
    RCC_APB2ENR=8;
   // GPIOB_CRL = 0XD00000;//00000000 10110000 00000000 0000000; // 配置PB5为复用推挽输出模式速度为50MHz
    //GPIOB_ODR = 0X10; // 
    //GPIOB_ODR= 0; // 
    
    GPIO_B->CRH=0X0011;
    GPIO_B->CRL=0Xd00000;
    //GPIO_B->ODR|=(1<<5);//低电平驱动LED
    GPIO_B->ODR|=(1<<8);//高电平驱动有源蜂鸣器
    while(1);  

}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 23:14:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 23:14:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 23:14:02       87 阅读
  4. Python语言-面向对象

    2024-04-22 23:14:02       96 阅读

热门阅读

  1. LeetCode刷题--- 完全平方数

    2024-04-22 23:14:02       35 阅读
  2. Rust---泛型(Generics)

    2024-04-22 23:14:02       32 阅读
  3. git 代码仓库

    2024-04-22 23:14:02       35 阅读
  4. 如何将本地项目上传到gitlab

    2024-04-22 23:14:02       40 阅读
  5. 【Spring】@Scheduled 定时器注解使用

    2024-04-22 23:14:02       40 阅读
  6. iOS知识点 ---- 离屏渲染

    2024-04-22 23:14:02       35 阅读
  7. CentOS常见命令详解

    2024-04-22 23:14:02       40 阅读
  8. vueelementui+tabs选项卡样式更改-内容待递增

    2024-04-22 23:14:02       35 阅读
  9. 安卓平台下OkHttp3网络库的全面探讨与实践

    2024-04-22 23:14:02       37 阅读
  10. python selenium 获取伪类

    2024-04-22 23:14:02       39 阅读
  11. SCP收容物081~09

    2024-04-22 23:14:02       36 阅读
  12. 设计模式详解(十五)——模板方法模式

    2024-04-22 23:14:02       42 阅读
  13. git 简单使用

    2024-04-22 23:14:02       33 阅读
  14. php ArrayAccess

    2024-04-22 23:14:02       37 阅读