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

📄 main.c

📁 周立功 《μCOS-II微小内核分析与程序设计-基于LPC2300》配套例程源码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.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:         Zhangmingjie
** Modified date:       2007-10-27
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "main.h"

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

OS_EVENT  *Sem1;

void TaskAdcSend(void *pdata);

extern void Uart0IniDft(void);
extern void Uart0SendStr( char *str);


/*******************************************************************************************
** Function name: Timer1_Exception
** Descriptions:  GPIO管脚P0.6出发的外部中断的中断服务程序
** Input:         无
** Output:        无 
*******************************************************************************************/    
void Timer1_Exception(void)
{
    T1IR = 0x01;                // 清除定时器中断标志 
                  
    OSSemPost(Sem1);            // 发送信号量,使信号量有效
    
    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 / 1000);          // 定时时间为1ms 
}

    
/*********************************************************************************************************
** 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[20];
    uint16 Samp[200];	
	pdata = pdata;
	TargetInit();     
    
	SetVICIRQ(5,1,(uint32)Timer1_Exception);    // 定时器1中断设置   
	Timer1Init();								// 初始化定时器1 
    
    Sem1 = OSSemCreate(0); 
    
    Uart0IniDft();								// 串口0初始化为8位数据位,1位停止位,无奇偶校验
    
	PCONP |=1 <<12;								// 必须打开ADC的功率控制位ADC才可以正常工作
	
	//进行ADC模块设置
	PINSEL3 = ((unsigned)0x03) << 30;		 // 设置P1.31为AIN5功能
	AD0CR = (1 << 5)|	                     //SEL=0x20,选择通道5
			((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转换
							
	OSTimeDly(OS_TICKS_PER_SEC/100);
	ADC_Data = ADDR5;	                	// 读取ADC结果,并清除DONE标志位

	
	while(1)	
	{	 
	    
        sprintf(str, "开始了一次采样,每隔1ms采样一次\r\n");
		Uart0SendStr(str);
		
        T1TCR = 0x01;                           // 启动定时器1 
	    for(i=0; i<200; i++){
		     OSSemPend(Sem1,0,&err);			// 等待信号量		
			 AD0CR |= 1 << 24;					// 进行第一次转换
			 while ((AD0STAT & (1<<5)) == 0);	// 等待第五通道AIN5转换结束
			 AD0CR |= 1 << 24;					// 再次启动转换
			 while ((AD0STAT & (1<<5)) == 0);	// 等待第五通道AIN5转换结束
			 ADC_Data = ADDR5;					// 读取ADC结果
			 ADC_Data = (ADC_Data >> 6) & 0x3ff;
			 ADC_Data = ADC_Data * 2500;		// 参考电压由精密恒压源提供的2.5V
			 ADC_Data = ADC_Data / 1024;
			 
			 Samp[i] = ADC_Data;
		}
        T1TCR = 0x00;                           // 关闭定时器1 
        
		sprintf(str, "采样的200次AD转换的电压为:\r\n"); // 发送采集到了数据回PC
		Uart0SendStr(str);
		for(i = 0; i < 200; i++){
		    sprintf(str, "%4d mV \r\n", Samp[i]);
		    Uart0SendStr(str);
        }
        
        sprintf(str, "等待3秒...\r\n");  
		Uart0SendStr(str);
        OSTimeDlyHMSM(0,0,3,0);                 // 延时等待3秒
	}
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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