ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32库函数是什么意思呢?和寄存器有什么联系呢(下)?

2021-04-02 20:57:09  阅读:280  来源: 互联网

标签:0000 Pin STM32 Mode 寄存器 GPIO 库函数 Speed 赋值


1.我们继续打开这个函数,看看第二个变量
在这里插入图片描述
我们发现这第二个变量的的结构体里是这个东西,刚好事一个基本的配置GPIO所需要的变量。
uint16_t GPIO_Pin; //无符号型16位变量 代表引脚号
GPIOSpeed_TypeDef GPIO_Speed;//结构体类型 代表速度
GPIOMode_TypeDef GPIO_Mode; 结构体类型 代表引脚模式
在这里插入图片描述
2.继续打开第二个变量结构体里的枚举类型(看他们如何赋值)
①这是GPIO_Pin的赋值选择
在这里插入图片描述
②这是GPIO_Speed的赋值选择
在这里插入图片描述
③这是GPIO_Mode的赋值选择
在这里插入图片描述
④我们挑选GPIO_Mode的赋值选择函数来讲解
typedef enum
{ xxxx
}GPIOMode_TypeDef;
//重命名一个枚举类型,他的名字是GPIOMode_TypeDef,他的取值范围只能是大括号{}里的xxx;
这样就限定了这个GPIOMode_TypeDef的取值只能是GPIO的这8种模式。
同理GPIO_Speed的取值范围也用了枚举变量enum去限制
GPIO_Pin的取值则是用了宏定义的方式定义了一大堆数组。

3.现在我们假设这样配置一下GPIO
在这里插入图片描述
这个函数是配置PB5为推挽输出输出,速率为50Mhz
3.1把他们赋值的值找出来看是多少
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ps:(由于枚举变量的性质,虽然没赋值,GPIO_Speed_50MHz=3 )
3.2把他们的赋值值化成2进制。
GPIO_Pin_5=((uint16_t)0x0020)=0000 0000 0010 0000
GPIO_Mode_Out_PP=0x10=0000 0000 0001 0000
GPIO_Speed_50MHz=3=0000 0000 0000 0000 0000 0000 0000 0011

3.2现在我们打开寄存器手册和结构体的函数情况
在这里插入图片描述
在这里插入图片描述
这个函数是实现了GPIO_Pin_5 GPIO_Mode_Out_PP GPIO_Speed_50MHz这三个值得移位拼接,c语言一般的应该能看懂,不多赘述,说不清。
总之最后拼接出来的tmpreg值=0000 0000 0011 0000 0000 0000 0000 0000
而GPIOx->CRL = tmpreg;就刚好是对GPIOA的寄存器地址里写入了0000 0000 0011 0000 0000 0000 0000 0000 这个值。对照手册,刚好是对寄存器进行了50MHZ推完输出模式
在这里插入图片描述
这样就完成了库函数和寄存器之间的转化了。
关于这个函数实现我没说清楚,也说不清。总之就是将这几个值<<>>&|操作把他们合并在一起,如果认真看看这个函数就会发现是个很精妙的算法。
诸君共勉,加油!

标签:0000,Pin,STM32,Mode,寄存器,GPIO,库函数,Speed,赋值
来源: https://blog.csdn.net/weixin_44941716/article/details/115407071

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有