- 2021-02-23
-
发表了主题帖:
【GD32E503评测】+ cJSON移植测试
JSON, 全称是”JavaScript Object Notation”, 它是一种基于文本,独立于语言的轻量级数据交换格式, XML也是一种数据交换格式,但是风格上我个人更喜欢JSON,因为XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记。
JSON有两种表示结构,对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组
数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成。没了解过JSON的可以看看这个网站,有比较详细的介绍说明。
http://www.json.org.cn/
单片机解析JSON的库有很多,这是在网络上找的,大家可以参考一下。
因为对cJSON比较熟悉,所以我选择了cJSON移植到GD32E503开发板上。
cJSON是开源的,在github上可以下载 https://github.com/DaveGamble/cJSON
cJSON移植也比较简单,就是把这4个文件,cJSON .c、cJSON.h、cJSON_Utils.h、cJSON_Utils.c,添加到项目文件中去就可以了,加入测试程序,串口打印出数据。
cJSON我在实际应用当中也经常碰到一些问题,最主要的还是内存分配。因为cJSON用的是编译器自带的malloc内存分配,所以Head堆空间要配置大一些,否则文件大了,容易出现内存不足而导致分配失败。本来计划用QSPI接口的SPIflash来存储解析,可是查看了开发板,发现很多IO口都已经分配殆尽。cJSON文件太大还是很耗内存资源的,如果用支持QSPI的可寻址这个特性来读取,效率就比较高了,因为cJSON解析JSON文件的时候,是要把整个文件都放在内存区域才能解析,也没办法预取部分来解析,所以对于内存空间较小的MCU,还是不推荐使用。
最后附上源代码
- 2021-02-22
-
发表了主题帖:
【GD32E503评测】+ SX1278模块移植
LoRa 的名字是远距离无线电(Long Range Radio),作为一种线性调频扩频的调制技术,最早由法国几位年轻人创立的一家创业公司 Cycleo 推出,2012 年 Semtech 收购了这家公司,并将这一调制技术封装到芯片中,基于 LoRa 技术开发出一整套 LoRa 通信芯片解决方案,包括用于网关和终端上不同款的 LoRa 芯片,开启了 LoRa 芯片产品化之路。
目前多个项目有用到SX1278模块,应用于远程水电抄表、远程智能灯控等,应用性比之前的CC1101有着更好的通信距离和抗干扰能力,LoRa 的特性总结:
传输距离:城镇可达 2-5 Km , 郊区可达 15 Km 。
工作频率:ISM 频段包括 433、868、915 MH 等。
标准:IEEE 802.15.4g。
调制方式:基于扩频技术,线性调制扩频(CSS)的一个变种,具有前向纠错(FEC)能力,semtech 公司私有专利技术。
容量:一个 LoRa 网关可以连接上千上万个 LoRa 节点。
此次测试的SX1278 Lora模块购买于淘宝,采用SPI通讯接口,还用到DIO0作为空中载波的判断,程序我年前已经适配过了,但是开发板放在老家忘记拿回来了,所以没有配图,只有源代码。
接口说明:
PA7—>SX1278_MOSI
PA6—> SX1278_MISO
PA5—> SX1278_SCK
PE3—> SX1278_CS
PE6—> SX1278_RST
PB0—> SX1278_DIO0
源代码的稳定性,我已经在多个项目上稳定运行很久了,暂时还没有发现BUG,刚接触SX1278的网友们可以下载参考一下。
- 2021-01-22
-
发表了主题帖:
【GD32E503评测】+ W5500网络模块移植
现在搞物联网的趋势日益增长,我在项目中也经常接触到网络。因为GD32E503V这款MCU没有内置网络接口,所以我通过SPI接口扩展了W5500模块来实现网络通讯。
W5500 芯片是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片,是韩国WIZnet(微知纳特)发布全硬件TCP/IP协议栈以太网接口芯片。W5500 支持高速标准4线SPI接口与主机进行通信,该 SPI 速率理论上可以达到 80MHz。其内部还集成了以太网数据链路层(MAC)和10BaseT/100BaseTX 以太网物理层(PHY),支持自动协商(10/100-Based全双工/半双工)、掉电模式和网络唤醒功能。与传统软件协议栈不同,W5500内嵌的8个独立硬件 Socket 可以进行8路独立通信,该8路Socket的通信效率互不影响,可以通过 W5500 片上32K 字节的收/发缓存灵活定义各个Socket的大小。
本来计划通过开发板外引的IO口来扩展SPI接口,最后查看了半天的原理图,把相关SPI的IO口都一个个标注出来,才发现MCU自带的3个SPI都已经用掉了,一个是SPI Flash,一个是SDIO的SD卡,一个是复用成I2S的音频模块,想找第二公用功能以及remap都找不到能用的,无奈之下,只能焊掉SPI Falsh,也就是GD25Q16芯片,W5500的一直功能才得以实现。
W5500的驱动库,可以到github上去下载:https://github.com/Wiznet/ioLibrary_Driver
这是我新建的W5500的项目结构
硬件连接接口如下:
PA7—>W5500_MOSI
PA6—>W5500_MISO
PA5—>W5500_SCK
PE3—>W5500_CS
PE6—>W5500_RST
调试过程中我自己还发现了一个问题,因为此次调试的W5500是模块形式组成,所以用杜邦线来接到开发板,以前的项目W5500都是直接layout到板上。同样的程序,在STM32上跑得很欢快,但是在这块开发板为啥死活都出不来呢…… 经过不断的排查再排查,问题居然出在杜邦线上,可能我用的杜邦线质量比较差(顺便吐槽一下,某宝上的杜邦线压根找不到质量好的,如果坛友有推荐的,还麻烦介绍一下,谢谢哈),后来用了另外一种杜邦线,就可以了。本来信心满满地认为调试只要半天就可以了,后来在这个问题上至少浪费了我3天的时间……
主循环里,我做了个Socket Server的服务,端口12345,用网络调试工具连上去,就可以双向发送数据了。有兴趣的可以下载完整项目代码参考一下。
- 2021-01-20
-
回复了主题帖:
【GD32E503评测】+ Littlefs移植
yang377156216 发表于 2021-1-19 17:10
芯片自己的 flash 用这个不知道能不能充当 模拟EEPROM 的作用 ?
理论上可行 但是内部的flash有的不是连续的块 这样操作起来就有问题
- 2021-01-18
-
加入了学习《DIY 离线语音空调助手,懒人系列》,观看 DIY离线语音空调助手,空调码库一键匹配,支持温度调节
- 2021-01-14
-
发表了主题帖:
【GD32E503评测】+ Littlefs移植
littlefs 是 ARM 官方推出的,专为嵌入式系统设计的文件系统,相比传统的文件系统,littlefs 具有以下优点:
自带擦写均衡
支持掉电保护
占用的 RAM/ROM 少
littlefs 自带的擦写均衡和掉电保护使开发者可以放心的将文件系统挂载到 nor flash 上。
https://github.com/littlefs-project/littlefs 这是github上的开源项目地址,有兴趣的可以关注下载。
littlefs的移植也非常简单,项目上添加lfs_util.c和lfs.c文件,然后配置参数如下:
#define BUFFER_SIZE 256
#define BLOCK_SIZE 4096
#define BOLCK_NUM 512 // 2M--512 8M--2048 16M--4096
#define LOOKAHEAD_SIZE (lfs_size_t)(BOLCK_NUM / 8)
lfs_t lfs;
lfs_file_t lfs_file;
static int lfs_flash_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size);
static int
lfs_flash_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size);
static int lfs_flash_erase(const struct lfs_config *c, lfs_block_t block);
static int lfs_flash_sync(const struct lfs_config *c);
const struct lfs_config cfg = {
// block device operations
.read = lfs_flash_read,
.prog = lfs_flash_prog,
.erase = lfs_flash_erase,
.sync = lfs_flash_sync,
// block device configuration
.read_size = BUFFER_SIZE,
.prog_size = BUFFER_SIZE,
.block_size = BLOCK_SIZE,
.block_count = BOLCK_NUM,
.cache_size = BUFFER_SIZE,
.lookahead_size = LOOKAHEAD_SIZE,
.block_cycles = 500,
};
然后对接口函数进行补充
static int lfs_flash_read(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size)
{
uint32_t addr;
addr = ((uint32_t)block << (uint32_t)12);
addr += off;
#ifdef enable_flash_debug
char message[64];
if(Flash_Debug_Flag)
{
memset(message, 0x00, sizeof(message));
sprintf(message, "Flash Read Block is %d, Offset is %d, Size is %d\n\r", block, off, size);
debug_log(message, strlen(message));
}
#endif
spi_flash_buffer_read((uint8_t *)buffer, addr, size);
return LFS_ERR_OK;
}
static int
lfs_flash_prog(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size)
{
uint32_t addr;
addr = ((uint32_t)block << (uint32_t)12);
addr += off;
// SPI_Flash_Write(addr, size, (uint8_t *)buffer);
#ifdef enable_flash_debug
char message[64];
if(Flash_Debug_Flag)
{
memset(message, 0x00, sizeof(message));
sprintf(message, "Flash Prog Block is %d, Offset is %d, Size if %d\n\r", block, off, size);
debug_log(message, strlen(message));
}
#endif
spi_flash_buffer_write((uint8_t *)buffer, addr, size);
return LFS_ERR_OK;
}
static int lfs_flash_erase(const struct lfs_config *c, lfs_block_t block)
{
#ifdef enable_flash_debug
char message[64];
if(Flash_Debug_Flag)
{
memset(message, 0x00, sizeof(message));
sprintf(message, "Erase Block is %d\n\r", block);
debug_log(message, strlen(message));
}
#endif
spi_flash_sector_erase(block << 12);
return LFS_ERR_OK;
}
static int lfs_flash_sync(const struct lfs_config *c)
{
return LFS_ERR_OK;
}
开发板中的spi flash的型号是gd25q16,空间大小是2M 字节,相应的驱动,开发板上附带的例程已经有了。
运行littlefs的测试程序,用串口debug输出结果
littlefs已经在我的多个项目中使用并量产了,到目前为止还没发现过大问题,就是写入文件有时候耗费的时间比较多,特别是文件数量比较多的时候,感觉更明显。
附上完整的项目文件供大家参考,有什么问题也大家也可以互相讨论一下:
- 2021-01-11
-
发表了主题帖:
【GD32E503评测】+ 上手初体验
我非常有幸的成为兆易创新科技公司的GD32E503V-EVAL开发板的评测人员。
因为我本人从事的是智能家居产品的软硬件设计开发,工作中接触到的网络、RF通讯比较多,所以我的总测评流程计划如下:
移植网络W5500 (实现基本的网络通讯框架以及Tftp下载,实现远程固件更新和文件下载到SpiFlash,文件系统采用Littlefs)
移植Lora sx1278模块 (实现基本的RF模块初始化配置和通讯)
测试QSPI接口解析JSON速度 (基于QSPI接口的SpiFlash的JSON文件的解析)
对外设接口的驱动
收到开发板有些时日了,因为年尾了,手头上的项目有点紧,赶紧抽空对开发板来一个第一轮的简单开箱上电评测。
开发板的外包装档次还是比较高的,值得永久珍藏。
再来看主角的全貌,PCB布板干净整洁,自带仿真器,资源丰富,有LED、按键、Nand Flash(一开始没找到,原来藏在LCD下面)、LCD、USB、EEPROM、数字音频模块等,还引出了所有的IO口,作为一块开发板,物尽其用。
首先打开兆易官网的链接找到GD32E5的资料
http://www.gd32mcu.com/cn/download/0?kw=GD32E5
把这些资料全部下载到电脑。MDK的包管理器里还找不到GD32E50x的包,所以先安装GD32E50x ADD-ON文件夹里的DFP文件。
然后就可以打开下载好的GD32E50x-Demo_Suites目录的例程
这里我选择了第一个GPIO_Running_LED来进行开箱测试。
看原理图,四个LED等分别对应的IO口是PC0、PC2、PE0、PE1
打开MDK的工程文件
可以看到工程中初始化的LED就是对应的原理图中的四个IO口,看来例程的代码都是完全匹配开发板的。然后编译运行…… 哎呀,怎么仿真出错了,噢,对了,还没有选仿真器呢!打开仿真器设置界面,怎么没有GD-LINK呢?难道是驱动没有装,但是没看到官网有提供驱动下载啊!
看了GD-Link的文档说明,才发现就是基于CMSIS-DAP的仿真器接口
仿真器上选择了CMSIS-DAP,运行,开发板上的4个LED逐个点亮然后灭掉
至此,第一轮的上电开箱评测结束,后续的会陆陆续续补上来。
- 2021-01-07
-
回复了主题帖:
了解PI最新产品,评论、下载抢楼好礼送!
我从事智能家居行业,设计过智能开关的86盒底座的电源板,本身空间受限,又要多路继电器输出,导致开关电源选型上比较费劲,又要考虑emc电容的大小位置以及工频滤波器电感等,看到MinE-CAP的介绍, 适用于超大功率密度AC/DC变换器的大容量电容小型化和浪涌管理IC ,可以较少50%的输入电容容量,内置了NTC,输入宽电压,各项指标参数也非常不错。
-
回复了主题帖:
了解PI最新产品,评论、下载抢楼好礼送!
- 2020-12-30
-
回复了主题帖:
测评入围名单:免费评测GD32E503V-EVAL(M33、带屏)
个人信息无误,确认可以完成评测计划,收到后,我们就会安排寄送开发板。
- 2020-12-14
-
加入了学习《5系列校准器介绍》,观看 5730A介绍视频
-
回复了主题帖:
出一批terasic tr4 stratix iv fpga开发板 ic验证
请不要说出价格 让我没有这条心
- 2020-12-07
-
回复了主题帖:
论坛小程序上线!扫码解锁逛坛新姿势啦!!
手机浏览了一会 暂时没发现什么问题 挺流畅的
- 2020-11-30
-
回复了主题帖:
美信基础模拟IC APP下载 助力您创新模拟设计!评论、抢楼全有礼!
一开始通过微信扫描,发现不能跳转,后来直接用浏览器扫描就可以下载了
-
回复了主题帖:
美信基础模拟IC APP下载 助力您创新模拟设计!评论、抢楼全有礼!
那个二维码扫描下载APP 无法使用啊
- 2020-11-11
-
加入了学习《泰克MSO6B系列创新型混合信号示波器》,观看 泰克 6 Series B MSO Jitter Demo
- 2020-10-30
-
加入了学习《泰克高级电源测试》,观看 6 Series B MSO Power Distribution,Power Supplies and 3-Phase Power
-
加入了学习《泰克高级电源测试》,观看 电源完整(PI)设计和测试
- 2020-10-09
-
回复了主题帖:
【中秋佳节话中秋】吃吃月饼聊聊天,还有抢楼好礼送给你!
6.今年的中秋节,你打算如何度过呢?
我只有一个目的,就是回家,和家人能吃一下团圆饭,在家陪陪父母,带父母出去逛逛。
看着孩子一天天长大,也看着父母一天天变老,中秋佳节,团圆美满
- 2020-09-30
-
回复了主题帖:
颁奖:观看赢好礼——京东卡等你拿! 活动颁奖啦
感谢eeworld 确认中奖了