- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章STM32 开发基础知识
下面我们再跟《 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
您可能关注的文档
最近下载
- 2025南京市专业技术人员继续教育公需课答案:《从大模型到智能超算的思考》(100分).doc VIP
- GKG-GSE-印刷机使用说明书.pdf VIP
- 历史记载-中西闻见录20.pdf VIP
- 历史记载-中西闻见录19.pdf VIP
- 活跃气氛课前热身小游戏破冰课堂游戏看图猜成语.pptx
- 2025秋苏教版(2024)科学三年级上册第四单元空气的性质《14 称空气》教学设计.docx VIP
- 2025秋苏教版(2024)科学三年级上册第四单元空气的性质《13 吹气球》教学设计.docx VIP
- 2025秋苏教版(2024)科学三年级上册第四单元《16 风的形成》教学设计.docx VIP
- 干货调料食材配送服务投标方案(技术方案).doc
- 2025秋苏教版(2024)科学三年级上册第四单元《15热气球》教学设计.docx VIP
文档评论(0)