📄 test.c
字号:
/*
*********************************************************************************************************
* 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 + -