当前位置:文档之家› XS128一般模块配置

XS128一般模块配置

#include
#include
#include "derivative.h"

#define KEY1 PORTB_PB4 //S1
#define KEY2 PORTB_PB5 //S2
#define KEY3 PORTB_PB6 //S3
#define KEY4 PORTB_PB7 //S4



void Dly_ms(unsigned int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii//for(jj=0;jj<1335;jj++); //16MHz--1ms
for(jj=0;jj<2270;jj++); //32MHz--1ms
//for(jj=0;jj<4006;jj++); //48MHz--1ms
for(jj=0;jj<4341;jj++); //64MHz--1ms
}


void SetBusCLK_40M(void)
{
CLKSEL=0X00; //disengage PLL to system
PLLCTL_PLLON=1; //turn on PLL
SYNR =0xc0 | 0x04;
REFDV=0x80 | 0x01;
POSTDIV=0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
_asm(nop); //BUS CLOCK=40M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL =1; //engage PLL to system;
}


void PIT0_init(void) //定时PIT0中断
{
PITCFLMT_PITE=0; //定时中断通道
PITCE_PCE0=1; //定时器通道0使能
PITMTLD0=40-1; //8位定时器初值设定。40分频,在40MHzBusClock下,为0.1MHz,即1us=0.001ms
PITLD0=500-1; //16位定时器初值设定。PITTIME*0.01MS,定时500 * 0.001ms = 0.5ms
PITINTE_PINTE0=1; //定时器中断通道0中断使能
PITCFLMT_PITE=1; //定时器通道使能 改为在按下键之后才置1
}


void PAOVFinit(void)
{
TSCR1_TEN =1; //(7)使能定时器模块
PACTL_PAEN =0; //(6)累加器禁止
PACTL_PAMOD=0; //(5)PAMOD=0,事件计数模式;PAMOD=1,门控时间累加模式
PACTL_PEDGE=0; //(4)选择通道7的脉冲沿(0,下降沿)

PACTL_PAOVI=0; //使能累加器溢出中断,即PAOVF=1时申请中断
PACTL_PAI = 0; //使能累加器输入中断,即PAIF=0时申请中断
PACNT=0; //计算器初值为0
PAFLG_PAOVF=1; //写入清除该位,当累加器溢出时置位
PAFLG_PAIF =1; //写入时清除该位,当累加器有变化时置位
PACTL_PAEN =1; //(6)累加器使能
}



int checkkey()// 按键程序
{
if(!KEY1)
{
Dly_ms(10);
if(!KEY1)
return (1);
}
if(!KEY2)
{
Dly_ms(10);
if(!KEY2)
return (2);
}
if(!KEY3)
{
Dly_ms(10);
if(!KEY3)
return (3);
}
if(!KEY4)
{
Dly_ms(10);
if(!KEY4)
return (4);
}
return 0;
}


int boma_key()
{
char a=0,b=0,c=0,d=0,boma=0;
a=PORTE_PE4;
b=PORTE_PE5;
c=PORTE_PE6;
d=PORTE_PE7;
if(a==1) boma=boma|0x08;
if(b==1) boma=boma|0x04;
if(c==1) boma=boma|0x02;
if(d==1) boma=boma|0x01;

return(boma);
}



//////////////PWM
void PWM01_init(void) //dajiao
{


PWME_PWME1 = 0;
PWMCTL_CON01 = 1; //通道23级联
PWMCAE_CAE1 = 0; //左对齐
PWMPOL_PPOL1 = 1; //1:起始为高电平 0:起始为低电平
PWMCLK_PCLK1 = 1; //= 1时钟来源选择ClocksSA
PWMSCLA = 5; //ClockSA=ClockA/(2*PWMSCLA) clockA=主频 40M/(2*PWMSCLA)=4MHz
PWMPER01 = 60000; //输出频率= 4000000Hz/(60000)
PWMDTY01 = 5455; //
PWME_PWME1 = 1; //启动PWM输出
}
void PWM23_init(void) //baitou
{

PWME_PWME3 = 0;
PWMCTL_CON23 = 1; //通道23级联
PWMCAE_CAE3 = 0; //左对齐
PWMPOL_PPOL3 = 1; //1:起始为高电平 0:起始为低电平
PWMCLK_PCLK3 = 1; //= 1时钟来源选择ClockSB
PWMSCLB = 5; //ClockSB 分频 结果为40M/(2*2)=10MHz 10/2=5m
PWMPER23 = 60000; //输出频率= 1000000Hz/(40000)=250Hz
PWMDTY23 = 4300; //
PWME_PWME3 = 1; //启动PWM输出
}
void PWM45_init(void) //
{
PWME_PWME5 = 0;
PWMCTL_CON45 = 1; //通道45级联
PWMCAE_CAE5 = 0; //左对齐
PWMPOL_PPOL5 = 1; //0低电平 1高电平 起始
PWMCLK_PCLK5 = 0; //= 0时钟来源选择ClockA
PWMPRCLK_PCKA = 0; //ClockA 不分频 结果为40MHz /2(0ci) =40m
PWMPER45 = 216; //输出频率= 40000KHz / 200 = 200KHz
PWMDTY45 = 108; //
PWME_PWME5 = 1; //启动PWM输出
}
void PWM67_init(void) //
{
PWME_PWME7 = 0;
PWMCTL_CON67 = 1; //通道45级联
PWMCAE_CAE7 = 0; //左对齐
PWMPOL_PPOL7 = 1; //0低电平 1高电平 起始
PWMCLK_PCLK7 = 0; //= 0时钟来源选择ClockA
PWMPRCLK_PCKB = 0; //ClockA 不分频 结果为40MHz /2(0ci) =40m
PWMPER67 = 4000; //输出频率= 40000KHz / 4000=10K
PWMDTY67 = 2000; //
PWME_PWME7 = 1; //启动PWM输出
}
void changePWM01(int angle)
{
static int angleold = 0;
if(angle != angleold)
{
PWME_PWME1 = 0;
PWMDTY01 = angle;
PWME_PWME1 = 1;
}
angleold = angle;
}
void changePWM23(int angle)
{
static int angleold = 0;
if(angle != angleold)
{
PWME_PWME3 = 0;
PWMDTY23 = angle;
PWME_PWME3 = 1;
}
angleold = angle;
}
void changePWM45(int angle)
{
static int angleold = 0;
if(angle != angleold)
{
PWME_PWME5 = 0;
PWMDTY45 = angle;
PWME_PWME5 = 1;
}
angleold = angle;
}
void changePWM67(int angle)
{
static int angleold = 0;
if(angle != angleold)
{
PWME_PWME7 = 0;
PWMDTY67 = angle;
PWME_PWME7 = 1;
}
angleold = angle;
}



void ADinit(void)
{
ATD0CTL1 = 0b00000000; //8位精度,禁止外部触发
ATD0CTL2 = 0b01000010; //自动清零,禁止外部触发,无等待模式,中断使能
ATD0CTL3 = 0b11000000; //输入通道个数
ATD0CTL4 = 0b10001001; //采样周期:12个,时钟频率:ATDclock(2MHZ)=(BusClock(40MHZ)/(9+1))*0.5
ATD0CTL5 = 0b00110000;

//多个通道采样,输入通道7启动AD
}
//ATD0CTL1:
//BIT7: ETRIGSEL:选择外部的触发源是AD通道或是EIRRG3-0选择的通道
//BIT6-5: SRES1-SRES0:AD精度的选择, 00:8bit精度, 01:10bit精度, 10:12bit精度, 11:reserved,保留(不用)
//BIT4: SMP-DIS:0:电容抽样前不放电.1:抽样前电容放电,这样会增加2个AD采样时钟周期
//BIT3-0: ETRIGCH3-0:这些位选择某些AD通道或ETRIG3-0的输入作为外部触发源
//
//ATD0CTL2: 01000010
//BIT7: 空
//BIT6: AFFC:0:AD转换必须向CCF位写1,AD转换标志位(CCF)才清零.1:AD转换成功标志位自动清零
//BIT5: ICLKSTP:0:当AD转换进行时进入停止模式,实际的转换过程将被退出,退出时自动重新启动停止模式.
// 1:AD转换继续在停止模式位
//BIT4-3: ETRIGLE-ETRIGP:外部触发:00:下降沿触发.01:上升沿触发.10:低电平触发.11:高电平触发
//BIT2: ETRIGE:0:不允许外部触发.1:允许外部触发
//BIT1: ASCIE:0:中断屏蔽.1:中断使能
//BIT0: ACMPIE:0:中断屏蔽.1:在自动模式下,转换成功后产生中断
//
//ATD0CTL3:
//BIT7: DJM:结果寄存器ATD0数据调整位,0:采用左调整.1:采用右调整
//BIT6-3: S8C-S4C-S2C-S1C:AD转换序列长度选择位:即代表AD每一次转换的AD通道个数
//BIT2: FIFO:0:第一次转换结果放在ATD0中,按顺序依次类推.1:循环模式,一般不用
//BIT1-0: FRZ1-0:冻结模式后台使能位.00:AD转换继续工作.01:保留AD转换.
// 10:完成当前的转换后进入冻结模式.11:立即进入冻结模式
//
//ATD0CTL4:
//BIT7-5: SMP2-0:这三位是用来选择采样时间的长短的,即采样周期.要稳时选择周期长的,要速度时选择周期
// 短的.000:4个AD采样周期.001:6个. 010:8个. 011:10个 100:12个 101:16个 110:20个. 111:24个
//BIT4-0: PRS4-0:AD时钟频率预设位,公式:ATDclock(AD时钟频率)=(BusClock(总线时钟频率)/(PRS+1))*0.5
// AD的时钟频率即是AD转换的速度,一个周期的速度
// 例:2MHZ的AD时钟频率,则四个周期所用的时间是2US
//
//ATD0CTL5:
//BIT7: 空
//BIT6: SC:特殊通道使能位.0:屏蔽.1:使能
//BIT5: SCAN:AD转换模式选择位.0:只转换一次.1:连续转换
//BIT4: MULT:多通道采样模式位.0:只采样特定的通道,由CC,CB,CA选择.
// 1: 采样多通道,通道个数由序列长度选择位S8C,S4C,S2C,S1C,决定
// 第一个通道由CD,CC,CB,CA位决定,接下来按顺序
//BIT3-0: CD-CC-CB-CA



相关主题
文本预览
相关文档 最新文档