codewarrior 不能全速运行
大家好,本人用的MC9S12S128的飞思卡尔芯片,里面用了简单的定时中断,SCI,下面是源代码。我用的IDE是codewarrior
在运行中有两个现象,1,不能全速运行,只能点一步运行一步。
2,长按f11,在程序运行两个来回以上,拔掉BDM,再上电。程序有可能烧进去了
/*---------------------------------------------------------*/
/************************************************************
************************************************************/
/*---------------------------------------------------------*/
#include /* common defines and macros /
#include "derivative.h" / derivative-specific definitions */
#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define BUS_CLOCK 32000000 //总线频率
#define OSC_CLOCK 16000000 //晶振频率
unsigned char a[56]={0XEB,0X90,0X83};
#define BAUD 38400 //串口波特率
/*************************************************************/
/* 初始化锁相环 /
/************************************************************/
void INIT_PLL(void)
{
CLKSEL &= 0x7f; //set OSCCLK as sysclk
PLLCTL &= 0x8F; //Disable PLL circuit
CRGINT &= 0xDF;
#if(BUS_CLOCK == 40000000)
SYNR = 0x44;
#elif(BUS_CLOCK == 32000000)
SYNR = 0x43;
#elif(BUS_CLOCK == 24000000)
SYNR = 0x42;
#endif
REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
PLLCTL =PLLCTL|0x70; //Enable PLL circuit
asm NOP;
asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already
CLKSEL |= 0x80; //set PLLCLK as sysclk
}
/*************************************************************/
/*************************************************************/
/* 初始化SCI /
/************************************************************/
void INIT_SCI(void)
{
SCI0BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600
SCI0CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验
SCI0CR2 = 0x08; //允许发送数据,禁止中断功能
}
/*************************************************************/
/*************************************************************/
/* 串口发送函数 /
/************************************************************/
void SCI_send(unsigned char data)
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL = data;
}
/*************************************************************/
/* 串口发送字符串函数 /
/************************************************************/
void send_string(unsigned char j)
{
while(j<56) //判断字符串是否发送完毕
{
SCI_send(a[j]);
}
}
/*************************************************************/
/*************************************************************/
/* PIT模块初始化函数 /
/************************************************************/
void init_PIT(){
/* PITMTLD0=249; //为0通道8位计数器赋值
PITLD0=63999; //为0通道16位计数器赋值 //(249+1)*(63999+1)=16000000个总线周期=0.5秒
PITMUX_PMUX0=0; //第0通道使用微计数器0
PITCE_PCE0=1; //第0通道计数器工作
PITCFLMT=0X80; //使能周期中断定时器
PITINTE_PINTE0=1; //0通道定时器定时中断被使能 */
PITCFLMT=0X00; //禁止PIT模块
PITCE_PCE0=1; // 使能定时器通道0
PITMUX=0X00;//定时器通道0使用Base Timer0(微定时基准0)
PITMTLD0=0XFF;//设置8位微定时装载寄存器0初值
PITLD0=0XFFFF;//设置16位装载寄存器0初值
//定时周期=(PITMTLD0+1)*(PITLD0+1)*(1/fBUS)=0.52428s
PITINTE=0X01;//使能PIT定时器通道0中断
PITCFLMT=0X80;//使能PIT模块
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PIT_INTER(void)
{ unsigned char i;
if(PITTF_PTF0==1) {
PITTF_PTF0=1; //把1改为0
LEDCPU=~LEDCPU;
for (i=0;i=i+1;)
{
send_string(a[i]);
}
}
}
#pragma CODE_SEG DEFAULT
/*************************************************************/
/* 主函数 /
/************************************************************/
void main(void) {
INIT_PLL();
LEDCPU_dir=1; //设置 PORTK_PK4为输出脚位
init_PIT();
INIT_SCI();
EnableInterrupts;
for(;;) {
}
}