[单片机芯片] 【CH32X035评估板测评】+3 SD_IAP实现及发现的问题

[复制链接]
 楼主| 6552918 发表于 2023-10-15 21:50 | 显示全部楼层 |阅读模式
#申请原创# #技术资源# @21ic小管家

本SD卡升级示例的逻辑框图如下
1.png
实例分为两个工程程序,一个是bootloader程序,一个是application程序,两个程序的核心功能是基本一致的,仅在部分节点的执行操作上有所不同,原本想使用一个工程来实现的,但对MounRiver Studio的一些设置不太熟悉,暂时使用两个功能来实现。
下面我来介绍一下真个例程的实现过程。
1移植SD SPI驱动(bootloader和application实现方式相同)
将SD SPI驱动添加到工程目录中
7cd8030f89c6c5d329dd16048d524411
MounRiver Studio会自动添加文件路径到工程内(需要刷新目录)
cc1a983c3b8a45c535c4a1bfdab6f246
我这里使用的是硬件SPI,因为X035只有一个SPI接口,我使用的是PA4 PA5 PA6 PA7,sdspi_port.c是SD卡SPI驱动的接口文件,里面是有SPI的相关接口函数。
66d12a773901efed121e3b162ef6975e
这里重点介绍一下CS管脚的使用,CS有两种控制模式。一种是软件控制。另一种是硬件控制,一般例程中使用软件模式的情况比较多,硬件模式使用的比较少,我的例程中使用的是硬件模式,经过实际测试,控制时序和描述有点差异,实际情况是,当SPI一旦使能,CS脚就会拉低,不会自动拉高,需要禁用SPI才能使CS恢复为高电平,因此CS的控制是通过使能和禁用SPI来实现的。
1d77948ad1b438c123986fc8eae7e330
在初始化配置时,使用硬件模式也是要注意的
1a82d761244979eb473ba1c6fe9f27b2
其他接口函数如下
cadf72883a63b503f6654e113ad9dc7a
d5027dfc6c985d20d87502164cdc393f
24f3527e7defa99244c74dc87fc28453
至此,SD卡SPI驱动就移植完了,接下来需要一致fatfs文件系统
fatfs 的官方网站:http://elm-chan.org/fsw/ff/00index_e.html
我这里使用的是最新的R0.15 (November 6, 2022)版本
将fatfs文件系统源码添加到工程目录内
82de88c092f3e8ee5205e71e65fe56ac
刷新IDE目录,查看到添加的文件内容
57d970945320cd18669daae2279e34af
Documents内是说明文档和例程文件,这里需要排除构建
fa9610a7985eabd09a22fadbf7262c5b
diskio.c文件是移植的接口文件,里面需要根据实际使用情况实现接口函数
disk_status、disk_initialize、disk_read、disk_write、disk_ioctl等函数
这些函数的具体操作需要调用SD_SPI中的相关API,所有需要添加头文件路径
ae7ca650d0c5a59f7caf75c8f43562da
84726e0ace6efc4743463eab9bc10aa3
再将接口函数实现,board_sdspi_if内关联了SD卡SPI驱动
de1a3313b7d988d387ca89f00737cff7
4a6f96b3f25f672e52362c7648ea75c5
至此,fatfs文件系统的移植就完成,下面就是具体的操作逻辑了
我们先来看一下芯片启动后的升级标志检查
67acf7b26924e397ebc57508fd466cb0
Bootloader部分判断升级标志是否正常,正常就跳转至APP,不正常则停留在Bootloader等待进行升级操作
acf825fe89f484317d9d12217f5b7afb
APP部分对升级标志的检查是判断是否第一次进行入APP,第一次进入APP则写升级标志位正常,否则正常执行APP
9daa24eae09a4c6bfd1fb0ce6ea05fb0
升级标志的存放我做了两个地址的示例,为了不占用程序存储区,标志都是存放在用户选择字存储区,这部分的用法厂家的用户手册写的不是很清楚,我经过测试发确认到底怎么用的,具体可以看一下我的另外一篇帖子
0be964b549c4bc8d673a0e1c6eecd657
厂家用户手册只描述了8个字节(实际使用了4个字(16个字节))的用法,其他地址就没介绍。
859a42f431689c956f91fa996cf2be0f
37e49753d141aa9948acbb15a8f14220
当JUMP_FLAG_MODE  1标志存放在用户选择字 Data1
b123a11a5153521d489ae9fa8d79638b
db3e9071a33cd3006c933c1a42e097ee
因为USER 和 RDPRT 在系统复位后从用户选择字区域加载。所以使用FLASH_GetUserOptionByte函数可以读取Data1的值
c0ce4f8738fe3f71f1fa8fedb0970fa0
8438585555b166533119502eeae0c63b
在调试时发现一处错误,
uint32_tFLASH_GetUserOptionByte(void)函数描述错误
返回值已经进行了右移两位,但返回值描述存在错误
b3f0dc4b4e39bd037597825baf349ee9
正确的描述应为
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]). 8c26e07fec2c7e9dc33af264c168e10b
当JUMP_FLAG_MODE2 标志存放在APP_UPDATE_FLAG_ADDR地址
2e4b1d77ac316ddae9b8191da050ca9b
整个 用户选择字 存储区的操作函数如下,可以对整个区域地址进行单字写操作
cad2ea6bca923043dcb60e6a11c417d4
接下来是部分的操作bootloader和APP的一样的
fb6309c1e7f3666f8dd0665c27c87688
d372eb9a5182d801aad9c001a8bb3075
ec7a130af3c05719c0bb7279f2db9ee2
检测到升级文件会有打印信息提示,才会进入到等待升级命令逻辑
0a83688a8cb26e75df0b0a2bae872c09
启动升级操作时通过串口2下发命令实现的(0xaa 0x01 0x55)
dc89f07cd005552f39b6a56ca72038ca
在bootloader中收到升级命令的操作如下
e1231272509794dc2f2cac3e48836899
在APP中收到升级命令的操作是清除升级标志,然后跳转至bootloader区,再执行bootloader区升级操作即可。
270f01ae4f086d929240c47e1411c16a
第一次使用沁恒的risc-v芯片,他们的IAP跳转是由软复位去执行的
先是开启软复位中断
82dd65d1120dfda0a6fa71db980553dc
在软复位中断函数内完成起始地址的设定
47fd383a9034bbb8871eee81626b8a41
除了上述代码上的操作为,bootloader和APP工程的.ld文件也需要分别修改
Bootloader的配置如下(起始地址为0大小为20K)
25b5754344ec8ac7176b99e9628266e2
APP的配置如下(起始地址为0x00005000大小为42K)
5dc9eb582373c37a5301b248d2f093de
至此,SD卡进行IAP升级的整个流程就介绍完了
1d960a9104a12fc781000214109fcf22
ce1acbf472140d3cb220d395a3f7dcca

SPI_SD_IAP.zip (5.67 MB, 下载次数: 9)

47a1f215fe8c9719564d3a78a0f24888
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

102

主题

1290

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部