之前我发的所有帖子都是基于HAL库的,HAL库虽然简单易上手,但存在编译速度慢的明显缺点(我家里的I7台式机初始化编译一个HAL库工程要30秒,增量编译也要几秒,更不用说学校课室的I3台式机了,初始化编译需要29分钟)而这次我使用的是Low Layer Library,底层库,即LL库,大部分的外设库函数均采用inline(内联函数)形式执行,并且直接操作寄存器,省去一大堆assert和while语句的校验,代码执行效率大大提高。但是,LL库同样存在缺点,ST官方推出LL库的历史远远比不上推出HAL库的历史悠久,在用户体验和代码完善方面远远不及HAL库,导致很多操作还需要直接翻看寄存器手册,用户花在查手册的时间非常多,下面的串口通信例子就是这样。 要学会一个库,首先要学会操作串口外设,这是最基础的一步。由于LL库也是CubeMX内部的控件,因此使用方法和HAL库一样,设置PG7和PG8为LPUART1复用。这里顺便设置板上三盏LED灯(PB7、PB14、PC7)为输出模式。 时钟配置方面也一样,设置MSI、PLLCLK、80MHz。 重点来了,打开Projects选项卡,找到Project Settings,设置三个外设的库函数均为LL库。这点千万不能忘了,HAL库和LL库唯一的区别就在这。 配置好了工程,但是现在就可以直接使用串口了吗?不可能! 没错,我又发现了问题。串口初始化完毕后,必须添加串口使能语句,否则串口无法正常工作,讲道理这点在CubeMX的HAL库的初始化工程中并没有问题啊,为什么CubeMX生成LL库工程就会出问题呢?这个问题只有ST官方才知道。而这点,足以打脸@moyanming2013在之前的帖子中针对我的那个问题。如果CubeMX生成的工程是完全没有问题的话,为什么会犯如此低级的错误呢?我如果是没有用过CubeMX,又怎么会发现这个问题呢?我们既然是CubeMX的使用者,就必须赞扬CubeMX的优点,正视CubeMX的缺点,而不是夸大CubeMX的优点,洗白CubeMX的缺点。 如图,左图为我自己修改过的工程,右图为原汁原味的CubeMX生成的工程,我没有经过任何改动 然后,为了要使用printf()函数,必须重定义fputc()函数。重定义fputc()函数有一个好处就是,可以自由选择printf()函数使用哪个串口作为输出,如图所示,使用LPUART1串口。 在主函数中添加GPIO电平反转函数,用法与HAL库一样。 上传工程文件。 |
不错写的很详细 |
很好,写的很棒。现在这个bug已经修复了、 |