
修复串口BUG在增加了定时器输出PWM之后,照旧下载程序准备看看效果,结果PA5所对应的用户LED LD4没有发生任何现象,仔细检查新添加的PWM代码之后,我自认为不可能发生错误,于是还是进行DEBUG看看问题,结果吓一跳,直接就hardfault了。经过定位,hardfault发生在uart的初始化中,再深入,直接定位到此处: 这就比较奇怪了,上一次我甚至使用了这个usart2进行printf,然而现在这个初始化出现问题并且是hardfault。虽然比较费解,但是这种问题,上次能够使用,这次不能使用,必然是HAL_UART_Init中的这个结构体数值没有初始化,编译器给了随机的数值让系统崩溃了。 因为之前是直接移植了代码,没有进入Init结构体中查看具体变量,一步步来赋值。这次直接按照Init结构体的成员进行赋值。 查看UART_InitTypeDef结构体,发现多出了两个成员OneBitSampling与ClockPrescaler。可以大致确认因为没有初始化这两个成员,结果导致了hardfault。本着出了错误就参考一下官方例子的偷懒原则,参考了官方例子中的printf例子中初始化usart2的过程,官方源码如下:
官方的例子里面还多初始化了一个不是UART_InitTypeDef成员的AdvancedInit中的AdvFeatureInit成员。随即马上打开这个成员的定义看看是个什么。 UART_AdvFeatureInitTypeDef结构体,里面定义了STM32串口的各种高级功能,就是之前我们在手册里面看到的串口自动波特率等等成员,具体成员如下: AdvFeatureInit,用来指定是否开启串口的高级功能,官方例子里面只使用了printf就直接关闭了 TxPinLevelInvert、RxPinLevelInvert、DataInvert这三个成员是用来反转电平的,分别是发送数据反转,接收数据反转,指定数据反转 Swap是用来交换Tx,Rx引脚的,方便了画错板子时候直接交换 OverrunDIsable用来关闭接收超限检测 DMADisableonRxError,字面意思,当发生接收错误的时候关闭DMA传输 AutoBaudRateEnable与AutoBaudMode用来进行串口波特率自动检测,使能之后可以选择4种模式进行检测,相当方便了,并且官方也给出了软件与硬件的检测说明(AN4908) MSBFirst是串口第一位传输MSB 鉴于之前我一直是使用串口的基本功能,只使用串口用来打印以及进行通信,虽然在手册看到这些功能,但是在编程上基本没有了解过,这次算是小小的了解了一下。 串口的BUG解决方式: 增加初始化结构体成员的初始化 PWM呼吸灯板子上虽然很可怜的只能操作一个按键和一个LED,但是这个LED能够链接到定时器,并且作为TIM1CH1的输出。
然后重新初始化一下PA5,屏蔽掉之前初始化的LED设置,将PA5链接到TIM1CH1 初始化TIM1的TIM_HandleTypeDef与TIM_OC_InitTypeDef。
然后在主函数的大循环中对TIM1->CCR1不断写入新的值。于是:
转换成git之后稍微有点模糊,但是还是能看到ld4从暗淡变成了明亮,呼吸起来了。 使用体验跑了几个基本外设之后,个人认为C0芯片很有潜力,新一代芯片所拥有的功能,ST并没有进行阉割,比如在UART_HandleTypeDef中基本是包括了串口的方方面面,丰富程度到了现在都可以不建立自己的结构体,直接在初始化UART_HandleTypeDef就能解决大多数的需求 UART_HandleTypeDef的大部分成员,初始化其中成员完成之后,用户是直接可以近乎完善的使用串口的功能,并且自由程度也很高,通过UART_AdvFeatureInitTypeDef能够使用更多的高级功能。 但是官方的例子很少很少,从例子的说明手册(AN5802)中看到 HAL库关于uart的例子只有一个,老实说既然是为了让工程师过渡的芯片,按道理来说应该是给予足够的例子,大概能把芯片外设玩个70%这样的,特别是芯片外设功能(就我所见的串口而言)这么丰富的情况下,如果没有足够的例子支撑,用户还是玩自己更熟悉的用法,对于芯片平台的利用率不充足。 不过手册已经很友好了,RM直接是中文呈现(RM0490),手册上虽然说到是补充,但是内容量已经足够使用了,还是非常不错的 |
STM32N6坛友评测出炉,来围观(第二波预约继续)
【STM32C0评测】C071:USB的使用
【STM32C0评测】C071:IIC的使用
NUCLEO-C071RB评测6_四种工作模式的功耗测试
【STM32C0评测】GPIO测试:使用外部中断控制小灯点亮熄灭
【STM32C0评测】+NUCLEO-C071 UART测试
NUCLEO-C071RB评测5_I2C通讯测试
【STM32C0评测】C071:加个PWM
NUCLEO-C071RB评测1_GPIO测试
【STM32C0评测】C071:GPIO+定时器+串口