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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版