USB Device实验程序解析_c程序设计实验四解析

2020-02-29 其他范文 下载本文

USB Device实验程序解析由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c程序设计实验四解析”。

// USB device实验程序解析

//头文件

#include #include #include #include “inc/hw_ints.h” #include “inc/hw_memmap.h” #include “inc/hw_types.h” #include “driverlib/debug.h” #include “driverlib/fpu.h” #include “driverlib/gpio.h” #include “driverlib/interrupt.h” #include “driverlib/sysctl.h” #include “driverlib/systick.h” #include “driverlib/timer.h” #include “driverlib/uart.h” #include “driverlib/rom.h” #include “grlib/grlib.h” #include “usblib/usblib.h” #include “usblib/usb-ids.h” #include “usblib/device/usbdevice.h” #include “usblib/device/usbdbulk.h” #include “utils/uartstdio.h” #include “utils/ustdlib.h” #include “drivers/cfal96x64x16.h” #include “usb_bulk_structs.h” // 系统节拍定时systick宏定义

// SYSTICKS_PER_SECOND 每秒中断次数 #define SYSTICKS_PER_SECOND 100 #define SYSTICK_PERIOD_MS(1000 / SYSTICKS_PER_SECOND)// 全局systick计数

volatile ui32 g_ulSysTickCount = 0;//全局变量记录发送和接收字节数 volatile ui32 g_ulTxCount = 0;volatile ui32 g_ulRxCount = 0;#ifdef DEBUG ui32 g_ulUARTRxErrors = 0;#endif // 与debug相关的定义和声明

// 如果在编译时定义了DEBUG那么通过UART0进行Debug的输出 #ifdef DEBUG //将所有Debug打印请求映射到UARTprintf输出 #define DEBUG_PRINT UARTprintf #else // 编译所有的Debug打印请求

#define DEBUG_PRINT while(0)((int(*)(char *,...))0)#endif // 图形上下文(context)用于OLED屏幕显示 tContext g_sContext;// 宏定义标志,用于在中断时向主程序发送命令.#define COMMAND_PACKET_RECEIVED 0x00000001 #define COMMAND_STATUS_UPDATE

0x00000002 volatile ui32 g_ulFlags = 0;char *g_pcStatus;// 全局标志显示USB设置是否完成 static volatile bool g_bUSBConfigured = false;// 错误处理 #ifdef DEBUG void __error__(char *pcFilename, ui32 ulLine){

UARTprintf(“Error at line %d of %sn”, ulLine, pcFilename);

while(1)

{

} } #endif // systick中断处理 void SysTickIntHandler(void){

// 更新tick计数

g_ulSysTickCount++;}

//函数static ui32 // 功能:device接收数据并返回给主机。

// 当从主机数据发送就绪后,该程序被调用,逐个字节读取数据,并且翻转 //大小写,最后回传给主机

// 变量 psDevice 指向要处理的设备数据实例 // 变量 pcData 指向USB接收缓冲去新接收到的数据 // 变量ulNumBytes 是程序要处理的字节数。// 返回:处理的数据字节数 static ui32 EchoNewDataToHost(tUSBDBulkDevice *psDevice, ui8 *pcData,ui32 ulNumBytes){

ui32 ulLoop, ulSpace, ulCount;

ui32 ulReadIndex;

ui32 ulWriteIndex;

tUSBRingBufObject sTxRing;

// 获取当前缓冲区信息以允许设备能直接写入发送缓冲区。

//(变量中已经有足够信息与接收缓冲区直接连接)

USBBufferInfoGet(&g_sTxBuffer, &sTxRing);

// 获取发送缓冲区的剩余空间

ulSpace = USBBufferSpaceAvailable(&g_sTxBuffer);

// 判断此次可以处理的字节数

ulLoop =(ulSpace

ulCount = ulLoop;

// 更新接收字节数

g_ulRxCount += ulNumBytes;

// 显示Debug信息

DEBUG_PRINT(“Received %d bytesn”, ulNumBytes);

// 与USB缓冲区连接启动字节处理

ulReadIndex =(ui32)(pcData'a')+ 'A';

}

else

{

// 判断是否是大写字母

if((g_pucUSBRxBuffer[ulReadIndex] >= 'A')&&

(g_pucUSBRxBuffer[ulReadIndex]

{ // 转换为小写字母,写到发送缓冲区中

g_pucUSBTxBuffer[ulWriteIndex] =

(g_pucUSBRxBuffer[ulReadIndex]1;

sRect.i16YMax = 9;

GrContextForegroundSet(&g_sContext, ClrDarkBlue);

GrRectFill(&g_sContext, &sRect);

// OLED屏幕背景为白色文本

GrContextForegroundSet(&g_sContext, ClrWhite);

// 屏幕中间显示应用名称“usb-dev-bulk”

GrContextFontSet(&g_sContext, g_psFontFixed6x8);

GrStringDrawCentered(&g_sContext, “usb-dev-bulk”,-1,|

GrContextDpyWidthGet(&g_sContext)/ 2, 4, 0);

// 显示当前的发送字节数、接收字节数

GrStringDraw(&g_sContext, “Tx bytes:”,-1, 0, 32, false);

GrStringDraw(&g_sContext, “Rx bytes:”,-1, 0, 42, false);

// 将GPIO外围设备设置为GPIO功能,并且配置USB引脚

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOL);

ROM_GPIOPinTypeUSBAnalog(GPIO_PORTB_BASE, GPIO_PIN_0 GPIO_PIN_1);

ROM_GPIOPinTypeUSBAnalog(GPIO_PORTL_BASE, GPIO_PIN_6 GPIO_PIN_7);

// 使能系统节拍中断(system tick)

ROM_SysTickPeriodSet(ROM_SysCtlClockGet()SYSTICKS_PER_SECOND);

ROM_SysTickIntEnable();

ROM_SysTickEnable();

// 显示应用程序名称和UART输出

DEBUG_PRINT(“nStellaris USB bulk device examplen”);

DEBUG_PRINT(“--nn”);

// 显示当前USB设备运行状况

DisplayStatus(&g_sContext, “Configuring USB”);

// 初始化USB发送和接收缓冲区

USBBufferInit((tUSBBuffer *)&g_sTxBuffer);

USBBufferInit((tUSBBuffer *)&g_sRxBuffer);

// USB设备初始化

// 将USB设备信息发送给主机USB库并且将设备连接在总线上

USBDBulkInit(0,(tUSBDBulkDevice *)&g_sBulkDevice);

// 等待初始化设置完成DisplayStatus(&g_sContext, “Waiting for host”);

// 清除发送、接收字节数

ulRxCount = 0;

| | /

ulTxCount = 0;

// 主程序循环

while(1)

{ // 判断是否请求更新显示状态

if(g_ulFlags & COMMAND_STATUS_UPDATE)

{

// 清除命令标志

g_ulFlags &= ~COMMAND_STATUS_UPDATE;

DisplayStatus(&g_sContext, g_pcStatus);

}

// 判断是否有发送错误

if(ulTxCount!= g_ulTxCount)

{ // 更新最后的发送字节数

ulTxCount = g_ulTxCount;

// 通过UART更新显示

usnprintf(pcBuffer, 16, “ %d ”, ulTxCount);

GrStringDraw(&g_sContext, pcBuffer,-1, 48, 32, true);

}

// 判断是否有接收错误

if(ulRxCount!= g_ulRxCount)

{ // 更新最后的接收字节数

ulRxCount = g_ulRxCount;

// 通过UART更新显示

usnprintf(pcBuffer, 16, “ %d ”, ulRxCount);

GrStringDraw(&g_sContext, pcBuffer,-1, 48, 42, true);

}

} }

《USB Device实验程序解析.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
USB Device实验程序解析
点击下载文档
相关专题 c程序设计实验四解析 程序 USB Device c程序设计实验四解析 程序 USB Device
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文