
本帖最后由 lqs0905 于 2018-11-30 12:20 编辑 本人是做消费电子的,所以在成本能节省就节省,在项目上就没有使用HAL这种很占用资源的库。在开发过程中我使用 cubeMX 配置单片机 库使用LL。我发现CubeMx 进行配置使用HAL库都没有问题,但是换成LL库之后问题就是一大堆,例如: 1.CubeMx在初始化IO口将IO口设为输低电平,如果使用HAL库就是正常的,换成LL库之后你会发现,在初始化IO口时根本就没有实现IO设成低电平的代码。 2.CubeMX 在重管脚时使用HAL库在初始化时就有重映的代码,但是在LL库中就没有这一功能,需要手动加上去,但是LL库中关于重映的代码还有BUG不能用,详情看我的贴子https://www.stmcu.org.cn/module/forum/thread-618115-1-1.html |
我也在STM32F103、STM32L496,在STM32CubeMx 2.5之前遇到过HAL、LL库的Bug,习惯库随时更新最新版本。不过等STM32CubeMx和HAL库更新到新版本后,发现已知BUG已被ST偷偷修复。
大家帮忙看一下,另一个不能重映射的见我另一个贴一楼有链接
LED.zip
2018-11-30 13:35 上传
点击文件名下载附件
1.79 KB, 下载次数: 1
HAL和LL本身都是都是对寄存器的封装,至于功能的实现,那不叫bug,那叫未实现,或者说是功能不提供!!!而且,既然是省资源,或多或少会因为架构原因,导致某些东西不能实现(仅仅只得是特殊地方,因为架构都是针对普通大众)。。。换句话说就是,hal的功能可以覆盖80%的程序需求,LL或许只能覆盖70%的需求,另外的特殊需求要自己实现。。。就拿你说的,初始化后,IO口电平不能指定,自己后面加一句话不就得了。。。至于你说的管脚重映射bug,这个要指定某个版本的某个芯片来说,因为使用IO的时候,都他妈需要重映射。。。
最后,我hal和ll都使用,到目前为止,我是未遇到什么bug的,要说唯一的逻辑错误,那就是adc的channe设置存在一个特殊原因导致的逻辑错误,需要自己看代码才知道原因。。至于其他bug未遇到。。。还有,多看hal和ll本身代码,很多东西看代码就知道怎么回事。。。不要动不动就搞大新闻,你看看hal和ll代码质量远高于在座的各位,自己心里要有点B数!!!
因为我是做产品的,我一惯的思维就是我提供不了的功能,我是不出现在我的产品说明书里,退一步要留我也会说明这个功能暂未实现。我只是希望stm32给我们提供更优质的代码,没有你想的什么大新闻来华众取宠。还有重映射这个加不了几个字节的代码,你再看看LL库生成的代码 PB4 ------> TIM3_CH1
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_4;
GPIO_InitStruct.Mode = LL_GPIO_MODE_FLOATING;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct); 这个都有你说应不应该加上重映射???
都是做产品得。。。没人不是做产品得。。。虽然不知道你怎么设置得,因为我没有用F1系列得芯片,懒的去下载库文件包,但是我F0同样的初始化代码是这个样子
GPIO_InitStruct.Pin = DP_00_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_1;
LL_GPIO_Init(DP_00_GPIO_Port, &GPIO_InitStruct);
至于说明书,你还别说,还真有,很显然你没看就说别人没有。。。不要搞什么一贯思维,懒就是你的思维!!!附上说明后缀.chm去库驱动路径里面找找,绝对有这个文档!!!没怎么看代码,也没怎么看文档吧!!!人啊,还是要低调,不要搞大事情!!!
1.就当我哔众取宠吧
2.希望我的发现对一些人有用
3.希望STM 的LL库越来越好用
4.无意冒犯请原谅
也不要看到别人否决了,就萎下去了。。。要勇于反抗!!!拿出证据,一步一步认证举例。。。打别人得脸可是很好玩得事情,滑稽。。。问题嘛,就是在反复探讨中成长,但是,一切都有但是,作为个人,很多东西,不要动不动就说别人这不行,那不行,比如你这标题起的,官方LL库bug太多,直接就表明了LL垃圾的一逼啊,感觉就像一以前UC震惊部。。。怎么问才合适呢,比如:官方得LL库这里好像有个bug,不知各位有木有遇到。。。谦虚一点,毕竟个人再牛逼,能力都是由限的!!!
ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStruct)
{
uint32_t pinmask;
uint32_t pinpos;
uint32_t currentpin;
/* Check the parameters */
assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));
assert_param(IS_LL_GPIO_PIN(GPIO_InitStruct->Pin));
/* ------------------------- Configure the port pins ---------------- */
/* Initialize pinpos on first pin set */
pinmask = ((GPIO_InitStruct->Pin) << GPIO_PIN_MASK_POS) >> GPIO_PIN_NB;
pinpos = POSITION_VAL(pinmask);
/* Configure the port pins */
while ((pinmask >> pinpos) != 0U)
{
/* skip if bit is not set */
if ((pinmask & (1U << pinpos)) != 0U)
{
/* Get current io position */
if (pinpos < GPIO_PIN_MASK_POS)
{
currentpin = (0x00000101U << pinpos);
}
else
{
currentpin = ((0x00010001U << (pinpos - GPIO_PIN_MASK_POS)) | 0x04000000U);
}
/* Check Pin Mode and Pin Pull parameters */
assert_param(IS_LL_GPIO_MODE(GPIO_InitStruct->Mode));
assert_param(IS_LL_GPIO_PULL(GPIO_InitStruct->Pull));
/* Pin Mode configuration */
LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode);
/* Pull-up Pull-down resistor configuration*/
LL_GPIO_SetPinPull(GPIOx, currentpin, GPIO_InitStruct->Pull);//这是一个BUG这一行不管设成输入输去都会执行
if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE))
{
/* Check speed and Output mode parameters */
assert_param(IS_LL_GPIO_SPEED(GPIO_InitStruct->Speed));
assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType));
/* Speed mode configuration */
LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed);
/* Output mode configuration*/
LL_GPIO_SetPinOutputType(GPIOx, currentpin, GPIO_InitStruct->OutputType);
}
}
pinpos++;
}
return (SUCCESS);
}
版主大人说话尖酸、刻薄,但是说的非常有道理。