📄 main.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 + -