Skip to content

Commit

Permalink
USB HOST MSC和HID
Browse files Browse the repository at this point in the history
  • Loading branch information
Staok committed Dec 10, 2020
1 parent 2d01e90 commit dac0472
Show file tree
Hide file tree
Showing 30 changed files with 10,398 additions and 368 deletions.
52 changes: 24 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,22 +30,13 @@

在开发过程中会上传以下正在测试的半成品代码,所以关于以下内容的代码先不要用~望谅解

- 完善LCD支持屏幕种类和中文字库支持,FATFS从SD读取字库写入SPI FLASH

- IAP(看下面的TODO)

- 大V的USB的相关所有例程移植和测试(F1和F4)

- 线性回归

- 常用校验、加密算法

- Modbus协议

搞完这些,UP主就要先去搞FPGA了,有缘再更新这里

理解了原理的东西,通用性低的东西,就不用时间去走一遍前人走过的路了,就酱


## 各个进展

### STM32F1xx:
Expand All @@ -60,35 +51,37 @@

目前主要完善的对象,已经完成大部分外设驱动,剩下的高级外设如:IAP和USB会主要在此平台完成,前两个平台F1和F2会有延迟

## 计划外设和组件
## 计划外设和组件(我真的累了=_=)

(加**粗体**为暂时尚未实现的外设或者组件)

- **不会支持的外设**:LTDC LCD \ IRDA \ CRYP \ HASH

- **暂时没有支持的组件:**

DCMI和IO驱动OV7725、OV2640和OV5650摄像头(暂时无限延期)

线性回归

常用校验、加密算法(3DES、AES、RC6、TEA、RSA、MD5、SHA1、SHA256)

音频编解码(MP3转PCM,外接一个功放直接播放)(暂时无限延期)

Modbus协议

MQTT协议(包含cjson,LWIP应用)(暂时无限延期)
完善LCD支持屏幕种类和中文字库支持(原子和普中例子),FATFS从SD读取字库写入SPI FLASH

DCMI和IO驱动OV7725、OV2640和OV5650摄像头 (暂时无限延期)

音频编解码(MP3转PCM,外接一个功放直接播放) (暂时无限延期)

MQTT协议(包含cjson,LWIP应用) (暂时无限延期)

JPEG、GIF解码和BMP编解码(暂时无限延期)
JPEG、GIF解码和BMP编解码 (暂时无限延期)

LittlevGL(暂时无限延期)
LittlevGL (暂时无限延期)

BPNN(CMSIS包中的内容,吸收进来)(暂时无限延期)
NN(CMSIS包中关于NN的内容,吸收进来) (暂时无限延期)

- 已经支持的外设:

大部分HAL库外设驱动的高级封装( MCO \ RTC \ CRC \ TIM \ ADC \ DAC \ IWDG \ USART \ SPI \ WFI \ FLASH \ **IAP** \ IO \ SDIO \ **DCMI** \ FSMC \ DMA \ RNG \ DSP \ FPU \ **USB** \ CAN \ Ethernet)
大部分HAL库外设驱动的高级封装( MCO \ RTC \ CRC \ TIM \ ADC \ DAC \ IWDG \ USART \ SPI \ WFI \ FLASH \ **IAP** \ IO \ SDIO \ **DCMI** \ FSMC \ DMA \ RNG \ DSP \ FPU \ USB \ CAN \ Ethernet)

- 已经支持的组件:

Expand All @@ -100,6 +93,8 @@

FATFS ff14

USB (ST UM1021)

ARM CMSIS 5.7.0 DSP Lib

fsm 有限状态机
Expand All @@ -109,7 +104,7 @@
内存管理(malloc和free)

无依赖的string库和sprintf库

软件模拟I2C\SPI库

软件ringbuf,FIFO缓冲
Expand All @@ -118,23 +113,23 @@

工程添加下载到RAM执行的功能

## 外设和组件说明
## 组件和外设说明

(标为“缺省”的为暂未实现的,以后会加上- -,工作量好大的! )

- **所有基础外设均在sys_config.h(F1)里或者PeriphConfigCore.h(F2和F4)里通过宏定义配置,每一个宏定义旁边均有使用说明的注释**,有详细注释,不看不会用
- 外设驱动代码分别在sys_config.c和periphconfig.c两个文件里,其所有的外设API声明均在sys.h里,所有的独立GPIO的API均在periphconfig.h里,用户程序调用外设控制API时,按需调用这两个文件即可
- MCU外设配置的统一函数为void sys_MCU_Init_Seq(void),一般无需改动;外接器件初始化统一函数为void sys_Device_Init_Seq(void),需要自行按需修改
- 本框架是正经的框架,有命名规范和应用规范的说明,在sys.h(F1)里或者PeriphConfigCore.h(F2和F4)里的上面
- F4模板请看Docs手册文档
- **F4模板请看Docs手册文档,里面包含了所有已经支持的组件和外设的使用说明**

### 裸跑或者FreeRTOS选择

- sys.h和FreeRTOSConfig.h里面的宏定义SYSTEM_SUPPORT_OS:是否开启FreeRTOS,不开为裸跑;具体应用逻辑编写和任务配置分别在TaskConfig.c和BareConfig.c里面

FreeRTOS说明:所有API均罗列在TaskConfig.h里!关于FreeRTOS的信号量和事件标志组,均用任务通知替代!关于FreeRTOS的任务与任务、任务与中断间的通讯只用消息队列,功能最全!

### 框架常用组件
### 组件

- Menu 菜单框架:SYSTEM_SUPPORT_Menu:提供一个作者自己实现的实现菜单功能的模板;推荐作为标准常用,应用逻辑围绕这个菜单框架展开编写;具体文件在sys_menu.c里面;按照里面的注释,void keyProcess(void)函数负责扫描输入,void menuProcess(void)函数负责执行菜单功能,这两个函数必须放到一个循环里一直执行
- fsm 有限状态机:提供一个作者自己实现的有限状态机(fsm),用于管理逻辑较为复杂的程序,帮助更好的写阅读性强的状态图实现,详细说明和具体用法在fsm.c和fsm.h文件内(推荐:sys_menu 用于管理输入(按键等)、输出(屏幕等)和系统参数的用户控制,fsm 用于管理 用状态图 描述的多状态、多条件的复杂逻辑任务)
Expand All @@ -145,9 +140,10 @@
- 内存管理(malloc和free):提供一个自实现的内存分配和释放函数,可用于内部RAM和外部RAM,参考了正点原子的“内存管理”章节的源代码
- LittlevGL:暂时缺省
- LWIP 2.1.2:(一个人精力有限,目前只有F4的模板比较完善,请注意!)在lwipopt.h里面进行配置,支持UDP、TCP Server、TCP Client,HTTP Server
- FATFS ff14:SYSTEM_FATFS_ENABLE:已经支持SDIO SD卡,SPI SD卡,和SPI FLASH,**还差USB文件系统**
- FATFS ff14:SYSTEM_FATFS_ENABLE:已经支持SDIO SD卡,SPI SD卡,SPI FLASH和USB HOST MSC
- USB (ST UM1021):详细使用说明请看“Docs.bin”里面的“STM32 USB库 使用”章节,里面介绍了USB Device的VCP、MSC和HID以及USB HOST的MSC和HID

### 框架基础外设
### 外设

(再次说明,具体使用方法看相应宏定义旁的注释,均在sys_config.h(F1)里或者PeriphConfigCore.h(F2和F4)里)

Expand All @@ -174,9 +170,9 @@
- FSMC:SYSTEM_FSMC_ENABLE:大容量芯片系列外设,可以用于外部SRAM或者LCD驱动,默认外部RAM用FSMC的块1区3,LCD用FSMC的块1区4,慎改动;就不支持各种FLASH了,MCU毕竟程序写不大,就算大了就用SPI的FLASH,也节约IO口。LCD的相关API说明在TFTLCD.h里面,字库也可剪裁
- DSP\FPU:在F4模板中默认添加,可用直接调用相关API,详情看Docs手册文档的DSP专题
- CAN:SYSTEM_CAN1_ENABLE:提供设置接收时只关心的帧类型和ID,提供收发API,收发可用设置帧类型和ID,STM32的CAN目前只有数据帧和遥控帧两种,每种都可以设置是标准标识符还是扩展标识符,CAN有关的学习记录和手册在Tips文件夹内,不熟悉的可用阅读,人话挺多的
- Ethernet:看LWIP组件
- Ethernet:看“LWIP组件”
- DCMI:暂时没有计划去支持
- USB:不久的将来支持
- USB:看“USB (ST UM1021)组件”

