页次: 1
初调D211的CAN通讯,最初是很正常的,可实现不同波特率下的数据正常收发。之后的测试卡的一塌糊涂
1- 发送卡壳;
2- CANH,CANL线缆短路,断路卡壳;
3- 设备波特率与总线波特率不一致时候卡壳。
卡壳有些是不可恢复的只能重新开机,有些是断开总线连接后可以恢复。
优化后的CAN通讯设计要点:
1.一定要把aic_can_hal.c文件中的hal_log_err()语句注释掉。主要是因为can通讯时有些error会被频繁触发,如果不关闭,所有线程都会被憋死,因为这属于中断响应。
2. can初始化时要选择自测模式而不是normal模式
hal_can_ioctl(&can, CAN_IOCTL_SET_MODE, (void *)CAN_SELFTEST_MODE);
按官方所说,自测模式属于发送不管,发送是否生效,用户可自己通过别的方式加以判断。
很多情况下数据本就是发不出去的比如线缆断路,短路,并不需要sdk函数本身来保证发送是否成功,否则CAN也会出现卡壳。
3. 发送安全机制:
. 设置一tx_done变量,在收发中断函数中tx_done=1。
. 发送每一帧报文前先判断tx_done是否为1.如果=1直接发送,如果=0说明之前的报文未发送完毕。等待10ms且每隔1ms判断一次,等待过程注意让出线程。
. 如果累计10ms后tx_done依然为0,说明总线异常,可能是D211设备异常,也可能是线缆异常。软件重启CAN外设来保证D211设备是正常的。
. 重启CAN外设后,即直接发送不再判断,如果tx_done=1属于正常发送;否则属于重启后发送。发送后tx_done=0.
这样的话,对于每次发送任务,不管总线有无异常,总会执行所需要的发送任务。如果属于CAN外设驱动问题,在软件重启CAN外设后自然会恢复。如果属于线缆问题,线缆正常后也会第一时间恢复发送。
经过这样一番倒腾后,D211的can运行还是挺稳的。完美。。
小结一下d211在rtt下的几个外设特点,用的是rtt的IO设备驱动。匠心创这点做的很好,bsp驱动很完善
1-uart:好用,支持中断和dma。
2-i2c:就用了一路驱动ctp,挺正常。
3-can:好用,也很简单。
4-pwm:简单好用,但花活估计玩不出来,只是点屏背光和驱动蜂鸣器。
5-timer:占用的是cap外设,rtt下不是很精准,ms级的定时器还能接受吧,us级的误差比较大。
6-ad采样:不大好,只支持中断方式,不支持dma方式,造成cpu占用率偏高,会影响到lvgl帧率。实测最高20kHz采样率,再高回调函数响应不过来。
总的来说,就是在luban-lite环境下,很多外设不能像普通mcu那么玩了。尤其是像pwm,adc这些。花式玩法还得是标准mcu。而对于标准性更好的外设,像uart,can这些,luban-lite的解决方案让人很满意。
小项目做完了,跑来小结一下:
1-关于工程备份:
用户工程项目文件的备份主要包括硬件(目标板文件)和软件(工程APP)的备份。都很小。其它还包括自用的IC外设备的驱动文件以及对原始SDK的自行调整文件,也要留意备份。其它公共文件不需要备份,只跟官方SDK版本有关,坏了就重装一下。
2-关于调试仿真:
VSCODE环境下开发很方便。新建文件后,文件夹内加个SConscript文件就可以。编译速度还行因为挂lvgl的工程本身就会比较大。镜像烧录也很方便,如果用的flash是NAND,烧录速度飞快。调试略显不足。printf代来替。
3-关于加密:
待解决...
4-关于在线升级:
待解决...
工程目前只是用到了uart,pwm,lvgl。官方SDK跟RTT兼容的很好。现在唯一不满意的就是调试操作显得有点烦。单次烧录过程一般是这样的:
(1) m编译工程;
(2) ISP脚接地,之后断电重启;
(3) 开始烧录镜像文件
调试过程中这个流程重复次数会非常频繁,如果能支持一键编译,烧录,那就很理想了。
借助官方的SDK,现在版本是V1.0.5,硬件没啥问题情况下,点屏速度很快。实测了一下,640*480的RGB屏,24位满色,跑分能到60帧(含旋转),做滑屏应该是比较轻松的一件事了。
因为是128MB的QSPI NAND,系统自动也具有了用户数据文件系统。
确实很方便。不足的地方也有:
1-跟一般MCU比,功耗有点偏大。有一部分功耗是给内置的ddr吃了。
2-调试串口,因为点屏固件一般比较大,用USB烧固件会很快捷方便。但出于调试需要,还要把串口留出一路,这样的话,服务于调试的引脚有点多了。如果串口是TTL电平,大估计还得把板载3.3V也拉出来。
最好是单一USB口能调试,能烧录。之前试过ADBD,这个插件好像只支持命令行启动,如果能开机默认自动启动就好了。这样除了usb烧录,再加ISP引脚(uart0的tx脚)就可以方便调试了。
图片上传还是有问题。贴图不行,上传文件也不行。
----------------------------------------------------
如何在本站发图片, 顺便吐槽功能弱智的phpbb半自动步木仑
https://whycan.com/t_588.html
硬件:D213官方评估板,7寸lvgs屏,分辨率1024*600,像素格式ARGB8888.
软件;LVGL官方例程,主要跑了benchmark,widget,music等三个例程。
分析:lvgl例程里面的图片均为数组格式,所以不需要修改文件系统镜像,考核指标主要包括
1-d213的cpu计算能力;
2-gpu的在线渲染能力;
3-ddr的带宽吞吐能力。
例程1:benchmark
整体得分在49帧左右,涉及shadow的几个分项得分很低,只有5-10帧。
例程2:widget
静态刷屏,或者局部静态刷屏帧率很高,基本能做到50-100帧。滑屏过程中瞬间会跌到肉眼可见的15帧。但不影响丝滑性。
例程3:music
最低瞬间帧率20帧,也是滑屏过程中的瞬间。
例程4:旋转90度
帧率无变化,硬件旋转能力得到释放。
小结:
1-优点:整体表现比较优秀,跟同级别MCU方案比(包括M4,M7,ARM9),属于集成度最高,解决方案最完整的。内置128MB
的DDR,外置128MB的SPI-NAND。跟MCU常用的支持XIP的NOR方案比,文件空间更大,下载速度很快,开发过程中的频繁下载
烧录不会成为痛点。下载速度基本保证在1.5MB以上,以1MB的CODE镜像为例,做到了秒下载。
2-缺点:跑上述几个例程并没用到文件系统,所有图片资源都是c文件数组跟代码绑定在一块的,所以不会涉及文件访问片外NAND
存储器拖慢速度问题,但滑屏过程中还是会瞬间掉帧,不知道是因为什么引起的。主频不够快?GPU拉跨?DDR不给力?
3-关于旋转:通过官方所说的menuconfig使能旋转方法,旋转后图像显示不正常。最后还是改disp初始化代码实现了旋转。旋转后
的帧率没变化,说明硬件旋转起作用了,这点给个大赞。
4-关于SPI-NAND速度,新版SDK限制在91MB左右,而这种NAND的经典速度是133MB。如果采用了通过文件系统读NAND素材文件
做开发的话,大估计NAND带宽会成为限制帧率的一个主要瓶颈。官方要把NAND时钟频率提上去才好。再或者也可考虑上电时把一部分
文件提前拷贝到DDR,但怎么建立DDR文件系统,怎么拷贝,怎么选定需要拷贝的具体文件,还需要官方授道解惑,讲解的更为详细些。
5-关于AWTK例程,能显示(局部不正常),但帧率就跌的很厉害了。不知道怎么回事。官方最好能优化一下。AWTK有更好的
studio设计器支持。
附:测试宏定义开关
几个需要开启的字库是music例程需要的,开启后OS镜像文件体积也会变大一些,但对于这种nand型存储器,下载烧录速度不受影响。
/*Music player demo*/
#define LV_FONT_MONTSERRAT_8 0
#define LV_FONT_MONTSERRAT_10 0
#define LV_FONT_MONTSERRAT_12 1
#define LV_FONT_MONTSERRAT_14 1
#define LV_FONT_MONTSERRAT_16 1
#define LV_FONT_MONTSERRAT_18 0
#define LV_FONT_MONTSERRAT_20 0
#define LV_FONT_MONTSERRAT_22 0
#define LV_FONT_MONTSERRAT_24 0
#define LV_FONT_MONTSERRAT_26 0
#define LV_FONT_MONTSERRAT_28 0
#define LV_FONT_MONTSERRAT_30 0
#define LV_FONT_MONTSERRAT_32 0
#define LV_FONT_MONTSERRAT_34 0
#define LV_FONT_MONTSERRAT_36 0
#define LV_FONT_MONTSERRAT_38 0
#define LV_FONT_MONTSERRAT_40 0
#define LV_FONT_MONTSERRAT_42 0
#define LV_FONT_MONTSERRAT_44 0
#define LV_FONT_MONTSERRAT_46 0
#define LV_FONT_MONTSERRAT_48 0
#define LV_USE_DEMO_MUSIC 1
#if LV_USE_DEMO_MUSIC
#define LV_DEMO_MUSIC_SQUARE 0
#define LV_DEMO_MUSIC_LANDSCAPE 0
#define LV_DEMO_MUSIC_ROUND 0
#define LV_DEMO_MUSIC_LARGE 0
#define LV_DEMO_MUSIC_AUTO_PLAY 0
#endif
测试平台:官方D213开发板。
1-新发布的V1.0.4开机时间至少需要2s。V1.0.3开机时间大概不到1s。
2-提示sd卡挂载失败。其实是有sd卡,开机后ls sdcard也能正常查看sd卡文件。
3-spi nand时钟变慢了,v1.0.3是100MHZ,与配置一致
qspi0 freq (input): 91636363Hz
qspi0 freq ( bus ): 91636363Hz
可否给个解释,作为RTOS系统,2s开机时间有点长了。
Welcome to ArtInChip Luban-Lite 1.0 [Built on Apr 17 2024 08:05:07]
01-01 10:31:37 I/touch: rt_touch init success
01-01 10:31:38 I/gt911: touch device gt911 init success
[w] aic_find_panel()62 find panel driver : panel-lvds
[w] aicfb_probe()950 fb0 allocated at 0x46000040
[w] hal_ge_init()1620 dither line phys: 0x464B0100
[w] aic_sdmc_clk_init()547 SDMC1 sclk: 50400 KHz, parent clk 1008000 KHz
01-01 10:31:38 I/SDMC: SDMC1 BW 1, sclk 50400 KHz, clk 400 KHz(406 KHz), div 2-62
[w] aic_sdmc_probe()664 SDMC1 driver loaded
qspi0 freq (input): 91636363Hz
qspi0 freq ( bus ): 91636363Hz
[w] spinand_info_read()472 find raw ID efaa2100
[w] spinand_flash_init()523 Enabled BUF, HWECC. Unprotected.
nftl vol: data, size 0
01-01 10:31:38 I/sensor: rt_sensor[temp_aic] init success
01-01 10:31:38 I/WDT: ArtInChip WDT loaded
01-01 10:31:39 E/DFS: mount fs[elm] on /sdcard failed.
Reboot action: Watchdog-Reset, reason: Command-Reboot
Startup time: 2.004 sec
[ND]nftl start:400,51
[ND]nftl ok!
id = GT911
range_x = 1024
range_y = 600
point_num = 5
官方是要求打开luban-lite的根目录。但根目录下的文件属于开发时的模板文件,应该是不需要做修改的。
用户二次开发的app应该是放在application目录下,并需要编写脚本文件。
对于习惯IDE模式的工程师来讲,甚是不方便,也不直观。
很明显,eclipse没办法支撑开发工作,卡慢死。仿真调试也可以不考虑,还好烧录很快。加上printf,也算行。
其实唯一选择也就是vscode+m命令行编译了。可否像eclipse一样,在project建构好后,也把需要的文件抽取出来到单独文件夹。
之后vscode只打开构建后的project根目录,而不是luban-lite根目录
通过scons --add-board可以从接近的模板中构建自己的模板工程。但下一步要怎么做,毕竟模板工程只是第一步。
1-从menuconfig中开通,关闭本地组件,在线组件,这个很方便。
2-如果需要加入用户自己的app或文件,应该是也要通过menuconfig而不会是在IDE里面强加,不然构建刷新的话,自己的app文件和设置也就没有了。是不是
需要自行编写相应的构建脚本文件?
3-关于GPIO,通过menuconfig,可以配置I2C,CAN这些外设的IO口,并在pinmux.c文件中有体现。但如果是通用IO口,比如就是个LED灯,同时也想在pinmux文件中做统一配置,这时候咋办?
还有个问题是关于eclipse开发的。
通过:scons --target=eclipse_sdk,可以生成完整的eclipse工程,在ide环境下,实测发现:
如果是导入工程并拷贝到本地workspace,这时候eclipse编译速度尚可。但如果是仅是导入而不拷贝,eclipse很容易假死。
另外,如果所构建的工程通过scons --target=eclipse_sdk重新构建后,已有的eclipse工程不会同步更新,因为老工程已经拷贝到本地workspace了。这时候咋办。
后来通过eclipse open projects from file system方式直接使用output文件夹下的eclipse工程,工程重构后,ide里面刷新后确实能自动更新,但还是存在编译速度非常慢的问题。
这一问题小结一下就是:ide只有把构建的工程导入且拷贝到其自己的workspace,编译速度会好一些,但工程重构后,老工程会得不到同步更新。
页次: 1