⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 20080130.txt

📁 这是基于arm的嵌入式操作系统基础性实验SPI实验
💻 TXT
字号:

#include "config.h"
#include "stdlib.h"
#include "spi.h"

uint8 const ShowTable[11] = {
      0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x00};
#define   HC595_CS       0x00000080                /* P0.8口为74HC595的片选 */
#define	TaskStkLengh	64		                 //Define the Task stack length 定义用户任务的堆栈长度

#define          TASK_START_PRIO    10                /* Application tasks priorities                  */
#define          TASK_1_PRIO        2
#define          TASK_2_PRIO        3
#define          TASK_3_PRIO        4

OS_STK           TaskStartStk[TaskStkLengh];         /* Startup    task stack                         */                        
OS_STK           Task1Stk[TaskStkLengh];             /* Task #1    task stack                         */
OS_STK           Task2Stk[TaskStkLengh];             /* Task #2    task stack                         */
OS_STK           Task3Stk[TaskStkLengh]; 


OS_EVENT        *AckMbox;                            /* Message mailboxes for Tasks #1 and #2         */
OS_EVENT        *TxMbox1;
OS_EVENT        *TxMboxSPI;
OS_EVENT        *AckMboxSPI;
OS_EVENT        *MainSem;                            //用于整个程序的信号量

void    TaskStart(void *pdata);                     //Function prototypes of tasks
void 	Task1(void *pdata);			                //Task1 任务1
void 	Task2(void *pdata);			                //Task2 任务2
void 	Task3(void *pdata);	

const uint32 LED1 = (1 << 18);	                    // P1.18控制LED1,高电平点亮
const uint32 LED2 = (1 << 17);	                    // P1.17控制LED2,高电平点亮 
INT8U txmsgSPI=0;

#if 0
void DelayNS (uint32 dly)
{
	uint32 i;
	
	for ( ; dly>0; dly--)
		for (i=0; i<50000; i++);
}
#endif

int main (void)
{
	PINSEL2 = PINSEL2 & (~0x08);                  // P1.18连接GPIO
	IO1DIR  = LED1|LED2;				          // 设置LED1LED2控制口为输出 
	IO1CLR  = LED1|LED2;                          // 关LED1LED2 	 
	SPIInit(0x30);
	
	OSInit ();
    
    AckMbox = OSMboxCreate((void *)0);                     /* Create 2 message mailboxes               */
    AckMboxSPI = OSMboxCreate((void *)0);
    TxMbox1  = OSMboxCreate((void *)0);
    TxMboxSPI = OSMboxCreate((void *)0);
    MainSem = OSSemCreate(1); 																								
	
	OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], TASK_1_PRIO);	  
    OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], TASK_2_PRIO);		
	OSTaskCreate (Task3,(void *)0, &Task3Stk[TaskStkLengh - 1], TASK_3_PRIO);
	OSStart ();
	return 0;															
}
/*********************************************************************************************************
**                            Task     任务
********************************************************************************************************/
#if 0 
void  TaskStart (void *pdata)
{
    pdata = pdata;
    TargetInit ();
    OSStatInit();
    AckMbox = OSMboxCreate((void *)0);                     /* Create 2 message mailboxes               */
    AckMboxSPI = OSMboxCreate((void *)0);
    TxMbox1  = OSMboxCreate((void *)0);
    TxMboxSPI = OSMboxCreate((void *)0);
    MainSem = OSSemCreate(1); 
    OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], TASK_1_PRIO);//创建两个任务
    OSTaskCreate (Task2,(void *)0, &Task2Stk[TaskStkLengh - 1], TASK_2_PRIO);
    OSTaskCreate (Task3,(void *)0, &Task3Stk[TaskStkLengh - 1], TASK_3_PRIO);
}
#endif


void Task1	(void *pdata)
{
	char   *rxmsg;
	INT8U  err;
	char   txmsg=1; 
	pdata = pdata;
	TargetInit ();
    OSStatInit();
	while (1)
	{
		IO1SET = LED1;			              // LED1点亮
		OSTimeDlyHMSM(0, 0, 0, 100 ); 
		IO1CLR = LED1;			              // LED1熄灭
		OSTimeDlyHMSM(0, 0, 0, 100 ); 
		IO1SET = LED1;			              // LED1点亮
		OSTimeDlyHMSM(0, 0, 0, 100 ); 
		IO1CLR = LED1;			              // LED1熄灭
		OSTimeDlyHMSM(0, 0, 0, 100 ); 
		OSMboxPost(TxMbox1, (void *)&txmsg);       /* Send message to Task #2*/                                  
        rxmsg = (char *)OSMboxPend(AckMboxSPI, 0, &err);        /* Wait for acknowledgement from Task #2              */
   	    
	}
}

void Task2	(void *pdata)
{

    char   *rxmsg;
    
    INT8U  err;
    pdata = pdata;
	while (1)
	{
        OSSemPend(MainSem, 0, &err);
        rxmsg = (char *)OSMboxPend(TxMbox1, 0, &err);              /* Wait for message from Task #1 */

        IO1SET=((*rxmsg)<<17);                                    //控制P0.0~P0.7 
        txmsgSPI++;

        //OSMboxPost(AckMbox, (void *)1);
        OSMboxPost(TxMboxSPI, (void *)&txmsgSPI);
        
        OSTimeDlyHMSM(0, 0, 0, 500);                                    /* Wait 10 milsecond                 */
        IO1CLR=LED2;
        OSSemPost(MainSem);
    }
}


void Task3	(void *pdata)
{
  uint8 temp;
  INT8U  err;
  char   *rxmsgSPI;
  pdata = pdata;                                                  /* 避免编译警告 */

    //SPIInit(0x30);                                                   /* 目标板初始化 */
    PINSEL0 = (PINSEL0 & 0xffff00ff) | 0x1500;
    IO0DIR = HC595_CS;
    
    while (1)
    {
            OSSemPend(MainSem, 0, &err);
            OSMboxPost(AckMboxSPI, (void *)1);
            
            rxmsgSPI = (char *)OSMboxPend(TxMboxSPI, 0, &err);

            SPIStart();
            IO0CLR = HC595_CS;
            SPIRW(&temp, ~ShowTable[*rxmsgSPI]);
            IO0SET = HC595_CS;
            SPIEnd();

            OSTimeDlyHMSM(0, 0, 0, 300 );          /* Wait 1 second  */            
            OSSemPost(MainSem);
    }
}  
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -