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

📄 ex5.c

📁 ucos在2407A上的移植
💻 C
字号:
/*******************************************************************************
* Module    :   main.c
*
* Purpose   :   First bit of 'C' code that executes after startup (see boot.asm).
;				Starts up the operating system, uC/OS.
*
* Language  :   'c'
*
* Written   :   Kirby W. Cartwright, The Vanner Power Group, 06/29/98
*
* Modified  :
*
* Project   :   Vanner Power Group Modular Controller Project PX-02.
*
* Copyright :   (C) copyright 1998 by Vanner, Inc.  All Rights Reserved.
*
* Notes     :
*
* Unit Tested:
*
*******************************************************************************/

#define	LEDS	0x000C					/* LEDs Register	
#include <ioports.h>
#include <time.h>    */
#include "includes.h"
#include   "f2407_c.h"
#define LOOP_CNT       1   /* 1-n, or -1 = forever */

//  屏蔽中断子程序        
unsigned int test1_exec;  /* you need one for each test,!=0=run, 0=no */
unsigned int test2_exec;
unsigned int test3_exec;
unsigned int test4_exec;
unsigned int test5_exec;
unsigned int test6_exec;
unsigned int test7_exec;


unsigned int error_code;     /* ms byte = main test #, ls byte = error code */
unsigned int halt_on_error;
unsigned int print_on_error;
unsigned int led_error_code;
unsigned int print_header;

OS_EVENT *pevent0;


extern void KickDog(void);

OS_STK Task0[OS_TASK_IDLE_STK_SIZE];
//OS_STK Task1[OS_TASK_IDLE_STK_SIZE];
///OS_STK Task2[OS_TASK_IDLE_STK_SIZE];
//OS_STK Task4[OS_TASK_IDLE_STK_SIZE];
OS_STK Task5[OS_TASK_IDLE_STK_SIZE];

void LEDTask0(void *); 
//void LEDTask1(void *);
//void LEDTask2(void *);
//void CAPTask4(void *);
void ADCTask5(void *);
/*******************************************************************************
*
* Routine	:   main
*
* Purpose   : 	Initialize further hardware, start multitasking.
*
* Inputs    :   None (void).
*
* Globals	:	None.
*
* Outputs (Returns):
*				None (void).
*
* Note(s)	:
*
*******************************************************************************/
void main(void)
	{
	int i;
	extern void ConfigureWatchDog(void);
    ConfigureWatchDog();
	OSInit();
	*PEDATDIR=*PEDATDIR&0x0fff0;
	OSTaskCreate(LEDTask0,(void *)&i,(void *)&Task0[OS_TASK_IDLE_STK_SIZE], 10);       
    //OSTaskCreate(LEDTask1,(void *)&i,(void *)&Task1[OS_TASK_IDLE_STK_SIZE], 20);
    //OSTaskCreate(LEDTask2,(void *)&i,(void *)&Task2[OS_TASK_IDLE_STK_SIZE], 30);
    //pevent0=OSSemCreate(0);
    //pevent0->OSEventGrp		|=OSMapTbl[prio >> 3];
    OSTaskCreate(ADCTask5,(void *)&i,(void *)&Task5[OS_TASK_IDLE_STK_SIZE], 14);
    OSStart();                                             /* Start multitasking */
	}

/*******************************************************************************
*
* Routine	:   void abort(void)
*
* Purpose   : 	Satisfy a link requirement.
*
* Inputs    :   None (void).
*
* Globals	:	None.
*
* Outputs (Returns):
*				None (void).
*
* Note(s)	:   Should never get here.  Should add code to annunciate if we
*				ever do.
*
*******************************************************************************/
/*void abort(void)
	{
    while (1);
    }*/
/*******************************************************************************
*
* Routine	:   void interrupt DefaultISR(void)
*
* Purpose   : 	Supply a default ISR for unused vectors.
*
* Inputs    :   None (void).
*
* Globals	:	None.
*
* Outputs (Returns):
*				None (void).
*
* Note(s)	:   Should add code to annunciate if we ever get here.
*
*******************************************************************************/
void interrupt DefaultISR(void)
	{
    }
/*******************************************************************************
*
* Task		:   void TimeOfDayTask(void *j);
*
* Purpose   : 	Time of day task.
*
* Inputs    :   Pointer to context?  Pointer to time/date structure.
*
* Globals	:	None.
*
* Outputs (Returns):
*				None (void).  Should never return.
*
* Note(s)	:   Should add code to go update global time and date structures.
*				Y2K compliant.
*				Should add code to initialize from hardware RTC on power-up.
*				The actual interrupt rate is 15625/256=61.03515625 Hz.
*
*******************************************************************************/
#define MS_TIME_LOOP   0x500



