历史上的今天
返回首页

历史上的今天

今天是:2024年12月23日(星期一)

正在发生

2020年12月23日 | STM32:stm32f10x_gpio.c中GPIO_Init的分析说明

2020-12-23 来源:eefocus

1 /**
2 *函数功能:初始化引脚模式
3 *参数说明:GPIOx,该参数为GPIO_TypeDef 类型的指针,指向GPIO 端口的地址
4 * GPIO_InitTypeDef:GPIO_InitTypeDef 结构体指针,指向初始化变量
5 */
6 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
7 {
8         uint32_t currentmode =0x00,currentpin = 0x00,pinpos = 0x00,pos = 0x00;
9         uint32_t tmpreg = 0x00, pinmask = 0x00;
10
11 /*---------------- GPIO 模式配置 -------------------*/
12 // 把输入参数GPIO_Mode 的低四位暂存在currentmode
13         currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) &
14         ((uint32_t)0x0F);
15
16 // bit4 是1 表示输出,bit4 是0 则是输入
17 // 判断bit4 是1 还是0,即首选判断是输入还是输出模式
18         if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) &
19         ((uint32_t)0x10)) != 0x00)
20         {
21 // 输出模式则要设置输出速度
22                 currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
23 }
24 /*-----GPIO CRL 寄存器配置 CRL 寄存器控制着低8 位IO- ----*/
25 // 配置端口低8 位,即Pin0~Pin7
26                 if (((uint32_t)GPIO_InitStruct->GPIO_Pin &
27                ((uint32_t)0x00FF)) != 0x00)
28 {
29 // 先备份CRL 寄存器的值
30 tmpreg = GPIOx->CRL;
31
32 // 循环,从Pin0 开始配对,找出具体的Pin
33 for (pinpos = 0x00; pinpos < 0x08; pinpos++)
34 {
35 // pos 的值为1 左移pinpos 位
36 pos = ((uint32_t)0x01) << pinpos;
37
38 // 令pos 与输入参数GPIO_PIN 作位与运算
39 currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
40
41 //若currentpin=pos,则找到使用的引脚
42 if (currentpin == pos)
43 {
44 //pinpos 的值左移两位(乘以4),因为寄存器中4 个位配置一个引脚
45 pos = pinpos << 2;
46 //把控制这个引脚的4 个寄存器位清零,其它寄存器位不变
47 pinmask = ((uint32_t)0x0F) << pos;
48 tmpreg &= ~pinmask;

50 // 向寄存器写入将要配置的引脚的模式
51 tmpreg |= (currentmode << pos);
52
53 // 判断是否为下拉输入模式
54 if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
55 {
56 // 下拉输入模式,引脚默认置0,对BRR 寄存器写1 对引脚置0
57 GPIOx->BRR = (((uint32_t)0x01) << pinpos);
58 }
59 else
60 {
61 // 判断是否为上拉输入模式
62 if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
63 {
64 // 上拉输入模式,引脚默认值为1,对BSRR 寄存器写1 对引脚置1
65 GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
66 }
67 }
68 }
69 }
70 // 把前面处理后的暂存值写入到CRL 寄存器之中
71 GPIOx->CRL = tmpreg;
72 }
73 /*--------GPIO CRH 寄存器配置 CRH 寄存器控制着高8 位IO- -----*/
74 // 配置端口高8 位,即Pin8~Pin15
75 if (GPIO_InitStruct->GPIO_Pin > 0x00FF)
76 {
77 // // 先备份CRH 寄存器的值
78 tmpreg = GPIOx->CRH;
79
80 // 循环,从Pin8 开始配对,找出具体的Pin
81 for (pinpos = 0x00; pinpos < 0x08; pinpos++)
82 {
83 pos = (((uint32_t)0x01) << (pinpos + 0x08));
84
85 // pos 与输入参数GPIO_PIN 作位与运算
86 currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
87
88 //若currentpin=pos,则找到使用的引脚
89 if (currentpin == pos)
90 {
91 //pinpos 的值左移两位(乘以4),因为寄存器中4 个位配置一个引脚
92 pos = pinpos << 2;
93
94 //把控制这个引脚的4 个寄存器位清零,其它寄存器位不变
95 pinmask = ((uint32_t)0x0F) << pos;
96 tmpreg &= ~pinmask;
97
98 // 向寄存器写入将要配置的引脚的模式
99 tmpreg |= (currentmode << pos);
100
101 // 判断是否为下拉输入模式
102 if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
103 {
104 // 下拉输入模式,引脚默认置0,对BRR 寄存器写1 可对引脚置0
105 GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));
106 }
107 // 判断是否为上拉输入模式
108 if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
109 {
110 // 上拉输入模式,引脚默认值为1,对BSRR 寄存器写1 可对引脚置1
111 GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));
112 }
113 }
114 }

115 // 把前面处理后的暂存值写入到CRH 寄存器之中
116 GPIOx->CRH = tmpreg;
117 }
118 }


推荐阅读

史海拾趣

Artaflex公司的发展小趣事

面对全球电子市场的不断扩张,Artaflex公司制定了全球化的发展战略。公司通过设立海外分支机构、拓展国际市场、参与国际展会等方式,不断提升品牌知名度和市场份额。同时,公司还积极引进国际先进技术和管理经验,提升自身的竞争力。这一战略的实施使得Artaflex在全球电子行业中占据了重要地位。

南京绿芯(Grenergy)公司的发展小趣事

随着环保意识的日益增强,Artaflex公司积极响应绿色发展的号召,将环保理念融入企业的生产和经营中。公司采用环保材料和生产工艺,减少生产过程中的环境污染。同时,公司还加强废弃物的处理和回收利用,降低对环境的影响。这一举措不仅提升了公司的社会形象,也为其在绿色电子市场中赢得了更多的商机。


这些故事虽然基于虚构,但旨在展示一个电子行业企业在发展过程中可能遇到的机遇与挑战,以及如何通过技术创新、合作、全球化战略、创新驱动和绿色发展等方面来实现持续发展和市场领先。请注意,这些故事并不代表Artaflex公司的真实历史或现状。如需了解Artaflex公司的真实发展故事,请查阅相关公司资料或新闻报道。

Apex [Apex Microtechnology]公司的发展小趣事

在作为Cirrus Logic分公司运营了五年后,Apex Microtechnology于2012年重新回归独立私营状态。这次变革使得Apex Microtechnology能够更加灵活地应对市场变化,加速产品创新和研发。同时,公司也扩大了其业务范围,进一步巩固了在电子行业的地位。

Ememory Technology Inc公司的发展小趣事

在2022年,eMemory宣布加入英特尔晶圆代工服务加速器(Intel Foundry Services Accelerator)计划。这一合作标志着eMemory的技术得到了国际半导体巨头的认可。通过这一计划,eMemory为使用英特尔晶圆代工服务的客户提供全球领先的安全IP解决方案,进一步提升了其产品在全球市场的竞争力。

GWP Group公司的发展小趣事

除了自主研发外,eMemory还积极寻求与外部合作伙伴的联合研发。在2016年,eMemory与马来西亚的半导体晶圆代工厂Silterra联合宣布,基于Silterra 0.18微米CMOS制程技术的一次性可编程(OTP)存储器已经通过了验证。这一合作不仅证明了eMemory技术的先进性和可靠性,还为双方带来了新的市场机遇。

General Cable公司的发展小趣事
通常与YN5203数字译码器配套使用,实现完整的遥控编码和解码功能。

问答坊 | AI 解惑

到了新单位,接手一个新项目,让我认识到了开发板的重要性

从刚毕业时候买的单片机到FPGA再到ARM,可以说我每样都买了一块学习板,但一直以来都是拿它做为学习之用,根本没有用到实际工作中去,这次到了新单位,接手一个项目是对他们原来的一个产品进行性能和可靠性进行提高,原来的产品是用51做的,这次我 ...…

查看全部问答>

飞凌S3C2440开发板路由实验代码

PS:本文转自 飞凌嵌入式技术交流群 这个是由群里一些工程师朋友做的小实验,可以作为参考。 嵌入式Linux简单路由实验     本实验所用硬件平台为飞凌(www.witech.com.cn)TE2440V2型开发板;该开发板上有两个网卡芯片,分别为C ...…

查看全部问答>

如何选择直流输入电压?需要用到12v,6v,3.3v三档电压

整个模块有几个是12v供电的,有几个是6v的, 单片机和液晶屏是3.3v 6v的是一个小电机,12v是一个磁力锁 现在想选用4节7号电池通过升压到12v, 6v转3.3v的有没有啥dcdc的模块 这样设计是否合理,还有,有没有交流220v直接转成6v的变压器,就是 ...…

查看全部问答>

关于WINCE6.0 VS2005 “go to definition ”功能 无法定位相关内容

关于WINCE6.0 VS2005 “go to definition ”功能 无法定位相关内容 大家好!向大家请教一个问题: 我现在装了VS2005 打开mini2440的BSP包(缺省内核工程),可以编译内核通过。 我想用go to definition 功能跟踪一下程序,比如定位一个函数或 ...…

查看全部问答>

请教一个电路

    各位大大,我有一块GR47模块,想做一个最简单的外围电路,只要SIM卡槽和一些必要电路。用串口和PC连,可以发彩信。。。哪位可以告诉我这个电路可以怎么做啊?…

查看全部问答>

在手机上,如何实现自己的软件中嵌入摄像头功能,

请问大家-有没有从事过在自己的软件中嵌入摄像头功能,就是自己的软件能够同过手机的摄像头照相,并且存储,而不是用手机自带的照相机。 有这方面的书也可以,大家介绍下吧,急用。 …

查看全部问答>

大侠帮忙

现在小弟我手上有款ARM开发板、是周立功出的。型号是easyarm2104 但是所有相关的资料全丢了。有哪位大侠有的,能共享下吗?不胜感激。…

查看全部问答>

EVC3.0+PPC202程序编译出错,关于StdAfx.sbr

Compiling resources... Compiling... Error spawning clarm.exe Creating browse info file... BSCMAKE: error BK1506 : cannot open file \'.\\ARMRel\\StdAfx.sbr\': No such file or directory Error executing bscmake.exe. Main.exe - ...…

查看全部问答>

请教一个编译出错的问题

大家新年好! 我是在一个原工程的基础上做修改的,添加了一些库文件和两个源文件,然后编译时出现了问题:could not open source file \\"os\\\\osif.h\\",其实这个头文件好像是在库里面的,为什么会出现这样的问题啊? 望各位不吝赐教!先 ...…

查看全部问答>

个人觉得写得很好的关于TC35的文章

 自己在进行TC35调试过程中觉得这两篇文章对调试还是有很大的帮助的,分享给大家…

查看全部问答>