STM32快速组织代码分析例如IO端口初始化GPIO_Init(GPIOE, &GPIO_InitStructure)

发布者:CelestialLight最新更新时间:2022-06-07 来源: eefocus关键字:STM32  IO端口  初始化  GPIO_Init 手机看文章 扫描二维码
随时随地手机看文章

GPIO_Init(GPIOE, &GPIO_InitStructure);


函数实体定义是:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)     //结构体的指针,指向结构体变量的首地址2020.2.18  //疑问?为什么用结构体指针类型定义,而不用结构体类型定义GPIOx,

   对应的外设的内部地址单片机第一好的         对应自定义的结构体指针变量的地址,编译器自动分配识别地址                                                   //GPIO_InitStruct2020.2.19

                                                                                                                            //猜测可以用结构体,但是要和绝对地址相联系实现起来麻烦


GPIO_TypeDef*结构体的指针指向结构体

typedef struct

{

  __IO uint32_t CRL;

  __IO uint32_t CRH;

  __IO uint32_t IDR;

  __IO uint32_t ODR;

  __IO uint32_t BSRR;

  __IO uint32_t BRR;

  __IO uint32_t LCKR;

} GPIO_TypeDef;

包含每个IO端口的7个寄存器


GPIOx   //IO端口外设

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));  //外设插入参数判断

#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) ||          //带参数的宏定义中,参数类型不用指定,只是符号代换,和函数的形参是不一样的

                                    ((PERIPH) == GPIOB) ||

                                    ((PERIPH) == GPIOC) ||

                                    ((PERIPH) == GPIOD) ||

                                    ((PERIPH) == GPIOE) ||

                                    ((PERIPH) == GPIOF) ||

                                    ((PERIPH) == GPIOG))



GPIOE   外设

#define GPIOE               ((GPIO_TypeDef *) GPIOE_BASE)                                                       //疑问?宏定义属于变量范畴吗 好像不是 宏定义可以表示常亮 3.1415926可以用宏定义

#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)                                                        //疑问?常量地址可以被强制转化为结构指针吗?2020.2.19

#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)                                                           //指针就是地址,常量可以被强制转化int * p;int a;p=&a;

#define PERIPH_BASE           ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */        

找到外设的地址


GPIO_InitTypeDef*结构体指针指向结构体

typedef struct

{

  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.

                                      This parameter can be any value of @ref GPIO_pins_define */  //引脚序号


  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.

                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */   //速度


  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.

                                      This parameter can be a value of @ref GPIOMode_TypeDef */    //推挽等模式

}GPIO_InitTypeDef;


assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));

assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));

assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));


#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_AIN) || ((MODE) == GPIO_Mode_IN_FLOATING) ||

                            ((MODE) == GPIO_Mode_IPD) || ((MODE) == GPIO_Mode_IPU) ||

                            ((MODE) == GPIO_Mode_Out_OD) || ((MODE) == GPIO_Mode_Out_PP) ||

                            ((MODE) == GPIO_Mode_AF_OD) || ((MODE) == GPIO_Mode_AF_PP))


GPIO_Mode的数据类型为  GPIOMode_TypeDef 枚举类型

typedef enum

{ GPIO_Mode_AIN = 0x0,

  GPIO_Mode_IN_FLOATING = 0x04,

  GPIO_Mode_IPD = 0x28,

  GPIO_Mode_IPU = 0x48,

  GPIO_Mode_Out_OD = 0x14,

  GPIO_Mode_Out_PP = 0x10,

  GPIO_Mode_AF_OD = 0x1C,

  GPIO_Mode_AF_PP = 0x18

}GPIOMode_TypeDef;


GPIO_Speed的数据类型为GPIOSpeed_TypeDef  枚举类型

typedef enum

  GPIO_Speed_10MHz = 1,

  GPIO_Speed_2MHz, 

  GPIO_Speed_50MHz

}GPIOSpeed_TypeDef;

#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) ||

                              ((SPEED) == GPIO_Speed_50MHz))            //带参数宏定义2020.2.19


GPIO_Pin的数据类型  uint16_t

#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 */


#define IS_GPIO_PIN(PIN) ((((PIN) & (uint16_t)0x00) == 0x00) && ((PIN) != (uint16_t)0x00))


#define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) ||

                              ((PIN) == GPIO_Pin_1) ||

                              ((PIN) == GPIO_Pin_2) ||

                              ((PIN) == GPIO_Pin_3) ||

                              ((PIN) == GPIO_Pin_4) ||

                              ((PIN) == GPIO_Pin_5) ||

                              ((PIN) == GPIO_Pin_6) ||

                              ((PIN) == GPIO_Pin_7) ||

                              ((PIN) == GPIO_Pin_8) ||

                              ((PIN) == GPIO_Pin_9) ||

                              ((PIN) == GPIO_Pin_10) ||

                              ((PIN) == GPIO_Pin_11) ||

                              ((PIN) == GPIO_Pin_12) ||

                              ((PIN) == GPIO_Pin_13) ||

[1] [2]
关键字:STM32  IO端口  初始化  GPIO_Init 引用地址:STM32快速组织代码分析例如IO端口初始化GPIO_Init(GPIOE, &GPIO_InitStructure)

上一篇:单片机STM32学习笔记之寄存器映射详解
下一篇:STM32参考说明中SPI数据发送接收过程数据寄存器缓冲区移位寄存器工作过程

推荐阅读最新更新时间:2024-11-08 02:02

STM32不同型号单片机keil工程移植说明
STM32系列单片机如果库函数开发的话,那么不同型号单片机的工程是可以直接移植的。这样的话如果项目中更换了芯片,工程就可以直接移植过去,不用重新编写。这样就节约了很多时间。 下面说一下如何将 在STM32F103RCT6单片机上开发的工程,移植到STM32F103C8T6单片机上。移植工程之前,首先要确保工程中用到的IO口,在两个芯片中都有。否则如果工程中使用IO在一个芯片上有,另一个芯片上没有,那么是不能直接移植的,需要更改 IO口后才能使用。 相关IO口可以在官方芯片资料中查看 如上图所示 PC0口,在48个引脚的单片机中是没有的,在其他单片机中的引脚位置也不一样。移植的时候引脚位置要确认好,看看位置不同是否影响使
[单片机]
<font color='red'>STM32</font>不同型号单片机keil工程移植说明
STM32 与 ST-Link V2仿真器 接线与烧录
STM32下载器 ST-Link V2仿真器 STM8编程器 自动升级 3.3V 5V可用 驱动下载地址:https://pan.baidu.com/s/1CM8z0W1BkYlX_Ek-iauCmw 资料下载地址:https://pan.baidu.com/s/1Mcjco71s14jlcAkVqE1-yQ 迷你ST-LINK / V2,功能与官方完全一致,支持自动升级,支持全系列STM32 SWD 和全系列 STM8 SWIM的下载和调试。 本店ST-LINK V2 八大靓点: 1、使用U盘外壳安装内部主板,携带方便,安全可靠! 2、接口定义直接在外壳上标注,一目了然,方便实用! 3、5V、3.3V同
[单片机]
<font color='red'>STM32</font> 与 ST-Link V2仿真器 接线与烧录
STM32 CPU ID,Unique ID,Flash size register的定义
注意,CPU ID和Unique ID对ST来讲是不同的定义,CPU ID是CortexM3自带的,复位值是一致的,在PM0056.pdf中有定义说明。 Unique ID是每个芯片的不同ID,在RM0008.PDF中定义,像F103就在30.2节中定义。 Flash size register是芯片的Flash大小,在RM0008.PDF中定义,像F103就在30.1中定义。 可以推理,如果知道了Flash大小,就可以根据手册来推出Page的大小了,所以就不要找page size register了,没有这个专门的寄存器。 要注意的是,L15x系列的地址基址和F103不一样,要参考对应的手册。
[单片机]
确保SRL和触发器在配置后正确初始化方法
FPGA 架构中的 SRL16 和触发器是通过 GWE(全局写使能)信号来释放的,该信号允许这些同步元件在配置完成后改变状态。GWE 是紧接配置后启动过程的一部分。   GWE 会为配置时钟同步释放 SRL16 和 触发器,并且会在该部分产生巨大的歪斜。因此,在同步设计中会产生两种类型的行为:   由于 GWE 释放的同步元件与配置时钟有关,而与用户的系统时钟无关, 因此,触发器和 SRL16 会产生时序违规。   传递 GWE 信号表明 SRL16 和触发器的释放时间可能稍有不同,从而导致设计的某些部分在 其他部分之前启动。   此问题将不会影响大多数设计。如果该设计符合下列标准之一,则应该在设计中实现此答复记录底部的
[模拟电子]
关于调试stm32和stm8(51单片机)的i2c和spi协议的之间的区别
在调试STM32的i2c和io口模拟spi协议时发现时序是很关键的。stm32在72M运行下可以实现i2c或者spi协议,但并不代表把相同的代码移植到51单片机上就会成功的跑起来,因为51单片机的速读最块8M,所以在时序上会产生很多大的区别。 经过测试,在stm32上的spi协议时钟线可达到20Khz,移植到51后,频率会降到 10hz。可是尽管把延时调小或者去掉还是无济于事,此时就要加几句把钟线置高置低的语句了 以便增大的速度,后来成功后,测试时钟线的确达到了10Khz左右。 先贴上部分代码 unsigned char ReadRawRC(unsigned char Address) { unsigned char
[单片机]
STM32 PCB触摸按键(RC检测法)
无意中翻出了大学刚毕业时用来来忽悠老板的触摸按键的程序,突然感概白发又多了。做硬件的不容易,做软件的也不容易,做硬件又做软件的更不容易。。。。 回想起来印象也不深刻,感觉纯粹为了好玩,又发现了键盘边有个有三个焊盘的pcb板,心血来潮把就它翻新了一下。 感觉触摸按键比物理按键简单多了,物理按键还要按键(废话),但是触摸按键的可是是一个铜片,铁片,金属片(反正是导体就行了)。如果手头上又没有pcb按钮的,可以自己随便找个废板,在有铜片的地方挖个按钮引条线出来也是可以的,甚至拿一条导线也可以。手按按钮时要在按键上贴个胶纸绝缘,不然,按下的时候电流都被人体吸光了。 要说明一下,程序和硬件都是借鉴STM8,ST有相关例程,是AN几就忘了
[单片机]
STM32定时器触发DMA数据传输失败的原因如何解决
有人使用STM32的定时器事件触发DMA,让其将内存数据传输到通信外设的数据寄存器进行发送,发现DMA根本就不动作。 比方以基于STM32F411的芯片为例,通过TIM3更新事件触发DMA请求,DMA从内存将数据送到SPI1‍的数据寄存器,从而完成数据发送。 他采用CubeMx进行配置。基本配置如下: ‍ 相关用户实现代码如下: 从配置过程和代码实现来看,似乎都没有问题。那DMA怎么就是不动作呢? 问题出在我们使用上面的函数做DMA传输所关联源端和目标端时,出现了想当然的情况。 我们利用TIMER事件来作为DMA请求源时,而作为数据传输的源端或目的端,都是我们用户指定的。这时就一定要注意源端和目标端是当前DMA
[单片机]
<font color='red'>STM32</font>定时器触发DMA数据传输失败的原因如何解决
STM32中断优先级实例
本例示范了如何使用嵌套向量中断控制器(Nested Vectored Interrupt Controller)来设置各个中断的优先级(Preemption Priority和SubPriority)。 设置2条外部中断线路(线路3和线路4)在每一个输入信号下降沿产生中断,开启SysTick中断。 这3个中断的优先级设置如下: EXTI Line3: PreemptionPriority = PreemptionPriorityValue SubPriority = 0 EXTI Line4: PreemptionPriority = 0 SubPriority = 1 Sys
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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