在线时间2 小时
UID3297961
注册时间2016-9-8
NXP金币0
该用户从未签到
新手上路
- 积分
- 39
- 最后登录
- 2016-12-30
|
自己在nxp系列的小成就,使用库函数写代码
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2009-05-12
** Last Version: V1.01
** Descriptions: The main() function example template
**
**--------------------------------------------------------------------------------------------------------
** Created by: Chengmingji
** Created date: 2009-07-24
** Version: V1.00
** Descriptions: 添加用户应用程序
** 特殊说明:有关NVIC中断设置函数,core_cm3.h里面的NVIC设置函数不可直接使用,因为
** 本uC/OS任务中为用户级特权,无权限修改NVIC寄存器,必须调用IRQ.H的NVIC设置函数。
**
**--------------------------------------------------------------------------------------------------------
** Modified by: LiuWeiyun
** Modified date: 2009-07-27
** Version: V1.01
** Descriptions: 编写USB_OTG例程
**
** Rechecked by: WangJianyu
*********************************************************************************************************/
#include "LPC177x_8x.h" /* LPC177x_8x外设寄存器 */
#include "includes.h"
#include "uart.h"
#include "..\ZLG.FS\FSConfig.h"
#include "..\ZLG.USBOTG\OTG\OTGincludes.h"
#include <stdio.h>
/*********************************************************************************************************
变量与宏定义
*********************************************************************************************************/
#define BEEP (1 << 30) /* 蜂鸣器 */
#define BEEP_INIT() LPC_GPIO3->DIR |= BEEP /* 配置P3.30为输出 */
#define BEEP_ON() LPC_GPIO3->CLR |= BEEP /* 蜂鸣器开 */
#define BEEP_OFF() LPC_GPIO3->SET |= BEEP /* 蜂鸣器关 */
#define FILE_SIZE 1024 /* 文件大小 */
#define STR_SEND(s) uart0SendStr(s) /* 发送(打印)字符串 */
/*********************************************************************************************************
按键定义
P2.11和外部中断1(OTG ATX中断)输入复用,故该IO口不能再用作按键输入
请使用杜邦线将按键2(上移按键)连接到SmartCortex M3-1700的P2.1
*********************************************************************************************************/
#define KEY_LEFT (LPC_GPIO0->PIN & (1 << 10) ? 1 : 0) /* 左移键,P0.10 */
#define KEY_RIGHT (LPC_GPIO0->PIN & (1 << 12) ? 1 : 0) /* 右移键,P0.12 */
#define KEY_PRESSED 0
#define KEY_RELEASED 1
/*********************************************************************************************************
定义全局变量
*********************************************************************************************************/
static OS_STK stkMainTask[256];
static OS_STK GstkFileTask[512];
static OS_STK GstkOTGBServeTask[512];
static INT8U Gu8FDataWr[FILE_SIZE];
static INT8U Gu8FDataRd[FILE_SIZE];
static INT8U Gu8FData[] = "USB OTG---Designed by ZLGMCU\r\n"; /* 文件内容 */
static INT8U Gu8PreX = 0, Gu8CurX = 0; /* X轴的上一次与当前的位置值 */
/*********************************************************************************************************
** Function name: keyServe
** Descriptions: 按键处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void keyServe (void)
{
if (KEY_PRESSED == KEY_LEFT) {
Gu8CurX--;
}
else if (KEY_PRESSED == KEY_RIGHT) {
Gu8CurX++;
}
}
/*********************************************************************************************************
** Function name: usbDevHIDServe
** Descriptions: HID鼠标处理
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void usbDevHIDServe (void)
{
UINT8 pEpBuf[EP1_PACKET_SIZE]; /* 逻辑端点1接收缓冲区 */
if(bEPPflags.bits.hid_enumed == 1) { /* 若HID类设备枚举成功 */
USB_ENTER_CRITICAL_SECTION();
pEpBuf[0] = 0x00;
pEpBuf[1] = (INT8U)(Gu8CurX - Gu8PreX); /* X: 发送x变化值 */
pEpBuf[2] = 0; /* Y: 发送y变化值 */
pEpBuf[3] = 0x00;
usbDevWriteEndpoint(3, pEpBuf, 4); /* 通过逻辑端点1的IN端点 */
/* 发送鼠标移动值到USB主机 */
USB_EXIT_CRITICAL_SECTION();
Gu8PreX = Gu8CurX; /* 保存X、Y的当前位置值 */
}
}
/*********************************************************************************************************
** Function name: otgTestInit
** Descriptions: OTG Test初始化
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void otgTestInit (void)
{
INT8U ucErr;
UARTInit(2, 115200);
STR_SEND("Here comes the OTG TEST\r\n");
// OS_NVIC_SetPriority(EINT1_IRQn, 12);
// OS_NVIC_EnableIRQ(EINT1_IRQn);
ucErr = otgInit(5, 6, 7);
if (ucErr != TRUE) {
STR_SEND("\r\nOTG init fail\r\n");
while (1);
}
NVIC_SetPriority(USB_IRQn, 11);
NVIC_EnableIRQ(USB_IRQn);
}
/*********************************************************************************************************
** Function name: otgBServe
** Descriptions: OTG role B serve
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void otgBServe (void)
{
while (!otgIsDeviceReady()) { /* 等待枚举完设备 */
OSTimeDly(10);
}
while (OTG_ROLE_DEVICE == otgGetCurRole()) {
keyServe();
usbDevHIDServe();
OSTimeDly(OS_TICKS_PER_SEC / 100);
}
}
/*********************************************************************************************************
** Function name: otgAServe
** Descriptions: OTG role A serve
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void otgAServe (void)
{
char pcFileAttr[] = "RW";
char pcFileName[] = "A:\\OTG.TXT";
HANDLE FHandle;
INT32U j, uiLen;
INT8U ucErr;
OSTaskCreate(OSFileTask, (void *)0, &GstkFileTask[511], 8);
OSTimeDly(10);
while (1) {
j = 0;
while (!otgIsDeviceReady()) { /* 等待枚举完设备 */
OSTimeDly(10);
if (j++ > 200) {
j = 0;
STR_SEND("\r\nwait device ready...\r\n");
}
}
while (otgGetCurRole() != OTG_ROLE_HOST) { /* 等待当前角色为主机 */
OSTimeDly(10);
}
OSAddFileDriver(usbCammand); /* 增加ATA设备0 */
for (j = 0; j < FILE_SIZE; j++) {
Gu8FDataWr[j] = Gu8FData[j % (sizeof(Gu8FData) - 1)];
}
OSRemoveFile(pcFileName); /* 删除已存在的同名文件 */
FHandle = OSFileOpen(pcFileName, pcFileAttr); /* 打开文件 */
if (FHandle == Not_Open_FILE) {
STR_SEND("\r\n\tOSFileOpen failed!\r\n");
}
#if 0
OSFileSeek(FHandle, 0, SEEK_SET); /* 文件指针移到文件开始 */
#endif
uiLen = OSFileWrite(Gu8FDataWr, sizeof(Gu8FDataWr), FHandle);
/* 写入文件 */
OSFileClose(FHandle);
if (uiLen > 0) {
OSAllCacheWriteBack();
}
if (uiLen >= sizeof(Gu8FDataWr)) { /* 写文件成功 */
STR_SEND("\r\nWritefile sucess!");
} else {
STR_SEND("\r\nWrite file failed!\r\n");
}
FHandle = OSFileOpen(pcFileName, "R"); /* 打开文件 */
if (FHandle == Not_Open_FILE) {
STR_SEND("\r\n\tOSFileOpen failed!\r\n");
}
OSFileSeek(FHandle, 0, SEEK_SET); /* 文件指针移到文件头部 */
memset(Gu8FDataRd, 0, sizeof(Gu8FDataRd));
uiLen = OSFileRead(Gu8FDataRd, sizeof(Gu8FDataRd), FHandle);
/* 读出文件 */
OSFileClose(FHandle);
if (uiLen >= sizeof(Gu8FDataRd)) { /* 读文件成功 */
STR_SEND("\r\nReadfile sucess");
} else {
STR_SEND("\r\nRead file failed!\r\n");
}
if (memcmp(Gu8FDataRd, Gu8FDataWr, FILE_SIZE)) {
STR_SEND("\r\nVerify file failed!\r\n");
} else {
STR_SEND("\r\nVerify file sucessed!\r\n");
}
OSTimeDly(100);
OSRemoveFileDriver(0); /* 移除设备 */
OSTimeDly(5);
STR_SEND("\r\n请拔出USB设备!\r\n");
while (otgIsDeviceReady()) {
OSTimeDly(OS_TICKS_PER_SEC / 50);
}
if (otgGetDeviceAB() == OTG_DEVICE_A) { /* 当前设备为A设备 */
otgHNPStart(); /* 启动HNP,切换主从机角色 */
} else {
ucErr = otgRetControlToA(); /* 否则为B设备,归还总线控制权 */
if (ucErr == TRUE) {
BEEP_ON();
OSTimeDly(OS_TICKS_PER_SEC / 2);
BEEP_OFF();
}
}
}
}
/*********************************************************************************************************
** Function name: otgBServeTask
** Descriptions: otgBServe任务
** input parameters: pvData: 没有使用
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void otgBServeTask (void *pvData)
{
pvData = pvData;
while (1) {
otgBServe();
OSTimeDly(OS_TICKS_PER_SEC / 4);
}
}
/*********************************************************************************************************
** Function name: mainTask
** Descriptions: 主任务
** input parameters: pvData: 没有使用
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void mainTask (void *pvData)
{
pvData = pvData;
BEEP_INIT();
BEEP_OFF();
otgTestInit();
OSTaskCreate(otgBServeTask,
(void *)0,
&GstkOTGBServeTask[sizeof(GstkOTGBServeTask) / sizeof(OS_STK) - 1],
9);
while (1) {
otgAServe();
OSTimeDly(OS_TICKS_PER_SEC / 4);
}
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 用户程序入口函数
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main (void)
{
SystemInit(); /* 系统初始化 */
OSInit();
OSTaskCreate(mainTask, (void *)0, &stkMainTask[sizeof(stkMainTask) / 4 - 1], 4);
OSStart();
}
/*********************************************************************************************************
End Of File
*********************************************************************************************************/
|
|