?? main.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:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#define TaskStkLengh 512 //Define the Task0 stack length 定義用戶任務0的堆棧長度
OS_STK TaskStk0 [TaskStkLengh]; //Define the Task0 stack 定義用戶任務0的堆棧
OS_STK TaskStk1 [TaskStkLengh];
OS_EVENT * Mybox=NULL;
uint32 ADC_DATA1[200]={0};
uint32 ADC_DATA[200]={200,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; //存放轉換結果
uint32 ADC_DATA_AVG=3000; //存放平均值
uint32 COU=0; //下標
volatile uint32 count=0;
/******************ADC初始化********************************************/
void ADC_Init(void)
{
PINSEL1=PINSEL1&(~(3<<22))|(1<<22); //設置P0.27為AIN0
ADCR= (1<<0) |
((Fpclk/1000000-1)<<8) |
(0<<16) |
(0<<17) |
(1<<21) |
(0<<22) |
(1<<24) |
(0<<27);
}
/*******************************************************************************/
/*****************T1初始化******************************************************/
void T1_Init(void)
{
T1IR=0xFFFFFFFF; //清楚定時器的全部中斷標志
T1TC=0x00; //初始化T1
T1PR=0x00; //不分頻
T1MCR=0x03; //匹配的時候 產生中斷并且復位
T1MR0=Fpclk/5000; //定時時間為200us
T1TCR=0x01; //啟動定時器
}
/*******************************************************************************/
/*****************IRQ 初始化******************************************************/
void IRQ_init(void)
{
VICIntEnable=(1<<5); //使能定時器1
}
/*************中斷服務程序***********************************/
void Timer1_Exception(void)
{
static uint32 Temp;
//void *Temp1=(&Temp);
OS_ENTER_CRITICAL();
T1IR=0x01; //清除中斷標志
VICVectAddr=0; //通知中斷控制器中斷結束
/*******************采樣程序*******/
Temp=ADDR;
ADCR=(ADCR&0xFFFFFF00)|0x01|(1<<24); //切換通道,并且進行轉換
while((ADDR&0x80000000)==0);
ADCR=ADCR|(1<<24);
while((ADDR&0x80000000)==0);
Temp=ADDR;
Temp=(Temp>>6)&0x3FF;
Temp=3300*Temp;
Temp=Temp>>10;
/**********************************/
OS_EXIT_CRITICAL();
ADC_DATA1[count]=Temp;
// OSMboxPost(Mybox,(void *)Temp); //向郵箱之中發送消息
OSMboxPost(Mybox,(void *)&Temp);
}
/*************計算平均值程序***********************************/
void AVG_CAL(uint32 *Data)
{
uint32 i;
uint32 Begin=0; //循環的初始值
uint32 AVG[4]={0}; //存放計算平均值的中間結果
for(i=0;i<4;i++)
{
Begin=i*50;
for(COU=Begin;COU<(Begin+50);COU++)
AVG[i]=ADC_DATA[COU]+AVG[i];
}
ADC_DATA_AVG=AVG[0]+AVG[1]+AVG[2]+AVG[3];
ADC_DATA_AVG=ADC_DATA_AVG/200;
}
/*********************************************************************************************************
** Task1 任務1
高速采樣任務
**********************************************************/
void Task1(void *pdata)
{
INT8U err=0;
//uint32 * DATA_P=NULL;
pdata=pdata;
count=0;
Mybox=OSMboxCreate((void*)0); //創建一個信郵箱
ADC_Init(); //ADC初始化
IRQ_init(); //IRQ初始化
T1_Init(); //初始化T1
for(count=0;count<200;count++)
{
// ADC_DATA[count]=(uint32)(uint32*)(OSMboxPend(Mybox,0,&err)); //郵箱返回的是一個指針
ADC_DATA[count]=*(uint32*)(OSMboxPend(Mybox,0,&err));
//OSTimeDlyHMSM(0,0,0,4);
}
VICIntEnClr=1<<5; //禁止T1的中斷
ZLG7290ShowChar(7,0x0F); //采樣完成顯示“F”
OSMboxDel(Mybox,OS_DEL_ALWAYS,&err); //刪除郵箱
OSTaskDel(OS_PRIO_SELF); //刪除任務
}
/*********************************************************************************************************
** Task0 任務0
鍵盤任務
********************************************************************************************************/
void Task0 (void *pdata)
{
uint32 KEY=0;
uint32 KEY0=0;
uint32 i=0;
pdata = pdata;
TargetInit ();
while (1)
{
OSTimeDly(10);
KEY0=ZLG7290GetKey();
OSTimeDly(6);
KEY=ZLG7290GetKey();
if((KEY==0)||(KEY>16)||(KEY!=KEY0))
{
OSTimeDly(4);
continue;
}
switch(KEY)
{
case 11: //創建采樣任務
{
OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 2);//高速采樣任務
break;
}
case 12: //顯示采樣平均值
{
AVG_CAL(ADC_DATA); //計算平均值
ZLG7290ShowChar(3,ADC_DATA_AVG/1000);
ZLG7290ShowChar(2,(ADC_DATA_AVG%1000)/100);
ZLG7290ShowChar(1,(ADC_DATA_AVG%100)/10);
ZLG7290ShowChar(0,ADC_DATA_AVG%10);
break;
}
case 13: //顯示全部數據
{
if(COU>199)
COU=0;
else
COU++;
ZLG7290ShowChar(7,ADC_DATA[COU]/1000);
ZLG7290ShowChar(6,(ADC_DATA[COU]%1000)/100);
ZLG7290ShowChar(5,(ADC_DATA[COU]%100)/10);
ZLG7290ShowChar(4,ADC_DATA[COU]%10);
break;
}
case 14: //清屏
{
for(i=0;i<8;i++)
ZLG7290ShowChar(i,0x1F);
break;
}
default:
break;
}
}
}
/*********************************************************************************************************
** Main Function
********************************************************************************************************/
int main (void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk0[TaskStkLengh - 1], 4);
OSStart ();
return 0;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -