一、踩坑背景
由于华大电子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中配置,具体操作如下:


选择自己的文件即可,如果没加,可以加入如下代码:
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)
}
}
至此,遇到的所有坑都已解决。

768

被折叠的 条评论
为什么被折叠?



