【好记性不如烂笔头】华大电子CIU32 RT-THREAD踩坑笔记

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

一、踩坑背景

由于华大电子ciu32并无rt-thread的移植工程,所以就需要自己对rt-thread和ciu32进行底层驱动的桥接工作,这个基本可以参考cortex-m0内核的stm32进行参考编写。
在项目进行过程中,发现了许多和其他ic厂家不一样的点,也经过了不少的折腾,终于将这些点都一一填平。

二 、踩坑点(所有的都是在rtos下发现的问题)

1、整个系统跑着跑着无缘无故重启。
2、串口无法交互数据
3、整个系统开机两三秒就进入硬件故障
4、不同的优化等级下,系统有的等级能跑,有的优化等级下跑不了
5、快速flash编程失败
注:要是没有这些问题,也可以看下,说不定你的问题也可以用同样的方法解决。

三、解决方案

针对标题二的解决方案顺序编写,就不写标题
1、造成重启的原因是串口溢出错误中断默认开启,此时标志量未清除,导致频繁进入中断,导致系统重启。
在这里插入图片描述

2、整个系统主频是48MHZ,在使用低功耗串口时,使用系统主频作为串口时钟,此时使用物联网模组无法通讯。经过排查发现,在例程中,对寄存器值做了限幅。

/* LPUART 波特率参数范围 */
#define  LPUART_BRR_MIN                               (0x00000300U)                             /**< LPUART波特率寄存器允许的最小值 */
#define  LPUART_BRR_MAX                               (0x000FFFFFU)                             /**< LPUART波特率寄存器允许的最大值 */
 
    /* 获取LPUART 预分频器的分频值 */
    prescaler_temp = std_lpuart_get_kclk_prescaler(lpuartx);
    /* 计算LPUART BRR配置 */
    // rt_kprintf("kclk_frequency = %#X\n",kclk_frequency);
    // rt_kprintf("prescaler_temp = %#X, baudrate = %d\n",prescaler_temp, baudrate);
    brr_temp = (uint32_t)(((((uint64_t)kclk_frequency/(uint64_t)prescaler_temp)<<8) + (baudrate>>1))/(baudrate));
    // rt_kprintf("brr_temp = %#X\n",brr_temp);
    /* 判断BRR配置在有效范围内 */
    if ((brr_temp>=LPUART_BRR_MIN) &&(brr_temp<=LPUART_BRR_MAX))
    {
        MODIFY_REG(lpuartx->BRR,USART_BRR_LPUART, brr_temp);
        return STD_OK;
    }
    else
    {
        return STD_ERR;
    } 

导致每次brr_temp的值都不在范围内,这里参考手册也有说明,但例程工程中并没有对这里进行说明,很容易中招。可以通过分频解决,正常分频下来24MHZ就不会出问题。
3、在启动文件中,将栈空间设置太小或者使其为0

Stack_Size      EQU     0x00000200

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp

在工程刚开始写,是400,后发现对整个工程似乎并无影响,后来干脆直接将其设置为0,然后就发现在初始化是,RAM空间变得不干净。
在这里插入图片描述
这是使用memset清除后打印的数据,这个坑比较深,花了两天多,如果遇到同样的情况,可以尝试将主栈空间改大一点。
4、和3一样,改大一点主栈空间就行。
这个主要是由于rtos在进入main之前, ARM Cortex-M 处理器上电后默认使用的主栈,需要进行一系列初始化工作,如:
系统初始化(时钟、内存等)
C 运行时环境(.data/.bss 初始化)
以及所有的硬件中断ISR处理部分。
即使你用了 RT-Thread,中断仍然使用这个主栈(MSP),而不是某个线程的栈!
5、这个是大概率是未加入官方库给出的链接脚本.lst文件,或着未在keil中配置,具体操作如下:
1、

在这里插入图片描述
选择自己的文件即可,如果没加,可以加入如下代码:

LR_IROM1 0x08000000 0x00040000  {
  ER_IROM1 0x08000000 0x00040000  {
    *(RESET, +First)
    *(InRoot$$Sections)
    .ANY (+RO)
  }

  RW_IRAM1 0x20000000 0x00007000  {
    *(.FAST_PROGRAM)  ; 让 FAST_PROGRAM 代码段存入 RAM
    .ANY (+RW +ZI)
  }
}

至此,遇到的所有坑都已解决。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值