STM32学习札记--GPIO端口设置

发布者:快乐心跳最新更新时间:2018-10-15 来源: eefocus关键字:STM32  GPIO  端口设置 手机看文章 扫描二维码
随时随地手机看文章

GPIOx(x=A,B,C,D,E,H)引脚配置需要几个方面:  (配例的工程函数是可以到官网上下载使用手册的)

1,首先肯定是要将相应的引脚口挂在到的AHB/APB的时钟使能,即配置RCC_AHBENR寄存器。

STM32学习札记--GPIO端口设置
GPIOC的使能位在BIT2  则 #DEFINE  GPIOCEN      (Unit32_t)0x0x00000004

STM32学习札记--GPIO端口设置

RCC的起始地址为0x4002 3800

#define PERIPH_BASE             ((uint32_t)0x40000000) 

#define AHBPERIPH_BASE      (PERIPH_BASE + 0x20000)

#define RCC_BASE                  (AHBPERIPH_BASE + 0x3800)


再定义RCC寄存器结构体

typedef struct

 {

  __IO uint32_t CR;

  __IO uint32_t ICSCR;

  __IO uint32_t CFGR;

  __IO uint32_t CIR;

  __IO uint32_t AHBRSTR;

  __IO uint32_t APB2RSTR;

  __IO uint32_t APB1RSTR;

  __IO uint32_t AHBENR;

  __IO uint32_t APB2ENR;

  __IO uint32_t APB1ENR;

  __IO uint32_t AHBLPENR;

  __IO uint32_t APB2LPENR;

  __IO uint32_t APB1LPENR;      

  __IO uint32_t CSR;    

} RCC_TypeDef;


#define RCC               ((RCC_TypeDef *) RCC_BASE)  

此处真的是很精妙,既把RCC定义成了一结构体,也阐明了它引用的地址。直接可以使用

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState)

{

    assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));

    assert_param(IS_FUNCTIONAL_STATE(NewState));  

    if (NewState  != DISABLE)  {

        RCC->AHBENR |= RCC_AHBPeriph;

     }

    else {

        RCC->AHBENR &= ~RCC_AHBPeriph;

     }

}


函数调用:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

       其中:#define RCC_AHBPeriph_GPIOC       RCC_AHBENR_GPIOCEN

                 #DEFINE  GPIOCEN        (Unit32_t)0x0x00000004

RCC->AHBENR|=RCC_AHBPeriph   等价于  RCC->AHBENR=RCC->AHBENR|0x0x00000004,使得RCC_AHBENR寄存器中GPIOC的使能位置1;

但个人也有疑问:结构体中寄存器变量的位置如何确定?

 隔天小哥自己阅读代码结构发现不同外设结构体的设置都是不同的,参照芯片手册后发现一个有趣的现象。

推测结构体内部成员的地址值是向上增长的,相应的寄存器成员变量地址也就确定了。

以下是结构体对照:

typedef struct                   # typedef struct  

{                                        #  {  

  __IO uint32_t KR;            #    __IO uint16_t CR1;

  __IO uint32_t PR;            #            uint16_t  RESERVED0;

  __IO uint32_t RLR;          #    __IO uint16_t CR2;

  __IO uint32_t SR;            #            uint16_t  RESERVED1;

} IWDG_TypeDef;             #    __IO uint16_t SR;

~~~~~~~~~~~~          #        uint16_t  RESERVED2;

 ~~~~~~~~~~~~      #    __IO  uint16_t DR;

~~~~~~~~~~~~          #             uint16_t  RESERVED3;

~~~~~~~~~~~~          #     __IO uint16_t CRCPR;

~~~~~~~~~~~~          #             uint16_t  RESERVED4;

~~~~~~~~~~~~          #     __IO uint16_t RXCRCR; 

~~~~~~~~~~~~                         uint16_t  RESERVED5;

~~~~~~~~~~~~                 __IO uint16_t TXCRCR;

~~~~~~~~~~~~                         uint16_t  RESERVED6;  

~~~~~~~~~~~~                 } SPI_TypeDef;

波浪线仅为对齐好看使用

IWDG寄存器占据四字节的定义为 __IO uint32_t 类型

SPI     寄存器占据两字节的定义为 __IO uint16_t 类型,中间空出的则用 uint16_t  RESERVED填充,可以证实以上的猜测。


关键字:STM32  GPIO  端口设置 引用地址:STM32学习札记--GPIO端口设置

上一篇:STM32通用定时器的几个重要寄存器
下一篇:STM32学习札记--ADC的有关函数个人见解

推荐阅读最新更新时间:2024-03-16 16:16

STM32+ESP8266获取网络时间和天气
先给出两个可以获取天气和时间的网站 https://www.seniverse.com/docs 可以获取天气 http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json&HTTP/1.1 可以获取时间 接下来简单说说怎么通过AT指令的方式去获取天气及时间信息 1:连网 首先,ESP8266肯定是需要连上网才能访问这些信息。所以,第一步要做的就是让ESP8266连接上wifi热点,可以是路由器,也可以是手机热点。下面写出重要的步骤 1:使用串口发送指令AT+CWMOD
[单片机]
STM32 硬件错误HardFault_Handler的真凶
STM32出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。 2、堆栈溢出。 最近遇到的问题是栈溢出,情况是这样的,举例说明: static char data ; void fun1(unsigned char *buf) { int i=0; for(i=0; i 5000; i++) { data = buf; } } void fun2(void) { unsigned char buf ; .........; fun1(buf); //执行完毕此函数出现硬件错误HardFault_Handler printf( data: %s\r\n ,buf); } int main()
[单片机]
MSP432学习-04-GPIO输入输出省电模式及中断的应用
一、相关库函数功能解析 看门狗 WDT_A_holdTimer(); //关闭看门狗 输出 uint_fast8_t selectedPort:选择端口 uint_fast16_t selectedPins:选择引脚 GPIO_setAsOutputPin(uint_fast8_t selectedPort, uint_fast16_t selectedPins); //设置为输出 GPIO_setOutputLowOnPin(uint_fast8_t selectedPort, uint_fast16_t selectedPins); //设置输出为低电平 GPIO_setOutputHighOnPin(uint_fas
[单片机]
基于STM32的BMP图片解码系统
在现代便携式设备的应用过程中,常常需要在系统中显示一些图片,而在各种图片格式中,BMP又是最具代表性的一种图片格式。 BMP是一种与硬件设备无关的图像文件格式,使用非常广泛。它采用位映射存储格式,除了图像深度可选以外,BMP文件的图像深度可选1、4、8及24 bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。 典型的BMP图像文件由3部分组成:位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。 ARM公司作为全球32位低功耗处理器设计领域的领导者,曾经设计过很多高性能低功耗的处理器,广泛应用于各种便携式手
[单片机]
基于<font color='red'>STM32</font>的BMP图片解码系统
STM32 RTC寄存器操作步骤
寄存器操作步骤 1、使能电源时钟和备份区域时钟。 我们要访问 RTC 和备份区域就必须先使能电源时钟 和 备份区域时钟。这个通过RCC_APB1ENR 寄存器来设置。 2、取消备份区写保护。 要向备份区域写入数据,就要先取消备份区域写保护(写保护在每次硬复位之后被使能),否则是无法向备份区域写入数据的。我们需要用到向备份区域写入一个字节,来标记时钟已经配置过了,这样避免每次复位之后重新配置时钟。 3、复位备份区域,开启外部低速振荡器。 在取消备份区域写保护之后,我们可以先对这个区域复位,以清除前面的设置,当然这个操作不要每次都执行,因为备份区域的复位将导致之前存在的数据丢失,所以要不要复位,要看情况而定。然
[单片机]
嵌入式系统学习——STM32之外部中断
STM32与51相比,多了很多资源,其中外部中断就是被扩展了很多。51的外部中断只有2个,但是STM32不是,STM32的每个IO都可以作为外部中断输入。 STM32的中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。 IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数: 从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数,外部中断线10~15分配一个中
[单片机]
嵌入式系统学习——<font color='red'>STM32</font>之外部中断
STM32系统学习——I2C (读写EEPROM)
I2C 通讯协议(Inter-Integrated Circuit)引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流, 协议层则规定我
[单片机]
<font color='red'>STM32</font>系统学习——I2C (读写EEPROM)
在线调试STM32 卡在LDR R0, = SystemInit_ExtMemCtl
程序卡在 在线调试STM32 卡在LDR R0, = SystemInit_ExtMemCtl的解决办法如下: 出现最多的情况就是设置的断点过多,可以把断点全部删除试试看,把断点设置在主函数。 在程序中使用了C库(printf),那么进入Option ---target 将 use microLib 勾选上。 硬件原因,主芯片,或者晶振有问题,更换一下就好了
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved