CH32V208继承了沁恆产品一贯的传统,即U盘的读写功能。这使得尽管CH32V208的闪存要比CH32V307的小一倍,但有了U盘读写功能的支持就可有效地缓解用户对存储空间的需求。
图1是U盘读写功能的测试条件及构成,在使用厂家例程的情况下其测试结果如图2所示,由此可说明其读写功能正常。
图1 测试条件
图2 测试结果
图3是进行测试的文本文件及其内容,由于文件前段所存放的是单字节的字符信息,故可以确保显示与存储内容的一致性,若是存放汉字信息会因读取字节数的问题而出现异常。
图3 测试文件
为了实现数码相框的功能,实现在U盘读写功能的基础上为其添加了TFT屏的显示功能,其显示读取数据的效果如图4所示。
图4 显示测试
随后,可将处理过的图像数据存放到文件中以供读取和图像再现。
在图像再现的过程中,其关键的地方就是按图像文件的大小来限制读取数据的数量,并将2个字节的数据拼接成一个16位的色彩数据从而在屏幕上绘制出一个彩色点。
通过读取U盘的图像数据文件,来就可实现图像再的现。在具有多个图像数据文件的情况下,依顺序进行显示就可形成了一个具有图片浏览效果的数码相框,其显示效果如图5和图6所示。
图5 显示效果
图6 读取状态
通过读取U盘图像数据实现图像再现的函数为:
void UDisk_PHOTO( void )
{
uint8_t ret;
uint8_t i,t;
uint16_t TotalCount = 0;
uint8_t w=0;
while(1)
{
Address_set(0+w*20,0+w*20,159+w*20,79+w*20);
if(w==0) strcpy( (char *)mCmdParam.Open.mPathName,"/PHOTO/HKTK.BIN" );
if(w==1) strcpy( (char
*)mCmdParam.Open.mPathName, "/PHOTO/FJAA.BIN" );
if(w==2) strcpy( (char
*)mCmdParam.Open.mPathName, "/PHOTO/HYAA.BIN" );
...
if(w==7) strcpy( (char*)mCmdParam.Open.mPathName, "/PHOTO/HKTK.BIN" );
ret= CHRV3FileOpen( );
if ( ret == ERR_MISS_DIR || ret ==ERR_MISS_FILE )
{
LCD_ShowString(20,10,"NOFIND ... ");
}
else
{
TotalCount = N;
Delay_Ms(10);
while ( TotalCount )
{
if ( TotalCount >(MAX_PATH_LEN-1) )
{
t = MAX_PATH_LEN-1;
}
else
{
t = TotalCount;
}
ByteCount = t;
ByteBuffer= &Com_Buffer[0];
ret = CHRV3ByteRead( );
TotalCount -= ByteCount;
for ( i=0; i!= ByteCount; i++ )
{
LCD_WR_DATA8(ByteBuffer[i]);
}
if (ByteCount < t )
{
LCD_WR_DATA8(ByteBuffer[i]);
break;
}
}
i = CHRV3FileClose( );
mStopIfError( i );
}
w++;
if(w==8)
{
w=0; while(Bit_SET==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1));
}
}
Delay_Ms(500);
}
}
实现数码相框功能的主程序为:
int main(void)
{
Delay_Init( );
Udisk_USBH_Initialization( );
key_INIT();
App_TFTInit();
tft_Init();
LCD_Clear(RED);
BACK_COLOR=RED;
POINT_COLOR=YELLOW;
LCD_ShowString(20,10," CH32V208 ");
while(1)
{
UDisk_USBH_ByteOperation( );
}
}
另外,还可添加RTC电子时钟及环境状态(如使用BH1750进行光照强度检测等)的显示功能等,见图7所示。
在实现RTC电子时钟功能时,需在文件ch32v20x_it.c中添加以下函数内容:
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
RTC_Get();
}
if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)
{
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_Get();
}
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);
RTC_WaitForLastTask();
}
并在文件ch32v20x_it.h中添加以下函数:
u8 RTC_Get(void);
在文件Udisk_Func_BasicOp.c中添加以下函数内容:extern u8 RTC_Get(void);
extern vu8 houra;
extern vu8 mina;
extern vu8 seca;
图7 电子时钟测试
在图片显示过程中,实现RTC显示的语句为:
RTC_Get();
LCD_ShowNum(240,60,houra,2);
LCD_ShowNum(264,60,mina,2);
LCD_ShowNum(288,60,seca,2);
Delay_Ms(500);
此外,它除了支持U盘的读取,还支持对TF卡这类器件的使用,将图8所示。
图8 多功能测试
演示视频: