图1. 芯片架构图
● 内置 RISC-V RV32IMAC 内核(2.6 CoreMark/MHz);
● 最高 32MHz 工作频率;
● 内置 4kB 的 SRAM;
● 内置 8B 的 ALWAYS 寄存器,能在掉电模式 2 下保存数据;
● 内置 4~40kB 的嵌入式 FLASH,512B 的 NVM;
● 内置 2 个 SPI MASTER;
● 内置 1 个 I2C MASTER;
● 内置 4 个 UART 支持最高 1Mbps;
● 内置 2 个 tiMER,每个 TIMER 支持 4 路互补 PWM 输出;
● 内置 1 个快速的高精度 13/14/15/16bit ADC,集成 1.2V 高精度基准;
● 宽 ADC 输入电压范围:0 ~ VDD(VDD ≤ 4.8V);
● ADC 支持 11 个输入通道,最多支持 9 个触摸按键;
● 内置 3 个快速比较器;
● 内置低压检测模块;
● 内置 RF 检测模块;
● 最多支持 30 个 GPIO 和 16 个外部中断;
● 内置硬件看门狗;
● 支持 4 种低功耗模式,最低功耗小于 1uA(看门狗工作);
● 内置 32 位真随机数发生器;
● 支持串口和无线 ISP 在线升级(无线 ISP 需外接 Si24R1);
● 支持 JTAG 2 线调试接口;
● 工作电压范围:1.8 ~ 5.5V;
● 支持 4x4mm QFN32 或 TSSOP20 封装。
芯片引脚图
芯片引脚图如图2所示,芯片有两种分装,一种为尺寸为TSSOP20 / 6.5mm*6.4mm*1.0mm封装,另外一种是QFN32 / 4mm*4mm*0.8mm封装。两者差别是前者引脚为20脚,后者为32脚,后者比前者IO资源更丰富,同时封装体积更小,适合小体积要求产品的开发。
图2CSM32RV20芯片引脚图
芯片功能描述
这里QFN32的芯片为测试对象,该芯片所有外设功能被引出。该芯片引脚功能描述如图3所示。
图3CSM32RV20芯片引脚功能描述
最小开发板
原厂提供了最小开饭,开发板将芯片的所有引脚已2.54mm排针引出。外接一颗CH34N USB转串口芯片,通过Type-C 接口与PC连接。同时板子上有3.3v/5.1v开关的选择,通过拨动开关可以选择不同的工作电压,可见此MCU可以在这两种电压下工作。开发板采用串口方式下载,J-Link调试器进行调试,板上右侧4根排针即为接J-Link的接口,需要注意的是J-Link需要支持v11版本以上的。
图4CSM32RV20开发板
开发环境配置
开发板开发主要开发语言为c/c++, 开发工具为CSMStudio,CSMStudio是集成开发环境,集成代码编辑,编译,连接,调试仿真为一体。在Win10上安装完CSMStudio后,打开开发工具如图5所示。
图5 CSMStudio IDE 集成开发工具
安装好CSMStudio后,直接通过菜单“文件”创建一个新工程,创建时选择CSM32RV20芯片,即可创建新工程,然后编译,在工程 default 目录下成功生成 elf 目标文件,如图6所示。
图6 CSMStudio IDE 创建测试工程
编译得到elf文件后,通过CSM提供的下载工具 CSMISP 进行下载。安装好CH34N窗口驱动和CSMISP软件。安装完CSMISP启动后如图7所示。
图7 CSMISP PC下载调试工具
安装完CSM_ISP后,设置好MCU型号,串口号和通讯速度即可连接到开发板。可以通过检测MCU型号来检测与开发板是否连接正常,点击检测MCU型号并且按开发板复位键,后会在下载信息窗口出现如图8所示,表示已和开发板连接成功。
图8 CSMISP 检测MCU型号成功
在确认下载工具与开发板连接正常后,再点程序文件,选择编译好的elf文件后,在调试信息里会显示程序文件加载成功。
图9 程序文件加载成功
再点下载/编程按钮,且按开发板复位键,在调试信息里会程序下载和flash刷写过程,如一切顺利,则显示程序下载成功。如果显示失败,可以重复下载动作几次,也能获得下载成功。下载过程如图10所示。
图10 下载编程到板子上成功
下载目标程序到板子上后,按按开发板复位键,程序就会被运行,默认创建的测试工程是一个点亮 LED的代码,程序在串口助手打印出信息,开发板上可以见到LED闪烁,如图11所示。到此整个开发、编译、下载和串口调试过建立程完成。
图11 按reset键程序在板子上运行成功
应用测试描述
此次测试目标,我们根据次芯片低功耗的特点,搭配电子墨水显示屏,使用纽扣电池或锂电充电电池的应用场景作为应用测试目标。电子墨水屏具有掉电保持显示内容,驱动功耗低等优点,方案可用于物联网现场数据采集显示、电子价签、智能工牌等应用。此次配合测试使用的是GDEW027W3一款2.7寸黑白两色的电纸屏, 屏幕分辨率为264x176,像素点为0.2毫米,屏幕显示对比度高,刷新速度快,温度适应范围宽,体积也很小巧。
测试硬件连接
该墨水屏采用SPI4线串口方式通讯,根据其使用说明,它与CSM32RV20 开发板连接电路如图12所示。
图12 CSM32RV20与GDEW027W3墨水屏连接电路图
物理连接使用CSM32RV20 SPI1通讯,SPI1的定义是:SCK为GPIOA PIN2,MISO为GPIOA PIN3 ,MOSI为GPIOA PIN4, 其它墨水屏需要的端口可以从空闲的端口选用,这里PA5,PA6为串口,因此这里依次使用的CS - PA7,DC – PA8, RES-PA9, BUSY PA10,这样连线即可。实际接线如图13图14所示。
图13 CSM32RV20与GDEW027W3墨水屏连接图
图14 CSM32RV20与GDEW027W3引线连接图
主要软件实现
硬件连接完后,则需开发相应的软件,通过SPI1来驱动墨水屏。墨水屏的驱动软件主要有3部分,第一部分是各引脚接口的定义,用来定义通信接口。第二部分是SPI通信操作的封装,第三部分是墨水屏各个功能的实现。这个墨水屏带有STM32的实例代码,那么下来主要的任务,就是将STM32代码移植适配到CSM32RV20这个MCU的软件上。工程软件代码文件主要有这eink_edp.c , eink_edp_gdew027w3.c, eink27_image.c 三个文件,其中eink_edp.c主要是对SPI操作的封装,也是移植不同MCU时需要修改的代码。eink_edp_gdew027w3.c则是这个屏的操作函数接口,eink27_image.c是由图像抽取工具制作的测试图像数据。如图15所示。
图15 CSM32RV20墨水屏软件工程
在墨水屏对CSM32RV20移植中,对照上面的硬件连接,各引脚IO对应做下面的定义:
//SCK--PA2 MISO--PA3 MOSI--PA4 CS--PA7 DC--PA8 RST--PA9 BUSY--PA10
#define EPD_GPIO_PORT GPIOA
#define EPD_LED_PIN PIN12 //RED LED
#define EPD_BUSY_PIN PIN10
#define EPD_RST_PIN PIN9
#define EPD_DC_PIN PIN8
#define EPD_CS_PIN PIN7
#define EPD_SDA_PIN PIN4
#define EPD_DIN_PIN PIN3 //没有用到
#define EPD_CLK_PIN PIN2
#define SET_SPI_CS (EPD_GPIO_PORT->BSR=0x00000001< #define CLR_SPI_CS (EPD_GPIO_PORT->BSR=0x00010000< #define SET_SPI_CLK (EPD_GPIO_PORT->BSR=0x00000001< #define CLR_SPI_CLK (EPD_GPIO_PORT->BSR=0x00010000< #define SET_SPI_MOSI (EPD_GPIO_PORT->BSR=0x00000001< #define CLR_SPI_MOSI (EPD_GPIO_PORT->BSR=0x00010000< #define GET_SPI_MISO (EPD_GPIO_PORT->IDR&(0x00000001< #define GET_BUSY_PIN (EPD_GPIO_PORT->IDR&(0x00000001<))>))>)
)>)
)>)
)>
主要移植修改的函数主要由下面几个,分别是墨水屏初始化,墨水屏的数据读写操作,以及延时函数。按函数的功能非常简单的适配开发就完成适配层的封装修改。
void DEV_Digital_Write(u8 gpio_pin, u8 s)
{
GPIO_Write(EPD_GPIO_PORT,gpio_pin,s);
}
void DEV_SPI_WriteByte(u8 t)
{
#if USE_SOFT_SPI
SPIWriteByte(t);
#else
uint8_t sTxpack[2];
uint8_t sRxpack[2];
sTxpack[0]=t;
SPI_Transceive(spi,sTxpack,sRxpack,1);
#endif
}
void DEV_Delay_ms(u32 ticks)
{
delay_ms(ticks);
}
int EPD_setup(uint8_t w, uint8_t h)
{
Paint_Init(&paint, frame_buffer,w, h);
Paint_Clear(&paint,0x1);
return 0;
}
int DEV_SPI_init()
{
spi = (SPI_TypeDef *)SPI1_BASE;
SPI_Init_case1(spi,0,0,6);
SPI1_CSN_Init_case1();
ee_printf("CS--PA7, CLK--PA2, DI--PA3, DO--PA4n");
ee_printf("BUSY--PA10, RST--PA9, DC--PA8n");
return SUCCESS;
}
这里在随后的调试时,通过反复测试验证,对CSM32RV20芯片驱动层的 SPI_Init_case1 做了一些修改,修改如下:
void SPI_Init_case1(SPI_TypeDef*SPIx, uint8_t cpol, uint8_t cpha, uint8_t fvk);
将原函数里SPI的CPOL与CPHA和主频分频数fvk通过参数方式传入,是为方便调试,通过实际测试验证传入不同的参数来调试相关参数。
在main.c 中则是直接调用封装后的函数,完成SPI对墨水屏操作的测试。测试例子非常简单,相关的函数已以在代码中给出注释,非常简单的十几行代码完成墨水屏的操作测试。
int main(void)
{
///----System Init ----------------------
CLIC_Init();//系统中断配置
System_Clock_Init();//系统时钟初始化
UART_Init_case1(UART1);//串口1初始化 TX1--PA6 RX1--PA5
ee_printf("nCSM32RV20 Eink Display testing ...n");
ee_printf("GPIO_Config completed! ...n");
GPIO_Config();
DEV_SPI_init();
ee_printf("DEV_SPI_init completed! ...n");
ee_printf("Start eink_edp27 testing ...n");
eink_edp27();
while(1)
{
delay_ms(1000);
}
}
编译下载到板子上运行调试。开始几次运行并没有出现正确的输出,例子运行总卡在ReadBusy(void)函数中,这个函数是检测墨水屏的状态的Check Busy,检测是通过读取PIN10的电平,引脚在初始化时配置为输入,并且默认拉低。按技术说明设备初始化如果正确,那么在会在检测ReadBusy时应该输出高电平,输出高电平后才能进行下一步,如果没有输出则代表这步操作没有完成,需要等待并且继续查询该状态直到通过。从初始化到显示的操作流程如图16所示。
图16 GDEW027W3操作程序流程图
因为这个屏在STM32的主控芯片下验证通过,其主要的代码也是在STM32上运行正确的,因此这次主要的调试就是检查硬件的连接以及相关参数的修改,确定适配部分的正确。通过经过n次的修改调试,硬件连接检查,最终在串口助手得到了全部正确的输出,输出调试信息如图17所示,这也意味着CSM32RV20驱动SPI串口系列屏验证通过。
图17 板上运行输出完整的正确信息
墨水屏上也显示出了正确的内容,如图18,图19所示。
图18 墨水屏上的显示输出
图19 墨水屏上的显示放大欣赏
相关性能测试结果
墨水屏应用测试的主要性能测试指标有:正常操作时的整体功耗,待机功耗,以及SPI通讯速度,墨水屏刷新速度。
通过反复运行测试,得到数据如下:
32Mhz主频设置下,3.3V 电压CSM32RV20驱动墨水屏显示最大电流为8.6mA。
待机时,墨水屏可以保持显示,主要待机电流为CSM32RV20待机电流,测试为 20uA左右。
SPI稳定刷写墨水屏,速率在0.5Mbps
墨水屏刷写速度,擦除在2秒左右,写入显示在0.5秒。
应用评测总结
经过对CSM32RV20操作墨水屏显示的应用测试,此款芯片上手比较容易,开发难度不大,在熟悉STM32开发的小伙伴们转到这款芯片时非常容易,开发编译还是非常方便的,编译速度也很快。此款芯片功耗较低能够较好的适用在电池供电等有严苛的电源限制的嵌入式环境下。从正常工作模式到待机模式转换很快,也很稳定。对于SPI速率问题,测试数据表现较低,对比在STM32下有2M以上的表现,分析主要原因可能由于,开发板连接墨水屏用的线较长,有20cm左右,因此干扰增大,造成较高速度通讯时失败率较高,不得不降低通讯速度才能稳定的运行。另外连接线插接不够稳固,也造成信号不够稳定,测试发现墨水屏驱动板电压经常只有1.2v,这是因为连线存在不稳固,线路上有较大电阻。经过反复插接压紧才达到3.3v的电压,因此建议采用布线打测试板的方式来进行验证,这样尽可能排除测试环境造成的影响。
因此此次是测试,直接采用制作好的图片数据,在实际应用中需要实时绘制图片的内容,以及对外通讯,因此需要考虑再加入Si24R1这样的无线通讯芯片,而 CSM32RV20已带有对该通讯芯片的例程,因此加入无线通讯也是比较容易的事了。
最后在此次测试时,恰逢虎年春节,顺手刷一张祝福图送给大家。