打印
[活动专区]

N32G457VL 基于SD卡的IAP

[复制链接]
764|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 qiangtech 于 2023-4-10 23:31 编辑

#申请原创#

经过大约一个星期的调试,终于完成了在N32G45XVL-STB板上进**IAP升级的操作。中间也遇到一些困难,但总体还算顺利。下面说一下我的方法,给大家做个参考。
首先,板载的N32G457芯片是有一个SDIO接口的,而且官方在资料包里也SDIO的驱动示例,这样的话底层驱动可以直接使用官方的,大大节省了移值的时间。


可以看到,官方SDIO驱动非常全面,提供了单块读写,多块读写,GET_STATE,GET_INFO等多个函数,在底层驱动上可以不做改动,直接使用。
在SD_INIT函数里面,有初始化SDIO接口GPIO的函数GPIO_CONFIGURATION.由它定义SDIO的各个功能引脚。





跟着它,最终跟我的SD卡模块连接如下,顺便说一下,有看到网上SPI接口的SD卡模块,只有6个引脚的,就只能用SPI驱动的底层函数了,不能用这个SDIO的驱动。


连接关系:
板卡GPIO口        SD卡口
PC10                                     D02
PC11                                     D03
PD2                                      CMD
PC12                                     CLK
PC8                                       D00
PC9                                       D01


SD模块的电源和地接到开发板的3.3V和GND上即可。完成连接后,硬件上就没有再改动的了。


连接好之后,就可以用这个例程测试一下SD卡模块和SD卡了。





例程读取了卡的信息并且做了读写比较操作。
我在这里遇到了第一个麻烦,我有一张128M的小卡,用它测试时,显示它的BLOCKSIZE是1024的。我就想把BLOCKSIZE改为1024来读写,结果就是卡死在DMA传输那里。




把DATBLKSIZE改成10<<4也是不行,能写不能读。


花了好多时间,没有找到问题根源。好在BLOCKSIZE在512情况下,读写都是没问题的。

因为要进行IAP升级,就要识别SD卡里的文件,所以要运行一个文件系统就是必要的。常用的文件系统FATFS.
第二步:移值FATFS.
FATFS是开源的,直接上官网下载一个。



最新的版本到R0.15了。
网站了介绍了它的函数和结构,可以看看参考下。





下载下来可以直接加入到例程工程中。

需要修改完善的DISKIO.C和FFCONF.H.  
先说FFCONFIG.H就是FATFS的配置文件,修改了几处。







然后是DISKIO.C,在这个文件中,要做一些方法与官方的SDIO驱动连接起来。

我是把SD卡挂载到0:下面,所以:


一共有5个函数要做一下连接:
Disk_status:



Disk_initialize:


Disk_read:



Disk_write:


Disk_ioctl:


因为前面测试BLOCKSIZE为1024时老是读写错误,现在我就将BLOCKSIZE固定为512了。
另外,读写函数也改了一点。


到此,FATFS移植完成。可以找到已经格式化的SD卡试试F_MOUNT能不能挂载成功了。因为我们是要使用SD卡内的BIN文件来IAP升级,所以是不能在板上对SD卡进行格式化。在PC上对SD卡进行格式化后,可以用WINHEX软件查看一下扇区数据,如果后面F_MOUNT不成功需要调试时可以用来对比读出的数据。



这是我这张卡的启动扇区数据,显示物理扇区是在128.

F_MOUNT成功后,就可以进入打开文件操作和烧写FLASH了。

找到文件后打开,流程如下:





具体的实现方法:

F_OPENDIR:



F_READDIR:


在目录内读取到文件后,会检查文件名来确认是不是用来IAP的BIN文件。检查规则:

能够用于IAP的文件必须是以0X08开头,以BIN结尾的13字符文件名。里面包含IAP APP的地址。比如0X08009000.BIN,文件名符合规则后。就会用这个文件开始IAP,并且用文件名的数字做为IAP APP的地址。

下一步就是边读文件边烧写FLASH了:



直到文件结束。
最后是就校验了,再次打开文件。边读边与上一步写入FLASH的数据进行比对。



比对没有错误就是IAP 成功了,再把IAP APP 地址写入到一个固定的FLASH地址。下次启动没有进行IAP也可以取得这个IAP APP地址进行跳转。

