历史上的今天
返回首页

历史上的今天

今天是:2025年06月26日(星期四)

正在发生

2018年06月26日 | STM32标准库中的GPIO_Pin_N与GPIO_PinSourceN话题

2018-06-26 来源:eefocus

最近做项目遇到这个问题,上网看到这篇文章,感觉很好,是人家的实际项目中总结出来的,转载过来,用以学习交流。一开始我也是分不清这两个参数的定义,总是以为是一样的,没注意他们的区别,以至于在按键消抖上面,总是不能很好的消抖,按下按键屏幕老是闪一下。原因就是我把该写GPIO_Pin_N的写成了GPIO_PinSourceN,其实这点和keil官方的MDK有关系,手写代码的时候,编辑器首先提示的是GPIO_PinSourceN,我就直接确定了。没想到是错误的。

下面是原文:(链接:http://www.51hei.com/bbs/dpj-40992-1.html)


某日,有个工程师电话跟我交流,他在使用STM32F042芯片开发产品,用到其中的硬件I2C。利用ST官方提供的标准固件库开发应用软件。他说发现I2C功能基本不受控,尤其令他奇怪的是,I2C即使关闭了,却发现I2C脚上还有脉冲出现。

他问我是否STM32F0芯片在I2C这里做了什么特别的调整,因为他之前用过STM32F1系列的芯片。我心想,再怎么调整也不应该调整出这个效果啊,我首先怀疑他代码是否哪里有问题,尤其I2C及相关GPIO的配置。建议其做与I2C有关的初始化配置代码的检查确认。

后来,他通过QQ留言反馈给我,说找到原因了。原因就是将有关PA9,PA10的复用功能配置语句做了调整就OK。显然,这里PA9,PA10是被复用为I2C通信脚。



调整前的代码
GPIO_PinAFConfig(GPIOA,GPIO_Pin_9,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_Pin_10,GPIO_AF_4);

调整后的代码
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_4);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_4);


不难看出,该工程师调整的就是上面红色参数部分。一个是GPIO_Pin_N,一个是GPIO_PinSourceN,其实这2个参数是不一样的。

GPIO_Pin_n可以理解为某端口脚在整个端口的位置。比方某GPIO口的第6管脚位置编码GPIO_Pin_6 被定义为 ((uint16_t)0x0040) ,在对相应GPIO管脚做基本属性配置时会用到,如配置输入输出模式、模拟输入模式的选择等。有兴趣的话,可以点击GPIO_Init( )进去看看。

而GPIO_PinSourceN一般是在对某GPIO口相应pin脚的复用功能进行选择配置才会用到。它是根据端口各脚位的位置按顺序从0开始依次递增编号,可以理解为该管脚在该端口的序号。比方某GPIO口的第6号复用功能脚的序号GPIO_PinSource6 被定义为 ((uint8_t)0x06) 。有兴趣的话,也可以打开GPIO_PinAFConfig( )函数看看。显然,GPIO_PinSource6跟上面的GPIO_Pin_6的值相差甚远。


下面是ST官方库代码中有关GPIO_Pin_N的定义:

#define GPIO_Pin_0 ((uint16_t)0x0001)

#define GPIO_Pin_1 ((uint16_t)0x0002)

#define GPIO_Pin_2 ((uint16_t)0x0004)

#define GPIO_Pin_3 ((uint16_t)0x0008)

#define GPIO_Pin_4 ((uint16_t)0x0010)

#define GPIO_Pin_5 ((uint16_t)0x0020)

#define GPIO_Pin_6 ((uint16_t)0x0040)

#define GPIO_Pin_7 ((uint16_t)0x0080)

#define GPIO_Pin_8 ((uint16_t)0x0100)

#define GPIO_Pin_9 ((uint16_t)0x0200)

#define GPIO_Pin_10 ((uint16_t)0x0400)

。。。。。。

#define GPIO_Pin_15 ((uint16_t)0x8000)

#define GPIO_Pin_All ((uint16_t)0xFFFF)

下面是有关GPIO_PinSourceN的定义:

#define GPIO_PinSource0 ((uint8_t)0x00)

#define GPIO_PinSource1 ((uint8_t)0x01)

#define GPIO_PinSource2 ((uint8_t)0x02)

#define GPIO_PinSource3 ((uint8_t)0x03)

#define GPIO_PinSource4 ((uint8_t)0x04)

#define GPIO_PinSource5 ((uint8_t)0x05)

#define GPIO_PinSource6 ((uint8_t)0x06)

#define GPIO_PinSource7 ((uint8_t)0x07)

#define GPIO_PinSource8 ((uint8_t)0x08)

#define GPIO_PinSource9 ((uint8_t)0x09)

#define GPIO_PinSource10 ((uint8_t)0x0A)

。。。。。。

#define GPIO_PinSource15 ((uint8_t)0x0F)


小结:上面的问题只有基于STM32官方固件库开发时才会碰到。说实在的,这两个参数的确容易让人误解成一个东西或者弄混淆,尤其刚接触的人。经常有人在这个地方遇到麻烦,之前我在一篇文章中提到过。这里再特意提醒下。

不过ST官方后来推出的STM32CUBE库在这个地方的代码写法做了调整,不再定义GPIO_PinSourceN。当然,因为管脚配置导致异常的问题时有发生,建议使用ST官方推出的STM32CUBE配置环境及CUBE参考固件库着手开发,这样会省不少事。


推荐阅读

史海拾趣

CP Technology Inc公司的发展小趣事

CP Technology Inc成立之初,便专注于半导体技术的研发。公司研发团队成功开发出一种高效能、低功耗的芯片,这一创新为公司的快速崛起奠定了基石。随着技术的不断完善和产品的广泛应用,CP Technology Inc逐渐在半导体市场上占据了一席之地。公司通过持续的技术创新和产品迭代,不断满足市场需求,赢得了客户的信赖和支持。

超音(CY)公司的发展小趣事

品质是超音一直以来的追求。公司注重产品质量管理,建立了完善的质量检测体系,确保每一件产品都符合高标准的质量要求。同时,超音还加强了品牌建设,通过广告宣传、赞助活动等方式提升品牌知名度和美誉度。这些努力使得超音在消费者心中树立了良好的品牌形象,为公司的长期发展奠定了坚实的基础。

DYMO公司的发展小趣事

近年来,DYMO公司越来越注重环保和可持续发展。公司采用环保材料制造产品,并推广循环使用和回收计划。此外,DYMO公司还积极参与各种环保活动,致力于减少生产过程中的碳排放和废弃物排放。这些举措不仅提高了DYMO公司的社会形象,也为其未来的发展奠定了更加坚实的基础。

骏晔科技(DreamLNK)公司的发展小趣事

物联网设备的互操作性一直是行业内的挑战。骏晔科技在面对这一挑战时,积极寻求解决方案。公司通过与多家物联网系统提供商合作,共同推动物联网互操作性标准的制定和实施。同时,公司还针对不同类型的物联网设备,提供定制化的RF模块和解决方案,帮助客户实现设备的互联互通。

Corex Intervest Inc公司的发展小趣事

随着技术的不断发展,Corex Intervest Inc公司意识到要想在竞争激烈的电子行业中脱颖而出,必须不断进行技术创新和产品升级。因此,公司加大了研发投入,引进了一批高端人才,积极研发新型电子产品。经过多年的努力,公司成功开发出了一系列具有创新性和市场竞争力的产品,如智能传感器、高性能电源模块等,为公司的发展奠定了坚实的基础。

Advanced Fibreoptic Engineering Ltd公司的发展小趣事

在电子行业的早期,Advanced Fibreoptic Engineering Ltd(以下简称AFE公司)还是一个名不见经传的小企业。然而,随着技术的不断进步,AFE公司凭借其在光纤技术领域的深厚积累,成功研发出了一种具有划时代意义的新型光纤材料。这种材料不仅传输速度快,而且损耗极低,极大地提高了数据传输的效率和质量。这一技术突破迅速为AFE公司赢得了市场认可,公司的订单量激增,业绩逐年攀升。

