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

📄 test.c

📁 UCOSII FOR freescale 9s12E64
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*********************************************************************************************************
*                                               uC/OS-II
*                                         The Real-Time Kernel
*
*                         (c) Copyright 1998, Jean J. Labrosse, Plantation, FL
*                                          All Rights Reserved
*
*
*                                          M68HC12 Sample code
*
* File : TEST.C
* By   : Jean J. Labrosse
*********************************************************************************************************
*/

#include "includes.h"
/*
*********************************************************************************************************
*                                                CONSTANTS
*********************************************************************************************************
*/

#define  TASK_STK_SIZE    220

#define  TASK_1_PRIO       2
#define  TASK_2_PRIO       4

#define  MUTEX_PIP_1        8
#define  MUTEX_PIP_2        9

#define  EVENT_Q_1_SIZE    10

#define  MEM_BLKS_1        10
#define  MEM_BLK_SIZE_1     8

#define SIZE_IN_BUFFER  100                              //接收 缓冲区长度

byte RXData[SIZE_IN_BUFFER];           //数据缓冲区
byte Send_Buffer[100];//发送缓冲区
typedef struct 
{//串口的各种属性
    unsigned char status;                          //当前状态    
    unsigned char cmd;                             //命令字
    unsigned int  len;                             //报文字节长度
    unsigned int  CRC;                             //检验和
    unsigned int  Addr;                            //接收缓冲区的 存数偏置        serial[1] com -> host's buffer 
    unsigned char token;                           //0x00:初始化
                                      //接收报文标志:0xF8:报文接收中
                                                   //0xFF:报文处理完
}Structserial;
Structserial  serial;              //同时可以接收到的数据队列深度为1
byte Send_toot[8]; //固定发送的8个数据

//table for CRC_16
const word crc_ta[256] @0xD800={ // CRC 余式表 
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};

/*
*********************************************************************************************************
*                                                VARIABLES
*********************************************************************************************************
*/
OS_STK        Task1Stk[TASK_STK_SIZE];
OS_STK        Task2Stk[TASK_STK_SIZE];

INT32U	  ttt;
     
INT16U        AppTask1Ctr;
INT16U        AppTask2Ctr;


OS_EVENT     *EventSem1;






 //PLL设置部分
void SetBusClock(void)
{
  CLKSEL_PLLSEL =0;
  REFDV= 1;
  SYNR = 5;				     // 24MHZ 
  PLLCTL_AUTO   =1;		 // 自动锁定
  PLLCTL_PLLON  =1;		 // 开启PLL
  while(!CRGFLG_LOCK); // 等待频率稳定
  CLKSEL_PLLSEL =1;		 // 设置为总线时钟
}

//串口通信初始化部分
void CommInt(void) {
  SCI0BD_SBR =156;      // 设置波特率为9600bps		    24MHZ			
  SCI0CR2_TE =1;     	 // 使能SCI0的发送功能
  SCI0CR2_RE =1;     	 // 使能SCI0的接收功能
  SCI0CR2_RIE=1;			 // 使能SCI0的接收中断功能
  SCI0CR1 =0x00;
}

//发送子函数
void TxByte(byte TxData) {
  SCI0DRL = TxData;   // 发送一个byte
  while(!SCI0SR1_TC) ;
}
/*
*********************************************************************************************************
*                                            FUNCTION PROTOTYPES
*********************************************************************************************************
*/

static  void  AppTask1(void *pdata);
static  void  AppTask2(void *pdata);
void TimeInit(void) ;
void CommDeal(void) ;
void Hard_respond(void) ;

static  void  AppTaskCreate (void)
{
    INT8U  err;
    OSTaskCreateExt(AppTask2, 
                    (void *)0, 
                    (OS_STK *)&Task2Stk[TASK_STK_SIZE-1], 
                    TASK_2_PRIO,
                    TASK_2_PRIO,
                    (OS_STK *)&Task2Stk[0],
                    TASK_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}

/*
*********************************************************************************************************
*                                                main()
*
* Description : This is the standard entry point for C code.  It is assumed that your code will call
*               main() once you have performed all necessary 68HC12 and C initialization.
* Arguments   : none
*********************************************************************************************************
*/

void main (void)
{
    INT8U  err;
    INITRM=0x10;	    //RAM偏移
    SetBusClock();				     //设置系统时钟
    OSInit();                               /* Initialize "uC/OS-II, The Real-Time Kernel"             */
    EventSem1=OSSemCreate(0); 
//	OSMutexPend(EventMutex1,0,&err);
    OSTaskCreateExt(AppTask1, 
                    (void *)0, 
                    (OS_STK *)&Task1Stk[TASK_STK_SIZE-1], 
                    TASK_1_PRIO,
                    TASK_1_PRIO,
                    (OS_STK *)&Task1Stk[0],
                    TASK_STK_SIZE,
                    (void *)0,
                    OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);

                    
   OSStart();                              /* Start multitasking (i.e. give control to uC/OS-II)      */
}

static void  AppTask1 (void *pdata)
{
    INT8U err,s1;

    OS_CPU_SR cpu_sr;
    pdata = pdata;                         
    OS_ENTER_CRITICAL();
    RTICTL=0x40;
    CRGINT_RTIE=1;
    CommInt();					         //串口初始化 
    OS_EXIT_CRITICAL();
    OSStatInit();
  //  TxByte('R'); 
    AppTaskCreate();
    while (TRUE) {                          /* Task body, always written as an infinite loop.          */
       
        OSTimeDlyHMSM(0, 0, 1, 10);         
    }
}


static void  AppTask2 (void *pdata)
{
    INT8U err;
    INT8U *ss;
    pdata = pdata;
     while (TRUE) { 
       	   CommDeal();
	       OSTimeDlyHMSM(0, 0, 0, 30);        
    }
}

// 定时器初始化
void TimeInit(void) {
   TIM0_TIOS_IOS4=1;   // 把定时器0的通道4设置为比较模式
   TIM0_TIE_C4I =1;		// 使能比较器4中断
   TIM0_TSCR2_PR =7;    // 设置计数时间的预分频	   /128
   TIM0_TSCR1_TEN=1;   // 使能定时器0
}

#pragma CODE_SEG NON_BANKED
void interrupt SCI0Rec(void) {
	 static  byte ch;
	 static byte RX_index;
	 static byte RX_temp[2];
	 
     OSIntEnter();	

     if (OSIntNesting == 1){			// 4~, if (OSIntNesting == 1) {
      __asm 
   	  {										    //  y寄存器可以当指针用
        ldy    OSTCBCur               //  3~, OSTCBCur->OSTCBStkPtr = Stack Pointer     
    	sts    0,y                           //  3~,}                                           
   	  }
     }	

  if(SCI0SR1_RDRF) {
  
  ch= SCI0DRL; 
	 	 
  if (serial.token == 0xF0)  //在缓冲区不满的情况下,接收数据
   {  
      OSIntExit();	 
      return;										//如果满了,退出接收
   }
   	  
   switch (serial.status )   //解释报文-根据接收到的字节转移状态
   {
      case 0x00 :
           serial.Addr=0x00;
           if(ch==0xAA) 
           {
              serial.status = 0x01;
              serial.token  = 0xF8;//报文接收中

⌨️ 快捷键说明

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