百科狗-知识改变命运!
--

stm32操作mfrc500的函数谁有啊。给一个参考一下

乐乐1年前 (2023-12-19)阅读数 7#综合百科
文章标签寄存器引脚

var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);

-2-

}GPIOSpeed_TypeDef;

则可知GPIOSpeed_TypeDef枚举类型同一只,其功能是定义一个枚举类型变量,该变量可表示GPIO_Speed_10MHz、GPIO_Speed_2MHz和GPIO_Speed_50MHz三个含义(其中GPIO_Speed_10MHz已经定义为1,读者必须知道GPIO_Speed_2MHz则依次被编译器赋予2,而GPIO_Speed_50MHz为3)。

同样也在“stm32f10x_gpio.h”文件中找到对GPIOMode_TypeDef的定义:

typedefenum{

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_Mode_AIN、GPIO_Mode_AF_OD等(也可以轻易判断出这表示GPIO设备的工作模式)。至此对程序段一的①解析可以做一个总结:该行定义一个结构体类型的变量GPIO_InitStructure,并且该结构体有3个成员,分别为GPIO_Pin、GPIO_Speed和GPIO_Mode,并且GPIO_Pin表示GPIO设备引脚GPIO_Speed表示GPIO设备速率和GPIO_Mode表示GPIO设备工作模式。

接下来是②,此句是一个赋值语句,把GPIO_Pin_4赋给GPIO_InitStructure结构体中的成员GPIO_Pin,可以在“stm32f10x_gpio.h”文件中找到对GPIO_Pin_4做的宏定义:

#defineGPIO_Pin_4((u16)0x0010)因此②的本质是将16位数0x0010赋给GPIO_InitStructure结构体中的成员GPIO_Pin。

③语句和②相似将GPIO_Speed_50MHz赋给GPIO_InitStructure结构体中的成员GPIO_Speed,但注意到此处GPIO_Speed_50MHz只是一个枚举变量,并非具体的某个值。

④语句亦和②语句类似,把GPIO_Mode_Out_PP赋给GPIO_InitStructure结构体中的成员GPIO_Mode,从上文可知GPIO_Mode_Out_PP的值为0x10。

⑤是一个函数调用,即调用GPIO_Init函数,并提供给该函数2个参数,分别为GPIOA和&GPIO_InitStructure,其中&GPIO_InitStructure表示结构体变量GPIO_InitStructure的地址,而GPIOA则在“stm32f10x_map.h”文件中找到定义:

#ifdef_GPIOA

#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)#endif

此三行代码是一个预编译结构,首先判断是否定义了宏_GPIOA。可以在“stm32f10x_conf.h”中发现对_GPIOA的定义为:#define_GPIOA。这表示编译器会将代

-3-

码中出现的GPIOA全部替换为((GPIO_TypeDef*)GPIOA_BASE)。从该句的C语言语法可以判断出((GPIO_TypeDef*)GPIOA_BASE)的功能为将GPIOA_BASE强制类型转换为指向GPIO_TypeDef类型的结构体指针变量。

如此则需要找出GPIO_TypeDef的原型及GPIOA_BASE的含义。同样GPIO_TypeDef的原型位于“stm32f10x_gpio.h”文件,原型如下:

typedefstruct{

vu32CRL;vu32CRH;vu32IDR;vu32ODR;vu32BSRR;vu32BRR;vu32LCKR;}GPIO_TypeDef;

这里把GPIO寄存器封装成结构体,即把GPIO的各寄存器类型设为结构体成员,结构体类型名定义为GPIO_TypeDef。

GPIOA_BASE的含义在“stm32f10x_map.h”文件中找到:

#defineGPIOA_BASE(APB2PERIPH_BASE+0x0800)#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#definePERIPH_BASE((u32)0x40000000)

明显GPIOA_BASE表示一个地址,通过将以上3个宏展开可以得到:

GPIOA_BASE=0x40000000+0x10000+0x0800;

此处的关键便在于0x40000000、0x10000和0x0800这三个数值的来历。读者应该通过宏名猜到了,这就是STM32微控制器的GPIOA的设备地址。通过查阅STM32微控制器参考手册可以得知,STM32的外设起始基地址为0x40000000,而APB2总线设备起始地址相对于外设基地址的偏移量为0x10000,GPIOA设备相对于APB2总线设备起始地址偏移量为0x0800。

对⑤句代码进行一个总结:调用GPIO_Init函数,并将STM32微控制器的GPIOA设备地址和所定义的结构体变量GPIO_InitStructure的地址传入。

以上是对GPIOA初始化库函数的剖析,现继续转移到函数内部分析,GPIO_Init函数原型如程序段二:

voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct){

u32currentmode=0x00,currentpin=0x00,pinpos=0x00,pos=0x00;u32tmpreg=0x00,pinmask=0x00;

/*检查参数是否正确*/

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

stm32操作mfrc500的函数谁有啊。给一个参考一下

assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));

-4-

/*将工作模式暂存至currentmode变量中*/

currentmode=((u32)GPIO_InitStruct->GPIO_Mode)&((u32)0x0F);/*如果欲设置为任意一种输出模式,则再检查”翻转速率“参数是否正确*/

if((((u32)GPIO_InitStruct->GPIO_Mode)&((u32)0x10))!=0x00){

assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));currentmode|=(u32)GPIO_InitStruct->GPIO_Speed;}

/*设置低八位引脚(即pin0~pin7)*/

if(((u32)GPIO_InitStruct->GPIO_Pin&((u32)0x00FF))!=0x00){

/*读出当前配置字*/tmpreg=GPIOx->CRL;

for(pinpos=0x00;pinpos

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)