你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX用LL库配置STM32F1的GPIO初始化是不是有bug呢

[复制链接]
哀歌与世无争 提问时间:2018-2-22 12:31 /
本帖最后由 哀歌与世无争 于 2018-2-22 12:40 编辑

STM32CubeMX设置PC13和PA1为推挽输出,速度50M,用LL库生成的代码如下:
  1. void MX_GPIO_Init(void)
  2. {

  3.   LL_GPIO_InitTypeDef GPIO_InitStruct;

  4.   /* GPIO Ports Clock Enable */
  5.   LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOC);
  6.   LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOD);
  7.   LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);

  8.   /**/
  9.   LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_13);

  10.   /**/
  11.   LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_1);

  12.   /**/
  13.   GPIO_InitStruct.Pin = LL_GPIO_PIN_13;
  14.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  15.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  16.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  17.   LL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  18.   /**/
  19.   GPIO_InitStruct.Pin = LL_GPIO_PIN_1;
  20.   GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  21.   GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
  22.   GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  23.   LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  24. }
复制代码
但是调试后发现寄存器配置不对,GPIOC寄存器如图:
20180222115529.png
PC13被初始化成模拟输入了,而PC5没有设置却变成了推挽输出了。

PA1倒是没有错误,GPIOA寄存器如图:

QQ截图20180222115934.png

总结:
      后面又试了几个引脚,发现用LL库高位的引脚(GPIO8-15)初始化会有问题,像PC13,PB13这样的高位引脚,设置后实际改变的是对应低位的引脚PC5和PB5,而想要配置的引脚却变成其他模式了。如果初始化是低位的引脚(GPIO0-7)不会有错误,像PA1,PB1就能被正确初始化。
大家有没有遇到这样的问题呢?
收藏 评论22 发布时间:2018-2-22 12:31

举报

22个回答
衔胆栖冰 回答时间:2018-2-23 08:57:17
先质疑自己,再质疑别人
七哥 回答时间:2018-2-23 02:00:49
经测试,STM32F103的LL库的确是坑,玩不起来。
环境STM32CubeMX 4.24.0,MDK 5.24
lockyer 回答时间:2019-5-2 23:26:38
本帖最后由 wuxiaoluo 于 2019-5-2 23:28 编辑

CUBEMX  HAL  stm32f030 主程序while发送,中断接收1个字节,有几率无法再开启中断接收。
主程序while只是打印几个变量值
printf("\r\n-----RcvCount=%8d  , ErrCount=%8d  RcErrCount=%8d\r\n",RcvCount,ErrCount,RcErrCount);
HAL_Delay(100);

中断接收 HAL_UART_Receive_IT(&huart1,(uint8_t*) &Uart1_Rx_Byte,1); //再次接收1个字符
里面什么都不干。

pc机100ms发送 0123456789. 一下就开始出现接收溢出,串口忙接收中断无法再开启启动的问题了
就这么简单的中断接收消息,主线程发送消息,一两百个字节就错误的无法用了。STM的库还能放心用在项目上?纯粹是熟悉和玩玩的摆设,能动不能用。
七哥 回答时间:2018-2-23 00:17:44
本帖最后由 toofree 于 2018-2-23 00:56 编辑

你的STM32F1是哪个系列的,具体什么型号?F1的型号太多了。

感觉不至于出现这样的问题呀,发个工程上来瞧瞧

LL库没玩过,不过我常用的F103系列中,印象是PC13速度不超过2MHZ,具体出自哪里,一时没找到


我用HAL是好的,前几天刚测试过“YD-STMF1系列核心板”,就是某宝上出现最多的那个STM32F103C8T6小板板,上面的LED用的就是PC13,闪灯灯好着呢。



哀歌与世无争 回答时间:2018-2-23 18:34:40
toofree 发表于 2018-2-23 00:17
你的STM32F1是哪个系列的,具体什么型号?F1的型号太多了。

感觉不至于出现这样的问题呀,发个工程上来瞧 ...

HAL库出来很久了,用了没啥问题,STM32F1的LL库最近才出的,发现有这个现象才来问问大家的。
哀歌与世无争 回答时间:2018-2-23 18:35:40
衔胆栖冰 发表于 2018-2-23 08:57
先质疑自己,再质疑别人

没有质疑,只是有疑问,有什么不当的地方请指出
xulei007 回答时间:2018-2-23 20:07:28
有!同样的BUG,今天用LL库初始化UASRT1,发现PA9和PA10都被初始化到了相应的PIN-8上,上面那个人说话真看不惯,你要么也去测试,要么帮忙分析一下可能的问题,别把自己摆的高高在上来一句先质疑自己。我们提问题都是经过思考的,另外今天第一次使用LL库,分别在F407的LL库上发现一个BUG,407的BUG是使用HSE的时候stm32f4xx_conf.h里面的HSE_VALE的宏会被LL库中的宏替代,而STM32CUBEMX不会去修改这个宏,所以导致UART使用的是25M配置的,导致传输错误的情况,库版本1.19,另外,STM32F1刚刚调试发现的BUG,我刚描述了,和你的情况一样,现在正尝试修复,库版本1.60
xulei007 回答时间:2018-2-23 20:13:54
跟踪进去,错误发生在stm32f1xx_ll_gpio.c的184行的pinpos = POSITION_VAL(GPIO_InitStruct->Pin);这一句没有得到正确的GPIO管脚顺序,跟踪进这个宏,具体实现是先反向,然后计算前导0的个数(由注解直译理解),继续跟跟踪到__clz这个,然后就跟踪不了他具体实现了,
哀歌与世无争 回答时间:2018-2-23 22:16:39
xulei007 发表于 2018-2-23 20:13
跟踪进去,错误发生在stm32f1xx_ll_gpio.c的184行的pinpos = POSITION_VAL(GPIO_InitStruct->Pin);这一句没 ...

不好搞,用了很多宏,有的还是编译器的关键字,晦涩难懂,最好等官方完善了。还是标准库好,简单的封装,使用稳定。现在为了可视化出了cubemx和这两个库,碎片化严重。
xulei007 回答时间:2018-2-24 11:51:20
哀歌与世无争 发表于 2018-2-23 22:16
不好搞,用了很多宏,有的还是编译器的关键字,晦涩难懂,最好等官方完善了。还是标准库好,简单的封装, ...

可以试着修复一下嘛~我直接改pinpos并不能正确初始化,后面还有一个currenpin,应该是指向正确的寄存器位置,然后我干脆寄存器初始化了,后面又发现USART那似乎也存在问题,这里用似乎哈,昨晚太晚没深究。
MrJiu 回答时间:2018-2-24 13:36:39
看来LL库确实还是有问题!!!还好我目前用的是Hal库,上次生成一次ll库看了看就发现好多都是用的宏定义实现的,也不知道高明在哪个地方!!!
哀歌与世无争 回答时间:2018-2-24 20:20:43
xulei007 发表于 2018-2-24 11:51
可以试着修复一下嘛~我直接改pinpos并不能正确初始化,后面还有一个currenpin,应该是指向正确的寄存器位 ...

  currenpin后面有个 LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode)函数,经过这个函数后寄存器的值就开始不对了,跟踪进去里面有个
MODIFY_REG(*pReg, ((GPIO_CRL_CNF0|GPIO_CRL_MODE0) << (POSITION_VAL(Pin) * 4U)), (Mode << (POSITION_VAL(Pin) * 4U)));
看名字是在修改寄存器的值,但是这个东西全是用宏定义拼起来的,太多宏太恶心了,实在看不下去了。
xulei007 回答时间:2018-2-26 22:29:44
本帖最后由 xulei007 于 2018-2-26 22:32 编辑

sssssssssssssssssss
xmstudio 回答时间:2018-2-27 11:48:48
问一下LL库和HAL库相比有什么优势呢?
蚁族 回答时间:2018-2-27 21:47:25
F1的LL库Bug很多,端口寄存器的都能错误
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版