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

📄 main.c

📁 SmartARM2400系列开发板全套资料
💻 C
字号:
/****************************************Copyright (c)****************************************************
**                         Guangzhou ZHIYUAN electronics Co.,LTD.                               
**                                     
**                               http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**--------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "main.h"

#define TaskAdcSend_ID            17      		                        /* 任务的ID                     */
#define TaskAdcSend_PRIO          TaskAdcSend_ID		                /* 任务的优先级                 */
#define TaskAdcSend_STACK_SIZE    1024     		                        /* 定义用户堆栈长度             */
   
OS_STK  TaskAdcSend_STACK[TaskAdcSend_STACK_SIZE];

OS_EVENT  *AdcMBox;

void TaskAdcSend(void *pdata);


/********************************************************************************************************
** Function name: ADC_Exception
** Descriptions:  ADC中断服务程序
** Input:         无
** Output:        无 
*********************************************************************************************************/    
void ADC_Exception(void)
{
    static uint32 AdcData;                                              /* 用静态局部变量保存消息       */
    
	AdcData = ADDR0;						                            /* 读取AD通道0结果,            */
	                                                                    /* 清除中断标志位               */
	AdcData = (AdcData >> 6) & 0x3ff;
	AdcData = AdcData * 2500;				                            /* 参考电压由精密恒压源提供2.5V */
	AdcData = AdcData / 1024;
    
    OSMboxPost(AdcMBox,(void *)&AdcData);
    
    VICVectAddr = 0;                                                    /* 通知中断控制器中断结         */
}

/********************************************************************************************************
** Function name: Timer1_Exception
** Descriptions:  GPIO管脚P0.6出发的外部中断的中断服务程序
** Input:         无
** Output:        无 
*********************************************************************************************************/    
void Timer1_Exception(void)
{
    T1IR = 0x01;                                                        /* 清除定时器1中断              */
    
    AD0CR |= (1 << 24);                                                 /* 启动AD转换                   */
    
    VICVectAddr = 0;                                                    /* 通知中断控制器中断结束       */
}

/*********************************************************************************************************
** Function name: Timer1Init
** Descriptions:  初始化定时器1的设置
** Input:         无
** Output:        无 
**********************************************************************************************************/    
void Timer1Init(void)
{
    T1CTCR = 0x00;                                                      /* 定时模式                     */
    T1TCR = 0x02;					                                    /* 复位定时器1                  */
    T1IR = 0xffffffff;		                                            /* 清除中断标志                 */
    T1TC = 0;                                                           /* 计数器初值设置为0            */
    T1MCR = 0x03;					                                    /* 匹配时候复位并产生中断       */
    T1MR0 = (Fpclk / 5000);                                             /* 定时时间为200us              */
}

    
/*********************************************************************************************************
** Function name : main
** Descriptions  : 主函数
** Input         : 无 
** Output        : 无 
** Created Date  : 2006-04-11
********************************************************************************************************/
int main (void)
{
    OSInit(); 
	OSTaskCreateExt(TaskAdcSend,
                    (void *)0,
                    &TaskAdcSend_STACK[TaskAdcSend_STACK_SIZE-1],
                    TaskAdcSend_PRIO,
                    TaskAdcSend_ID,
                    &TaskAdcSend_STACK[0],
                    TaskAdcSend_STACK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
                              
    OSStart();                                       
}
		

/*******************************************************************************************************
** Function name: Task_AdcSend
** Descriptions:  无
** Input:         无
** Output:        无 
********************************************************************************************************/
void TaskAdcSend	(void *pdata)
{
	uint8 err;
	uint32 ADC_Data,i;
	char str[100];
	uint16 Samp[200];
	pdata = pdata;
	TargetInit();    
	 
    AdcMBox = OSMboxCreate((void *)0); 

	Timer1Init();	                                                    /* 初始化定时器1                */
	SetVICIRQ(5,1,(uint32)Timer1_Exception);                            /* 定时器1中断设置              */
							
    
    

	PCONP |=1 <<12;								                        /* 打开ADC的功率控制位          */
   	/*
   	 *  ADC初始化
   	 */
	PINSEL1 = (PINSEL1&0xffff3fff)|(0x01<<14);		                    /* 设置P0.23为AIN0[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,正常工作模式           */
			(0 << 24);		                                            /* 先不启动ADC                  */
			
	AD0INTEN = 1 << 0;                                                  /* 使能AD通道0转换结束后产生中断*/			
	
	OSTimeDly(OS_TICKS_PER_SEC/100);
	ADC_Data = ADDR0;	                	                            /* 读取ADC结果,并清除DONE标志位*/
	
	SetVICIRQ(18,2,(uint32)ADC_Exception);                              /* ADC中断设置                  */

	
	while(1)	
	{	 
	    
        sprintf(str, "ADC采样200次,每隔200us采样一次,现在开始第一次转换\r\n");
		UART0_SendStr(str);
		
        T1TCR = 0x01;                                                   /* 启动定时器1                  */
	    for(i=0; i < 200; i++){
        
		    Samp[i] = *(uint16 *)OSMboxPend(AdcMBox,200,&err);	        /* 等待邮箱,邮箱有效时获取并且 */
		                                                                /* 保存转换结果,超时等待为1秒钟*/
		    if( *(&err) == OS_TIMEOUT)
	            goto TimeOut;
		}
        T1TCR = 0x00;                                                   /* 关闭定时器1                  */
        
		
		sprintf(str, "采样的200次AD转换的电压为:\r\n");
		UART0_SendStr(str);
		for(i = 0; i < 200; i++){
		    sprintf(str, "%4d mV \r\n", Samp[i]);
		    UART0_SendStr(str);
        }
        goto AdcOK;
		
		TimeOut:
		sprintf(str, "转换超时,ADC存在问题\r\n");
		UART0_SendStr(str);

        AdcOK:
        sprintf(str, "等待3秒...\r\n");
		UART0_SendStr(str);
		
        
		
        OSTimeDlyHMSM(0,0,3,0);
	}
}


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

⌨️ 快捷键说明

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