[菜农助学交流] USB鼠标

[复制链接]
4267|10
 楼主| xianghou 发表于 2011-10-30 13:40 | 显示全部楼层 |阅读模式
基于RL-RTX的,建了两个任务。一个是计算ADC1和VBG电压然后通过串口上报。任务2是USB的轮询函数

KEY1是鼠标水平移动,KEY2是鼠标垂直移动
初始化

  1. #include "NUC1xx.h"
  2. #include "drvsys.h"
  3. #include "drvgpio.h"
  4. #include "drvuart.h"
  5. #include "drvadc.h"
  6. #include "drvusb.h"
  7. #include <rtl.h>
  8. #include "HIDSys.h"
  9. #include "HID_API.h"

  10. static void ClockInit( void )
  11. {
  12.     UNLOCKREG();
  13.     DrvSYS_SetOscCtrl( E_SYS_XTL12M, ENABLE );
  14.     DrvSYS_SelectPLLSource( E_SYS_EXTERNAL_12M );
  15.     DrvSYS_Open(48000000);
  16.     DrvSYS_SelectSysTickSource( 3 );
  17. }
  18. static void UartInit( void )
  19. {
  20.     STR_UART_T sParam;
  21.     sParam.u32BaudRate = 115200;
  22.     sParam.u8cDataBits = DRVUART_DATABITS_8;
  23.     sParam.u8cStopBits = DRVUART_STOPBITS_1;
  24.     sParam.u8cParity   = DRVUART_PARITY_NONE;
  25.     sParam.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES;
  26.     DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, INTERNAL_HCLK);
  27.     DrvUART_Open (UART_PORT0, &sParam);
  28.     DrvGPIO_InitFunction(E_FUNC_UART0_RX_TX);
  29. }
  30. static void ADCInit( void )
  31. {
  32.     DrvADC_Open(ADC_SINGLE_END, ADC_SINGLE_CYCLE_OP, (1 << 1) | (1 << 7), EXTERNAL_12MHZ, 11);   //Set adc parameter
  33.     DrvADC_ConfigADCChannel7( INTERNAL_BANDGAP );
  34.     DrvGPIO_InitFunction(E_FUNC_ADC1);
  35.     DrvADC_EnableSelfCalibration();  //start calibration
  36.     while(DrvADC_IsCalibrationDone() == 0)
  37.     {
  38.         ;
  39.     }
  40. }
  41. void USBD_Init( void )
  42. {
  43.     //int32_t i32Ret = 0;
  44.    
  45.     GPIOB->IEN = (1 << 15) | (1 << 14);
  46.     NVIC_EnableIRQ(EINT1_IRQn);
  47. NVIC_EnableIRQ(EINT0_IRQn);
  48. DrvUSB_Open((void *)DrvUSB_DispatchEvent);
  49. //    i32Ret = DrvUSB_Open((void *)DrvUSB_DispatchEvent);
  50. ////    if(i32Ret != 0)
  51. //    {
  52. //        return i32Ret;
  53. //    }
  54. /* Disable USB-related interrupts. */
  55.     _DRVUSB_ENABLE_MISC_INT(0);
  56.     /* Enable float-detection interrupt. */
  57.     _DRVUSB_ENABLE_FLDET_INT();
  58.     /* Start HID and install the callback functions to handle in/out report */
  59.     HID_Init();
  60.     /* Enable USB-related interrupts. */
  61.     _DRVUSB_ENABLE_MISC_INT(INTEN_WAKEUP | INTEN_WAKEUPEN | INTEN_FLDET | INTEN_USB | INTEN_BUS);
  62.     /* Enter power down to wait USB attached */
  63. //      PowerDown();
  64. }
  65. void SystemInit( void )
  66. {
  67.     ClockInit();
  68.     UartInit();
  69.     ADCInit();
  70.    // USBD_Init();
  71. }
  72. /* 重定向PRINTF函数到串口1*/
  73. int putchar(int __c)
  74. {
  75.     if(DrvUART_Write(UART_PORT0, (unsigned char *)__c, 1))
  76.     {
  77.         return 1;
  78.     }
  79.     else
  80.     {
  81.         return 0;
  82.     }
  83. }



主函数

  1. #include "NUC1xx.h"
  2. #include <rtl.h>
  3. #include "drvgpio.h"
  4. #include "bsp.h"
  5. #include "drvuart.h"
  6. #include "drvadc.h"
  7. #include "drvusb.h"
  8. #include <stdio.h>
  9. #include "HIDSys.h"
  10. #include "HID_API.h"
  11. extern void USBD_Init( void );
  12. __task void usbtask( void )
  13. {
  14. USBD_Init();
  15. /* Poll and handle USB events. */
  16. for( ;; )
  17. {
  18.   E_DRVUSB_STATE eUsbState;
  19.      eUsbState = DrvUSB_GetUsbState();
  20.      if (eUsbState == eDRVUSB_DETACHED)
  21.      {
  22.          break;
  23.      }
  24.      if(eUsbState & eDRVUSB_SUSPENDED)
  25.      {
  26.          /* Enter suspend here */
  27. //              PowerDown();
  28.      }
  29.      else
  30.      {
  31.          /* Set HID IN report for interrupt IN transfer */
  32.          HID_SetInReport();
  33.      }
  34.      os_dly_wait(2);
  35. }
  36. }
  37. __task void ledtask( void )
  38. {
  39.     for( ;; )
  40.     {
  41.         unsigned int i;
  42.         float j;
  43.         DrvADC_StartConvert();   //start first convert
  44.         os_dly_wait( 200 );
  45.         i = DrvADC_GetConversionData( 1 );
  46.         j = (float)i * 3.3 / 4095;
  47.         printf("The ADC Channel 1 Voltage:%1.3f V\n", j);
  48.         i = DrvADC_GetConversionData( 7 );
  49.         j = (float)i * 3.3 / 4095;
  50.         printf("The VBG Voltage:%1.3f V\n", j);
  51.     }
  52. }
  53. __task void taskinit( void )
  54. {
  55.     os_tsk_create(ledtask, 1);   //创建任务
  56. os_tsk_create(usbtask, 2);
  57.     os_tsk_delete_self();        //删除自己
  58.     for( ;; )
  59.     {
  60.     }
  61. }
  62. int main( void )
  63. {
  64. //  usbd_init();                         // USB Initialization
  65. //  usbd_connect(__TRUE);                // USB Connect
  66.     os_sys_init( taskinit );    //启动任务调度器
  67.     while( 1 )
  68.     {
  69.     }
  70. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
weshiluwei6 发表于 2011-10-31 07:24 | 显示全部楼层
这个好玩 支持支持啊
Ryanhsiung 发表于 2011-10-31 13:07 | 显示全部楼层
不错,要顶一下
Ryanhsiung 发表于 2011-11-10 18:46 | 显示全部楼层
本帖最后由 Ryanhsiung 于 2011-11-10 19:14 编辑

刚才不能用,现在可以用了,不知道为什么!!!
Ryanhsiung 发表于 2011-11-10 19:14 | 显示全部楼层
知道为什么了,因为是没有勾选DEBUG LOAD FLASH
yongjun_meng 发表于 2012-3-28 10:46 | 显示全部楼层
挺啊,在学习USB
缥缈九哥 发表于 2012-3-29 08:20 | 显示全部楼层
顶起。要把USB用得像UART串口一样。熟悉,方便,普及。
[惊涛骇浪] 发表于 2012-4-1 08:42 | 显示全部楼层
乡村男孩 发表于 2012-4-1 11:14 | 显示全部楼层
学习了
abin0415 发表于 2012-4-5 16:01 | 显示全部楼层
zaj1017141116 发表于 2012-4-5 20:53 | 显示全部楼层
这个怎么用啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

105

帖子

2

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