unsigned int wait_ms( volatile unsigned int delay_val )
{
    unsigned int i;
/*    unsigned int ms_ctr;  */
    int ms_ctr;
    for ( i = 0; i < delay_val; i++ )
    {
	ms_ctr = MS_TIME_LOOP;

	while ( ms_ctr )
	{
	    ms_ctr--;
	}
    }

    return( delay_val );
}
/******************************************************************************/
volatile unsigned int configdata;

void set_wait(void);
void set_wait(void)
{

  configdata =	IOWSB1+DSWSB1+PSWSB1; 	 /* 2 waits for off chip I/O */
  OUTMAC( _WSGR, configdata);
}

void set_system(void)
{
  unsigned int SCSR1_Data;

	
  SCSR1_Data = *SCSR1;

  SCSR1_Data |= (ADC_CLKEN | SCI_CLKEN | SPI_CLKEN | CAN_CLKEN | EVB_CLKEN | EVA_CLKEN);

  
  *SCSR1 = SCSR1_Data;
	
}

void test_init(void)
{
  test1_exec = TEST1;  /* data space ram test,run test if !=0, no if 0 */
  test2_exec = TEST2;  /* code space ram test,run test if !=0, no if 0 */
  test3_exec = TEST3;  /* onchip uart test,run test if !=0, no if 0 */
  test4_exec = TEST4;  /* dac test, run test if !=0, no if 0 */
  test5_exec = TEST5;  /* led test, run test if !=0, no if 0 */
  test6_exec = TEST6;  /* ti led test, run test if !=0, no if 0 */
  test7_exec = TEST7;  /* ti switch, run test if !=0, no if 0 */

  error_code = 0;               /* show no error */
  halt_on_error = 1;            /* stop if error occurred */
  print_on_error = 0;           /* do not print error info to uart */
  led_error_code = 0;           /* don't put on leds */
  print_header = 0;             /* do not print header info to uart */

  set_wait();                   /* set up wait states for I/O */

  set_system();

  set_pll();


}

//void error_process(unsigned int);
void error_process(unsigned int bad_code)
{
  error_code = bad_code;          /* put in global location */
  if (print_on_error)             /* print msg to uart ? */
  {
  }
  if (led_error_code)             /* put error code on leds ? */
  {
  }
}


/******************************************************************/


void LEDTask0(void *j)
	{
	 int loop_var,i;
     unsigned int error_state, test_num;
     INT8U *err;
     test_init();                           /* init variables & hardware */
     for (i=1 ; i<=4 ; i++)
       {
        ti_led_off(i);
       }    
   // volatile INT8U LEDTick=0;
   	   asm("        LDP	#0E8H");    //指向定时器T1的定时器控制器T1CON(7404H)
       asm("        LACC	4");
       asm("        OR		#040H");   //使能定时器T1
       asm("        SACL	4");
   	 for(;;)
     {  
      //if (test5_exec)
        //{
                                  /* end of error */
       //}                                  /* end of test6_exec != 0 */
		led_setup();
		led_ds5((unsigned int) 0x0001);    /* all leds on */
    	led_ds6((unsigned int) 0x0001);

    	wait_ms( 50 );

    	led_ds5((unsigned int) 0x0000);   /* all leds off */
    	led_ds6((unsigned int) 0x0000);

    	//wait_ms( 500 );
                             /* inc the test num */
      //OSSemPend(pevent0,10*OS_TICKS_PER_SEC,err);
       //OSTimeDlyHMSM(0,0,4,0);
     OSTimeDly(5*OS_TICKS_PER_SEC);
      //goto led_fail;
      
      }
   }        
/*******************************************************************************
*
* Task		:   void TimeOfDayTask(void *j);
*
* Purpose   : 	Time of day task.
*
* Inputs    :   Pointer to context?  Pointer to time/date structure.
*
* Globals	:	None.
*
* Outputs (Returns):
*				None (void).  Should never return.
*
* Note(s)	:   Should add code to go update global time and date structures.
*				Y2K compliant.
*				Should add code to initialize from hardware RTC on power-up.
*				The actual interrupt rate is 15625/256=61.03515625 Hz.
*
*******************************************************************************/

/*void LEDTask1(void *j)
	{
	int ctr,i,exetimes;
    unsigned int error_state, test_num;

    exetimes=0;
    test_init();                           /* init variables & hardware 
  
    //for (i=1 ; i<=4 ; i++)
     //{
     //  ti_led_off(i);
   
     //}  
   // volatile INT8U LEDTick=0;
    for(;;)
    {    
       if(exetimes==9)
      {
      	OSSemPost(pevent0);	
      	exetimes=0;
      }
      else
      {exetimes++;
        for (ctr=1; ctr <= 4; ctr++)      /* turn all leds on 
    	{
      		ti_led_on(ctr);
    	}
      
      	wait_ms( 200 );

    	for (ctr=1; ctr <= 4; ctr++)      /* turn all leds off 
    	{
      		ti_led_off(ctr);
    	}
    	//wait_ms( 200 );
      
      }
      OSTimeDlyHMSM(0,0,1,0);
      //OSTimeDly(0.5*OS_TICKS_PER_SEC);
      //goto ti_led_fail;

      }
    }  
    
 /**********************************************************************
  void LEDTask2(void *j) 
  {
  unsigned int ticker, ctr;

  
  for (;;)
  {
    for (ctr=1; ctr <= 4; ctr++)
    {
      ti_led_on(ctr);
      wait_ms( 200 );
      ti_led_off(ctr);
      wait_ms( 200 );
    }

    //wait_ms( 200 );
  OSTimeDlyHMSM(0,0,0,30);
  //OSTimeDly(0.2*OS_TICKS_PER_SEC);
  }
  } 
  */
  /*****************************************************
  SPI experimnet module
  ******************************************************/
 // 系统初始化子程序
int               ADRESULT[16];	// 定义一个数组用于保存AD转换的结果
volatile  unsigned  int  *j;	// 定义一个指针变量j
int i,k;
void inline disable() 
{
    asm(" setc INTM");
}
// 开总中断子程序
void inline enable()
{
    asm(" clrc INTM");
}
// 系统初始化子程序
void  initial()
{
   asm(" setc      SXM");// 符号位扩展有效
   asm(" clrc     OVM");	// 累加器中结果正常溢出
   asm(" clrc      CNF");// B0被配置为数据存储空间
  // *SCSR1=0x83FE;// CLKIN=15M,CLKOUT=2*CLKIN=30M
   *WDCR=0x0E8;	// 不使能看门狗,因为SCSR2中的WDOVERRIDE
			// 即WD保护位复位后的缺省值为1,故可以用
	  		// 软件禁止看门狗
   *IMR=0x0022;	//  允许INT1中断
   *IFR=0x0FFFF;	//  清除全部中断标志,"写1清0"
}
// AD初始化子程序
void  ADINIT()
{
   *T4CNT=0X0000;	// T4计数器清0
   *T4CON=0X170C;	// T4为连续增计数模式,128分频,且选用内部时钟源
   *T4PER=0X75;	// 设置T4的周期寄存器
   *GPTCONB=0X400;	// T4周期中断标志触发AD转换
   *EVBIFRB=0X0FFFF;	// 清除EVB中断标志,写"1"清0
   *ADCTRL1=0X30;	// 采样时间窗口预定标位ACQ PS3-ACQ PS0为0,
		// 转换时间预定标位CPS为0,AD为启动/停止模式,排
		// 序器为级连工作方式,且禁止特殊的两种工作模式
   *ADCTRL2=0X8404;	// 可以用EVB的一个事件信号触发AD转换,
	// 且用中断模式1
   *MAXCONV=0X0F;	// 16通道
   *CHSELSEQ1=0X3210;
   *CHSELSEQ2=0X7654;
   *CHSELSEQ3=0X0BA98;
   *CHSELSEQ4=0X0FEDC;	// 转换通道是0-15  
}
// 启动AD转换子程序(通过启动定时器4的方式间接启动)
void  ADSOC()
{
   *T4CON=*T4CON|0X40;// 启动定时器4
}

void ADCTask5(void *j)
{
   disable( );	// 禁止总中断
   initial( );	// 系统初始化
   ADINIT( );	// AD初始化子程序
   enable( );	// 开总中断
   ADSOC( );	// 启动AD转换
   while(1)
   {
     // if(i==0x10)   break;	// 如果已发生中断,则停止等待(发生中断后,i=0x10)
  	if(k>=10)
  	{
  			*T4CON=*T4CON&0X0FFBF;	// 停止定时器4,即间接停止A/D转换
  			k=0;
  			break;
  	}
  	}	// 等待中断发生
  // *T4CON=*T4CON&0X0FFBF;	// 停止定时器4,即间接停止A/D转换
  // while(1)
  // {
   //    ;
   //}	// 死循环,在实际的工程应用中在此可以利用A/D转换的结果用于一些运算
}

// 若是其它中断则直接返回子程序
void interrupt nothing()
{
  enable();
   return;
}
// AD中断服务子程序
void  interrupt  adint()
{
   
   asm(" clrc      SXM");	// 抑制符号位扩展
   j=RESULT0;	// 取得RESULT0的地址
   for(i=0;i<=15;i++,j++)
   {
      ADRESULT[i]=*j>>6; 	// 把AD转换的结果右移6位后存入规定的数组
      //cesi=ADRESULT[i];		// 检验每个A/D转换的结果
   }	
   k++;
   *ADCTRL2=*ADCTRL2|0X4200;	// 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0
   enable();	// 开总中断,因为一进入中断总中断就自动关闭了
}

⌨️ 快捷键说明

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