📄 ex5.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 + -