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

【STM32C0评测】3、串口BUG修正,PWM呼吸灯

[复制链接]
Teresa 发布时间:2024-3-22 15:20

修复串口BUG

在增加了定时器输出PWM之后,照旧下载程序准备看看效果,结果PA5所对应的用户LED LD4没有发生任何现象,仔细检查新添加的PWM代码之后,我自认为不可能发生错误,于是还是进行DEBUG看看问题,结果吓一跳,直接就hardfault了。经过定位,hardfault发生在uart的初始化中,再深入,直接定位到此处:

image.png

这就比较奇怪了,上一次我甚至使用了这个usart2进行printf,然而现在这个初始化出现问题并且是hardfault。虽然比较费解,但是这种问题,上次能够使用,这次不能使用,必然是HAL_UART_Init中的这个结构体数值没有初始化,编译器给了随机的数值让系统崩溃了。

因为之前是直接移植了代码,没有进入Init结构体中查看具体变量,一步步来赋值。这次直接按照Init结构体的成员进行赋值。

查看UART_InitTypeDef结构体,发现多出了两个成员OneBitSampling与ClockPrescaler。可以大致确认因为没有初始化这两个成员,结果导致了hardfault。本着出了错误就参考一下官方例子的偷懒原则,参考了官方例子中的printf例子中初始化usart2的过程,官方源码如下:

  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_ODD;
  huart2.Init.Mode = UART_MODE_TX_RX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart2) != HAL_OK)
  {
    Error_Handler();
  }

官方的例子里面还多初始化了一个不是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解决方式:

image.png

增加初始化结构体成员的初始化

PWM呼吸灯

板子上虽然很可怜的只能操作一个按键和一个LED,但是这个LED能够链接到定时器,并且作为TIM1CH1的输出。

image.png

/* 板子上的LED PA5 可以用TM1CH1驱动 AF5 */
#define PWM_CLK_ENABLE()              __HAL_RCC_TIM1_CLK_ENABLE()
#define PWM_TIM                       TIM1

#define PWM_LED_CLK_ENABLE()          __HAL_RCC_GPIOA_CLK_ENABLE()
#define PWM_LED_PORT                  GPIOA
#define PWM_LED_PIN                   GPIO_PIN_5
#define PWM_LED_AF                    GPIO_AF5_TIM1

然后重新初始化一下PA5,屏蔽掉之前初始化的LED设置,将PA5链接到TIM1CH1

初始化TIM1的TIM_HandleTypeDef与TIM_OC_InitTypeDef。

    TIM_HandleTypeDef TimHandle = {0};
    TIM_OC_InitTypeDef OCConfig = {0};

    TimHandle.Instance = PWM_TIM;
    TimHandle.Init.Prescaler = SystemCoreClock / 10000;
    TimHandle.Init.Period = 100 - 1;
    TimHandle.Init.ClockDivision = 0;
    TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
    TimHandle.Init.RepetitionCounter = 0;
    TimHandle.Init.AutoReloadPreload = 0;
    if (HAL_TIM_PWM_Init(&TimHandle) != HAL_OK)
    {
        while(1);
    }

    OCConfig.OCMode = TIM_OCMODE_PWM1;
    OCConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
    OCConfig.OCFastMode = TIM_OCFAST_DISABLE;
    OCConfig.OCNPolarity = TIM_OCNPOLARITY_HIGH;
    OCConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
    OCConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
    OCConfig.Pulse = 0;
    if (HAL_TIM_PWM_ConfigChannel(&TimHandle, &OCConfig, TIM_CHANNEL_1) != HAL_OK)
    {
        while(1)
        {

        }
    }

    if (HAL_TIM_PWM_Start(&TimHandle, TIM_CHANNEL_1) != HAL_OK)
    {
        while(1)
        {

        }
    }
}

然后在主函数的大循环中对TIM1->CCR1不断写入新的值。于是:

IMG_0557.gif.

转换成git之后稍微有点模糊,但是还是能看到ld4从暗淡变成了明亮,呼吸起来了。

使用体验

跑了几个基本外设之后,个人认为C0芯片很有潜力,新一代芯片所拥有的功能,ST并没有进行阉割,比如在UART_HandleTypeDef中基本是包括了串口的方方面面,丰富程度到了现在都可以不建立自己的结构体,直接在初始化UART_HandleTypeDef就能解决大多数的需求

image.png

UART_HandleTypeDef的大部分成员,初始化其中成员完成之后,用户是直接可以近乎完善的使用串口的功能,并且自由程度也很高,通过UART_AdvFeatureInitTypeDef能够使用更多的高级功能。

但是官方的例子很少很少,从例子的说明手册(AN5802)中看到

image.png

HAL库关于uart的例子只有一个,老实说既然是为了让工程师过渡的芯片,按道理来说应该是给予足够的例子,大概能把芯片外设玩个70%这样的,特别是芯片外设功能(就我所见的串口而言)这么丰富的情况下,如果没有足够的例子支撑,用户还是玩自己更熟悉的用法,对于芯片平台的利用率不充足。

不过手册已经很友好了,RM直接是中文呈现(RM0490),手册上虽然说到是补充,但是内容量已经足够使用了,还是非常不错的

收藏 评论0 发布时间:2024-3-22 15:20

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版