📄 transplant_5_tasks_with_arm7.txt
字号:
#i nclude "config.h"
#i nclude "stdlib.h"
#define LED1 (1 << 18) // P1.18控制LED1
#define LED2 (1 << 19) // P1.19控制LED2
#define LED3 (1 << 20) // P1.20控制LED3
#define LED4 (1 << 21) // P1.21控制LED4
#define LED5 (1 << 22) // P1.22控制LED5
#define LED6 (1 << 23) // P1.22控制LED5
#define key1 (1<<16)///按键管脚定义
#define key2 (1<<17)///按键管脚定义
#define TASK_STK_SIZE 32////堆栈指针的长度
OS_STK TaskSTK0[TASK_STK_SIZE];
OS_STK TaskSTK1[TASK_STK_SIZE];
OS_STK TaskSTK2[TASK_STK_SIZE];
OS_STK TaskSTK3[TASK_STK_SIZE];
OS_STK TaskSTK4[TASK_STK_SIZE];
OS_STK TaskSTK5[TASK_STK_SIZE];
OS_EVENT *Uart0ReviceMbox;////邮箱指针
OS_EVENT *Uart1ReviceMbox;
OS_EVENT *Uart2ReviceMbox;
OS_EVENT *DispSem;//////信号量的定义
void Task0(void *pdata);//建立各个任务。将串口0对应邮箱的数据发送到串口0
void Task1(void *pdata);//串口0接收函数,将接收数据送到邮箱1
void Task2(void *pdata);//按键检测,将固定数据送到邮箱1
void Task3(void *pdata);//按键检测,将固定数据直接发送到串口1
void Task4(void *pdata);//串口1接收函数,将接收的数据直接发送到串口1
void Task5(void *pdata);//SPI总线,控制数码管显示固定的数据0-9
uint8 const ShowTable[11] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00};
// 0 1 2 3 4 5 6 7 8 9
/*********************************************************************************************************
** 函数名称: PC_DispChar1
** 功能描述: 从UART0将缓冲区的数据发送出去。共发送5字节数据。
********************************************************************************************************/
void PC_DispChar1(uint8 *cp)
{
OS_ENTER_CRITICAL();
UART0Putch(0xfE);
UART0Putch(*cp++);
UART0Putch(*cp++);
UART0Putch(*cp++);
UART0Putch(*cp++);
OS_EXIT_CRITICAL();
}
/****************************************************************************************
按键检测程序
功能描述: 检测按键,为按键检测后加系统OS延时函数 切换任务
*****************************************************************************************/
void key(void)
{
while((IO0PIN&key1)!=0) OSTimeDly(OS_TICKS_PER_SEC / 5);
OSTimeDly(OS_TICKS_PER_SEC / 10);/////
}
/****************************************************************************************
按键检测程序
功能描述: 检测按键,为按键检测后加系统OS延时函数 帮助任务切换
*****************************************************************************************/
void k2()
{
while((IO0PIN&key2)!=0) OSTimeDly(OS_TICKS_PER_SEC / 5);
OSTimeDly(OS_TICKS_PER_SEC / 10);
}
/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: PC_DispClrScr,OSInit,OSTaskCreate,OSStart
********************************************************************************************************/
int main (void)
{ OSInit();
OSTaskCreate(Task0, (void *)0, &TaskSTK0[TASK_STK_SIZE - 1], 0);
OSStart();
return 0;
}
/*********************************************************************************************************
** 函数名称: Task0
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
等待邮箱中的消息,有可用消息的时候,将邮箱内的消息指向的数组通过串口0发送出去.
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
********************************************************************************************************/
void Task0(void *pdata)
{ uint8 *cp,err;
PINSEL1 = PINSEL1 & (~(0x03 << 4)); // P1.18选择GPIO
IO1DIR |= LED1; // 设置LED1控制口输出
IO1SET=LED1;
pdata = pdata; /* 避免编译警告 */
Uart0ReviceMbox = OSMboxCreate(NULL); // 建立邮箱0 /
Uart1ReviceMbox = OSMboxCreate(NULL); // 建立邮箱1
Uart2ReviceMbox = OSMboxCreate(NULL); // 建立邮箱2
if( (Uart2ReviceMbox) == NULL)
{
while (1);
}
OSTaskCreate(Task1, (void *)0, &TaskSTK1[TASK_STK_SIZE - 1], 5);//任务1:接收串口0的数据
//OSTaskCreate(Task2, (void *)0, &TaskSTK2[TASK_STK_SIZE - 1], 6);//任务2:按键检发送消息到邮箱
OSTaskCreate(Task2, (void *)0, &TaskSTK2[TASK_STK_SIZE - 1], 6);//任务1:接收串口0的数据
OSTaskCreate(Task3, (void *)0, &TaskSTK3[TASK_STK_SIZE - 1], 7);//任务3:串口1发送检测按键
OSTaskCreate(Task4, (void *)0, &TaskSTK4[TASK_STK_SIZE - 1], 8);//任务4:串口1接收数据
OSTaskCreate(Task5, (void *)0, &TaskSTK5[TASK_STK_SIZE - 1], 9);//任务4:串口1接收数据
Uart0ReviceMbox = OSMboxCreate(NULL); // 建立邮箱0 /
for (;;)
{
cp = (uint8 *)OSMboxPend(Uart2ReviceMbox, 0, &err); ///等待邮箱信息的发送
IO1CLR=LED1;
OSTimeDly(OS_TICKS_PER_SEC/15 );
IO1SET=LED1;
OSTimeDly(OS_TICKS_PER_SEC/2 );
UART0Write(cp,6);///将消息邮箱中的数据发送到串行口0
}
}
/*********************************************************************************************************
** 函数名称: Task1
** 功能描述: 串口0接收函数,接受到数据后LED3闪烁,并且将收到的数据发送消息到邮箱
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
********************************************************************************************************/
void Task1(void *pdata)
{
uint8 *cp;
uint8 Buf[]={"你好我朋友"};
uint8 temp, i;
pdata = pdata;
TargetInit();
PINSEL1 = PINSEL1 & (~(0x03 << 8)); // P1.18选择GPIO
IO1DIR |= LED3; // 设置LED1控制口输出
IO1SET = LED3;
for (;;)
{
while (UART0Getch() == 0x30) /* 接收数据头 */
{
//UART0Getch();
*cp=0x30;
Buf[0]=0x30;
for (i = 1; i < 10; i++)
{
IO1CLR=LED3;
OSTimeDly(OS_TICKS_PER_SEC/4 );
IO1SET=LED3;
OSTimeDly(OS_TICKS_PER_SEC / 4);
temp = UART0Getch();////接收数据
Buf[i] = temp;
}
OSMboxPost(Uart0ReviceMbox, (void *)Buf);////发送消息
//////接受到数据后马上发送出去
// PC_DispChar1(Buf);///
}
OSTimeDly(OS_TICKS_PER_SEC/20 );
}
}
/*********************************************************************************************************
** 函数名称: Task2
** 功能描述: 按键检测发送函数,检测按键,LED2闪烁,并且将固定数据内的数据发送消息到邮箱.
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
********************************************************************************************************/
void Task2(void *pdata)
{
uint8 BUF[]={"中国人民"};
pdata = pdata;
PINSEL1 = PINSEL1 & (~(0x03 << 6)); // P1.18选择GPIO
IO1DIR |= LED2; // 设置LED1控制口输出
IO1CLR = LED2;
OSTimeDly(OS_TICKS_PER_SEC/2 );
IO1SET = LED2;
OSTimeDly(OS_TICKS_PER_SEC/2);
for(;;)
{ key();
IO1CLR = LED2;
OSTimeDly(OS_TICKS_PER_SEC/2 );
IO1SET = LED2;
OSTimeDly(OS_TICKS_PER_SEC/2);
// UART0Write(BUF,8); //串口1发送数据
OSMboxPost(Uart0ReviceMbox, (void *)BUF);
}
}
/*********************************************************************************************************
** 函数名称: Task3
** 功能描述: 检测按键K2,检测按键后串口1发送数据,暂时不发送邮箱消息
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
********************************************************************************************************/
void Task3(void *pdata)
{ uint8 BUF[]={"你好哈"};////需要发送的内容
uint8 err,*cp;
pdata = pdata;
PINSEL1 = PINSEL1 & (~(0x03 << 10)); // P1.18选择GPIO
IO1DIR |= LED4; // 设置LED1控制口输出
IO1CLR = LED4;
OSTimeDly(OS_TICKS_PER_SEC / 4);
IO1SET = LED4;
for(;;)
{ //k2();
cp=(uint8 *)OSMboxPend(Uart0ReviceMbox, 0, &err);
IO1CLR = LED4;
OSTimeDly(OS_TICKS_PER_SEC / 4);
IO1SET = LED4;
OSTimeDly(OS_TICKS_PER_SEC / 4);
UART0Write(BUF,6); //串口1发送数据
// OSMboxPost(Uart0ReviceMbox, (void *)BUF);////发送消息到串口1使用的邮箱
}
}
/*********************************************************************************************************
** 函数名称: Task4
** 功能描述: 串口1循环检测接收到数据后,驱动LED5闪烁,暂时不发送消息
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
********************************************************************************************************/
void Task4(void *pdata)
{ uint8 *cp;
uint8 Buf[]={"你好吗"};
uint8 temp, i;
PINSEL1 = PINSEL1 & (~(0x03 << 12)); // P1.18选择GPIO
IO1DIR |= LED5; // 设置LED1控制口输出
IO1CLR = LED5;
OSTimeDly(OS_TICKS_PER_SEC /4 );
IO1SET = LED5;
pdata = pdata;
for (;;)
{ cp = Buf;
while (UART1Getch() == 0x30)///等待接收数据头0X30
{ Buf[0]=0x30;
for (i = 1; i < 10; i++)////////循环接收发来的数据
{ IO1CLR=LED5;
OSTimeDly(OS_TICKS_PER_SEC /4 );
IO1SET=LED5;
OSTimeDly(OS_TICKS_PER_SEC / 4);
temp = UART1Getch();////接收数据
Buf[i] = temp;
}
OSTimeDly(OS_TICKS_PER_SEC /2);
UART1Write(Buf,10);//将收到的数据再发送出去
//OSMboxPost(Uart1ReviceMbox, (void *)Buf);////发送消息
}
OSTimeDly(OS_TICKS_PER_SEC / 20);
}
}
/***************************************************************************************
** 函数名称: Task5
** 功能描述: SPI函数 发送函数通过SPI接口控制数码管的显示
具体功能:设置定时器的初值,当定时器时间到,就刷新数码管的显示
AD转换。将AD转换的值,通过处理送到数码管上显示需要"参考电压"开发板上设置2.480V
*****************************************************************************************/
void Task5(void *pdata)
{
uint32 ADCDATA;
uint8 buf[5], DataBuf[11];
uint8 temp,i;
pdata = pdata; // 避免编译警告
IO0DIR = HC595_CS;
PINSEL1 = PINSEL1 & (~(0x03 << 14)); // P1.18选择GPIO
PINSEL1 = (PINSEL1&(~(0x03<<28)))|(0x01<<28);//选择AD0.3
IO1DIR |= LED6; // 设置LED1控制口输出
IO1CLR = LED6;
OSTimeDly(OS_TICKS_PER_SEC /4 );
IO1SET = LED6;
T1PR=0;
T1MR0=Fpclk/2;
T1MCR = 0x03; // 禁止比较功能
T1CCR = 0x00; // 禁止捕获功能
T1TCR = 0x01; // 启动定时器
AD0CR= (1<<3)|
((Fpclk/1000000-1)<<8)|
(0<<16)|
(0<<17)|
(1<<21)|
(0<<22)|
(1<<24)|
(0<<27);
ADCDATA=AD0DR;
for (;;)
{
for (i = 0; i < 10; i++)
{
AD0CR|=1<<24;
while((AD0DR&0X80000000)==0);
AD0CR|=1<<24;
while((AD0DR&0X80000000)==0);
OSTimeDly(OS_TICKS_PER_SEC /50);
ADCDATA=AD0DR;
ADCDATA=(ADCDATA>>6)&0X3FF;//调整结果保留结果位
buf[4]=0XFF;
buf[3]=(ADCDATA%10);
buf[2]=(ADCDATA/10%10);
buf[1]=(ADCDATA/100%10);
//buf[0]=(ADCDATA/1000%10);
UART0Write(buf,5);
OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
SPIStart();
IO0CLR = HC595_CS;
SPIRW(&temp,~ShowTable[buf[1]]);
IO0SET = HC595_CS;
SPIEnd();
while((T1IR&0X01)==0);
T1IR=0X01;
if((IO1SET&LED6)==0) IO1SET=LED6;
else IO1CLR=LED6;
}
for (i = 0; i < 10; i++)
{
DataBuf[i] = 10-i;
}
DataBuf[0] = 0; // 扩展地址
//I2cWrite(CAT1025, DataBuf, 11);//
OSTimeDly(OS_TICKS_PER_SEC / 100 + 1);
for (i = 0; i < 10; i++)
{
DataBuf[i] = i;
}
I2cRead(CAT1025, DataBuf, DataBuf, 1, 11);
//UART1Write(DataBuf,10);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -