STM32F103固件库原理解析_第1页
STM32F103固件库原理解析_第2页
STM32F103固件库原理解析_第3页
STM32F103固件库原理解析_第4页
STM32F103固件库原理解析_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

探讨探讨STM32F103STM32F103 的固件库原理的固件库原理 一 通过一个端口操作分析固件库原理 一 通过一个端口操作分析固件库原理 LED0 0 LED0 0 这是个输出命令 将PA 8口置低电位 它由下面的宏完成 define define LED0LED0 PAout 8 PAout 8 PA8PA8 这个宏将使用PAout n 这个宏 define define PAout n PAout n BIT ADDR GPIOA ODR Addr n BIT ADDR GPIOA ODR Addr n 输出输出 这个宏又要引用 BIT ADDR 也就是位地址定义 这里它使用了 GPIOA ODR Addr这个宏 带两个参数 一个是PA的ODR 可能是输出寄存器 地址 IO IO口操作宏定义口操作宏定义 define define BITBAND addr BITBAND addr bitnum bitnum addr addr 这条语句 就相当于 volatile volatile unsignedunsigned longlong 0 x422101A00 x422101A0 0 0 虽然针对这样一个只是为了把一个输出管脚电位置低 固件库就做了这么多的转换 但这样的设计 是为了很好的重用性 相近系列的产品只需要稍作基址改动就可以 移植 而且 这样只是编译器的工作复杂了些 最终的代码量并不大 二 通过一个设置语句分析固件库原理 二 通过一个设置语句分析固件库原理 RCC CFGR 0X00000400 RCC CFGR 0X00000400 APB1 DIV2 APB2 DIV1 AHB DIV1 APB1 DIV2 APB2 DIV1 AHB DIV1 先看一下RCC的定义 看到后面我们就会知道 RCC是复位和时钟控制寄存器 define define RCCRCC RCC TypeDef RCC TypeDef RCC BASE RCC BASE 也就是说它是一个值为RCC BASE 的 RCC TypeDef 类型的指针 RCC BASE 等于多少 在固件库中 带BASE都是一类特殊功能寄存器的基址 我们向上追溯定义 define define RCC BASERCC BASE AHBPERIPH BASE AHBPERIPH BASE 0 x1000 0 x1000 define define AHBPERIPH BASEAHBPERIPH BASE PERIPH BASE PERIPH BASE 0 x20000 0 x20000 define define PERIPH BASEPERIPH BASE u32 0 x40000000 u32 0 x40000000 看到了吧 这次又追溯到了PERIPH BASE 那么 RCC BASE 就等于 u32 0 x40000000 0 x20000 0 x1000 u32 0 x40000000 0 x20000 0 x1000 u32 0 x40021000 u32 0 x40021000 对吧 我们再看一下 RCC TypeDef 这个类型的定义 ResetReset andand ClockClock ControlControl typedeftypedef structstruct vu32vu32 CR CR vu32vu32 CFGR CFGR vu32vu32 CIR CIR vu32vu32 APB2RSTR APB2RSTR vu32vu32 APB1RSTR APB1RSTR vu32vu32 AHBENR AHBENR vu32vu32 APB2ENR APB2ENR vu32vu32 APB1ENR APB1ENR vu32vu32 BDCR BDCR vu32vu32 CSR CSR RCC TypeDef RCC TypeDef 这个结构体类型包含多个成员 每个成员都是一个特殊功能寄存器 而且我们确定一定以及肯定确定一定以及肯定这些寄存器都是从RCC BASE这个基地址按顺序进行组织 的 而这个宏传递了这个基地址的指针 define define RCCRCC RCC TypeDef RCC TypeDef RCC BASE RCC BASE 我们就可以用这个指针对成员进行访问 RCC CFGR 0X00000400 RCC CFGR 0X00000400 真相大白了吧 哈哈 三 固件库在如何检查实参的合法性 三 固件库在如何检查实参的合法性 先看一个函数 voidvoid MY NVIC SetVectorTable u32MY NVIC SetVectorTable u32 NVIC VectTab NVIC VectTab u32u32 Offset Offset 检查参数合法性检查参数合法性 assert param IS NVIC VECTTAB NVIC VectTab assert param IS NVIC VECTTAB NVIC VectTab assert param IS NVIC OFFSET Offset assert param IS NVIC OFFSET Offset SCB VTORSCB VTOR NVIC VectTab OffsetNVIC VectTab Offset u32 0 x1FFFFF80 设置设置NVICNVIC的向量表偏移寄存器的向量表偏移寄存器 用于标识向量表是在用于标识向量表是在CODECODE区还是在区还是在RAMRAM区区 这个函数用assert param IS NVIC VECTTAB NVIC VectTab 语句来检查参数的合 法性 我们向上追溯 ifdef ifdef DEBUGDEBUG MacroMacro NameName assert paramassert param DescriptionDescription TheThe assert paramassert param macromacro isis usedused forfor function sfunction s parametersparameters check check ItIt isis usedused onlyonly ifif thethe librarylibrary isis compiledcompiled inin DEBUGDEBUG mode mode InputInput expr expr IfIf exprexpr isis false false itit callscalls assert failedassert failed functionfunction whichwhich reportsreports thethe namename ofof thethe sourcesource filefile andand thethe sourcesource lineline numbernumber ofof thethe callcall thatthat failed failed IfIf exprexpr isis true true itit returnsreturns nono value value ReturnReturn NoneNone define define assert param expr assert param expr expr expr void 0 void 0 assert failed u8assert failed u8 FILE FILE LINE LINE ExportedExported functionsfunctions voidvoid assert failed u8 assert failed u8 file file u32u32 line line else else define define assert param expr assert param expr void 0 void 0 endif endif DEBUGDEBUG 很明显 这些宏只是在 DEBUG 的时候使用 如果不是 DEBUG 状态 展开后的结果是 void 0 void 0 空值 什么也没做 但编译器在进行语法检查时 这个类似断言的语句是有效的 define define assert param expr assert param expr expr expr void 0 void 0 assert failed u8assert failed u8 FILE FILE LINE LINE 如果 表达式 expr 为真 结果为 void 0 否则按出错处理 调用assert failed assert failed 它的原型是 voidvoid assert failed u8 assert failed u8 file file u32u32 line line 这个 assert failed 函数的作用 将文件指针与出错行数传送给编译器 以便它进行处理 表达式的构成是最精彩的 IS NVIC VECTTAB NVIC VectTab IS NVIC VECTTAB NVIC VectTab IS NVIC VECTTAB的宏定义是这样的 define define NVIC VectTab RAMNVIC VectTab RAM u32 0 x20000000 u32 0 x20000000 define define NVIC VectTab FLASHNVIC VectTab FLASH u32 0 x08000000 u32 0 x08000000 define define IS NVIC VECTTAB VECTTAB IS NVIC VECTTAB VECTTAB VECTTAB VECTT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论