随着技术的推广和应用,AFE公司的光纤产品逐渐在通信、医疗、工业等多个领域得到广泛应用。公司不仅在国内市场占据了一席之地,还积极拓展海外市场,与国际知名企业建立了稳定的合作关系。凭借卓越的产品性能和良好的市场口碑,AFE公司逐渐在电子行业中崭露头角,成为了光纤技术领域的佼佼者。

以上是第一个故事的示例,若您想要探索更多关于AFE公司的发展故事,请输入继续。

(注:由于我无法实时获取具体公司的实际发展故事,以上故事为虚构内容,仅用于展示故事编写风格和结构。如果您需要真实、具体的故事,请提供更多关于AFE公司的信息,以便我能为您编写更贴近实际的内容。)

问答坊 | AI 解惑

调试伺服系统心得2

    今天特意留意下机台配电电盘的硬件构造,终于弄清隔离地与模拟地的差异。而且在工控产品好多会涉及到隔离地的问题。我前天看了电路原理图,也问了我部门老大,但是我没太在意。在测试前准备工作中,我因隔离地问题,将一块USB转 ...…

查看全部问答>

没搞明白,取补是如何实现双字节减法的

(PIC18F248) NEG_A                                        ;ACCA取补子程序       &nbs ...…

查看全部问答>

STR730的疑惑

近来用STR730搞个项目发觉EIC算中断程序地址这样算   0XF3E0+0X00000040+8+0XFFFFFC18  = 0x0000f040事实上跳到0X80000040处,高16位就不说了,固定的,低16位就搞不懂了,多了个0XF000即0XF3E0表示的偏移量是0 ...…

查看全部问答>

请教STM32高级定时器PWM输出极性问题

TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;   //配置输出极性(TIM 输出比较极为低) 下载 (23.24 KB) 2010-10-5 22:13 …

查看全部问答>

请问自定义数组到底放到程序page0,还是1中,再问这句话,是否说:变量溢出

error: can\\\'t allocate .text (sz: 00002cc0 page: 0) in PRAMH0 (avail:             00000ffe) 我应该怎么修改,谢谢…

查看全部问答>

谁来支援我一下...SDIO和RTC的中断套嵌该怎么处理?

RT.现在在做一个小模块.RTC生成时间作为日志的一部分保存在SD卡上.可是...中断好像冲突了.不能1s生成一个文件.1s中断不执行..咋办呢 具体如下: 主函数中 void InterruptConfig(void) {   /* Deinitializes the NVIC */  &nb ...…

查看全部问答>

msp430与PC机远程通信

我用msp430f149与PC机进行远程通信,用max487转换为485接口,单片机发送到PC机的数据,PC机能正确收到,但PC机发送到单片机的数据,单片机收不到,哪位大侠知道为什么?帮帮忙,我着急啊!…

查看全部问答>

晶振的峰值电压问题

我用的一个16MHZ的高速晶振源,它的峰值电压在1V左右,在2131上测试了结果跑不起来,是根本不能用还是别的原因?…

查看全部问答>

无线供电

高手帮助指导LC振荡电路LC振荡电路本身很简单,通电可工作,并可点亮一个LED,不知道怎么提升功率.BD336E中功三极管率,电压12V,电流50MA左右,线圈用.38mm,10T,50T,50T,线圈直径50mm,想点亮十六个LED,并接,电压5V,电流100MA左右, [ 本帖最后由 a37113 ...…

查看全部问答>

就业问题

2013年趋势分析:智能电视还能变啥样? 2012-11-14 13:05:52   来源:中国家电在线        从黑白到彩色,从模拟到数字,从平面到2D再到3D,从“看电视”到“用电视”再到“玩电视”……日新月异的电视技术 ...…

查看全部问答>