⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 smartARM2400 USB device例程
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                            Guangzhou ZHIYUAN electronics Co.,LTD.
**                                      
**                                 http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:               main.c
** Latest modified Date:    2008-05-10
** Latest Version:          1.0
** Descriptions:            SmartARM2400 系列开发板 USB Device HID示例程序
**
**--------------------------------------------------------------------------------------------------------
** Created by:              Chenmingji
** Created date:            2004-09-16
** Version:                 1.0
** Descriptions:            The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:   			LingGuilin          
** Modified date:    		2008-05-10       
** Version:          		1.0       
** Descriptions:      		SmartARM2400 系列开发板 USB Device HID示例程序
**							1.将SmartARM2400开发板枚举为一个HID类设备(鼠标),通过电位器W2调节AD采样值,通过
**							  报告描述符反馈不同的X/Y轴位移变化量
**
*********************************************************************************************************/
#include "config.h"


#define USB_INT         22

INT8U	Last_X=0,Cur_X=0;											/*  X轴的上一次与当前的位置值		*/
INT8U	Last_Y=0,Cur_Y=0;											/*  Y轴的上一次与当前的位置值		*/

/*********************************************************************************************************
** Function name:		ADC_Init
** Descriptions:        初始化ADC,使用AD0.0通道
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
void ADC_Init(void)
{
	PCONP |= (1 << 12);													/*  打开ADC外设					*/
	
	PINSEL1 = (PINSEL1 & (~((unsigned)0x03 << 14)))|((unsigned)0x01 << 14);
																		/* 	P0.23选择AD0.0				*/
	AD0CR = (1 << 0)					   |// SEL=0x01,选择通道0
			((Fpclk / 1000000 - 1) << 8)   |// CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
			(0 << 16)					   |// BURST=0,软件控制转换操作
			(0 << 17)					   |// CLKS=0, 使用11clock转换
			(1 << 21)					   |// PDN=1,正常工作模式
			(1 << 24);		                // START=1,直接启动ADC转换
			
}

/*********************************************************************************************************
** Function name:		Get_ADCValue_X
** Descriptions:        获取ADC转换结果
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
INT32U Get_ADCValue_X(void)
{
	INT32U ADC_Data;
	INT32U i,adsum = 0;
	
	for (i = 0; i < 512; i++) {											/*  AD转换512次					*/
	
		AD0CR |= 1 << 24;												/*  进行第一次转换				*/
		while ((AD0STAT & (1 << 0)) == 0);								/*  等待第一通道AIN0转换结束	*/
		AD0CR |= 1 << 24;												/*  再次启动转换				*/
		while ((AD0STAT & (1 << 0)) == 0);								/*  等待第一通道AIN0转换结束	*/
		ADC_Data = (INT32U)ADDR0;										/*  读取ADC结果					*/
		ADC_Data = (ADC_Data >> 6) & 0x3ff;
		ADC_Data = ADC_Data * 2500;										/*  参考电压2.5V				*/
		ADC_Data = ADC_Data / 1024;										/*  10位AD转换,1024级			*/
		adsum += ADC_Data;												/*  累加ADC结果					*/
	}
		
	adsum = adsum >> 9;													/*  计算平均值					*/
	return adsum;														/*  返回AD结果					*/
	
}

/*********************************************************************************************************
** Function name:		Get_ADCValue_Y
** Descriptions:        获取ADC转换结果
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
INT32U Get_ADCValue_Y(void)
{
	return Get_ADCValue_X();											/*  返回采样结果				*/
}

/*********************************************************************************************************
** Function name:		main
** Descriptions:        主函数
** input parameters:    无					
** output parameters:	无						
** Returned value:      无
*********************************************************************************************************/
int main (void)
{
	uint8 ucErr = 0;

	ucErr = usbDevInit();												/*  初始化USB控制器 			*/
	if (ucErr != 0) {
		while(1);														/*  初始化失败,程序停止执行 	*/
	}
		
	ADC_Init();															/*  初始化LPC2400 ADC转换器		*/
	Last_X= (INT8U)Get_ADCValue_X();				   					/*  取得ADC的值					*/
	Last_Y = (INT8U)Get_ADCValue_Y();
														
	vicIrqFuncSet(USB_INT,3,(uint32)usbDevException);					/*  设置USB Device中断服务程序	*/

	IRQ_ENABLE();														/*  允许CPU的IRQ中断			*/
	
	
	while(1) {
	
		usbDevServe();													/*  处理USB事件 				*/
		
		if (bEPPflags.bits.configuration == 1) {
			
			if(bEPPflags.bits.hid_enumed == 1) {						/*  若HID类设备枚举成功 		*/
															
				IRQ_DISABLE();
				
				Cur_X = (INT8U)Get_ADCValue_X();						/*  取得ADC0.5的转换值			*/
				Cur_Y = (INT8U)Get_ADCValue_Y();						/*  取得ADC0.5的转换值			*/


				GenEpBuf[0] = 0x00;
				GenEpBuf[1] = (INT8U)(Cur_X-Last_X);					/*  X: 发送ADC0.0变化值			*/  
				GenEpBuf[2] = (INT8U)(Cur_Y-Last_Y);					/*  Y: 发送ADC0.0变化值			*/
				GenEpBuf[3] = 0x00;
							
				usbDevWriteEndpoint(3,GenEpBuf,4);						/*  通过逻辑端点1的IN端点		*/
																		/*  发送鼠标移动值到USB主机		*/
				IRQ_ENABLE();
				
				Last_X=Cur_X;											/*  保存 X Y 的当前位置值		*/
				Last_Y=Cur_Y;
			}
		
		}
	}
	
    return 0;
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -