用户工具

站点工具


icore3_arm_hal_19

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
icore3_arm_hal_19 [2020/04/17 14:18]
fmj [三、 实验原理]
icore3_arm_hal_19 [2022/03/18 15:08] (当前版本)
sean
行 2: 行 2:
 |技术支持电话|**0379-69926675-801** ​ ||| |技术支持电话|**0379-69926675-801** ​ |||
 |技术支持邮件|Gingko@vip.163.com ​ ||| |技术支持邮件|Gingko@vip.163.com ​ |||
-|技术论坛|http://​www.eeschool.org ​ ||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
 |  V1.0  |  2020-04-17 ​ |  gingko ​ |  初次建立 ​ | |  V1.0  |  2020-04-17 ​ |  gingko ​ |  初次建立 ​ |
行 112: 行 111:
 int main(void)  ​ int main(void)  ​
 {  ​ {  ​
-    ​int i;   +  /* USER CODE BEGIN 1 */   
-    ​static ​unsigned char data_number = 0;   +  ​int i;   
-    ​HAL_Init();   +  unsigned char buffer[64];   
-    ​USBD_Init(&​USB_OTG_dev,​USB_OTG_HS_CORE_ID,&​USR_desc,&​USBD_CDC _cb,&​USR_cb);   +  ​unsigned char send_buffer[64];   
-    SystemClock_Config(); ​  +  ​static int counter; ​  
-    MX_GPIO_Init(); ​  +  RTC_DateTypeDef sDate; ​  
-    while(State==0);   +  RTC_TimeTypeDef sTime; ​  
-    ​LED_RED_ON;   +  /* USER CODE END 1 */   
-    while (1)   +  HAL_Init();   
-    {   +  SystemClock_Config(); ​  
-        if(USB_ReceivedCount > 0){   +  /* Initialize all configured peripherals */   
-            ​LED_RED_ON; ​   +  ​MX_GPIO_Init(); ​  
-            USB_ReceivedCount ​= 0;   +  ​MX_RTC_Init();   
-            ​data_number ​USB_Rx_Buffer[0]; ​  +  ​MX_USB_DEVICE_Init();   
-            do{   +  /* USER CODE BEGIN WHILE */   
-                ​USB_StatusDataSended = 0;   +  ​while (1)   
-                ​DCD_EP_Tx(&USB_OTG_dev,CDC_IN_EP,gImage_flower,sizeof(gImage_flower));   +    
-                ​while(USB_StatusDataSended ​== 0){   +    /* USER CODE END WHILE */   
-                    for(i = 0;i < 10000;i++)  +        if(systick.second_flag == 1){   
-                ​}   +            ​systick.second_flag ​= 0;   
-                data_number--;   +            ​if(hUsbDeviceHS.dev_state ​== USBD_STATE_CONFIGURED){ ​  
-            }while(data_number > 0);   +                ​if(counter ++ % 2){   
-            ​LED_RED_OFF;   +                    ​HAL_RTC_GetTime(&​hrtc,​ &sTime, RTC_FORMAT_BIN); ​  
-         ​  +                    HAL_RTC_GetDate(&​hrtc,​ &sDate, RTC_FORMAT_BIN); ​  
-    }+                    memset(send_buffer,​0,64) 
 +                    sprintf((char *)send_buffer,"​time:​%02d:​%02d:​%02d ​ %02d-%02d-%02d",​sTime.Hours,​sTime.Minutes,​sTime.Seconds,​sDate.Year,​sDate.Month,​sDate.Date);​ 
 +                    ​USBD_HID_SendReport(&hUsbDeviceHS,send_buffer,64);   
 +                }else{ ​  
 +                    memset(send_buffer,0,​64); ​  
 +                    if(ARM_KEY_STATE == KEY_DOWN  
 +                        sprintf((char *)send_buffer,"​key:​KEY PRESS");  ​ 
 +                    else   
 +                        sprintf((char *)send_buffer,"​key:"​); ​  
 +                    USBD_HID_SendReport(&​hUsbDeviceHS,​send_buffer,​64); ​ 
 +                ​}          
 +            }          
 +        }   
 +        //​接收命令处理 
 +        if(usb_receive_flag ​== 1){   
 +            ​usb_receive_flag = 0;   
 +            memcpy(buffer,​usb_receive_buffer,​usb_receive_counter); ​  
 +            memset(usb_receive_buffer,​0,​usb_receive_counter); ​  
 +            ​for(i = 0;i < 64;i++)  
 +                ​buffer[i] = tolower(buffer[i]);   
 +            }   
 +            ​command_process(buffer);   
 +                
 +   
 }  ​ }  ​
 +
 </​code>​ </​code>​
-=== 2. 中断函数 ===+  * 在主函数的while循环中通过定时器,定时向主机发送时间数据。再通过USB处理函数对主机发送过来的数据进行接收处理,并送入处理函数进行处理,实现相应的功能。 
 +=== 2. 时钟函数 ===
 <code c> <code c>
-void OTG_HS_IRQHandler(void)  ​+void HAL_SYSTICK_Callback(void)  ​
 {  ​ {  ​
-  USBD_OTG_ISR_Handler ​(&​USB_OTG_dev);   +    //​中断时间1ms,  
-}   +static int counter = 0;   
-void OTG_HS_EP1_IN_IRQHandler(void)  ​+ 
 +    if((counter ++ % 250== 0){   
 +        systick.second_flag = 1      
 +    }   
 +} 
 + 
 +</​code>​ 
 +  * 通过时钟函数计时,定时向主机发送数据 
 +=== 3. usb驱动文件修改 ===  
 +  * 因为hal库中的驱动没有对hid设备接收函数的处理,需要修改usbd_hid.c文件。主要是添加USBD_HID_DataOut函数,增加对从主机发送的数据接收功能。 
 +<code c> 
 +static uint8_t ​ USBD_HID_DataOut ​(USBD_HandleTypeDef *pdev, ​   
 +                              uint8_t epnum)  ​
 {  ​ {  ​
-  USBD_OTG_EP1IN_ISR_Handler ​(&​USB_OTG_dev)  +    if(epnum == HID_EPOUT_ADDR)  
-  +        ​usb_receive_counter = USBD_GetRxCount(pdev,​epnum); ​  
-void OTG_HS_EP1_OUT_IRQHandler(void)   +        if(pdev->​dev_state == USBD_STATE_CONFIGURED)  
-  +            ​usb_receive_flag = 1;   
-  ​USBD_OTG_EP1OUT_ISR_Handler ​(&​USB_OTG_dev);  ​+  ​USBD_LL_PrepareReceive(pdev,​HID_EPOUT_ADDR,​usb_receive_buffer,​HID_EPOUT_SIZE);   
 +        }   
 +    }   
 +  return USBD_OK;  ​
  
  
 </​code>​ </​code>​
-=== 3. USB驱动移植 ===  +  * 修改USBD_HID_Init函数,增加USBD_LL_OpenEP函数语句与USBD_LL_PrepareReceive函数语句,保证相应功能的初始化。 
-  * 在CUBEMX中 无法配置USBDevice为CDC高速传输模式,需要将USB库的驱动文件移植到程序中去。建立好一个新工程后,打开此实验例程文件夹,找到USB文件夹,将文件夹拷贝到建立好工程中去。 +<code c> 
-{{  :​icore3:​icore3_arm_hal_18_6.png?​direct&​800 ​ |}} +/* Open Ep Out */   
 +    USBD_LL_OpenEP(pdev,​ HID_EPOUT_ADDR,​ USBD_EP_TYPE_INTR,​ HID_EPOUT_SIZE); ​   
 +    /* Prepare Out endpoint to receive next packet */   
 +    USBD_LL_PrepareReceive(pdev,​ HID_EPOUT_ADDR,​ usb_receive_buffer,​ HID_EPOUT_SIZE);​  
 +</​code>​ 
 +  * 在usbd_hid.h添加对EPOUT参数地址与大小的定义 
 +<code c> 
 +#define HID_EPOUT_ADDR ​                             0x01   
 +#define HID_EPOUT_SIZE ​                             0x40  
 +</​code>​ 
 +  * 利用上位机hid.exe与iCore3通讯,HID设备的描述符需要进行修改,以便可以与上位机软件进行通讯。主要是对usbd_desc.c 设备描述符与usbd_hid.c配置描述符进行修改。这些描述符决定了HID设备的类型与定义上位机需要根据这些描述符发出相应的指令控制。直接将程序中的usbd_hid.c文件替换为例程文件的usbd_hid.c。在usbd_desc.c中需要修改USBD_HS_DeviceDesc中的相应描述配置,将宏定义中一些参数进行修改,即可实现hid描述符修改。 
 +<code c> 
 +#define USBD_VID ​    ​0x483 ​  
 +#define USBD_LANGID_STRING ​    ​1033 ​  
 +#define USBD_MANUFACTURER_STRING ​    "​Gingko" ​  
 +#define USBD_PID_HS ​    ​0x5720 ​  
 +#define USBD_PRODUCT_STRING_HS ​    "​iCore3 in HS mode" ​  
 +#define USBD_SERIALNUMBER_STRING_HS ​    "​00000000001A" ​  
 +#define USBD_CONFIGURATION_STRING_HS ​    "​HID Config" ​  
 +#define USBD_INTERFACE_STRING_HS ​    "​HID Interface" ​  
 +#define USB_SIZ_BOS_DESC ​           0x0C  
 +</​code>​
 ==== 五、 实验步骤 ==== ==== 五、 实验步骤 ====
   - 把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连);   - 把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连);
行 165: 行 224:
   - 打开Keil MDK开发环境,并打开本实验工程;   - 打开Keil MDK开发环境,并打开本实验工程;
   - 烧写程序到iCore3;   - 烧写程序到iCore3;
 +  - 也可以进入Debug模式,单步运行或设置断点验证程序逻辑;
   - 打开usb_hid.exe进行验证。   - 打开usb_hid.exe进行验证。
  
 ==== 六、 实验现象 ==== ==== 六、 实验现象 ====
-  * 绿色LED亮,结果如下: +  * 点击测试软件的LED控制按钮,iCore3上的LED灯的颜色状态将发生变化,点击校准时间,将用电脑系统的时间校准iCore3的内部RTC按下iCore3上的ARM-KEY,​按键状态栏将显示按键状态(如下图所示)。 
-{{ :​icore3:​icore3_arm_hal_18_7.png?​direct |}} +{{ :icore3:icore3_arm_hal_19_3.png?direct |}}
-**附录:** +
-  * 1、打开设备管理器,并找到USB_CDC设备 +
-{{ :​icore3:​icore3_arm_hal_18_8.png?​direct |}} +
-  * 2、选中此设备并右选择更新驱动程序,选中浏览计算机以查找驱动程序软件 +
-{{ :​icore3:​icore3_arm_hal_18_9.png?​direct |}} +
-  * 3、找到例程文件夹下driver文件夹并选中此文件夹,点击下一步后驱动程序会自动安装。 +
-{{ :​icore3:​icore3_arm_hal_18_10.png?​direct |}} +
-  * 4、安装成功后设备管理器显示相对应设备。 +
-{{ :icore3:icore3_arm_hal_18_11.png?direct |}} +
  
icore3_arm_hal_19.1587104316.txt.gz · 最后更改: 2020/04/17 14:18 由 fmj