打印
[单片机芯片]

【CH32X035评估板测评】+3 SD_IAP实现及发现的问题

[复制链接]
2127|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# #技术资源# @21ic小管家

本SD卡升级示例的逻辑框图如下

实例分为两个工程程序,一个是bootloader程序,一个是application程序,两个程序的核心功能是基本一致的,仅在部分节点的执行操作上有所不同,原本想使用一个工程来实现的,但对MounRiver Studio的一些设置不太熟悉,暂时使用两个功能来实现。
下面我来介绍一下真个例程的实现过程。
1移植SD SPI驱动(bootloader和application实现方式相同)
将SD SPI驱动添加到工程目录中

MounRiver Studio会自动添加文件路径到工程内(需要刷新目录)

我这里使用的是硬件SPI,因为X035只有一个SPI接口,我使用的是PA4 PA5 PA6 PA7,sdspi_port.c是SD卡SPI驱动的接口文件,里面是有SPI的相关接口函数。

这里重点介绍一下CS管脚的使用,CS有两种控制模式。一种是软件控制。另一种是硬件控制,一般例程中使用软件模式的情况比较多,硬件模式使用的比较少,我的例程中使用的是硬件模式,经过实际测试,控制时序和描述有点差异,实际情况是,当SPI一旦使能,CS脚就会拉低,不会自动拉高,需要禁用SPI才能使CS恢复为高电平,因此CS的控制是通过使能和禁用SPI来实现的。

在初始化配置时,使用硬件模式也是要注意的

其他接口函数如下



至此,SD卡SPI驱动就移植完了,接下来需要一致fatfs文件系统
fatfs 的官方网站:http://elm-chan.org/fsw/ff/00index_e.html
我这里使用的是最新的R0.15 (November 6, 2022)版本
将fatfs文件系统源码添加到工程目录内

刷新IDE目录,查看到添加的文件内容

Documents内是说明文档和例程文件,这里需要排除构建

diskio.c文件是移植的接口文件,里面需要根据实际使用情况实现接口函数
disk_status、disk_initialize、disk_read、disk_write、disk_ioctl等函数
这些函数的具体操作需要调用SD_SPI中的相关API,所有需要添加头文件路径


再将接口函数实现,board_sdspi_if内关联了SD卡SPI驱动


至此,fatfs文件系统的移植就完成,下面就是具体的操作逻辑了
我们先来看一下芯片启动后的升级标志检查

Bootloader部分判断升级标志是否正常,正常就跳转至APP,不正常则停留在Bootloader等待进行升级操作

APP部分对升级标志的检查是判断是否第一次进行入APP,第一次进入APP则写升级标志位正常,否则正常执行APP

升级标志的存放我做了两个地址的示例,为了不占用程序存储区,标志都是存放在用户选择字存储区,这部分的用法厂家的用户手册写的不是很清楚,我经过测试发确认到底怎么用的,具体可以看一下我的另外一篇帖子

厂家用户手册只描述了8个字节(实际使用了4个字(16个字节))的用法,其他地址就没介绍。


当JUMP_FLAG_MODE  1标志存放在用户选择字 Data1


因为USER 和 RDPRT 在系统复位后从用户选择字区域加载。所以使用FLASH_GetUserOptionByte函数可以读取Data1的值


在调试时发现一处错误,
uint32_tFLASH_GetUserOptionByte(void)函数描述错误
返回值已经进行了右移两位,但返回值描述存在错误

正确的描述应为
The FLASH User Option Bytes values:IWDG_SW(Bit0), RST_STOP(Bit1),RST_STDBY(Bit2) ,RST_MOD(bit[4:3]) ,DATA0(bit[15:8]) and DATA1(bit[23:16]).
当JUMP_FLAG_MODE2 标志存放在APP_UPDATE_FLAG_ADDR地址

整个 用户选择字 存储区的操作函数如下,可以对整个区域地址进行单字写操作

接下来是部分的操作bootloader和APP的一样的



检测到升级文件会有打印信息提示,才会进入到等待升级命令逻辑

启动升级操作时通过串口2下发命令实现的(0xaa 0x01 0x55)

在bootloader中收到升级命令的操作如下

在APP中收到升级命令的操作是清除升级标志,然后跳转至bootloader区,再执行bootloader区升级操作即可。

第一次使用沁恒的risc-v芯片,他们的IAP跳转是由软复位去执行的
先是开启软复位中断

在软复位中断函数内完成起始地址的设定

除了上述代码上的操作为,bootloader和APP工程的.ld文件也需要分别修改
Bootloader的配置如下(起始地址为0大小为20K)

APP的配置如下(起始地址为0x00005000大小为42K)

至此,SD卡进行IAP升级的整个流程就介绍完了



SPI_SD_IAP.zip (5.67 MB)

47a1f215fe8c9719564d3a78a0f24888 (38.87 KB )

47a1f215fe8c9719564d3a78a0f24888

使用特权

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

本版积分规则

认证:北京汇冠触摸技术有限公司/电子工程师
简介:电子工程师,嵌入式应用爱好者。

102

主题

1235

帖子

6

粉丝