📄 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: 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 + -