历史上的今天
返回首页

历史上的今天

今天是:2024年12月20日(星期五)

正在发生

2018年12月20日 | STM32L1xx的库函数有个Bug(stm32l1xx_gpio.c)

2018-12-20 来源:eefocus

在使用STM32L151的时候遇到 GPIO_PinAFConfig(xx,xx,xx)函数无效,有时候还有导致程序HardFault的问题。之前遇到就使用直接寄存器操作避免了这个问题,这次出现了Hardfault,我想这得找找原因了,不然每次都得修改寄存器操作,麻烦的很。


文件“stm32l1xx_gpio.c”中关于GPIO_PinAFConfig 函数式这么定义的。


当使用的引脚号大于8 的时候会导致hardFault的发生。


void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)

{

  uint32_t temp = 0x00;

  uint32_t temp_2 = 0x00;

  

  /* Check the parameters */

  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));

  assert_param(IS_GPIO_PIN_SOURCE(GPIO_PinSource));

  assert_param(IS_GPIO_AF(GPIO_AF));

  


//  temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;

//  GPIOx->AFR[GPIO_PinSource >> 0x03] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;

//  temp_2 = GPIOx->AFR[GPIO_PinSource >> 0x03] | temp;

//  GPIOx->AFR[GPIO_PinSource >> 0x03] = temp_2;

  


}




typedef struct

{

  __IO uint32_t MODER;        /*!< GPIO port mode register,                     Address offset: 0x00      */

  __IO uint16_t OTYPER;       /*!< GPIO port output type register,              Address offset: 0x04      */

  uint16_t RESERVED0;         /*!< Reserved,                                    0x06                      */

  __IO uint32_t OSPEEDR;      /*!< GPIO port output speed register,             Address offset: 0x08      */

  __IO uint32_t PUPDR;        /*!< GPIO port pull-up/pull-down register,        Address offset: 0x0C      */

  __IO uint16_t IDR;          /*!< GPIO port input data register,               Address offset: 0x10      */

  uint16_t RESERVED1;         /*!< Reserved,                                    0x12                      */

  __IO uint16_t ODR;          /*!< GPIO port output data register,              Address offset: 0x14      */

  uint16_t RESERVED2;         /*!< Reserved,                                    0x16                      */

  __IO uint16_t BSRRL;        /*!< GPIO port bit set/reset low registerBSRR,    Address offset: 0x18      */

  __IO uint16_t BSRRH;        /*!< GPIO port bit set/reset high registerBSRR,   Address offset: 0x1A      */

  __IO uint32_t LCKR;         /*!< GPIO port configuration lock register,       Address offset: 0x1C      */

  __IO uint32_t AFR[2];       /*!< GPIO alternate function low register,        Address offset: 0x20-0x24 */

  __IO uint16_t BRR;          /*!< GPIO bit reset register,                     Address offset: 0x28      */

  uint16_t RESERVED3;         /*!< Reserved,                                    0x2A                      */

} GPIO_TypeDef;


我们知道AFR是一个只有两个元素的数组,库中若引脚号大于8,会导致AFR【x】中x的值不在是0、1,而可能是0、1、2、3、4····


所以要你将0-7对应为标号0的数组成员,8-15对应到标号1的成员。


把函数体中实现部分修改下,使得不超过数组界限2个成员。