我把IAP APP地址存放在0X08008000.


至此,IAP功能结束,可以跳转到APP运行了。


做了一个按键跳转,按S1键就跳转入APP运行。这里要注意一点,在跳转前一定要记得关掉中断,比如上图中的TIM6的中断,没关中断的时候一跳转就死机了。

为了在没有串口条件下直观观看IAP结果,利用板载的LED做了一个简单的指示。


IAP 运行中时红灯闪,IAP失败红灯常亮,IAP成功后亮绿灯。








再来看下APP程序这边。直接用官方例程GPIO/LED_BLINK来改一下。

改成红绿兰三个灯闪。很简单。

改中断向量偏移量。


改ROM和RAM配置:


改好后编译,找到BIN文件,改名为0X08009000.bin,存放到SD卡里准备IAP使用。

可以再次用WINHEX看一下这个BIN文件里的数据,如果需要调试时可以做为参照。


万事俱备了,可以做最后的测试了。
把IAP下载到板子上,把包含BIN的SD卡插入卡座。运行。

提示按S1键的时候按一下S1,顺利进入了APP.

有一个小开关DIS_DATA,打开后可以在读取文件时一并显示文件数据,方便调试。




打开显示数据会增加IAP的时间。


另外,可以使用官方的上位机工具来读取FLASH中的数据。比如查看地址0X08000000的IAP程序,和0X08008000上APP跳转地址,0X08009000位置的APP程序。如果有问题需要调试时会有很大帮助。





没插SD卡,IAP失败后亮红灯。



跳转到APP程序后,三个灯一起闪。



IAP成功后亮绿灯。




总结:这不是一个很难的工程,而且官方和网上已经有了很多的资料。需要一些耐心,再加上认真小心的调试,还有一些工具软件,总会有一些成果的。满意的地方是基本上完成预想的功能, 但是这个IAP工程编译出来在开了3级优化的前提下,居然还有接近30K的CODE.
后面还可以找找能删减的部分,减少一些代码量。






附件文件说明:
3个LOG文件分别是开显示数据和不开显示数据,不插SD卡启动时的UART输出LOG。
0X08009000.BIN是启动地址为0X08009000的APP BIN.



附件.rar (7.73 KB)
NS_SD_IAP.rar (6.5 MB)



使用特权

评论回复
评论
21小跑堂 2023-5-11 11:25 回复TA
申请原创要@21小跑堂噢~ 
沙发
fcccc| | 2023-5-11 22:30 | 只看该作者
不错

使用特权

评论回复
板凳
biechedan| | 2023-6-6 12:22 | 只看该作者
制作一个基于SD卡的文件系统工程

使用特权

评论回复
地板
lihuami| | 2023-6-6 12:59 | 只看该作者
来一个sd卡的IAP升级固件教程。

使用特权

评论回复
5
backlugin| | 2023-6-6 13:15 | 只看该作者
使用SD卡进行IAP升级,速度很快。

使用特权

评论回复
6
i1mcu| | 2023-6-6 13:38 | 只看该作者
在实现适用于 MCU 的通用 IAP 程序框架

使用特权

评论回复
7
ccook11| | 2023-6-6 14:20 | 只看该作者
在实现基于SD卡的IAP时,要充分考虑设备的性能、存储空间、数据传输速度等因素

使用特权

评论回复
8
phoenixwhite| | 2023-6-6 14:28 | 只看该作者
可以从串口、外部 SPI FLASH、外部 SDIO SD 卡、USB Device MSC 或者 USB HOST MSC等等途径更新 MCU 固件。

使用特权

评论回复
9
sdCAD| | 2023-6-6 14:52 | 只看该作者
固件升级方式,可以通过SD卡来更新嵌入式系统的固件。

使用特权

评论回复
10
wwppd| | 2023-6-6 17:35 | 只看该作者
DFU用来做IAP是很方便的               

使用特权

评论回复
11
wilhelmina2| | 2023-6-6 17:41 | 只看该作者
可以直接通过USB来对APP进行升级

使用特权

评论回复
12
cemaj| | 2023-6-6 17:49 | 只看该作者
用SD卡进行IAP固件升级用的bootloader怎么写的

使用特权

评论回复
13
macpherson| | 2023-6-6 18:10 | 只看该作者
测试速度很快啊               

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

1362

帖子

11

粉丝