STM32L1xx的库函数有个Bug(stm32l1xx_gpio.c)

发布者:水墨人生最新更新时间:2018-12-20 来源: eefocus关键字:STM32L1xx  库函数  Bug 手机看文章 扫描二维码
随时随地手机看文章

在使用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;


关键字:STM32L1xx  库函数  Bug 引用地址:STM32L1xx的库函数有个Bug(stm32l1xx_gpio.c)

上一篇:关于stm32 HardFault_Handler 异常的处理 死机
下一篇:STM32F401 USB VBUS 设置引起的一些问题

推荐阅读最新更新时间:2024-03-16 16:20

STM8L101F3P6-官方库的Bug列表(不断维护)
STM8L101F3P6该款MCU官方库stsw-stm8012UtilitiesSTM8L101_EVALCommonstm8l_eval_i2c_ee.c文件中sEE_WritePage函数中 while((uint16_t)(*NumByteToWrite) 0) { /* Send the byte to be written */ I2C_SendData( *pBuffer); /* Test on EV8 and clear it */ /* Wait till all data have been physically transferred on the bus */ while
[单片机]
如何判断STM32的复位类型_STM32软件复位bug有哪些
STM 32在复位时,有严重BUG: 1.上电复位和外置的看门狗芯片重启复位是无法区分开来的!RCC_FLAG_BORRST, RCC_FLAG_PINRST, RCC_FLAG_LPWRRST三个都复位了! 2.这样当要在上电复位初始化关键代码时,这些代码看门狗复位则不用重启,这个关键代码会导致应用业务的异常!若两个中断分不开,导致系统异常看门狗复位时影响业务! /* RCC_FLAG_BORRST: POR/PDR or BOR reset //Power-on/power-down reset (POR/PDR reset) or brownout (BOR) reset RCC_FLAG_PINRST: Pin r
[单片机]
stm32 外部中断库函数实现全程分析
前题:   闭门造车,两周了,经过各种的思考和求问,反复阅读了 M3权威指南 和 stm32不完全手册 的相关章节,以及开发板厂商的实验例程,对stm32这块中断终有所悟,是以记之。   至于中断的什么优先级,什么优先级分组,使能之类的原理,就不再赘述。这里主要是记载以下如何使用中断,以及中断配置函数的实现过程,其中并叙述我曾经的疑惑和感悟。   我的开发板里的中断例程是用按键控制一个灯亮和灭的两个状态。   这个例程的实现过程如下描述: 第一步,将一个I/O口配置成中断输入模式。      这里需要注意的是,GPIO本身是没有中断功能神马的。如果硬要使他产生中断输入方式,就得将相应的端口映射到相应的外部事件上去。而
[单片机]
stm32 外部中断<font color='red'>库函数</font>实现全程分析
【STC15库函数上手笔记】2、GPIO
STC实验箱4 IAP15W4K58S4 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《STC库函数使用参考》 IO口初始化函数 GPIO_Inilize GPIO_InitTypeDef的定义见于文件 GPIO.H 。 typedef struct { u8 Mode; u8 Pin; //要设置的端口 }GPIO_InitTypeDef; Mode:配置IO的模式,取值见下表: Pin:要配置的某一个回多个IO,取值见下表: 以上参数可以使用或运算,比如: GPIO_InitStruc
[单片机]
【STC15<font color='red'>库函数</font>上手笔记】2、GPIO
苹果变女娲也没用啊,iOS出现大Bug
上周苹果正式向用户推送iOS 9.3.1版本更新,它修复了Safari浏览器、信息和邮件等程序内链接失效的问题。但今天这个版本又被曝出一个新漏洞。 有国外用户上传了这个漏洞的演示视频,当设备处于锁屏状态时,对Siri访问Twitter或邮箱地址的语音指令,通过点击邮箱信息,3D Touch功能允许用户直接访问手机中的通讯录,或通过给通讯录换头像的方式进入相册。 这个过程并不复杂,很容易就能学会。当然,这个bug至少需要个iPhone 6s,否则没有3D Touch也不能实现。
[嵌入式]
iOS 11.2新测试版发布 修复各种Bug
    今天,苹果再次发布了iOS 11.2的第二个测试版,跟上次不同的是(只针对iPhone X),这次的新系统是为其他设备准备的。   距离上个测试版仅仅过去一周的时间,苹果推出的新iOS 11.2测试版,主要还是以修复Bug为主,比如移除了计算器中的动画效果,让1+2+3这样的计算结果正常。   此外,iOS 11.2新测试版还在控制中心加入了正在播放的功能,这主要是为用iPhone控制Apple TV准备的,同时Apple Pay个人转账功能也开始测试。   值得一提的是,iOS 11.2的UI和系统动画也都有新的调整,让人看起来更加清爽。
[手机便携]
怎一惨字了得! 小米Note2屏幕被摔漏液
   近日有网友上传了一段视频,视频显示其购买的小米Note 2屏幕出现大“Bug”,简直不忍直视。不过各位小米用户不同担心,这个问题不是产品本身缺陷,应该就是手滑了一下不小心给摔了,造成的内屏爆裂产生的漏液现象,只能对该用户表示深切的安慰。   小米Note 2采用双曲面屏设计,这种结构决定了它会比较脆,跌落很容易造成屏幕碎裂。其实不只是小米Note 2,三星的双曲面屏手机同样很容易碎屏。所以大家别光顾着美,日常使用还是要好好保护。  
[手机便携]
STM32单片机常用库函数
1.GPIO初始化函数 用法: voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure;//GPIO状态恢复默认参数 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_标号|GPIO_Pin_标号; //管脚位置定义,标号可以是NONE、ALL、0至15。 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//最高输出速度为50MHz GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出 GPIO_Init(GPIOC,&GPIO_I
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved