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