📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
**
** http://www.zlgmcu.com
**
** 文 件 名: Main.c
** 最后修改日期: 2004年7月2日
** 描 述: PDIUSBD12 设备端驱动程序 演示程序
** 版 本: V1.0
**********************************************************************************************************/
#include "config.h" //包含LPC22xx模板的配置头文件
#include "D12Driver.h" //包含PDIUSBD12驱动程序的头文件
OS_STK TaskStartStk[128]; //操作系统起动任务堆栈
OS_STK TaskRec1Stk[400]; //任务1堆栈(400个字)
OS_STK TaskRec2Stk[400]; //任务2堆栈(400个字)
OS_EVENT *TaskRec1_Sem; //任务1就绪信号量
OS_EVENT *TaskRec2_Sem; //任务2就绪信号量
void TaskStart(void *pdata);
void TaskRec1(void *pdata);
void TaskRec2(void *pdata);
extern void Usb_Handler(void);
/************************************************************
** 函数名称: void Init_D12Int(void)
** 功能描述: 初始化D12的中断,设置D12的中服务程序地址
** 输 入: 无
** 输 出: 无
************************************************************/
void Init_D12Int(void)
{
VICVectCntl1 = (0x20 | 0x0E); //EINT0通道分配到IRQ slot 1
VICVectAddr1 = (INT32U)Usb_Handler; //设置EINT0向量地址
VICIntEnable = 1 << 14; //允许EINT0
}
/**********************************
主函数
***********************************/
int main (void)
{
OSInit(); //初始化 uC/OS-II
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[127], 1);
//创建起动任务
OSStart(); //开始多任务
}
/**********************************
* 起动任务,优先级 3
***********************************/
void TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT8U Cmd,err;
pdata = pdata; /* Prevent compiler warning */
IO0SET = LED;
TargetInit(); //LPC2200开发板初始化
err = Init_D12(); //PDIUSBD12初始化
Init_D12Int(); //配置PDIUSBD12的中断
IO0CLR = LED;
OSTimeDly(OS_TICKS_PER_SEC);
TaskRec1_Sem = OSSemCreate(0); //创建两个信号量,信号量初值为0
TaskRec2_Sem = OSSemCreate(0);
if (err == 0) //如果初始化PDIUSBD12成功,才创建控制传输处理任务
OSTaskCreate(TaskSetup,(void *)0, &TaskSetupStk[127], 0);
else IO0SET = LED;
OSTaskCreate(TaskRec1,(void *)0, &TaskRec1Stk[399], 3); //创建任务1和任务2
OSTaskCreate(TaskRec2,(void *)0, &TaskRec2Stk[399], 4);
for (;;){
err = ReadPort1(1,&Cmd,200); //等待来自PC机的命令
if (err == OS_NO_ERR){ //接收正确
if (Cmd == 0x01)
OSSemPost(TaskRec1_Sem); //使任务1就绪
else
OSSemPost(TaskRec2_Sem); //使任务2就绪
}
}
}
#define RW_NUMS 1024 //任务1和任务2收发数据字节数
/********* 任务 1 ***********/
void TaskRec1(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT8U Buff[RW_NUMS]; //接收及发送缓冲区
INT8U ack = 0x01; //应答主机数值
INT8U err; //函数返回值
pdata = pdata; /* Prevent compiler warning */
for (;;){
OSSemPend(TaskRec1_Sem,0,&err); //等待TaskStart的命令
err = WritePort1(1,&ack,200); //应答USB主机
if (err == USB_NO_ERR){ //应答正确
err = ReadPort2(RW_NUMS,Buff,200); //接收数据
OSTimeDly(1); //延时一个时钟周期
if (err == USB_NO_ERR){ //接收正确
Buff[0] = OSPrioCur; //标识该任务
err = WritePort2(RW_NUMS,Buff,200); //发送数据
}
}
}
}
/********* 任务 2 ***********/
void TaskRec2(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT8U Buff[RW_NUMS]; //接收及发送缓冲区
INT8U ack = 0x02; //应答主机数值
INT8U err; //函数返回值
pdata = pdata; /* Prevent compiler warning */
for (;;){
OSSemPend(TaskRec2_Sem,0,&err); //等待TaskStart的命令
err = WritePort1(1,&ack,200); //应答USB主机
if (err == USB_NO_ERR){ //应答正确
err = ReadPort2(RW_NUMS,Buff,200); //接收数据
if (err == OS_NO_ERR){ //接收正确
Buff[0] = 0x02; //标识该任务
err = WritePort2(RW_NUMS,Buff,200); //发送数据
}
}
}
}
/*
配套书中的D12 PACK原理图有错,正确原理图请见光盘文件的说明: 关于对D12PACK硬件的修改.pdf
AD0 -- P3.0
CS_USB-- P3.25
RD -- P1.1
WR -- P3.27
RST_USB- P0.10
SUSP -- P0.13
D0-D7 -- P2.0-P2.7
VBUS -- P0.15
INT_USB- P0.16
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -