返回列表 发新帖我要提问本帖赏金: 20.00元(功能说明)

[AT32F405] 【AT-START-F405测评】第三步:USB主机测试

[复制链接]
 楼主| lovelessing 发表于 2024-5-16 11:21 | 显示全部楼层 |阅读模式
前面测试了最基本的IO、串口、SPI等等,测多了开发板你就知道了,工程模板给你已经开了很多很多功能了,无外乎就是开关个配置复制复制修改修改代码。
所以直接一步到位测一下USB,用的是host-hid demo,可以识别USB鼠标和键盘设备
76599664577eb9d029.png
首先加上之前的OLED驱动
  1.     nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);

  2.     system_clock_config();

  3.     at32_board_init();
  4.        
  5.         /* get system clock */
  6.         crm_clocks_freq_get(&crm_clocks_freq_struct);
  7.        
  8.         OLED_Init();
  9.         OLED_SetDir(3);
  10.         OLED_Clear(0);
  11.         OLED_DrawRectangle(5,5,122,59,1);
  12.         OLED_DrawRectangle(15,15,112,49,1);
  13.         OLED_DrawRectangle(25,25,102,39,1);
  14.         OLED_Refresh_Gram();


接着打开一个多少钱用来做定时刷新,因为host需要一直轮询,所以不能占用太多的刷新影响,而工程也没有开启滴答定时器做系统计数,因此不能获取到准确的时基,同于也不能通过循环次数做计时,因为每次循环时间并不一致
  1. /* enable tmr1 clock */
  2.         crm_periph_clock_enable(CRM_TMR1_PERIPH_CLOCK, TRUE);

  3.         /* tmr1 configuration */
  4.         /* time base configuration */
  5.         tmr_base_init(TMR1, 10-1, (crm_clocks_freq_struct.apb2_freq / 10000) - 1);
  6.         tmr_cnt_dir_set(TMR1, TMR_COUNT_UP);

  7.         /* overflow interrupt enable */
  8.         tmr_interrupt_enable(TMR1, TMR_OVF_INT, TRUE);

  9.         /* tmr1 hall interrupt nvic init */
  10.         nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  11.         nvic_irq_enable(TMR1_OVF_TMR10_IRQn, 1, 0);

  12.         /* enable tmr1 */
  13.         tmr_counter_enable(TMR1, TRUE);
定时器中断中对变量进行计数,当作时基
  1. uint32_t tmr_cnt = 0;

  2. /**
  3.   * [url=home.php?mod=space&uid=247401]@brief[/url]  this function handles timer1 overflow handler.
  4.   * @param  none
  5.   * @retval none
  6.   */
  7. void TMR1_OVF_TMR10_IRQHandler(void)
  8. {
  9.         if(tmr_interrupt_flag_get(TMR1, TMR_OVF_FLAG) == SET)
  10.         {
  11.                 tmr_flag_clear(TMR1, TMR_OVF_FLAG);
  12.                 tmr_cnt += 10;
  13.         }
  14. }
没100毫秒进行一次刷屏,尽量不占用USB轮询
  1.     while(1)
  2.     {
  3.         usbh_loop_handler(&otg_core_struct.host);
  4.                 if(!(tmr_cnt % 100))
  5.                 {
  6.                         OLED_Refresh_Gram();
  7.                 }
  8.     }
修改USB鼠标坐标回调函数,因为参数类型不适合,之后加上坐标限制以及OLED画点函数的调用
  1. int16_t x_pos = 0, y_pos = 0;

  2. uint8_t left_btn_flag = 0;

  3. /**
  4.   * @brief  usb host hid position
  5.   * @param  x: x position
  6.   * @param  y: y position
  7.   * @retval none
  8.   */
  9. void usbh_hid_mouse_position(int8_t x, int8_t y)
  10. {
  11.   if((x != 0) || (y != 0))
  12.   {
  13.     x_pos += x / 2;
  14.     y_pos += y / 2;

  15.     if(x_pos > MOUSE_WINDOW_WIDTH - 2)
  16.     {
  17.       x_pos = MOUSE_WINDOW_WIDTH - 2;
  18.     }
  19.     if(y_pos > MOUSE_WINDOW_HEIGHT - 2)
  20.     {
  21.       y_pos = MOUSE_WINDOW_HEIGHT - 2;
  22.     }

  23.     if(x_pos < 2)
  24.     {
  25.       x_pos = 2;
  26.     }
  27.     if(y_pos < 2)
  28.     {
  29.       y_pos = 2;
  30.     }
  31.     USBH_DEBUG("Moving Mouse");
  32.         extern void OLED_DrawPoint(uint16_t x, uint16_t y, uint8_t p);
  33.         if(left_btn_flag)
  34.         {
  35.                 OLED_DrawPoint(x_pos,y_pos,1);
  36.         }
  37.   }

  38. }
同样的对按键回调函数做出改动如下,当按住左键时使能画点,右键则用来清屏
  1. /**
  2.   * @brief  usb host hid button press
  3.   * @param  button: button id
  4.   * @retval none
  5.   */
  6. void usbh_hid_mouse_button_press(uint8_t button)
  7. {
  8.   switch(button)
  9.   {
  10.     case MOUSE_BUTTON_LEFT:
  11.       /* left button */
  12.       USBH_DEBUG("Left Button Pressed ");
  13.         left_btn_flag = 1;
  14.       break;
  15.     case MOUSE_BUTTON_RIGHT:
  16.       USBH_DEBUG("Right Button Pressed ");
  17.       /* left button */
  18.         extern void OLED_Clear(uint8_t para);
  19.         OLED_Clear(0);
  20.       break;
  21.     case MOUSE_BUTTON_MIDDLE:
  22.       USBH_DEBUG("Middle Button Pressed ");
  23.       /* middle button */
  24.       break;
  25.   }
  26. }

  27. /**
  28.   * @brief  usb host hid button release
  29.   * @param  button: button id
  30.   * @retval none
  31.   */
  32. void usbh_hid_mouse_button_release(uint8_t button)
  33. {
  34.   switch(button)
  35.   {
  36.     case MOUSE_BUTTON_LEFT:
  37.       /* left button */
  38.       USBH_DEBUG("Left Button Released ");
  39.         left_btn_flag = 0;
  40.       break;
  41.     case MOUSE_BUTTON_RIGHT:
  42.       /* left button */
  43.       USBH_DEBUG("Right Button Released ");
  44.       break;
  45.     case MOUSE_BUTTON_MIDDLE:
  46.       /* middle button */
  47.       USBH_DEBUG("Middle Button Released ");
  48.       break;
  49.   }
  50. }
基本上就修改差不多了,下载代码跑一下
4594566457b553313c.jpg
插上鼠标,画一个AT字符,USB驱动成功,画完了可以右键清除一下
607236645794557307.png

打赏榜单

ArteryMCU 打赏了 20.00 元 2024-06-07
理由:[F405开发板评测活动]内容优质

呐咯密密 发表于 2024-5-21 13:20 | 显示全部楼层
实现的很棒
 楼主| lovelessing 发表于 2024-5-21 19:09 | 显示全部楼层

还有不少瑕疵呢,暂时没实现鼠标位置的动态显示,所以现在只能凭感觉感触位置画,都是测评要的比较急
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

136

帖子

2

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