打印
[活动专区]

【AT-START-F425测评】+ U盘文件读写及应用

[复制链接]
1457|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinglixixi|  楼主 | 2022-3-20 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#申请原创#

对于AT32F425芯片来讲,其最突出特点就是采用了极致性价比的USB微控制器,且提供了对U盘读写的功能。
在按图1连接后,就可对U盘的读写功能加以测试,其执行效果如图2所示,说明读写操作是成功的。
                              
1 连接U
2 显示信息
若打开U盘,则可见到所生成的文件AT32.txt,打开后其内容如图3所示。
3 U盘文件内容
以此为基础,在添加OLED屏显示的情况下,则可以实现图4所示的显示效果。
4  计时值存储
实现OLED屏文本信息的主程序为:
extern int8_t read_datp[32];
int main(void)
{
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
system_clock_config();
at32_board_init();
/* usb gpio config */
usb_gpio_config();
#ifdef USB_LOW_POWER_WAKUP
usb_low_power_wakeup_config();
#endif
uart_print_init(115200);
/* enable otgfs clock */
crm_periph_clock_enable(OTG_CLOCK, TRUE);
/* select usb 48m clcok source */
usb_clock48m_select(USB_CLK_HEXT);
/* enable otgfs irq */
nvic_irq_enable(OTG_IRQ, 0, 0);
/* init usb */
usbh_init(&otg_core_struct,
USB_FULL_SPEED_CORE_ID,
USB_ID,
&uhost_class_handler,
&usbh_user_handle);
app_oled_init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AT32F425",16);
OLED_ShowString(0,2,"U disk TEST",16);
delay_ms(200);
while(1)
{
usbh_loop_handler(&otg_core_struct.host);
OLED_ShowString(24,4,read_datp,16);
}
}

其中,公关变量read_datp用于获取OLED屏的显示信息。
在实现了U盘信息显示之后,该如何实现数据的U盘记录呢?
方法是将记录的数据写到数值中,然后再一次性写入。
所涉及的函数为usbh_user_application(),其内容为:
extern int8_t read_datp[32];
static usb_sts_type usbh_user_application(void)
{
usb_sts_type status = USB_OK;
FRESULT res;
uint32_t len;
uint8_t write_data[32] =
{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x41,0x42,0x61,0x62};
res = f_mount(&fs, "", 0);
if(res == FR_OK)
{
if(f_open(&file, "0:AT32.txt", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
{
USBH_DEBUG("Open AT32.txt failed");
}
else
{
res = f_write(&file, write_data, sizeof(write_data), &len);
if(res != FR_OK || len == 0)
{
USBH_DEBUG("Write AT32.txt failed");
}
else
{
USBH_DEBUG("Write AT32.txt Success");
}
f_close(&file);
}

if(f_open(&file, "0:AT32.txt", FA_READ) != FR_OK)
{
USBH_DEBUG("Open AT32.txt failed");
}
else
{
res = f_read(&file, read_datp, sizeof(read_datp), &len);
if(res != FR_OK || len == 0)
{
USBH_DEBUG("Read AT32.txt failed");
}
else
{
USBH_DEBUG("Read AT32.txt Success");
}
f_close(&file);
}
f_mount(NULL, "", 0);
}
return status;
}

其运行效果如图5所示
5  数值存储与显示
若使用数组write_data来存放汉字字模,则可以获得软字库的作用。
16*16点阵汉字为例,一个汉字要占用32字节。
存放“鸿”字的字模数组为:
uint8_t write_data[32] =
{0x12,0x64,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xFC,0x16,0x25,0x84,0xFC,0x00,0x00,0x04,0x7E,0x01,0x10,0x30,0x1F,0x08,0x08,0x00,0x13,0x12,0x12,0x52,0x82,0x7E,0x00};
相应的汉字显示函数为:
void OLED_ShowCHineseR(uint8_t x,uint8_t y,uint8_t no)
{
uint8_t t,adder=0;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(read_datp[t],OLED_DATA);
adder+=1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(read_datp[16+t],OLED_DATA);
adder+=1;
}
}

实现图6所示测试效果的主程序为:
int main(void)
{
nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
system_clock_config();
at32_board_init();
usb_gpio_config();
#ifdef USB_LOW_POWER_WAKUP
usb_low_power_wakeup_config();
#endif
uart_print_init(115200);
crm_periph_clock_enable(OTG_CLOCK, TRUE);
usb_clock48m_select(USB_CLK_HEXT);
nvic_irq_enable(OTG_IRQ, 0, 0);
usbh_init(&otg_core_struct,
USB_FULL_SPEED_CORE_ID,
USB_ID,
&uhost_class_handler,
&usbh_user_handle);
app_oled_init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AT32F425",16);
OLED_ShowString(0,2,"U disk TEST",16);
OLED_ShowCHinese(16,4,0);
OLED_ShowCHinese(32,4,1);
delay_ms(200);
while(1)
{
usbh_loop_handler(&otg_core_struct.host);
OLED_ShowCHineseR(64,4,0);
}
}

在显示界面中,“鸿雁”2字是通过读取字库来实现的,而单个“鸿”字则是通过读取U盘来实现的。
6  汉字显示

使用特权

评论回复
沙发
mxkw0514| | 2022-3-20 17:17 | 只看该作者
这个OLE的驱动库是楼主自己写的吗?能否分享呢

使用特权

评论回复
板凳
mxkw0514| | 2022-3-20 17:21 | 只看该作者
AT32F425采用了极致性价比的USB微控制器主要是面向什么应用呢?

使用特权

评论回复
地板
jinglixixi|  楼主 | 2022-3-21 00:12 | 只看该作者
mxkw0514 发表于 2022-3-20 17:17
这个OLE的驱动库是楼主自己写的吗?能否分享呢

这个不难,找一个OLED屏的程序移植一下即可,只需改动几处就行。

使用特权

评论回复
5
jinglixixi|  楼主 | 2022-3-21 00:14 | 只看该作者
mxkw0514 发表于 2022-3-20 17:17
这个OLE的驱动库是楼主自己写的吗?能否分享呢

资料下载链接:https://pan.baidu.com/s/1q59yc34IzcFnFZ0uXuV3rQ

提取码:si5u

使用特权

评论回复
6
jinglixixi|  楼主 | 2022-3-21 00:17 | 只看该作者
mxkw0514 发表于 2022-3-20 17:21
AT32F425采用了极致性价比的USB微控制器主要是面向什么应用呢?

个人的理解是面向USB类的处理,其中U盘的读写功能就是亮点之一,其它的如USB鼠标等也是应用方向。

使用特权

评论回复
7
jinjing1981| | 2022-5-12 10:28 | 只看该作者
这个例程的源代码能提供学习下嘛

使用特权

评论回复
8
jinglixixi|  楼主 | 2022-5-13 07:59 | 只看该作者
jinjing1981 发表于 2022-5-12 10:28
这个例程的源代码能提供学习下嘛

请参考

main.zip

2.15 KB

使用特权

评论回复
9
CHENGCN| | 2023-10-18 16:58 | 只看该作者
楼主你好,usbh_loop_handler后加入系统延时会卡死,请问遇到这种情况该怎么解决

使用特权

评论回复
10
jinglixixi|  楼主 | 2023-10-19 09:16 | 只看该作者
CHENGCN 发表于 2023-10-18 16:58
楼主你好,usbh_loop_handler后加入系统延时会卡死,请问遇到这种情况该怎么解决 ...

加个循环延时看,如果正常则是系统的延时影响到了USB的函数。

使用特权

评论回复
11
CHENGCN| | 2023-10-19 10:03 | 只看该作者
jinglixixi 发表于 2023-10-19 09:16
加个循环延时看,如果正常则是系统的延时影响到了USB的函数。

解决了,两种延时冲突了,谢谢楼主

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

37

粉丝