控制工程师论坛

教程与手册

基于STM32的USB程序开发笔记 1

xilinxue
xilinxue

2008-11-22

STM32 USB固件函数的一些介绍
接着上篇,详细情况可以查看usb_core(.c/.h),STM32 USB中断事件为以下几种:
void ISTR_CTR(void);
void ISTR_SOF(void);
void ISTR_ESOF(void);
void ISTR_DOVR(void);
void ISTR_ERROR(void);
void ISTR_RESET(void);
void ISTR_WAKEUP(void);
void ISTR_SUSPEND(void);

这些处理函数使能由定义CNTR_MASK决定:
// CNTR mask control
#define CNTR_MASK   CNTR_CTRM | CNTR_WKUPM | CNTR_SUSPM | CNTR_ERRM |     \
                    CNTR_SOFM | CNTR_ESOFM | CNTR_RESETM | CNTR_DOVRM     \

其中着重说明的是ISTR_RESET()和ISTR_CTR()函数,ISTR_RESET()主要处理USB复位后进行一些初始化任务,ISTR_CTR()则是处理数据正确传输后控制,比如说响应主机。

// *****************************************************************************
// Function Name  : INT_ISTR_RESET
// Description    : ISTR Reset Interrupt service routines.
// Input          :
// Output         :
// Return         :
// *****************************************************************************
void INT_ISTR_RESET(void)
{
  // Set the buffer table address
  SetBTABLE(BASEADDR_BTABLE);

  // Set the endpoint type: ENDP0
  SetEPR_Type(ENDP0, EP_CONTROL);
  Clr_StateOut(ENDP0);

  // Set the endpoint data buffer address: ENDP0 RX
  SetBuffDescTable_RXCount(ENDP0, ENDP0_PACKETSIZE);
  SetBuffDescTable_RXAddr(ENDP0, ENDP0_RXADDR);

  // Set the endpoint data buffer address: ENDP0 TX
  SetBuffDescTable_TXCount(ENDP0, 0);
  SetBuffDescTable_TXAddr(ENDP0, ENDP0_TXADDR);

  // Initialize the RX/TX status: ENDP0
  SetEPR_RXStatus(ENDP0, EP_RX_VALID);
  SetEPR_TXStatus(ENDP0, EP_TX_NAK);

  // Set the endpoint address: ENDP0
  SetEPR_Address(ENDP0, ENDP0);

  // ---------------------------------------------------------------------
  // TODO: Add you code here
  // ---------------------------------------------------------------------
  // Set the endpoint type: ENDP1
  SetEPR_Type(ENDP1, EP_INTERRUPT);
  Clr_StateOut(ENDP1);

  // Set the endpoint data buffer address: ENDP1 RX
  SetBuffDescTable_RXCount(ENDP1, ENDP1_PACKETSIZE);
  SetBuffDescTable_RXAddr(ENDP1, ENDP1_RXADDR);

  // Set the endpoint data buffer address: ENDP1 TX
  SetBuffDescTable_TXCount(ENDP1, 0);
  SetBuffDescTable_TXAddr(ENDP1, ENDP1_TXADDR);

  // Initialize the RX/TX status: ENDP1
  SetEPR_RXStatus(ENDP1, EP_RX_VALID);
  SetEPR_TXStatus(ENDP1, EP_TX_DIS);

  // Set the endpoint address: ENDP1
  SetEPR_Address(ENDP1, ENDP1);
 
 
 
  SetEPR_Type(ENDP2, EP_INTERRUPT);
  Clr_StateOut(ENDP2);

  // Set the endpoint data buffer address: ENDP2 RX
  SetBuffDescTable_RXCount(ENDP2, ENDP2_PACKETSIZE);
  SetBuffDescTable_RXAddr(ENDP2, ENDP2_RXADDR);

  // Set the endpoint data buffer address: ENDP2 TX
  SetBuffDescTable_TXCount(ENDP2, 0);
  SetBuffDescTable_TXAddr(ENDP2, ENDP2_TXADDR);

  // Initialize the RX/TX status: ENDP2
  SetEPR_RXStatus(ENDP2, EP_RX_DIS);
  SetEPR_TXStatus(ENDP2, EP_TX_VALID);

  // Set the endpoint address: ENDP2
  SetEPR_Address(ENDP2, ENDP2);



  // ---------------------------------------------------------------------
  // End of you code
  // ---------------------------------------------------------------------
 
  SetDADDR(0x0080 | vsDeviceInfo.bDeviceAddress);
  vsDeviceInfo.eDeviceState = DS_DEFAULT;
  vsDeviceInfo.bCurrentFeature = 0x00;
  vsDeviceInfo.bCurrentConfiguration = 0x00;
  vsDeviceInfo.bCurrentInterface = 0x00;
  vsDeviceInfo.bCurrentAlternateSetting = 0x00;
  vsDeviceInfo.uStatusInfo.w = 0x0000;
}
回帖

评论2

总共 , 当前 /
首页 | 登录 | 注册 | 返回顶部↑
手机版 | 电脑版
版权所有 Copyright(C) 2016 CE China