temp = ((uint32_t)(GPIO_AF) << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;

  GPIOx->AFR[(GPIO_PinSource >> 0x03)&0x01] &= ~((uint32_t)0xF << ((uint32_t)((uint32_t)GPIO_PinSource & (uint32_t)0x07) * 4)) ;

  temp_2 = GPIOx->AFR[(GPIO_PinSource >> 0x03)&0x01] | temp;

  GPIOx->AFR[(GPIO_PinSource >> 0x03)&0x01] = temp_2;


推荐阅读

史海拾趣

American Custom Components公司的发展小趣事

American Custom Components公司自创立之初,就致力于电子元器件的创新研发。在一次技术研讨会上,公司的研发团队发现了一种新型的半导体材料,具有出色的导电性和稳定性。经过数月的实验和验证,团队成功地将这种材料应用于新产品中,推出了一款性能卓越的集成电路。这一创新技术不仅提升了公司的产品质量,还赢得了市场的广泛认可,为公司的发展奠定了坚实基础。

Brainboxes公司的发展小趣事

随着全球化进程的加速,Brainboxes逐渐将业务拓展至全球范围。公司在多个国家和地区设立分支机构或销售网络,以便更好地服务当地客户。同时,Brainboxes也在不断探索新的应用领域和市场机会,为公司的未来发展奠定坚实基础。展望未来,Brainboxes将继续致力于技术创新和市场拓展,为电子行业的发展贡献更多力量。

这五个故事分别展现了Brainboxes公司在电子行业中的创立与发展、技术创新与荣誉、内部制造与供应链、客户亲密度与工业连接以及全球布局与未来展望等方面的事实。通过这些故事,可以更加全面地了解Brainboxes公司在电子行业中的成长轨迹和发展成就。

Eurotech公司的发展小趣事

Eurofarad公司深知品质是企业生存和发展的根本。因此,公司一直注重品质管理,建立了严格的质量控制体系。同时,公司还不断提升服务水平,为客户提供全方位的售前咨询和售后服务。这些措施不仅提高了客户的满意度和忠诚度,还为公司的口碑和品牌形象增添了光彩。

AOS公司的发展小趣事

进入20世纪,AOS公司开始将目光投向热水领域。1936年,公司研发出了著名的“金圭特护内胆”技术,这一创新在热水器行业中引起了革命性的变化。金圭内胆不仅提高了热水器的耐用性和安全性,也大幅提升了产品的能效。这一技术的推出使AOS公司迅速成为热水领域的领先者,并奠定了其在全球热水器市场的领导地位。

潮州三环(Three-circle)公司的发展小趣事

随着公司业务的不断拓展和市场的日益全球化,三环集团开始积极推进全球化战略。公司在广东潮州、深圳,四川成都、南充、德阳,江苏苏州,湖北武汉,中国香港,德国,泰国等地设立公司,形成了覆盖全球的产业布局。通过与国际知名企业的合作与交流,三环集团不断提升自身的技术水平和市场竞争力,逐步成为电子行业的领军企业之一。同时,公司还积极参与国际展览和论坛等活动,展示自身实力和品牌形象,为全球客户提供更优质的产品和服务。

以上五个故事分别从不同角度展现了潮州三环(Three-circle)公司在电子行业中的发展历程和成就。这些故事不仅展示了公司的创新能力和市场洞察力,也体现了公司在面对市场挑战时的勇气和决心。

Advanced Energy公司的发展小趣事

在电子行业快速发展的同时,AE公司也面临着来自市场竞争、技术更新等多方面的挑战。然而,AE公司凭借其敏锐的市场洞察力和强大的研发实力,成功应对了这些挑战。公司不断调整战略方向,优化产品结构,提升服务质量,以适应市场的变化。同时,AE公司也积极关注未来技术的发展趋势,加大在新兴领域的投入,为公司的未来发展奠定了坚实的基础。

以上只是AE公司在电子行业中的部分发展故事概述,每个故事都体现了AE公司在技术创新、市场拓展、合作伙伴关系等方面的努力和成就。这些故事不仅展示了AE公司的成长历程,也反映了整个电子行业的发展变迁。

问答坊 | AI 解惑

TI28335的参考资料集锦

28335片内FLASH插件安装方法 http://www.hellodsp.com/bbs/viewthread.php?tid=7487 28335的ADC_DMA例程 http://www.hellodsp.com/bbs/viewthread.php?tid=7488 SEED_DEC28335用户指南 http://www.hellodsp.com/bbs/viewthread.php?tid=7489 ...…

查看全部问答>

去耦电容和旁路电容的区别

旁路电容不是理论概念,而是一个经常使用的实用方法,在50 -- 60年代,这个词也就有它特有的含义,现在已不多用。电子管或者晶体管是需要偏置的,就是决定工作点的直流供电条件。例如电子管的栅极相对于阴极往往要求加有负压,为了在一个直流电源下 ...…

查看全部问答>

]经典LED知识介绍!

replyreload += \',\' + 378446;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

大家用ARM在开发什么产品?

能大概介绍下吗,本人想做ARM的产品,但不知道做什么好。 …

查看全部问答>

驻极体话筒+运算放大器+AD转换

我想把外界的音乐,声音等信号采集进单片机(AT89S51),采样频率在44.1KHz,问请用什么运算放大器和AD转换器…

查看全部问答>

WINCE 分区如何隐藏

eboot 分了 4个分区, 1个binfs 3个fatfs 3个fatfs在pc上都是别出来了, 现在遇到以下问题: 1). 我想隐藏其中2个fatfs分区, 因为 我要放 应用程序 用 所以需要隐藏起来 2). 现在分区的路径名是按默认的名字, 比如默认是 disk, 那么 后面几 ...…

查看全部问答>

哪位大侠开发过Symbol MC1000?

RT,系统是wince4.2,哪位开发过?麻烦发个类似记事本写字板一样的能有输入和存档。以前从未在wince上开发过,新手初来,请各位帮忙!!感谢!! 邮箱:jackbinhao@163.com…

查看全部问答>

关于ui和菜单,急!

大家好:   谁对UI比较熟,还有就是做菜单的技术,菜单就像是彩屏手机里的菜单或是数字电视里的菜单等,这项技术如何实现,我开发过程中要用到,挺急的,请大家帮忙给我点建议或资料吧。先谢谢了。…

查看全部问答>

mobile开发模式与.net类似吗?

如题, 小弟正在学习mobile开发, 因为以前做asp.net, 所以想请教mobile开发模式与.net开发有什么区别, 比如.net主要是事件,用户触发事件后, 需要编写事件的处理函数,而windowsce是消息机制, 请问这个消息和事件的区别, 总是在源码里 ...…

查看全部问答>

#include路径怎么写啊,请高手指点

看了Ti的文档还是不太清楚,最后只能写绝对路径,就是包含盘符的那种,不过还是不太好 现在情况是这样的:在include文件夹下面我定义了A、B、C三个文件夹,用来放置三种.h文件 其中A文件夹中又有A1、A2、A3三个文件夹,如何包含这几个文件夹的头 ...…

查看全部问答>