📄 fchev_can.c
字号:
/*********************************************************************
**********************************************************************
**********************************************************************
*********************************************************************/
/*** Address Definitions ***/
#include "f2407regs.h"
/*+++++++++++*/
#include "firfilt.h"
#include "pid_reg1.h"
/*+++++++++++*/
/*+++++++++++*/
/*----PID definitions----*/
PIDREG1 pid=PIDREG1_USER;
#pragma DATA_SECTION(fir,"firfilt");
FIRFILT_ORD10 fir =FIRFILT_ORD10_LPF;
/*+++++++++++*/
#define DAC0 port0000 /* EVM DAC register 0 (I/O space) */
ioport unsigned port0000; /* '24xx compiler specific keyword */
#define DAC1 port0001 /* EVM DAC register 1 (I/O space) */
ioport unsigned port0001; /* '24xx compiler specific keyword */
#define DAC2 port0002 /* EVM DAC register 2 (I/O space) */
ioport unsigned port0002; /* '24xx compiler specific keyword */
#define DAC3 port0003 /* EVM DAC register 3 (I/O space) */
ioport unsigned port0003; /* '24xx compiler specific keyword */
#define DACUD port0004 /* EVM DAC update register (I/O space) */
ioport unsigned port0004; /* '24xx compiler specific keyword */
#define DIPSWCH port0008 /* EVM DIP switch (I/O space) */
ioport unsigned port0008; /* '24xx compiler specific keyword */
#define LED port0009 /* EVM LED bank (I/O space) */
ioport unsigned port0009; /* '24xx compiler specific keyword */
/*** Constant Definitions ***/
/*#define timer2_per 3215*/ /* 1ms timer2 period with a 1/4 timer prescaler and 40MHz CPUCLK */
#define timer2_per 3215
int mbx2_a=-2,mbx2_b=-1,mbx2_c=-1,mbx2_d=-1;
int CAN_TFLAG;/*CAN 发送时间计数*/
int LED6_counter=0; /*LED6 定时器2中断指示灯*/
int LED7_counter=0; /*LED7 CAN接收成功指示灯*/
int LED8_counter=0; /*LED8 CAN发送成功指示灯*/
int LED_STATE=0x000F; /*1-off ;0-on,low 4 bit for LED6-9*/
int temp_RCR=-1; /*STORE THE *RCR REGISTER VALUE*/
int temp_TCR=-1; /*STORE THE *TCR REGISTER VALUE*/
/*** Global Variable Definitions ***/
int Ib=-1,If=-1,Ubus=-1; /*the current of battery&Fuel cell and the bus voltage*/
int temp=0xFFFF; /*varialbe value for ouput of DAC to produce control signal*/
int end_ad=-1; /*the flag of end of ad conversion*/
int channel_0=-1,channel_1=-1,channel_2=-1,channel_3=-1;/*the result of ad0-3*/
/*+++++++++++++++*/
int tx_cnt=0;
void sci_init(void);
void delay(void);
int P_FC_ref=0;
/*+++++++++++++++*/
main()
{
/* ;(3)系统初始化程序 */
asm(" SETC INTM");
asm(" CLRC SXM");
asm(" CLRC OVM");
asm(" CLRC CNF");
asm(" nop");
asm(" nop");
asm(" nop");
/*** Configure the System Control and Status registers ***/
*SCSR1 = 0x00FD;
/*
bit 15 0: reserved
bit 14 0: CLKOUT = CPUCLK
bit 13-12 00: IDLE1 selected for low-power mode
bit 11-9 000: PLL x4 mode
bit 8 0: reserved
bit 7 1: 1 = enable ADC module clock
bit 6 1: 1 = enable SCI module clock
bit 5 1: 1 = enable SPI module clock
bit 4 1: 1 = enable CAN module clock
bit 3 1: 1 = enable EVB module clock
bit 2 1: 1 = enable EVA module clock
bit 1 0: reserved
bit 0 1: clear the ILLADR bit */
*SCSR2 = (*SCSR2 | 0x000B) & 0x000F;
/*
bit 15-6 0's: reserved
bit 5 0: do NOT clear the WD OVERRIDE bit
bit 4 0: XMIF_HI-Z, 0=normal mode, 1=Hi-Z'd
bit 3 1: disable the boot ROM, enable the FLASH
bit 2 no change MP/MC* bit reflects state of MP/MC* pin
bit 1-0 11: 11 = SARAM mapped to prog and data */
/*** Disable the watchdog timer ***/
*WDCR = 0x00E8;
/*
bits 15-8 0's: reserved
bit 7 1: clear WD flag
bit 6 1: disable the dog
bit 5-3 101: must be written as 101
bit 2-0 000: WDCLK divider = 1 */
/*** Setup external memory interface for LF2407 EVM ***/
WSGR = 0x0000;
asm(" NOP");
WSGR = 0x0040;
/*
bit 15-11 0's: reserved
bit 10-9 00: bus visibility off
bit 8-6 001: 1 wait-state for I/O space
bit 5-3 000: 0 wait-state for data space
bit 2-0 000: 0 wait state for program space */
/*** Setup shared I/O pins ***/
*MCRA = 0x0000; /* group A pins */
/*
bit 15 0: 0=IOPB7, 1=TCLKINA
bit 14 0: 0=IOPB6, 1=TDIRA
bit 13 0: 0=IOPB5, 1=T2PWM/T2CMP
bit 12 0: 0=IOPB4, 1=T1PWM/T1CMP
bit 11 0: 0=IOPB3, 1=PWM6
bit 10 0: 0=IOPB2, 1=PWM5
bit 9 0: 0=IOPB1, 1=PWM4
bit 8 0: 0=IOPB0, 1=PWM3
bit 7 0: 0=IOPA7, 1=PWM2
bit 6 0: 0=IOPA6, 1=PWM1
bit 5 0: 0=IOPA5, 1=CAP3
bit 4 0: 0=IOPA4, 1=CAP2/QEP2
bit 3 0: 0=IOPA3, 1=CAP1/QEP1
bit 2 0: 0=IOPA2, 1=XINT1
bit 1 0: 0=IOPA1, 1=SCIRXD
bit 0 0: 0=IOPA0, 1=SCITXD */
*MCRB = 0xFEC0; /* group B pins */
/*
bit 15 1: 0=reserved, 1=TMS2 (always write as 1)
bit 14 1: 0=reserved, 1=TMS (always write as 1)
bit 13 1: 0=reserved, 1=TD0 (always write as 1)
bit 12 1: 0=reserved, 1=TDI (always write as 1)
bit 11 1: 0=reserved, 1=TCK (always write as 1)
bit 10 1: 0=reserved, 1=EMU1 (always write as 1)
bit 9 1: 0=reserved, 1=EMU0 (always write as 1)
bit 8 0: 0=IOPD0, 1=XINT2/ADCSOC
bit 7 1: 0=IOPC7, 1=CANRX
bit 6 1: 0=IOPC6, 1=CANTX
bit 5 0: 0=IOPC5, 1=SPISTE
bit 4 0: 0=IOPC4, 1=SPICLK
bit 3 0: 0=IOPC3, 1=SPISOMI
bit 2 0: 0=IOPC2, 1=SPISIMO
bit 1 0: 0=IOPC1, 1=BIO*
bit 0 0: 0=IOPC0, 1=W/R* */
*MCRC = 0x0000; /* group C pins */
/*
bit 15 0: reserved
bit 14 0: 0=IOPF6, 1=IOPF6
bit 13 0: 0=IOPF5, 1=TCLKINB
bit 12 0: 0=IOPF4, 1=TDIRB
bit 11 0: 0=IOPF3, 1=T4PWM/T4CMP
bit 10 0: 0=IOPF2, 1=T3PWM/T3CMP
bit 9 0: 0=IOPF1, 1=CAP6
bit 8 0: 0=IOPF0, 1=CAP5/QEP4
bit 7 0: 0=IOPE7, 1=CAP4/QEP3
bit 6 0: 0=IOPE6, 1=PWM12
bit 5 0: 0=IOPE5, 1=PWM11
bit 4 0: 0=IOPE4, 1=PWM10
bit 3 0: 0=IOPE3, 1=PWM9
bit 2 0: 0=IOPE2, 1=PWM8
bit 1 0: 0=IOPE1, 1=PWM7
bit 0 0: 0=IOPE0, 1=CLKOUT */
/*** Setup timers 1 and 2, and the PWM configuration ***/
*T1CON = 0x0000; /* disable timer 1 */
*T2CON = 0x0000; /* disable timer 2 */
*GPTCONA = 0x0000; /* configure GPTCONA */
/*
bit 15 0: reserved
bit 14 0: GP timer 2 Status. Read only.
bit 13 0: T1STAT, read-only
bit 12-11 00: reserved
bit 10-9 00: T2TOADC, 00 = no timer2 event starts ADC
bit 8-7 00: T1TOADC, 00 = no timer1 event starts ADC
bit 6 0: TCOMPOE, 0 = Hi-z all timer compare outputs
bit 5-4 00: reserved
bit 3-2 00: T2PIN, 00 = forced low
bit 1-0 00: T1PIN, 00 = forced low */
/* Timer 2: configure to generate a T ms periodic interrupt */
*T2CNT = 0x0000; /* clear timer counter */
*T2PR = timer2_per; /* set timer period */
*T2CON = 0x1700; /* configure T2CON register */
/*
bit 15-14 00: stop immediately on emulator suspend
bit 13 0: reserved
bit 12-11 10: 10 = continous-up count mode
bit 10-8 111: 111 = x/128 prescaler
bit 7 0: T2SWT1, 0 = use own TENABLE bit
bit 6 0: TENABLE, 0 =Disable timer operation
bit 5-4 00: 00 = CPUCLK is clock source
bit 3-2 00: 00 = reload compare reg on underflow
bit 1 0: 0 = disable timer compare
bit 0 0: SELT1PR, 0 = use own period register */
/*** Setup the core interrupts ***/
*IMR = 0x0000; /* clear the IMR register */
*IFR = 0x003F; /* clear any pending core interrupts */
*IMR = 0x0006; /* enable desired core interrupts:T2peroid INT3&CAN ERROR HIGH INT2 */
/*** Setup the event manager interrupts ***/
*EVAIMRA = 0x0000; /* enable desired EVA group A interrupts */
*EVAIMRB = 0x0001; /* enable desired EVA group B interrupts:T2PINT ENABLE */
*EVAIMRC = 0x0000; /* enable desired EVA group C interrupts */
*EVAIFRA = 0xFFFF; /* clear all EVA group A interrupts */
*EVAIFRB = 0xFFFF; /* clear all EVA group B interrupts */
*EVAIFRC = 0xFFFF; /* clear all EVA group C interrupts */
/*__________________________;(4)CAN初始化程序______________________________ */
/*;~~~~~~~ CAN 位定时器配置 ~~~~~~~~~~~~*/
*MDER=0x0040; /*;MD2=1,MBX2为发送方式*/
*CAN_IFR=0xFFFF; /*;清全部CAN中断标志*/
*LAM1_H=0x7000; /*;设置邮箱2、3的屏蔽ID寄存器 */
*LAM1_L=0xFFFF; /* ;0则ID必须匹配 */
*MCR=0x1000; /* ;CCR=1 改变配置请求 */
W_CCE: if(*GSR&0x0010==0x0000)goto W_CCE; /*;等待改变配置使能 */
/*;当CCE=1 时即可配置 BCR2、BCR1 寄存器 */
*BCR2=0x0027; /* ;波特率预分频寄存器 40M/(39+1)=1M */
*BCR1=0x0013; /* ;波特率设置为2+3+3=8 */
*MCR=*MCR&0xEFFF; /*;CCR=0 改变配置结束请求 */
W_NCCE: if(*GSR&0x0010==0x0010)goto W_NCCE;/*;等待改变配置不使能 */
/*;只有当CEE=0时,BCR2、BCR1 */
/*;寄存器配置成功 */
/*;~~~~写 CAN 邮箱内容前寄存器设置~~~~~~*/
*MDER=0x0040; /* ;不使能邮箱,邮箱2设为接收方式*/
*MCR=0x0103; /* ;CDR=1,数据区改变请求 */
/*;~~~~~~~写 CAN 邮箱内容~~~~~~~~~~~~~*/
*MSGID2H=0x4080; /*;设置邮箱2的控制字及ID
;IDE=0, AME=1, AAM=0
;标准方式为MSGID2H[12~2]*/
*MSGID2L=0xFFFF;
*MSGCTRL2=0x0008; /* ;设置控制域 */
/*;数据长度DCL = 8,RTR=0 数据帧 */
*MBX2A=0x0000; /*;邮箱2信息初始化 */
*MBX2B=0x0000;
*MBX2C=0x0000;
*MBX2D=0x0000;
/* *MSGID3L=0xFFFF; */
*MSGID3H=0x4088;
*MSGID3L=0xFFFF;
*MSGCTRL3=0x0008; /* ;RTR=0,DCL=8 */
/*;邮箱3信息初始化 */
*MBX3A=0x000F;
*MBX3B=0x0200;
*MBX3C=0x0400;
*MBX3D=0x0400;
/*;~~~~~~~~~写 CAN 邮箱内容后寄存器设置~~~~~~~~~~~~*/
*MCR=0x2480; /* ;DBO=1,ABO=1,STM=0 */
/*===================*/
/**MCR=0x24C0; */
/*===================*/
*MDER=0x004C; /* ;ME3=1,MBX3 发送, ME2=1 接收 */
/**CAN_IMR=0xF7FF; */ /*;中断MBX3不使能,MBX2使能,*/
*CAN_IMR=0x8480;
/*;中断优先级 */
*CAN_IFR=0xFFFF; /* ;清全部中断标志 */
/*=======================================================================*/
/*+++++++++++++++++++++*/
sci_init();
/*+++++++++++++++++++++*/
/*+++++++++++++++++++++*/
/* Fixed Order Filter Initialisation */
fir.dbuffer_ptr=&fir.dbuffer[0];
fir.coeff_ptr=&fir.coeff[0];
fir.init(&fir);
/*+++++++++++++++++++++*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -