[活动专区] 【AT-START-F425测评】+ U盘文件读写及应用

[复制链接]
 楼主| jinglixixi 发表于 2022-3-20 10:06 | 显示全部楼层 |阅读模式
#申请原创#

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

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

  29. if(f_open(&file, "0:AT32.txt", FA_READ) != FR_OK)
  30. {
  31. USBH_DEBUG("Open AT32.txt failed");
  32. }
  33. else
  34. {
  35. res = f_read(&file, read_datp, sizeof(read_datp), &len);
  36. if(res != FR_OK || len == 0)
  37. {
  38. USBH_DEBUG("Read AT32.txt failed");
  39. }
  40. else
  41. {
  42. USBH_DEBUG("Read AT32.txt Success");
  43. }
  44. f_close(&file);
  45. }
  46. f_mount(NULL, "", 0);
  47. }
  48. return status;
  49. }

其运行效果如图5所示
5.jpg
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};
相应的汉字显示函数为:
  1. void OLED_ShowCHineseR(uint8_t x,uint8_t y,uint8_t no)
  2. {
  3. uint8_t t,adder=0;
  4. OLED_Set_Pos(x,y);
  5. for(t=0;t<16;t++)
  6. {
  7. OLED_WR_Byte(read_datp[t],OLED_DATA);
  8. adder+=1;
  9. }
  10. OLED_Set_Pos(x,y+1);
  11. for(t=0;t<16;t++)
  12. {
  13. OLED_WR_Byte(read_datp[16+t],OLED_DATA);
  14. adder+=1;
  15. }
  16. }

实现图6所示测试效果的主程序为:
  1. int main(void)
  2. {
  3. nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  4. system_clock_config();
  5. at32_board_init();
  6. usb_gpio_config();
  7. #ifdef USB_LOW_POWER_WAKUP
  8. usb_low_power_wakeup_config();
  9. #endif
  10. uart_print_init(115200);
  11. crm_periph_clock_enable(OTG_CLOCK, TRUE);
  12. usb_clock48m_select(USB_CLK_HEXT);
  13. nvic_irq_enable(OTG_IRQ, 0, 0);
  14. usbh_init(&otg_core_struct,
  15. USB_FULL_SPEED_CORE_ID,
  16. USB_ID,
  17. &uhost_class_handler,
  18. &usbh_user_handle);
  19. app_oled_init();
  20. OLED_Init();
  21. OLED_Clear();
  22. OLED_ShowString(0,0,"AT32F425",16);
  23. OLED_ShowString(0,2,"U disk TEST",16);
  24. OLED_ShowCHinese(16,4,0);
  25. OLED_ShowCHinese(32,4,1);
  26. delay_ms(200);
  27. while(1)
  28. {
  29. usbh_loop_handler(&otg_core_struct.host);
  30. OLED_ShowCHineseR(64,4,0);
  31. }
  32. }

在显示界面中,“鸿雁”2字是通过读取字库来实现的,而单个“鸿”字则是通过读取U盘来实现的。
6.jpg
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屏的程序移植一下即可,只需改动几处就行。
 楼主| jinglixixi 发表于 2022-3-21 00:14 | 显示全部楼层
mxkw0514 发表于 2022-3-20 17:17
这个OLE的驱动库是楼主自己写的吗?能否分享呢

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

提取码:si5u
 楼主| jinglixixi 发表于 2022-3-21 00:17 | 显示全部楼层
mxkw0514 发表于 2022-3-20 17:21
AT32F425采用了极致性价比的USB微控制器主要是面向什么应用呢?

个人的理解是面向USB类的处理,其中U盘的读写功能就是亮点之一,其它的如USB鼠标等也是应用方向。
jinjing1981 发表于 2022-5-12 10:28 | 显示全部楼层
这个例程的源代码能提供学习下嘛
 楼主| jinglixixi 发表于 2022-5-13 07:59 | 显示全部楼层
jinjing1981 发表于 2022-5-12 10:28
这个例程的源代码能提供学习下嘛

请参考

main.zip

2.15 KB, 下载次数: 18

CHENGCN 发表于 2023-10-18 16:58 | 显示全部楼层
楼主你好,usbh_loop_handler后加入系统延时会卡死,请问遇到这种情况该怎么解决
 楼主| jinglixixi 发表于 2023-10-19 09:16 | 显示全部楼层
CHENGCN 发表于 2023-10-18 16:58
楼主你好,usbh_loop_handler后加入系统延时会卡死,请问遇到这种情况该怎么解决 ...

加个循环延时看,如果正常则是系统的延时影响到了USB的函数。
CHENGCN 发表于 2023-10-19 10:03 | 显示全部楼层
jinglixixi 发表于 2023-10-19 09:16
加个循环延时看,如果正常则是系统的延时影响到了USB的函数。

解决了,两种延时冲突了,谢谢楼主
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2934

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部