📄 timer.c
字号:
#include "type.h"
#include "board.h"
#include <stdio.h>
#include "timer.h"
//Tms320vc5402 have two timer--TIM0:timer0 TIM1:timer1
#define TIM0 0
#define TIM1 1
//define clkmd register initialize value
#define PLL15 0x0e007
#define PLL10 0x9007
#define PLL5 0x4007
#define PLL2 0x1007
#define PLL1 0x0f007
#define DIV2 0x0000
#define DIV4 0xf000
void set_clock(u16 plldiv); //set system clock mode
void set_wait_states(void); //set wait state register
void init_io_reg(void); //initialize CPLD I/O control register
void board_led_toggle(BrdLed led); //led toggle
void board_led_enable(BrdLed led); //led enable
void board_led_disable(BrdLed led); //led disable
void delay(int period);
void interrupt_init(void); //interrupt initialization
interrupt void timer0_isr(void); //timer0 interrupt program
u16 count=2;
u8 xf_flag=0;
void main()
{
asm(" SSBX INTM "); //disable all interrupt
set_clock(PLL10); //clkout=10*10=100Mhz
set_wait_states();
init_io_reg();
while(count--)
{
board_led_enable(BRD_LED0);
delay(1000);
board_led_disable(BRD_LED0);
board_led_enable(BRD_LED1);
delay(1000);
board_led_disable(BRD_LED1);
board_led_enable(BRD_LED2);
delay(1000);
board_led_disable(BRD_LED2);
}
//initialize TIMER 0,timer period is 10ms
//TIMER_INIT(TIM0,TCR_MASK(1,0,15),62499);
TIMER_HALT(TIM0);
PRD(TIM0)=62499;
TCR(TIM0)=0x0C0f;
//TCR(TIM0)=TCR_MASK(1,0,15);
interrupt_init();
for(;;);
}
interrupt void timer0_isr(void)
{
if (xf_flag)
{
asm(" SSBX XF");
xf_flag=0;
}
{
asm(" RSBX XF");
xf_flag=1;
}
count++;
if (count==50) //50*10=500ms
{
board_led_toggle(BRD_LED0); //LED0 flash every 500ms
count=0;
}
}
void interrupt_init(void)
{
IFR|=0x0ffff; //clear all interrupt flag
IMR|=0x0008; //enable timer0 interrupt
//PMST=PMST&0x007f|0x4000; //set IPTR
PMST=0x4020; //set IPTR
asm(" RSBX INTM "); //enable all interrupt
}
//set clock generator mode
void set_clock(u16 plldiv)
{
if (CLKMD&0x0001) //if clock generator is PLL mode
{
if ((plldiv==DIV2)||(plldiv==DIV4)) //PLL mode to DIV mode
{
CLKMD=plldiv;
}
else //PLL mode to PLL mode
{
CLKMD=DIV2; //turn to DIV mode
while (CLKMD&0x0001); //check CLKMD PLL status bit
CLKMD=plldiv|0x07f8;
while (!(CLKMD&0x0001)); //check CLKMD PLL status bit
}
}
else //else clock generator is DIV mode
{
if ((plldiv==DIV2)||(plldiv==DIV4)) //DIV mode to DIV mode
{
CLKMD=PLL1|0x07f8; //turn to PLL mode
while(!(CLKMD&0x0001)); //check CLKMD PLL status bit
CLKMD=plldiv;
}
else
{
CLKMD=plldiv|0x07f8; //DIV mode to PLL mode
while (!(CLKMD&0x0001)); //check CLKMD PLL status bit
}
}
}
void set_wait_states(void)
{
SWWSR=0x0d844;
}
void init_io_reg(void)
{
port0=0x10;
port4=0x03;
port2=0x00;
port3=0x30;
port5=0x00;
port6=0x00;
}
void board_led_enable(BrdLed led)
{
port0|=0x01<<led;
}
void board_led_disable(BrdLed led)
{
port0&=~(0x01<<led);
}
void board_led_toggle(BrdLed led)
{
port0^=(0x01<<led);
}
void delay(int period)
{
int i, j;
for(i=0; i<period; i++)
{
for(j=0; j<period>>1; j++);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -