第4章STM32开发基础知识案例.ppt

  1. 1、本文档共79页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
下面我们再跟《 STM32 中文参考手册 V10》比较一下看看 GPIOA 的基地址是不是0截图 P28 存储器映射表我们可以看到, GPIOA 的起始地址也就是基地址确实是 0 上面我们已经知道 GPIOA 的基地址,那么那些 GPIOA 的 7 个寄存器的地址又是怎么算出来的呢??在上面我们讲过 GPIOA 的各个寄存器对于 GPIOA 基地址的偏移地址,所以我们自然可以算出来每个寄存器的地址。 GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相对 GPIOA 基地址的偏移值 这个偏移值在上面的寄存器地址映像表中可以查到。 结构体存储的成员他们的地址是连续的。上面讲到 GPIOA 是指向GPIO_TypeDef 类型的指针,又由于 GPIO_TypeDef 是结构体,所以我们就可以算出 GPIOA 指向的结构体成员变量对应地址了。 这就是为什么固件库里面: GPIOA-BRR=value;就是设置地址为 00x014(BRR 偏移量)=0的寄存器 BRR 的值了。它和 51 里面 P0=value 是设置地址为 0x80 的 P0 寄存器的值是一样的道理。 MDK 固件库快速组织代码技巧 现在我们要初始化某个 GPIO 端口,我们要怎样快速操作呢?在头文件 stm32f10x_gpio.h头文件中定义 GPIO 初始化函数为: void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct); 现在我们想写初始化函数,那么我们在不参考其他代码的前提下,怎么组织代码呢? 首先,我们可以看出,函数的入口参数是 GPIO_TypeDef类型指针和 GPIO_InitTypeDef类型 指 针 , 因 为 GPIO_TypeDef 入 口 参 数 比 较 简 单 , 所 以 我 们 通 过 第 二 个 入 口 参 数 GPIO_InitTypeDef类型指针来讲解。双击 GPIO_InitTypeDef后右键选择“Go to definition…” 查看类型定义方法 于是定位到 stm32f10x_gpio.h 中 GPIO_InitTypeDef的定义处: typedef struct { uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; GPIOMode_TypeDef */ }GPIO_InitTypeDef; 可以看到这个结构体有 3 个成员变量,这也告诉我们一个信息,一个 GPIO 口的状态是由速度(Speed)和模式(Mode)来决定的。我们首先要定义一个结构体变量,下面我们定义: GPIO_InitTypeDef GPIO_InitStructure; 接着我们要初始化结构体变量 GPIO_InitStructure。首先我们要初始化成员变量 GPIO_Pin,这个时候我们就有点迷糊了,这个变量到底可以设置哪些值呢?这些值的范围有什么规定吗?这里我们就要找到 GPIO_Init()函数的实现处, 同样,双击 GPIO_Init,右键点击“ Go todefinition of …”,这样光标定位到stm32f10x_gpio.c 文件中的 GPIO_Init 函数体开始处,我们可以 看到在函数的开始处有如下几行: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) { …… /* Check the parameters */ assert_param(IS_GPIO_ALL_PERIPH(GPIOx)); assert_param(IS_GPIO_MODE(GPIO_InitStructGPIO_Mode)); assert_param(IS_GPIO_PIN(GPIO_InitStruct-GPIO_Pin)); …… assert_param(IS_GPIO_SPEED(GPIO_InitStructGPIO_Speed)); …… } 顾名思义, assert_param 函数式对入口参数的有效性进行判断,所以我们可以从这个函数入手,确定我们的入口参数的范围。第一行是对第一个参数 GPIOx 进行有效性判断,双击“ IS_GPIO_ALL_PERIPH”右键点击“ go to defition of…” 定位到了下面的定义: #define IS_GPIO_ALL_PERIP

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档