简介
W806 芯片是一款安全 IoT MCU 芯片。芯片集成 32 位 CPU 处理器,内置 UART、GPIO、SPI、SDIO、I2C、I2S、PSRAM、7816、ADC、LCD、TouchSensor 等数字接口;支持 TEE 安全引擎,支持多种硬件加解密算法,内置 DSP、浮点运算单元与安全引擎,支持代码安全权限设置,内置 1MB Flash 存储器,支持固件加密存储、固件签名、安全调试、安全升级等多项安全措施,保证产品安全特性。适用用于小家电、智能家居、智能玩具、工业控制、医疗监护等广泛的物联网领域。
目前 MCU 溢价严重,这款 W806 目前官网售价是:5.90
元/片,感觉可以入手一试;
除此之外还可以选择带有 WIFI 和 BLE 的 W801,同样也是 5.9
元/片;
MCU特性:
- 集成 32 位 XT804 处理器,工作频率 240MHz,内置 DSP、浮点运算单元与安全引擎
- 内置 1MB Flash,288KB RAM
- 集成 PSRAM 接口,支持最高 64MB 外置 PSRAM 存储器
- 集成 6 路 UART 高速接口
- 集成 4 路 16 比特 ADC,最高采样率 1KHz
- 集成 1 个高速 SPI 接口(从接口),支持最高 50MHz
- 集成一个主/从 SPI 接口
- 集成 1 个 SDIO_HOST 接口,支持 SDIO2.0、SDHC、MMC4.2
- 集成 1 个 SDIO_DEVICE,支持 SDIO2.0,最高吞吐率 200Mbps
- 集成 1 个 I2C 控制器
- 集成 GPIO 控制器,最多支持 44 个 GPIO
- 集成 5 路 PWM 接口
- 集成 1 路 Duplex I2S 控制器
- 集成 LCD 控制器,支持 4x32 接口
- 集成 1 个 7816 接口
- 集成 15 个 Touch Sensor
安全特性:
- MCU 内置 Tee 安全引擎,代码可区分安全世界/非安全世界
- 集成 SASC/TIPC,内存及内部模块/接口可配置安全属性,防止非安全代码访问
- 启用固件签名机制,实现安全 Boot 升级
- 具备固件加密功能,增强代码安全
- 固件加密密钥使用非对称算法分发,增强密钥安全性
- 硬件加密模块:RC4256、AES128、DES/3DES、SHA1/MD5、CRC32、2048 RSA,真随机数发生器
功耗特性:
- 3.3V 单电源供电
- 支持工作、睡眠、待机、关机工作模式
- 待机功耗小于 10uA
开发环境设置
下载并解压编译器,打开 eide 插件设置,设置 any-gcc 的 安装目录
和 编译器前缀
(本处编译器前缀为:csky-elfabiv2-
)
工程建立与编译
打开 eide,点击新建空项目,选择 any-gcc
项目;新建完成后打开项目
在项目目录下新建一个 sdk
文件夹,将 WM_SDK_W806.rar 解压到该文件夹下,如下:
接下来打开 eide 项目资源管理器,开始添加源文件,需要添加的文件夹如下:
sdk/app
目录
sdk/include
目录
sdk/lib
目录
sdk/platform
目录
添加完毕后,如下所示:
打开构建配置,设置编译参数。设置完成后,ctrl+s
即可保存配置
设置链接脚本路径,sdk 链接脚本位置:sdk/ld/W806/gcc_csky.ld
打开 Builder Options
, 切换至 Global Options
选项卡,设置如下参数:
-mcpu=ck804ef -mhard-float
切换至 C/C++ Compiler
选项卡,分别为 C/C++ 编译器设置如下参数:
# C 编译器参数
-c -x c -ffunction-sections -fdata-sections -std=gnu99 -g -Og
# C++ 编译器参数
-c -x c++ -ffunction-sections -fdata-sections -std=gnu99 -g -Og
切换至 Asm Compiler
选项卡,为汇编器设置如下参数:
-c -std=gnu99
切换至 Linker
选项卡,为链接器设置如下参数:
# 链接器参数
-Wl,--gc-sections -Wl,--print-memory-usage -nostartfiles
# 链接库参数
-lm
之后,点击 项目属性 的修改按钮,设置预处理器定义,如下:
__CK804__
TLS_CONFIG_CPU_XT804
WM_SWD_ENABLE=1
修改完成后保存,即可完成预处理器定义的设置
点击编译按钮,编译整个项目:
打开 Output Files
,ELF 文件已生成
由于 any-gcc
没有设置生成 bin
文件的命令,所以我们需要自己添加;打开 构建配置->构建器选项->用户任务,在 Post Build Task 任务内添加如下命令:
"${CompilerFolder}\${CompilerPrefix}objcopy" -O binary "${OutDir}\${TargetName}.elf" "${OutDir}\${TargetName}.bin"
由于 W806 使用 fls
文件进行烧录,因此我们还需要生成 fls
文件,在项目根目录下新建一个 tools
目录,在里面新建一个 shell
脚本文件,名为 make_img.sh
,脚本内容如下:
#!/bin/sh
##########################
# project info
ProjName=$1
ObjFolder=$2
if [ x"$ProjName" == x"" ]; then
ProjName="w806_demo"
fi
if [ x"$ObjFolder" == x"" ]; then
ObjFolder=./build/Debug
fi
##########################
# dist folder
BinFolder=./bin
##########################
# firmware config
signature=0
prikey_sel=0
code_encrypt=0
sign_pubkey_src=0
img_type=1
zip_type=1
sec_img_header=8002000
sec_img_pos=8002400
run_img_header=8010000
run_img_pos=8010400
upd_img_pos=8010000
if [ $prikey_sel -gt 0 ]
then
let img_type=$img_type+32*$prikey_sel
fi
if [ $code_encrypt -eq 1 ]
then
let img_type=$img_type+16
fi
if [ $signature -eq 1 ]
then
let img_type=$img_type+256
fi
if [ $sign_pubkey_src -eq 1 ]
then
let img_type=$img_type+512
fi
##################################
# copy bin files
rm -rf ./${BinFolder}
mkdir -p ${BinFolder}
cp -f "${ObjFolder}/${ProjName}.bin" "${BinFolder}/${ProjName}.bin"
cp -f "${ObjFolder}/${ProjName}.elf" "${BinFolder}/${ProjName}.elf"
cp -f "${ObjFolder}/${ProjName}.map" "${BinFolder}/${ProjName}.map"
##################################
# gen firmware
if [ $code_encrypt -eq 1 ]
then
let prikey_sel=$prikey_sel+1
openssl enc -aes-128-ecb -in ${BinFolder}/"$ProjName".bin -out ${BinFolder}/"$ProjName"_enc.bin -K 30313233343536373839616263646566 -iv 01010101010101010101010101010101
openssl rsautl -encrypt -in ./sdk/tools/W806/ca/key.txt -inkey ./sdk/tools/W806/ca/capub_"$prikey_sel".pem -pubin -out key_en.dat
cat ${BinFolder}/"$ProjName"_enc.bin key_en.dat > ${BinFolder}/"$ProjName"_enc_key.bin
cat ${BinFolder}/"$ProjName"_enc_key.bin ./sdk/tools/W806/ca/capub_"$prikey_sel"_N.dat > ${BinFolder}/"$ProjName"_enc_key_N.bin
./sdk/tools/W806/wm_tool.exe -b ${BinFolder}/"$ProjName"_enc_key_N.bin -o ${BinFolder}/"$ProjName" -it $img_type -fc 0 -ra $run_img_pos -ih $run_img_header -ua $upd_img_pos -nh 0 -un 0
else
./sdk/tools/W806/wm_tool.exe -b ${BinFolder}/"$ProjName".bin -o ${BinFolder}/"$ProjName" -it $img_type -fc 0 -ra $run_img_pos -ih $run_img_header -ua $upd_img_pos -nh 0 -un 0
fi
if [ $signature -eq 1 ]
then
openssl dgst -sign ./sdk/tools/W806/ca/cakey.pem -sha1 -out ${BinFolder}/"$ProjName"_sign.dat ${BinFolder}/"$ProjName".img
cat ${BinFolder}/"$ProjName".img ${BinFolder}/"$ProjName"_sign.dat > ${BinFolder}/"$ProjName"_sign.img
mv ${BinFolder}/"$ProjName"_sign.img ${BinFolder}/"$ProjName"_sign.img
#when you change run-area image's ih, you must remake secboot img with secboot img's -nh address same as run-area image's ih
./sdk/tools/W806/wm_tool.exe -b ./sdk/tools/W806/W806_secboot.bin -o ${BinFolder}/"$ProjName"_secboot -it 0 -fc 0 -ra $sec_img_pos -ih $sec_img_header -ua $upd_img_pos -nh $run_img_header -un 0
cat ${BinFolder}/"$ProjName"_secboot.img ${BinFolder}/"$ProjName"_sign.img > ${BinFolder}/"$ProjName".fls
else
#when you change run-area image's ih, you must remake secboot img with secboot img's -nh address same as run-area image's ih
./sdk/tools/W806/wm_tool.exe -b ./sdk/tools/W806/W806_secboot.bin -o ${BinFolder}/"$ProjName"_secboot -it 0 -fc 0 -ra $sec_img_pos -ih $sec_img_header -ua $upd_img_pos -nh $run_img_header -un 0
cat ${BinFolder}/"$ProjName"_secboot.img ${BinFolder}/"$ProjName".img > ${BinFolder}/"$ProjName".fls
fi
#produce compressed ota firmware*/
if [ $zip_type -eq 1 ]
then
if [ $signature -eq 1 ]
then
./sdk/tools/W806/wm_tool.exe -b ${BinFolder}/"$ProjName"_sign.img -o ${BinFolder}/"$ProjName"_sign -it $img_type -fc 1 -ra $run_img_pos -ih $run_img_header -ua $upd_img_pos -nh 0 -un 0
mv ${BinFolder}/"$ProjName"_sign_gz.img ${BinFolder}/"$ProjName"_sign_ota.img
else
./sdk/tools/W806/wm_tool.exe -b ${BinFolder}/"$ProjName".img -o ${BinFolder}/"$ProjName" -it $img_type -fc 1 -ra $run_img_pos -ih $run_img_header -ua $upd_img_pos -nh 0 -un 0
mv ${BinFolder}/"$ProjName"_gz.img ${BinFolder}/"$ProjName"_ota.img
fi
fi
#openssl --help
然后接着在 Post Build Task 里添加一个任务(该命令将在编译后调用 make_img.sh
脚本生成 fls
),命令如下:
bash ./tools/make_img.sh "${TargetName}" "${OutDir}"
填写完成并保存,按 F7
进行编译,hex
和 fls
会自动在编译完成后生成
程序烧录,效果
本例程使用官方的烧录程序:Upgrade Tools
从串口完成烧录
EIDE 工程模板
编译器下载: csky-elfabiv2-tools-mingw-minilibc.7z
HLKW806: w806_vsc_eide_template
HLKW801: w801_vsc_eide_template