📄 main.c
字号:
} else {
OSSemPost(Sem); /* 发送信号量 */
while ((IO0PIN & Key1) == 0) { /* 等待按键释放 */
OSTimeDly(1); /* 延时1个clk */
}
}
}
}
/**********************************************************************************************************
** Function name: TaskSamp
** Descriptions: 采样任务,对电压数据进行采集
** input parameters: 无
** output parameters: 无
** Returned value: 无
**********************************************************************************************************/
void TaskSamp (void *pdata)
{
INT8U i,err;
INT32U *pt;
INT32U Temp[10] = {0};
INT32U TempAll = 0;
INT32U TempAve = 0;
pdata = pdata;
Q = OSQCreate(MsgQTbl,Qlength); /* 创建消息队列,长度为10 */
PartitionPt = OSMemCreate(Partition,10,4,&err); /* 创建内存分区,保存信息 */
/*
* ADC初始化
*/
PCONP |= 1<<12; /* 使能ADC模块的功率控制位 */
PINSEL3 |= ((unsigned)0x03)<<30; /* 设置P1.31为AIN5功能 */
AD0CR = (1<<5) | /* SEL = 0X20,选择通道5 */
((Fpclk/1000000 - 1)<<8)| /* CLKDIV= Fpclk/1000000-1,转 */
/* 换时钟为1MHz */
(1<<16) | /* BURST = 1,硬件控制转换操作 */
(0<<17) | /* CLKS = 0,使用11clock转换 */
(1<<21) | /* PDN = 1,正常工作模式 */
(0<<24) | /* START = 0,硬件控制转换 */
(0<<27);
while (1) {
OSSemPend(Sem,0,&err); /* 等待信号量 */
OS_ENTER_CRITICAL(); /* 进入临界区 */
SampNum++; /* 采样次数累加 */
OS_EXIT_CRITICAL(); /* 退出临界区 */
if (SampNum <= Qlength) { /* 消息队列未满 */
TempAll = 0; /* 采样值累计和清零 */
for (i = 0;i < 10;i++) {
while((AD0STAT & (1<<5)) == 0); /* 等待AIN5转换结束 */
Temp[i] = ADDR5;
Temp[i] = (Temp[i] >> 6) & 0x3ff;
Temp[i] *= 2500; /* 参考电压由精密恒压源提供2.5V */
Temp[i] /= 1024;
TempAll += Temp[i];
}
TempAve = TempAll / 10; /* 取采样平均值 */
pt = OSMemGet(PartitionPt,&err); /* 申请一个内存块 */
*pt = TempAve; /* 对内存区赋值 */
OSQPost(Q,(void *)pt); /* 发送消息到消息队列中 */
}
OSTimeDly(OS_TICKS_PER_SEC/10); /* 延时0.1S */
}
}
/**********************************************************************************************************
** Function name: TaskDisp
** Descriptions: 显示任务,把通过AD采样得到的数据送到PC机上显示
** input parameters: 无
** output parameters: 无
** Returned value: 无
**********************************************************************************************************/
void TaskDisp (void *pdata)
{
INT8U i,err;
char str[50] = {0}; /* 存储送显示数据的数组 */
INT32U *tp;
static uint32 SampNumTemp = 0;
pdata = pdata;
sprintf(str,"系统启动......\r\n");
UART0_SendStr(str); /* 系统启动提示信息 */
while (1) {
sprintf(str,"延时2s ......\r\n");
UART0_SendStr(str); /* 每2S显示一次 */
OSTimeDly(OS_TICKS_PER_SEC*2); /* 延时2S */
OS_ENTER_CRITICAL(); /* 进入临界区 */
SampNumTemp = SampNum; /* 获得采样次数 */
SampNum = 0; /* 累加采样次数清零 */
OS_EXIT_CRITICAL(); /* 退出临界区 */
if (SampNumTemp == 0) { /* 没有采样 */
sprintf(str,"在这2s中,没有发生采样.\r\n\r\n");
UART0_SendStr(str); /* 显示无采样提示信息 */
} else if (SampNumTemp <= Qlength) {
sprintf(str,"在这2s中,共发生了%d次采样.\r\n",SampNumTemp);
UART0_SendStr(str); /* 显示采样次数提示信息 */
} else {
sprintf(str,"发生错误,队列溢出!\r\n");
UART0_SendStr(str); /* 显示消息队列满提示信息 */
SampNumTemp = Qlength; /* 有效的结果个数与队列长度一致 */
sprintf(str,"有效的%d个采样结果为:\r\n",SampNumTemp);
UART0_SendStr(str); /* 显示有效采样值信息 */
}
for (i = 1;i <= SampNumTemp;i++) {
tp = (INT32U *)OSQPend(Q,0,&err); /* 获得消息队列中的消息指针 */
sprintf(str,"第%d次ADC采样结果为 %d mv \r\n",i,*tp); /* 把送显示数据发送到数组中 */
UART0_SendStr(str); /* 通过UART发送到上位机 */
OSMemPut(PartitionPt,tp); /* 释放内存块 */
if (i == SampNumTemp) {
sprintf(str,"\r\n");
UART0_SendStr(str); /* 显示最后一条信息后空一行 */
}
}
}
}
/**********************************************************************************************************
END FILE
**********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -