您好!
我的要求是从计时器中断以每50us 发送一次256kB 数据。
我将使用 USB_DEV_SERIAL 示例代码通过 USB 将数据从控制器传输到 PC 应用。
但在 PC 应用程序中,我观察到一些数据丢失,而且数据不是来自一组。
如果与之类似、我在后台仅发送一次数据而不是从计时器中断发送数据、我能够根据需要以正确的格式和单组方式接收所有数据。
请注意:在这两种情况下、定时器 ISR 的执行时间均为40usec。
您能不能给我们介绍一下如何使用计时器 ISR
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我的要求是从计时器中断以每50us 发送一次256kB 数据。
我将使用 USB_DEV_SERIAL 示例代码通过 USB 将数据从控制器传输到 PC 应用。
但在 PC 应用程序中,我观察到一些数据丢失,而且数据不是来自一组。
如果与之类似、我在后台仅发送一次数据而不是从计时器中断发送数据、我能够根据需要以正确的格式和单组方式接收所有数据。
请注意:在这两种情况下、定时器 ISR 的执行时间均为40usec。
您能不能给我们介绍一下如何使用计时器 ISR
您好,Omer Amir,
感谢您的回复。 
我在示波器的帮助下验证了计时器 ISR 是否正确执行。
是的、我尝试在计时器 ISR、main while 循环中发送数据、也尝试过循环。
它是恒定的字节数(256字节)
但我将使用 USBCDC 通信虚拟 Com 端口。
我一次只能发送32个字节。 我将获得32个字节、我也将按顺序在50微秒内应用。
如果我将字节数增加到256、它将开始发送数据包大小4096数据、这没问题、但数据丢失。
我的问题是可以以50usec 的速度发送256字节的单个数据包。 如果是、请向我建议需要修改的地方。
谢谢。
//########################################################################出################################出
//
//文件:usb_dev_serial.c
//
//标题:USB CDC 串行示例的主要例程。
//
//########################################################################出################################出
//$TI 版本:F2837xD 支持库 V210美元
//$Release Date:TUE Nov 1:46:15 CDT 2016 $
//$Copyright:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//########################################################################出################################出
//
//包含的文件
//
#include "F28x_Project.h"
#包含
#包含
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_uart.h"
#include "driverlib/debug.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/SysTick。h"
#include "driverlib/uart.h"
#include "driverlib/usb.h"
#include "driverlib/usb_hal.h"
#include "driverlib/rom.h"
#include "usblib/usblib.h"
#include "usblib/usbcdc.h"
#include "usblib/usb-ids.h"
#include "usblib/usblibpriv.h"
#include "usblib/device/usbdevice.h"
#include "usblib/device/usbdcdc.h"
#include "utils/ustdlib.h"
#include "usb_serial_structs.h"
//#include "USBDMA.h"
__interrupt void cpu_timer0_isr (void);
//*****
//
//! \addtogroup cpu01_example_list
//!
//*****
//
//系统节拍率,以每秒和1毫秒的节拍率表示
//周期。
//
//*****
#define SYSTICK _每秒100
#define SysTick 周期_MS (1000 / SYSTICK 每秒)
//*****
//
//变量跟踪发送和接收计数。
//
//*****
Volatile uint32_t g_ui32UARTTxCount = 0;
Volatile uint32_t g_ui32UARTRxCount = 0;
uint32_t TX_flag = 0;
#ifdef 调试
uint32_t g_ui32UARTRxErrors = 0;
#endif
//*****
//
//要存储的 UART 的基地址、外设 ID 以及中断 ID
//重定向。
//
//*****
//*****
//
//定义通过 USB 重定向 UART0所需的定义。
//
//*****
#define USB_UART_BASE UARTA_BASE
#define USB_UART_Periph SYSCTL_Periph_SCI1
#define USB_UART_INT INT_SCIRXINTA
//*****
//
//重定向 UART 的默认线路编码设置。
//
//*****
#define DEFAULT_BIT_RATE 115200
#define DEFAULT_UART_CONFIG (UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE |\
UART_CONFIG_STOP_ONE)
//*****
//
//指示当前是否正在发送中断条件的标志。
//
//*****
静态 bool g_bSendingBreak = false;
//*****
//
//全局系统节拍计数器
//
//*****
Volatile uint32_t g_ui32SysTickCount = 0;
//*****
//
//用于将命令从中断上下文传递到主循环的标志。
//
//*****
#define COMMAND_packet_RECEIVED 0x00000001
#define COMMAND_STATUS_UPDATE 0x00000002
Volatile uint32_t g_ui32Flags = 0;
char *g_pcStatus;
//*****
//
//表示已设置 USB 配置的全局标志。
//
//*****
静态易失性 bool g_bUSBConfigured = false;
//*****
//
//用于处理来自应用端的数据的 Rx 和 Tx 缓冲器
//
//*****
uint8_t USBRxBuffer[100];
uint8_t USBTxBuffer[256]=
{
0xAA、0x55
,0x00、1、0x00、2、0x00、3、0x00、4、0x00、5
,0x00、6、0x00、7、0x00、8、0x00、9、0x00、10
,0x00,11,0x00,12,0x00,13,0x00,14,0x00,15
//、0x00、16、0x00、17、0x00、18、0x00、19、0x00、20
//、0x00、21、0x00、22、0x00、23、0x00、24、0x00、25、0x00、26、
/*0x01,0x02,0x03,0x04,0x05,0x06,0x07
0x00、0x01、0x00、0x02、0x00、0x03、0x00、0x04、0x00*/
};
uint8_t peranum = 32;
uint8_t peranum1= 64;
uint8_t USB_remain_data = 0;
//绩效指标问题
//
//下面的其它变量
//
//*****
void sciaRxFifoIsr();
void Load_Rx_Paremeters ();
//*****
//
//内部函数原型。
//
//*****
静态空 SetControlLineState (uint16_t ui16State);
静态 bool SetLineCoding (tLineCoding *psLineCoding);
静态空 GetLineCoding (tLineCoding *psLineCoding);
静态空 SendBreak (bool bSend);
//*****
//
//驱动程序库遇到错误时调用的错误例程。
//
//*****
#ifdef 调试
空
__error__(char *pcFilename,uint32_t ui32Line)
{
while (1)
{
}
}
#endif
//*****
//
//系统时钟计数器的中断处理程序。
//
//*****
__中断无效
SysTickIntHandler (void)
{
//
//更新系统时间。
//
G_ui32SysTickCount++;
PieCtrlRegs.PIEACK.all |= 1;
}
//*****
//
//设置 RS232 RTS 和 DTR 信号的状态。
//
//*****
静态空
SetControlLineState (uint16_t ui16State)
{
//
// TODO:如果配置了 GPIO 来控制握手线,
//根据在 wValue 中传递的标志进行适当的设置
//请求结构的字段已传递。
//
}
//*****
//
//设置要在 UART 上使用的通信参数。
//
//*****
静态 bool
SetLineCoding (tLineCoding *psLineCoding)
{
uint32_t ui32Config;
bool bRetcode;
//
//假设一切正常,直到我们检测到任何问题。
//
bRetcode = true;
//
//字长。 对于无效值、默认设置为每帧8个位、
//字符并返回错误。
//
switch (psLineCode->ui8Databits)
{
情形5:
{
ui32Config = UART_CONFIG_WLEN_5;
中断;
}
情况6:
{
ui32Config = UART_CONFIG_WLEN_6;
中断;
}
情形7:
{
ui32Config = UART_CONFIG_WLEN_7;
中断;
}
情形8:
{
ui32Config = UART_CONFIG_WLEN_8;
中断;
}
默认值:
{
ui32Config = UART_CONFIG_WLEN_8;
bRetcode = false;
中断;
}
}
//
//奇偶校验。 对于任何无效的值、我们将不设置奇偶校验并返回错误。
//
switch (psLineCoding->ui8Parity)
{
案例 USB_CDC_PARITY_NONE:
{
ui32Config |= uart_config_PAR_NONE;
中断;
}
情况 USB_CDC_quitance_odd:
{
ui32Config |= uart_config_PAR_ODD;
中断;
}
案例 USB_CDC_quitance_even:
{
ui32Config |= uart_config_par_even;
中断;
}
案例 USB_CDC_PARITY_MARK:
{
ui32Config |= uart_config_par_one;
中断;
}
案例 USB_CDC_PARITY_SPACE:
{
ui32Config |= uart_config_par_zero;
中断;
}
默认值:
{
ui32Config |= uart_config_PAR_NONE;
bRetcode = false;
中断;
}
}
//
//停止位。 我们的硬件仅支持1或2个停止位、而 CDC
//允许主机选择1.5个停止位。 如果通过1.5 (或任何其他
// ui8Stop 的值无效或不受支持,我们设置为1个停止位,但
//返回错误,如果调用方需要停止或以其他方式报告
//返回到主机。
//
switch (psLineCoding->ui8Stop)(开关(psLineCoding->ui8Stop))
{
//
//请求一个停止位。
//
案例 USB_CDC_STOP_BITS_1:
{
ui32Config |= uart_config_stop_one;
中断;
}
//
//请求两个停止位。
//
案例 USB_CDC_STOP_BITS_2:
{
ui32Config |= uart_config_stop_two;
中断;
}
//
//其他情况是 ui8Stop 的无效值或我们使用的值
//无法支持如此设置1个停止位,但返回错误。
//
默认值:
{
ui32Config = UART_CONFIG_STOP_ONE;
bRetcode |= false;
中断;
}
}
//
//适当地设置 UART 模式。
//
UARTConfigSetExpClk (USB_UART_BASE、SysCtlLowSpeedClockGet (SYSTEM_CLOCK_SPEED)、
readusb32_t (&(psLineCoding->ui32Rate)、ui32Config);
//
//让呼叫者知道我们是否有问题。
//
返回(bRetcode);
}
//*****
//
//获取 UART 上使用的通信参数。
//
//*****
静态空
GetLineCoding (tLineCoding *psLineCoding)
{
uint32_t ui32Config;
uint32_t ui32Rate;
//
//在 UART 中设置当前行编码。
//
UARTConfigGetExpClk (USB_UART_BASE、SysCtlLowSpeedClockGet (SYSTEM_CLOCK_SPEED)、
&ui32Rate、&ui32Config);
writeusb32_t (&(psLineCoding->ui32Rate)、ui32Rate);
//
//将配置字长字段转换为预期格式
//通过主机。
//
开关(ui32Config 和 UART_CONFIG_WLEN_MASK)
{
案例 UART_CONFIG_WLEN_8:
{
psLineCode->ui8Databits = 8;
中断;
}
案例 UART_CONFIG_WLEN_7:
{
psLineCoding ->ui8Databits = 7;
中断;
}
案例 UART_CONFIG_WLEN_6:
{
psLineCoding ->ui8Databits = 6;
中断;
}
案例 UART_CONFIG_WLEN_5:
{
psLineCoding ->ui8Databits = 5;
中断;
}
}
//
//将配置奇偶校验字段转换为预期的格式
//通过主机。
//
开关(ui32Config 和 uart_config_PAR_MASK)
{
案例 UART_CONFIG_PAR_NONE:
{
psLineCoding->ui8Parity = USB_CDC_Parite_none;
中断;
}
案例 UART_CONFIG_PAR_ODD:
{
psLineCoding->ui8Parity = USB_CDC_page_odd;
中断;
}
案例 UART_CONFIG_PAR_EVEN:
{
psLineCoding->ui8Parity = USB_CDC_page_even;
中断;
}
}
//
//将配置停止位字段转换为预期的格式
//通过主机。
//
开关(ui32Config 和 uart_config_stop_mask)
{
案例 UART_CONFIG_STOP_ONE:
{
psLineCoding->ui8Stop = USB_CDC_STOP_BITS_1;
中断;
}
案例 UART_CONFIG_STOP_TWO:
{
psLineCoding->ui8Stop = USB_CDC_STOP_BITS_2;
中断;
}
}
}
//*****
//
//此函数设置或清除重定向 UART RX 上的中断条件
//行。 当调用函数且\ e bSend 设置为
//\b true 并持续,直到使用\e bSend Set 重新调用函数为止
//以\b 为假。
//
//*****
静态空
SendBreak (bool bSend)
{
//
// C28x SCI 无法发送中断条件
//
返回;
}
//*****
//
//处理与器件控制和设置相关的 CDC 驱动程序通知。
//
//\param pvCBData 是此通道由客户端提供的回调指针。
//\param ui32Event 标识我们收到通知的事件。
//\param ui32MsgValue 是特定于事件的值。
//\param pvMsgData 是特定于事件的指针。
//
//此函数由 CDC 驱动程序调用以执行与控制相关的
//代表 USB 主机执行操作。 这些功能包括设置
//以及查询串行通信参数,设置握手线
//状态和发送中断条件。
//
//返回的返回值是特定于事件的值。
//
//*****
//调用
uint32_t
ControlHandler (void * pvCBData、uint32_t ui32Event、
uint32_t ui32MsgValue、void * pvMsgData)
{
uint32_t ui32IntsOff;
//
//要求我们处理哪个事件?
//
开关(ui32Event)
{
//
//我们已连接到主机,现在可以进行通信。
//
案例 USB_EVENT_CONNECTED:
g_bUSBConfigured = true;
//
//清空缓冲区。
//
USBBufferFlush (&g_sTxBuffer);
USBBufferFlush (&g_sRxBuffer);
//
//指示主循环更新显示。
//
ui32IntsOff = IntMasterDisable ();
G_pcStatus ="connected";
G_ui32Flags |= COMMAND_STATUS_UPDATE;
if (!ui32IntsOff)
{
IntMasterEnable();
}
中断;
//
//主机已断开连接。
//
案例 USB_EVENT_DISCONNECTED:
g_bUSBConfigured = false;
ui32IntsOff = IntMasterDisable ();
G_pcStatus ="disconnected";
G_ui32Flags |= COMMAND_STATUS_UPDATE;
if (!ui32IntsOff)
{
IntMasterEnable();
}
中断;
//
//返回当前的串行通信参数。
//
案例 USBD_CDC_EVENT_GET_LINE_CODED:
GetLineCoding (pvMsgData);
中断;
//
//设置当前串行通信参数。
//
案例 USBD_CDC_EVENT_SET_LINE_CODED:
SetLineCoding (pvMsgData);
中断;
//
//设置当前串行通信参数。
//
案例 USBD_CDC_EVENT_SET_CONTROL_LINE_STATE:
SetControlLineState ((uint16_t) ui32MsgValue);
中断;
//
//在串行线上发送中断条件。
//
案例 USBD_CDC_EVENT_SEND_BREAK:
SendBreak (真);
中断;
//
//清除串行线上的中断条件。
//
案例 USBD_CDC_EVENT_CLEAR_BREAK:
SendBreak (假);
中断;
//
//暂时忽略挂起和恢复。
//
案例 USB_EVENT_SUSPEND:
案例 USB_EVENT_RESUME:
中断;
//
//我们不希望收到任何其他事件。 忽略任何显示的内容
//在版本编译中向上或在调试编译中挂起。
//
默认值:
#ifdef 调试
while (1);
#else
中断;
#endif
}
返回0;
}
//*****
//
//处理与传输通道相关的 CDC 驱动程序通知(向
// USB 主机)。
//
//\param pvCBData 是此通道由客户端提供的回调指针。
//\param ui32Event 标识我们收到通知的事件。
//\param ui32MsgValue 是特定于事件的值。
//\param pvMsgData 是特定于事件的指针。
//
// CDC 驱动程序调用此函数以将任何事件通知我们
//与传输数据通道(内通道承载
//发送数据到 USB 主机)。
//
//返回的返回值是特定于事件的值。
//
//*****
uint32_t
TxHandler (void * pvCBData、uint32_t ui32Event、uint32_t ui32MsgValue、
void *pvMsgData)
{
//
//我们发送了哪个事件?
//
开关(ui32Event)
{
案例 USB_EVENT_TX_COMPLETE:
//
//由于我们使用的是 USBBuffer,因此我们不需要执行任何操作
//此处。
//
TX_FLAG = 0;
GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1;
中断;
//
//我们不希望收到任何其他事件。 忽略任何显示的内容
//在版本编译中向上或在调试编译中挂起。
//
默认值:
#ifdef 调试
while (1);
#else
中断;
#endif
}
返回(0);
}
//*****
//
//处理与接收通道相关的 CDC 驱动程序通知(来自
// USB 主机)。
//
//\param pvCBData 是此通道由客户端提供的回调数据值。
//\param ui32Event 标识我们收到通知的事件。
//\param ui32MsgValue 是特定于事件的值。
//\param pvMsgData 是特定于事件的指针。
//
// CDC 驱动程序调用此函数以将任何事件通知我们
//与接收数据通道(输出通道承载
//来自 USB 主机的数据)。
//
//返回的返回值是特定于事件的值。
//
//*****
//呼叫
uint32_t
RxHandler (void * pvCBData、uint32_t ui32Event、uint32_t ui32MsgValue、
void *pvMsgData)
{
uint32_t ui32Count;
uint32_t ui32Read;
uint8_t ui8Char;
//
//我们要发送什么事件?
//
开关(ui32Event)
{
//
//接收到新的数据包。
//
案例 USB_EVENT_RX_AVAILABLE:
{
//
//将一些字符输入到 UART TX FIFO 中并启用
//中断,当有更多空间时,我们会被告知。
//
//如果我们正在发送中断条件,则不会收到任何
//更多数据。 我们将在中断关闭后恢复传输。
//
if (g_bSendingBreak)
{
返回(0);
}
//
//如果 UART FIFO 中有空间,请尝试读取一些字符
//从接收缓冲区再次将其填充。
//
while (UARTSpaceAvail (USB_uart_BASE))
{
//
//从缓冲区中获取一个字符。
//
ui32Read = USBBufferRead ((tUSBBuffer *)&g_sRxBuffer、&ui8Char、1);
//
//我们得到了一个字符吗?
//
if (ui32Read)
{
//
//更新通过 UART 传输的字节数。
//
USBRxBuffer [g_ui32UARTTxCount]= ui8Char;
G_ui32UARTTxCount++;
if (g_ui32UARTTxCount > 99)
G_ui32UARTTxCount=0;
}
否则
{
//
//我们将字符用完,因此退出该函数。
//
返回(0);
}
}
// USBUARTPrimeTransmit (USB_UART_BASE);
UARTIntEnable (USB_UART_BASE、UART_INT_TXRDY);//调用
// USBBufferDataWritten (&g_sTxBuffer、215);
中断;
}
//
//我们被问及我们还有多少未经处理的数据
//处理。 如果 UART 当前处于空闲状态、则返回0;如果 UART 处于空闲状态、
//在传输某物的过程中。 实际的
// UART FIFO 中的字节在这里并不重要,只是需要
//不是先前发送给我们的所有内容都已传输。
//
案例 USB_EVENT_DATA_REMAINING:
{
//
//获取缓冲区中的字节数,如果某些数据,则添加1
//仍需要清除发送器。
//
ui32Count = UARTBusy (USB_UART_BASE)? 1:0;
返回(ui32Count);
}
//
//我们需要提供一个缓冲区,以便将下一个数据包
//可以读取。 我们不支持这种数据接收模式、
//驱动程序通过返回0来知道。 CDC 驱动程序不应通过
//此消息仅用于说明和
//完整性。
//
案例 USB_EVENT_Request_BUFFER:
{
返回(0);
}
//
//我们不希望收到任何其他事件。 忽略任何显示的内容
//在版本编译中向上或在调试编译中挂起。
//
默认值:
#ifdef 调试
while (1);
#else
中断;
#endif
}
返回(0);
}
//*****
//
//这是主应用程序进入函数。
//
//*****
uint16_t tmr_inex= 0;
uint32_t datleight = 32;
__interrupt void cpu_timer0_isr (void)
{
/CpuTimer0.InterruptCount++;
//GpioDataRegs.GPBSET.bit.GPIO34 = 1;
DELAY_US (35);
tmr_inex++;
USBTxBuffer[8]= tmr_inex >> 8;
USBTxBuffer[9]= tmr_inex;
//if (TX_FLAG = 1)
USBBufferWrite (((tUSBBuffer *)&g_sTxBuffer、(uint8_t *)&USBTxBuffer[0]、peranum);
//GpioDataRegs.GPBCLEAR .BIT.GPIO34 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
内部
主函数(空)
{
uint32_t ui32RxCount;
Volatile uint32_t ui32Fullness;
InitSysCtrl();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
#ifdef _flash
//将时间关键代码和闪存设置代码复制到 RAM
//这包括以下函数: InitFlash();
// RamfuncsLoadStart、RamfuncsLoadSize 和 RamfuncsRunStart
//符号是由链接器创建的。 请参阅器件.cmd 文件。
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif
//
//将时钟设置为从50MHz 的 PLL 运行
//
SysCtlClockSet (SYSCTL_OSCSRC_XTAL | SYSCTL_PLL_ENABLE | SYSCTL_IMULT (20)|
SYSCTL_SYSDIV (2);
SysCtlAuxClockSet (SYSCTL_OSCSRC_XTAL | SYSCTL_PLL_ENABLE |
SYSCTL_IMULT (12)| SYSCTL_SYSDIV (4);
#ifdef _flash
//调用闪存初始化以设置闪存等待状态
//该函数必须驻留在 RAM 中
InitFlash();
#endif
//
//初始化中断控制器和矢量表
//
InitPieVectTable();
EALLOW;
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO31 = 1;
EDIS;
//
//初始未配置。
//
g_bUSBConfigured = false;
//
//配置 USB 操作所需的引脚。
//
USBGPIOEnable();
USBIntRegister (USB0_BASE、F28x_USB0DeviceIntHandler);
//
//启用我们将重定向的 UART。
//
SysCtlPeripheralEnable (USB_UART_Periph);
//
//针对 UART 模式配置 GPIO 引脚。
//
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;
GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;
EDIS;
//
// TODO:如果需要,请添加用于配置握手 GPIO 的代码。
//
//
//设置默认的 UART 配置。
//
/* UARTConfigSetExpClk (USB_UART_BASE、SysCtlLowSpeedClockGet (SYSTEM_CLOCK_SPEED)、
DEFAULT_BIT_RATE、DEFAULT_UART_CONFIG);
UARTFIFOIntLevelSet (USB_UART_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);*/
//
//配置并启用 UART 中断。
//
/* UARTIntClear (USB_UART_BASE、UARTIntStatus (USB_UART_BASE、FALSE);
UARTIntEnable (USB_UART_BASE、(UART_INT_RXERR | UART_INT_RXRDY_BRKDT |
UART_INT_TXRDY);*/
//
//启用系统刻度。
//
/* SysTickInit ();
SysTickPeriodSet (SysCtlClockGet (system_clock_speed)/ SYSTICKS_PER_second);
SysTickIntRegister (SysTickIntHandler);
SysTickIntEnable ();
SysTickEnable ();
*/
//
//初始化传输和接收缓冲区。
//
USBBufferInit (&g_sTxBuffer);
USBBufferInit (&g_sRxBuffer);
//
//将 USB 堆栈模式设置为设备模式并进行 VBUS 监控。
//
USBStackModeSet (0、eUSBModeForceDevice、0);
//
//将器件信息传递到 USB 库并放置器件
//在总线上。
//
USBDCDCInit (0、&g_sCDCDevice);
//
//清除我们的本地字节计数器。
//
ui32RxCount = 0;//
//现在启用中断,因为应用程序已准备好启动。
//
IntEnable (USB_UART_INT);
IntMasterEnable();
EALLOW;//需要执行此操作才能写入 EALLOW 保护的寄存器
PieVectTable.TIMER0_INT =&CPU_timer0_ISR;
InitCpuTimers ();
ConfigCpuTimer (&CpuTimer0200、50);
CpuTimer0Regs.tcr.all = 0x4001;
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
CpuTimer0Regs.tcr.bit.free = 1;
TSS = 0;
EDIS;
EINT;//启用全局_interrupt INTM
ERTM;
/ /
// DMA 初始化
/ /
//tUSBDMAInstance * psUSBDMAInst = USBLibDMAInit (USB0_BASE);
USBFIFOConfigSet (USB0_BASE、USB_EP_2、0x00000028、USB_FIFO_SZ_32_DB、USB_EP_DEV_IN);
//USBDevEndpointConfigSet (USB0_BASE、USB_EP_2、USB_FIFO_SZ_32_DB、USB_EP_SPEED_FULL);
// USBEndpointDMAConfigSet (USB0_BASE、USB_EP_1、USB_EP_AUTO_SET);
// USBEndpointDMAEnable (USB0_BASE、USB_EP_1、USB_EP_DEV_IN);
/ /
//
//主应用程序循环。
//
while (1)
{
/* if (g_ui32Flags 和 COMMAND_STATUS_UPDATE)
{
//
//清除命令标志
//
IntMasterDisable();
G_ui32Flags 并且=~COMMAND_STATUS_UPDATE;
IntMasterEnable();
}
//
//自上次检查以来是否有任何接收流量?
//
if (ui32RxCount!= g_ui32UARTRxCount)
//中频(1)
{
//
//快照最新的接收计数。
//
ui32RxCount = g_ui32UARTRxCount;
//
//更新 TX 缓冲区填满。 请记住、缓冲器
//相对于 USB 命名,而状态显示来自
// UART 的视角。 USB 的发送缓冲区是 UART 的
//接收缓冲器。
//
ui32Fullness =((USBBufferDataAvailable (&g_sTxBuffer)* 100)/
uart_Buffer_size);
}
*/
//
//自上次检查以来是否存在传输流量?
//
/*
如果(TX_FLAG =1)
{
//USBBufferDataWritten (&USBTxBuffer[0]、8);
//USBTxBuffer[8]= tmr_inex >> 8;
//USBTxBuffer[9]= tmr_inex;
TX_FLAG = 0;
USBBufferWrite (((tUSBBuffer *)&g_sTxBuffer、(uint8_t *)&USBTxBuffer[0]、peranum1);
// USBBufferDataWritten ((tUSBBuffer *)&g_sTxBuffer、peranum);
//USBEndpointDataPut (USB0_BASE、USB_EP_2、&USBTxBuffer[0]、USB_FIFO_SZ_256_DB);
//USBEndpointDataSend (USB0_BASE、USB_EP_2、USB_TRANS_OUT);
}*/
}
}
//
//文件结尾
//