lv_init()出错

问题:使用我自己设计的STM32F407板子,在使用LVGL图形库 lv_init();初始化时,进入tlsf_assert()触发断言,程序不再继续向下执行,停留在函数的static block_header_t * search_suitable_block(control_t * control, int * fli, int * sli)函数中的tlsf_assert(sl_map && "internal error - second level bitmap is null");语句,但该程序在正点原子的探索者STM32F407的开发板上运行没问题。

猜想:可能是因为外部的SRAM的电路线路长度相差较大导致的信号时序出现问题,导致LVGL使用外部SRAM分配空间的时候出现错误。但我单独使用SRAM的相关程序在我的板子上是可以正常运行的,例如在我的板子上可以运行正点原子的SRAM测试例程,内存管理例程,以及正点原子的avi视频播放例程,这些例程都使用到了SRAM,都可正常运行,所以这个SRAM出问题的可能性应该也很低,但也想不出是其他什么的原因了。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7568738
  • 除此之外, 这篇博客: STM32学习100步之第三十九-四十步——RTC实时时钟中的 这里值得注意的是,0xA5A5是作为标志检查位而写入的,当后备电源断电之后,RTC相关寄存器和后备寄存器的值必定会丢失,这时可以根据此来判断是否需要进行首次RTC设置,进行首次RTC值设置之后,还应该对相应的一个后备寄存器写入该值,以便下次进行检查,代码中还有上电复位和外部SET复位,可向相应的if语句中写入上电复位和外部SET复位对应的不同效果,而且作为初学者,我们只需要调用一般的初始化函数即可,因为该函数中已经包含首次RTC设置的判断语句,除非强制首次RTC设置。另外初学者只要学会调用下面两条程序即可 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    u8 RTC_Get(void);                  //读出当前时间值
    { //写入当前时间(1970~2099年有效),
    	u16 t;
    	u32 seccount=0;
    	if(syear<2000||syear>2099)return 1;//syear范围1970-2099,此处设置范围为2000-2099       
    	for(t=1970;t<syear;t++){ //把所有年份的秒钟相加
    		if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数
    		else seccount+=31536000;                    //平年的秒钟数
    	}
    	smon-=1;
    	for(t=0;t<smon;t++){         //把前面月份的秒钟数相加
    		seccount+=(u32)mon_table[t]*86400;//月份秒钟数相加
    		if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数        
    	}
    	seccount+=(u32)(sday-1)*86400;//把前面日期的秒钟数相加
    	seccount+=(u32)hour*3600;//小时秒钟数
    	seccount+=(u32)min*60;      //分钟秒钟数
    	seccount+=sec;//最后的秒钟加上去
    	RTC_First_Config(); //重新初始化时钟
    	BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//配置完成后,向后备寄存器中写特殊字符0xA5A5
    	RTC_SetCounter(seccount);//把换算好的计数器值写入
    	RTC_WaitForLastTask(); //等待写入完成
    	return 0; //返回值:0,成功;其他:错误代码.    
    }	
    
    u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec);       //写入当前时间
    {//读出当前时间值 //返回值:0,成功;其他:错误代码.
    	static u16 daycnt=0;
    	u32 timecount=0;
    	u32 temp=0;
    	u16 temp1=0;
    	timecount=RTC_GetCounter();		
    	temp=timecount/86400;   //得到天数(秒钟数对应的)
    	if(daycnt!=temp){//超过一天了
    		daycnt=temp;
    		temp1=1970;  //从1970年开始
    		while(temp>=365){
    		     if(Is_Leap_Year(temp1)){//是闰年
    			     if(temp>=366)temp-=366;//闰年的秒钟数
    			     else {temp1++;break;} 
    		     }
    		     else temp-=365;       //平年
    		     temp1++; 
    		}  
    		ryear=temp1;//得到年份
    		temp1=0;
    		while(temp>=28){//超过了一个月
    			if(Is_Leap_Year(ryear)&&temp1==1){//当年是不是闰年/2月份
    				if(temp>=29)temp-=29;//闰年的秒钟数
    				else break;
    			}else{
    	            if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
    	            else break;
    			}
    			temp1++; 
    		}
    		rmon=temp1+1;//得到月份
    		rday=temp+1;  //得到日期
    	}
    	temp=timecount%86400;     //得到秒钟数      
    	rhour=temp/3600;     //小时
    	rmin=(temp%3600)/60; //分钟     
    	rsec=(temp%3600)%60; //秒钟
    	rweek=RTC_Get_Week(ryear,rmon,rday);//获取星期  
    	return 0;
    }  
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^