如果觉得好用,使用时还请别忘加上本仓库的地址哦:https://github.com/Staok/stm32_framework

Expand Down
18 changes: 13 additions & 5 deletions STM32F4DSP_HAL_freeRTOS_Framework/CONFIG/PeriphConfigCore.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,14 @@ void sys_Device_Init_Seq(void)
#endif

/*STM32 USB 的初始化*/
#if SYSTEM_USB_ENABLE
init_return = sys_USBD_User_Init(); if(init_return != 0){ FaultASSERT("sys_USBD_User_Init()",init_return,flag_Fault);}
#if ( (SYSTEM_USB_ENABLE) && ( (USE_DEVICE_MODE) || (USE_HOST_MODE) ) )
#if (USE_DEVICE_MODE)
init_return = sys_USBD_User_Init(); if(init_return != 0){ FaultASSERT("sys_USBD_User_Init()",init_return,flag_Fault);}
#endif

#if (USE_HOST_MODE)
init_return = sys_USBH_User_Init(); if(init_return != 0){ FaultASSERT("sys_USBH_User_Init()",init_return,flag_Fault);}
#endif
#endif

/*FATFS ff14 初始化*/
Expand All @@ -176,13 +182,15 @@ void sys_Device_Init_Seq(void)
}else FaultASSERT("f_mkfs DEV_ExFLASH",init_return,flag_Warning); //格式化失败
HAL_Delay(1000);
}

init_return = f_mount(fs[1],"DEV_SD:",1); //挂载SDIO驱动的SD卡
if(init_return != 0){ FaultASSERT("f_mount fs[1]",init_return,flag_Warning);}

// init_return = f_mount(fs[2],"DEV_USB:",1); //挂载USB文件设备
// if(init_return != 0){ FaultASSERT("f_mount fs[2]",init_return,flag_Warning);}

init_return = f_mount(fs[2],"DEV_USB:",1); //挂载USB UOST MSC文件设备(U盘)
if(init_return != 0){ FaultASSERT("f_mount fs[2]",init_return,flag_Warning);}


init_return = f_mount(fs[3],"DEV_SPI_SD:",1); //挂载SPI驱动的SD卡
if(init_return != 0){ FaultASSERT("f_mount fs[3]",init_return,flag_Warning);}
#endif
Expand Down
18 changes: 13 additions & 5 deletions STM32F4DSP_HAL_freeRTOS_Framework/CONFIG/PeriphConfigCore.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,18 @@ unsigned int Curl_rand(void); /*提供实现伪随机数的函数*/
#include "BareConfig.h"
#endif

#define SYSTEM_USB_ENABLE 1 /*STM32 USB库 使用*/

#if USE_USB_OTG_FS
#define SYSTEM_USB_ENABLE 1 /*STM32 USB库使用,这里不用动,从 Select Target 选择 USB Device 或者 USB HOST*/
#else
#define SYSTEM_USB_ENABLE 0
#endif
#if SYSTEM_USB_ENABLE
#include "usbd_usr.h"
#if (USE_DEVICE_MODE)
#include "usbd_usr.h"
#endif
#if (USE_HOST_MODE)
#include "usbh_usr.h"
#endif
#endif

#include "lwipopts.h" /*lwip 2.1.2,在里面配置和控制是否开启*/
Expand Down Expand Up @@ -108,8 +116,8 @@ unsigned int Curl_rand(void); /*提供实现伪随机数的函数*/

/*DEVICES所有头文件*/
#include "TFTLCD.h"
//#include "OLED.h"
//#include "mpu6050.h"
#include "OLED.h"
#include "mpu6050.h"


/*_____________________________________\\\ ///____________________________________________*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ u8 FATFS_Init(void)
file=(FIL*)mymalloc(InrRAM,sizeof(FIL)); //为file申请内存
ftemp=(FIL*)mymalloc(InrRAM,sizeof(FIL)); //为ftemp申请内存
fatbuf=(u8*)mymalloc(InrRAM,512); //为fatbuf申请内存
if(i==FF_VOLUMES&&file&&ftemp&&fatbuf)return 0; //申请有一个失败,即失败.
else return 1;
if(i==FF_VOLUMES&&file&&ftemp&&fatbuf)return 0;
else return 1; //申请有一个失败,即失败.
}

//将小写字母转为大写字母,如果是数字,则保持不变.
Expand Down
97 changes: 91 additions & 6 deletions STM32F4DSP_HAL_freeRTOS_Framework/Docs/docs.bin
Original file line number Diff line number Diff line change
Expand Up @@ -341,22 +341,39 @@ APIʹ
*_______________________________________________STM32 USB�� ʹ��________________________________________________________*
*_____________________________________/// \\\____________________________________________*/
/*
˵����
˵����
��ʷԭ��Ŀǰʹ�õ��DZ�׼��汾�Ŀ⣨�����ǿ��ȫ���������ٸ��µ����ܱ�HAL���ȶ���HAL��汾�ڶ�ӦоƬ��Cube�����棩����ʱ�������
����׼��汾�Ŀ��ȫ����"UM1021 STM32F105/7xx, STM32F2xx and STM32F4xx USB On-The-Go host and device library"��
STM32F4xx/STM32F2xx�� USB IP �˾�Ϊ OTG��VBUS���Կ��ƣ����Լ�⣩��STM32F103��USB����OTG����ֻ��USB Device��
STM32F4xx/STM32F2xx�� USB HOST �� USB Device ��ΪFS��HS��ǰ�����12Mbps���Դ�PHY��ȫ�����ţ�DM DP ID SOF����
STM32F4xx/STM32F2xx�� USB HOST �� USB Device ��ΪFS��HS��ǰ�����12Mbps���Դ�PHY��ȫ�����ţ�DM DP ID������ʡ�� SOF��������Ƶ������
������Ҫͨ��ULPI�ӿ������ⲿUSB PHYоƬ��ȫ�����ţ�8������+4�������ߣ���
STM32F4x9��HS��Ƕ��PHY������HS����ѡ��ʹ����ǶPHY,������STM32F4xxһ��

��ʼ����̣����Ѿ����ӵ���ʼ�����������ˣ�
��ģ����Ĭ��ʹ��FS����Ҫ��HS��Ҳ���ѣ���ʼ����ULPI�ӿں�ʱ�ӣ���USE_USB_OTG_HS�滻USE_USB_OTG_FS�궨��ȣ��ο��ٷ�����
HSʹ���ⲿPHY�ĺ궨�壺USE_USB_OTG_HS ,USE_EMBEDDED_PHY
HSʹ���ڲ�PHY�ĺ궨�壺USE_USB_OTG_HS,USE_ULPI_PHY�����PHY��FS�ģ���֪���᲻��Ӱ���ٶȣ�

USB��Ĵ����ص������У������豸����ʱ����ϢĬ�϶��Ӵ���1��ӡ����ͨ�� FaultASSERT() ���� printf_uart() �������д�ӡ

USB Device �� HOST ѡ��
�� Select Target ѡ�� USB Device ���� USB HOST
USB Class ѡ��
�� usbd_usr.c ���� usbh_usr.c �е� sys_USBD_use_for_ ���� sys_USBH_use_for_ ����ѡ��

��ʼ����̣����Ѿ����ӵ���ʼ�����������ˣ�
/*STM32 USB �ij�ʼ��*/
#if SYSTEM_USB_ENABLE
init_return = sys_USBD_User_Init(); if(init_return != 0){ FaultASSERT("sys_USBD_User_Init()",init_return,flag_Fault);}
#if ( (SYSTEM_USB_ENABLE) && ( (USE_DEVICE_MODE) || (USE_HOST_MODE) ) )
#if (USE_DEVICE_MODE)
init_return = sys_USBD_User_Init(); if(init_return != 0){ FaultASSERT("sys_USBD_User_Init()",init_return,flag_Fault);}
#endif

#if (USE_HOST_MODE)
init_return = sys_USBH_User_Init(); if(init_return != 0){ FaultASSERT("sys_USBH_User_Init()",init_return,flag_Fault);}
#endif
#endif


USB Deviceʹ��˵����
USB Deviceʹ��˵����
����״����־λʹ�����ӣ�
u8 Divece_STA;
if(Divece_STA != bDeviceState)
Expand Down Expand Up @@ -446,7 +463,75 @@ APIʹ
counter = 0;
}

USB HOSTʹ��˵��
������һ����ѭ�����������³��򣺣�����ѭ���ﲻ������ʱ����Ĭ���Ѿ���BareConfig.c��ѭ�������ӣ�
#if ((SYSTEM_USB_ENABLE) && (USE_HOST_MODE))
//Host Task handler
//USBH_Process �������� U ��ʶ��׶Σ���ҪƵ���������ã����ǵ� U �̱�ʶ���ʣ�µIJ�����U �̶�д������������ USB �жϴ�����
USBH_Process(&USB_OTG_Core, &USB_Host);

if(sys_USBH_use_for_ == use_for_HID) //ֻ����ʹ��HOST HID��ʱ�����������Ⲣ����
{
if(bDeviceState==1)//���ӽ�����
{
if(USBH_Check_HIDCommDead(&USB_OTG_Core,&HID_Machine))//���USB HIDͨ��,�Ƿ�����?
{
USBH_HID_Reconnect();//����
}
}
else //����δ������ʱ��,���
{
if(USBH_Check_EnumeDead(&USB_Host)) //���USB HOST ö���Ƿ�������?������,�����³�ʼ��
{
USBH_HID_Reconnect();//����
}
}
}

//����豸�Ƿ�����
if(HCD_IsDeviceConnected(&USB_OTG_Core))
{

}
#endif

����״����־λʹ�����ӣ�
u8 Divece_STA;
if(Divece_STA != bDeviceState)
{
if(bDeviceState == 1)
LCD_ShowString(10,140,tftlcd_data.width,tftlcd_data.height,16,"USB Connected ");//��ʾUSB�����Ѿ�����
else
LCD_ShowString(10,140,tftlcd_data.width,tftlcd_data.height,16,"USB DisConnected ");//��ʾUSB���γ���
Divece_STA = bDeviceState;
}


VCPģʽ��USBģ�����⴮�ڣ���
USB HOST��֧�� VCP��HOST��ô�度��������VCP̫�˷���


MSCģʽ���������洢����
�����FATFS���õĺ� SYSTEM_FATFS_ENABLE
��U�̲���USB HOST�ӿں󣬻�ִ��������û�����һ�Σ��ڴ˳�����Ĭ�ϻ���FATS���� DEV_USB�豸��������USB UOST MSC�ļ��豸��U�̣�
u8 USH_MSC_User_App(void)

�ɹ���Ϳ�����FATFS��API����ͨ��USB MSC���ص��ⲿU����


HID���˻��ӿڣ�������ģ����꣨�����xy�ƶ��͹��֣����߼���
�ڴ��ļ��������棬��Ҫ����ĸ��û�API����
����USB HOST�ӿڲ������ ���HID�豸���������º�����������豸�����ִ��һ�ε��û�����ˢ����Ӧ�Ľ��棬��־λ�ȵȣ�
void USR_MOUSE_Init (void)

����USB HOST�ӿڲ������ ����HID�豸���������º�����������豸�����ִ��һ�ε��û�����ˢ����Ӧ�Ľ��棬��־λ�ȵȣ�
void USR_KEYBRD_Init(void)

���ͼ��̵��û�Ӧ�ó���ÿ���豸����һ�Σ���ᱻ�ص�һ��
void USR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef *data)
void USR_KEYBRD_ProcessData (uint8_t data)

�����ĸ�API��ԭ���� usbh_hid_keybd.c �� usbh_hid_mouse.c ����
*/

/*_____________________________________\\\ ///____________________________________________*
Expand Down
Loading

0 comments on commit dac0472

Please sign in to comment.