1. 程式人生 > 實用技巧 >筆記:freescale-S9S12G系列微控制器開發指南

筆記:freescale-S9S12G系列微控制器開發指南

目標:搭建S9S12G微控制器最小系統,配置常用片上資源
備註:軟硬體設計參考官方開發板-DEVKIT-S12G128開發板
片上資源:時鐘、定時器GPIO、外部中斷、PWM、ADC、EE、IIC、SCI、SPI、CAN、看門狗

0. S9S12G系列微控制器概況




在這個系列裡面可應用的模組包括以下特點:

  S12核心

  高達240KB的片內線上可程式設計FLASH儲存器防糾錯快閃記憶體

  高達4KB防糾錯EEPROM

  高達11KB片內SRAM

  擁有內部濾波器的鎖相環迴路(IPLL)頻率乘法器

  4-16MHz振幅控制穿透振盪器

  1MHz內部RC振盪器

  定時單元(TIM)支援達到8通道(提供16位輸入俘獲,輸出比較,計數,脈衝儲存器功能)

  多達8*8通道脈寬調節(PWM)模組

  多達16通道,10位或12位解析度逐次近似計演算法模數轉換器(ADC)

  多達兩個8位數模轉換器(DAC)

  多達一個5V模擬比較器(ACMP)

  多達3個序列外圍介面模組(SPI)

  多達3個序列通訊介面(SCI)模組(支援LIN通訊)

  多達一個多級控制區域網(MSCAN)模組(支援CAN2.0 A/B 協議)

  線上片內穩壓器(VREG)用於控制內部供給和內部電壓

  自動週期性中斷(API)

  固定電壓基準精度參考ADC轉換器

1. 搭建最小系統

晶振電路、復位電路、BDM除錯電路、供電電路

1.1 晶振電路


1.2 復位電路

RESET引腳是一個低電平有效的雙向控制訊號, RESET引腳內部上拉


1.3 BDM除錯電路


1.4 供電電路






2. 配置片上資源

時鐘、定時器GPIO、外部中斷PWMEE、IIC、SCI、SPI、CAN、看門狗

片上驅動採用內建PE配置方式開發

2.1 時鐘配置

/*******************************************************************************
Function Name : PLL_Init
Parameters    : unsigned char pll_synr
                unsigned char pll_refdv
                unsigned char pll_postdivNONE
Modifies      : NONE
Returns       : NONE
Notes         : Sets BUSCLK = 40MHz from OSCCLK = 4MHz
Issues        : NONE
*******************************************************************************/
static void PLL_Init(unsigned char pll_synr, unsigned char pll_refdv, unsigned char pll_postdiv)
{
  CPMUPROT = 0x26U;                    /* Disable protection of clock configuration registers */  
  CLKSEL = 0X00;   //disengage PLL to system
  PLLCTL_PLLON = 1;  //turn on PLL
  //CPMUREFDIV_REFFRQ = 2; 
    
  /* CPMUSYNR: VCOFRQ1=0,VCOFRQ0=0,SYNDIV5=0,SYNDIV4=0,SYNDIV3=0,SYNDIV2=1,SYNDIV1=0,SYNDIV0=1 */  
  CPMUSYNR = pll_synr;        // Set the multiplier register [3]
  /* CPMUREFDIV: REFFRQ1=0,REFFRQ0=1,REFDIV3=0,REFDIV2=0,REFDIV1=0,REFDIV0=1 */  
  CPMUREFDIV = pll_refdv;     // Set the divider register [1]
  /* CPMUPOSTDIV: POSTDIV4=0,POSTDIV3=0,POSTDIV2=0,POSTDIV1=0,POSTDIV0=0 */
  CPMUPOSTDIV = pll_postdiv;  // Set the post divider register [1]
    
  CPMUOSC_OSCE = 1;			  // External oscillator enable. 8MHZ.        FREF=FOSC/(REFDIV+1)	
  _asm(nop);
  _asm(nop);
  while(!CPMUFLG_LOCK);       // Wait till the PLL VCO is within tolerance
    
  CPMUCLKS_PLLSEL = 1;        // Select clock source from PLLCLK,bus=fPLL/2; COP is clocked from OSCCLK
    
  ECLKCTL_NECLK=0;            // Enable the BusClk output at ECLK pin to see busclk if necessary 
  CPMUPROT = 0x00U;                    /* Enable protection of clock configuration registers */  
}

PLL_Init(0x58, 0x07, 0x00); // 25MHz BUSCLK from 8 MHZ oscclk, PEE mode,系統時鐘fbus = fPLL / 2
  //--- PLL Initialization ---------------
  //SetPEEmodeBUSCLK(0x58, 0x03, 0x00);   // 25MHz BUSCLK from 4 MHZ oscclk, PEE mode
  //SetPEEmodeBUSCLK(0x58, 0x07, 0x00);   // 25MHz BUSCLK from 8 MHZ oscclk, PEE mode
  //SetPEEmodeBUSCLK(0x03, 0x40, 0x00);   // 16MHz BUSCLK from 4 MHZ oscclk, PEE mode
  //SetPEEmodeBUSCLK(0x01, 0x80, 0x00);   // 16MHz BUSCLK from 8 MHZ oscclk, PEE mode
  //SetPEEmodeBUSCLK(0x01, 0x80, 0x07);   // 2MHz BUSCLK from 8 MHZ oscclk, PEE mode
  //SetPEEmodeBUSCLK(0x02, 0x80, 0x00);   // 24MHz BUSCLK from 8 MHZ oscclk, PEE mode







2.2定時器配置

PIT模組,週期終端定時器PIT定時器對其計數初值做減計數,直到減到0時產生溢位中斷,此時計數初值自動重灌

2.3 GPIO配置


/*****************************************************************
**    程式名:MC9S12G128 IO
**    參  數:無
**    功  能:G128 IO口LED按一定間隔時間閃爍  
**    注  意:LED位於G128 PD0口
**    作  者:趙露露
**    版  本:v1.0
**    時  間:2012.5.6   
******************************************************************/
#include <hidef.h>            /* common defines and macros */
#include "derivative.h"       /* derivative-specific definitions */
 
 
/*****************************************************************
**    函式名: delayms()
**    參  數:xms
**    功  能:在16MHz匯流排時鐘下大約延時xms毫秒  
**    注  意:    
******************************************************************/
void delayms(uint xms)
{
  uint z,j;
	for(z=xms;z>0;z--)
	    for(j=1600;j>0;j--);
}
 
void main(void) 
{
  
  DDRD = 0xFF;                //設定PD(0-7)方向為輸出
  PORTD = 0xFF;               //設定PD(0-7)輸出高電平
 while(1)
  {
    PORTD_PD0 = ~PORTD_PD0; //對PD0口取反
    delayms(1000);          //延時
  }            
 
 
}

2.4外部中斷配置

/*****************************************************************
**    程式名:MC9S12G128 按鍵檢測(中斷方式)
**    參  數:無
**    功  能:當按下按鍵後LED關閉0.1秒  
**    注  意:LED位於G128 PD0口,按鍵位於G128 PP0口
**    作  者:趙露露
**    版  本:v1.0
**    時  間:2012.5.7   
******************************************************************/
#include <hidef.h>            /* common defines and macros */
#include "derivative.h"       /* derivative-specific definitions */
 
 
/*****************************************************************
**    函式名: delayms()
**    參  數:xms
**    功  能:在16MHz匯流排時鐘下大約延時xms毫秒  
**    注  意:    
******************************************************************/
void delayms(uint xms)
{
  uint z,j;
	for(z=xms;z>0;z--)
	    for(j=1600;j>0;j--);
}
//中斷函式
//將中斷函式置於非分頁區內,地址空間超過了16位的定址空間64K,但是它的中斷向量地址只有16位,所以中斷程式要執行,就得在它16位的定址空間也即非分頁區內,這就是為什麼會將S12的中斷函式置於非分頁區的原因。
#pragma CODE_SEG __NEAR_SEG NON_BANKED

interrupt 56 void IRQ_ISR(void)       //56為PP口中斷向量號,它是由檔案"mc9s12g128.h"中定義的巨集,可在這個檔案中搜索"VectorNumber"查詢各個中斷的中斷向量號
{ 
  DisableInterrupts;                  //關閉中斷                  
  PIFP_PIFP0 = 1;                     //清除PP0的中斷標誌位
  PORTD_PD0 = 1;                      //關閉LED
  delayms(100);                       //延時以至於可以觀察到效果
  EnableInterrupts;                   //開啟中斷
}
#pragma CODE_SEG DEFAULT              //將後續程式碼置於預設區域內
 
void main(void) 
{
  
  DDRD = 0xFF;                //設定PD(0-7)方向為輸出
  PORTD = 0xFF;               //設定PD(0-7)輸出高電平
  
  DDRP_DDRP0 = 0;             //設定PP0口方向為輸入
  PERP_PERP0 = 1;             //設定PP0口拉裝置啟用
  PPSP_PPSP0 = 1;             //開啟PP0口上拉
  PIEP_PIEP0 = 1;             //設定PP0口中斷使能
                              
  EnableInterrupts;           //開啟中斷
 while(1)
  {
    PORTD_PD0 = 0;            //開啟LED
  }            
 
}
/*****************************************************************
**    程式名:MC9S12G128 按鍵檢測
**    參  數:無
**    功  能:當按下按鍵後,開啟或關閉LED燈  
**    注  意:LED位於G128 PD0口,按鍵位於G128 PB0口
**    作  者:趙露露
**    版  本:v1.0
**    時  間:2012.5.6   
******************************************************************/
#include <hidef.h>            /* common defines and macros */
#include "derivative.h"       /* derivative-specific definitions */
 
 
/*****************************************************************
**    函式名: delayms()
**    參  數:xms
**    功  能:在16MHz匯流排時鐘下大約延時xms毫秒  
**    注  意:    
******************************************************************/
void delayms(uint xms)
{
  uint z,j;
	for(z=xms;z>0;z--)
	    for(j=1600;j>0;j--);
}
 
void main(void) 
{
  
  DDRD = 0xFF;                //設定PD(0-7)方向為輸出
  DDRB = 0x00;                //設定PB(0-7)方向為輸入
  PORTD = 0xFF;               //設定PD(0-7)輸出高電平
  
  PUCR_PUPBE = 1;             //PB口上拉使能
  
 while(1)
  {
        //按鍵未按下
        if(PORTB_PB0 == 1)
        {
           PORTD_PD0 = 1;    //LED關閉
        }
        //按鍵按下
        else
        {
           delayms(10);      //延時消除按鍵抖動
           if(PORTB_PB0 == 0)
           PORTD_PD0 = 0;    //LED開啟
        }
    
  }            
 
 
}


2.5PWM配置



/*****************************************************************
**    程式名:MC9S12G128 PWM
**    參  數:無
**    功  能:初始化G128PWM,頻率,16KHz,佔空比50%  
**    注  意:匯流排時鐘需超頻至32MHz
**    作  者:趙露露
**    版  本:v1.0
**    時  間:2012.5.11   
******************************************************************/
#include <hidef.h>            /* common defines and macros */
#include "derivative.h"       /* derivative-specific definitions */
 
 
/*****************************************************************
**    函式名: delayms()
**    參  數:xms
**    功  能:在32MHz匯流排時鐘下大約延時xms毫秒  
**    注  意:    
******************************************************************/
void delayms(uint xms)
{
  uint z,j;
	for(z=xms;z>0;z--)
	    for(j=5340;j>0;j--);
}
/*****************************************************************
**    函式名: PLL_Init()
**    參  數:無
**    功  能:將G128超頻至16M,32M,64M  
**    注  意:    
******************************************************************/
void PLL_Init(void) 
{
  CPMUPROT = 0x26;            //保護時鐘配置暫存器
  CPMUCLKS_PSTP = 0;          //禁用PLL
  CPMUCLKS_PLLSEL = 1;        //選擇PLL作為系統時鐘源
  CPMUOSC_OSCE = 1;           //外部晶振使能
  
  CPMUSYNR = 0x07;            //fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)                     
  CPMUREFDIV = 0x03;          //16M:07,0F;32M:07,07;64M:07,03
    
  CPMUPOSTDIV = 0x00;         // PLL CLOCK = VCO CLOCK / (POSTDIV + 1) 
                              //BUS CLOCK = PLL CLOCK/2
  _asm(nop);
  _asm(nop);
  
  CPMUPLL=0x10;               //鎖相環調頻啟用,用以減少噪音
    
  while(CPMUFLG_LOCK == 0);	  //等待PLL穩定	  
  CPMUPROT = 0x00;            //關閉保護時鐘
  
 }
 
/*****************************************************************
**    函式名: PWM_Init()
**    參  數:無
**    功  能:初始化G128的PWM模組  
**    注  意:01 23通道級聯使用    
******************************************************************/
static void PWM_Init(void)
{
  PWME_PWME0 = 0;             //禁止通道
  PWME_PWME1 = 0;
  PWME_PWME2 = 0;
  PWME_PWME3 = 0;
  
  PWMCTL_CON01 = 1;           //01,23通道連線成16位PWM使用
  PWMCTL_CON23 = 1;
  
  PWMCNT0 = 0x00;             //0123通道計數被禁止
  PWMCNT1 = 0x00;
  PWMCNT2 = 0x00;
  PWMCNT3 = 0x00;
  
  PWMPRCLK = 0x00;            //預分頻 A、B 1分頻 32MHz
  
        
  PWMSCLB = 0x01;             //0x01 : SB_CLK = B_CLK  / (1*2) == 16MHz
                              //SB時鐘設定
  PWMSCLA = 0x01;             //0x01 : SA_CLK = B_CLK  / (1*2) == 16MHz
                              //SA時鐘設定
  PWMPOL_PPOL1 = 1;           //起始高電平 
  PWMCLK_PCLK1 = 1;           //PWM1---SB   時鐘源的選擇 
  PWMPOL_PPOL3 = 1; 
  PWMCLK_PCLK3 = 1;           //SA時鐘設定
  
  PWMCAE_CAE1 = 0;            //對齊方式設定
  PWMCAE_CAE3 = 0;
  
  PWMDTY01 = 500;             // Duty cycle =    佔空比暫存器設定 3500
  PWMPER01 = 1000;            //週期==(1/16M)*(1000)= ms; 16kHz 週期暫存器設定 
  PWMDTY23 = 500;             
  PWMPER23 = 1000;            //週期==(1/16M)*(1000)= ms; 16kHz 
  
  PWME_PWME1 = 1;             //Enable  PWM             使能   
  PWME_PWME3 = 1;
                               
}
void main(void) 
{
  DDRD = 0xFF;                //設定PD(0-7)方向為輸出
  PORTD = 0xFF;               //設定PD(0-7)輸出高電平
 
  PLL_Init();
  PWM_Init();
                              
  while(1)
  {
    PORTD_PD0 = ~PORTD_PD0;   //LED取反
    delayms(1000);
  }            
 
}


2.6 ADC配置







/*****************************************************************
**    函式名: AD_Init()
**    參  數:無
**    功  能:AD初始化  
**    注  意:    
******************************************************************/  
void AD_Init(void) 
{  
  //8路通道   
  ATDCTL1=0x20;   //7:1-外部觸發,65:00-8位精度,01-10位精度,4:放電,3210:ch
  ATDCTL2=0x40;   //忽略外部觸發,中斷禁止    
  ATDCTL3=0x80;   //右對齊無符號,每次轉換8個序列, 無緩衝, 凍結模式下繼續轉換    
  ATDCTL4=0x01;   //765:取樣時間為4個AD時鐘週期,ATDClock=[BusClock*0.5]/[PRS+1]
  ATDCTL5=0x30;   //6:0特殊通道禁止,5:1連續轉換 ,4:1多通道輪流取樣
  ATDDIEN=0x00;   //作為AD用,IO口禁止 
} 
/*****************************************************************
**    函式名: ReadATD()
**    參  數:ch:讀取第ch通道電壓值
**    功  能:讀取AD採集的電壓值  
**    注  意:10位精度    
******************************************************************/  
ReadATD(byte ch)
{
  signed int ad = 0;        //存放採集電壓值
  while(ATDSTAT0_SCF == 0); //等待轉換完成
  switch(ch)
  {
    default:
    case 0:
      ad = ATDDR0;
    break;
    case 1:
      ad = ATDDR1;
     break;
    case 2:
      ad = ATDDR2;
    break;
    case 3:
      ad = ATDDR3;
    break;
    case 4:
      ad = ATDDR4;
    break;
    case 5:
      ad = ATDDR5;
    break;
    case 6:
      ad = ATDDR6;
    break;
    case 7:
      ad = ATDDR7;
    break;   
  }
  return ad;
}

2.7 EE配置

啟用PE配置驅動,提示報錯: +ERROR: Compiler option -CpPPAGE=0x15 (address of PPAGE register) or -CpPPAGE=RUNTIME must be set to compile the generated code correctly (current target settings, Compiler for HC12, Options, Code Generation tab, PPAGE register is used for paging). After compiler option change, run Code design to apply the change in Processor Expert. For details, see Help of the component.

2.8 IIC配置

2.9 SCI配置


/*****************************************************************
**    程式名:MC9S12G128 串列埠
**    參  數:BusCLK_nM 匯流排時鐘
**    功  能:使用G128串列埠通訊  
**    注  意:程式中使用的是G128的第一路串列埠,即(S0,S1)
**    作  者:
**    版  本:v1.0
**    時  間:2012.5.9   
******************************************************************/
 
#include <hidef.h>      
#include "derivative.h"      
#include <ctype.h>
#include <string.h>
#include <stdarg.h>
 
 
#define BusCLK_nM 16000000
 
#pragma CODE_SEG DEFAULT 
#define CR_as_CRLF  TRUE             // if true , you can use "\n" to act as CR/LF, 
                                     // if false, you have to use "\n\r",but can get a higher speed  
static int do_padding;
static int left_flag;
static int len;
static int num1;
static int num2;
static char pad_character;
 
unsigned char uart_getkey(void)
{  
   while(!(SCI0SR1&0x80)) ; 		 //keep waiting when not empty  
   return SCI0DRL;
}
 
void uart_putchar(unsigned char ch)
{ 
  if (ch == '\n')  
  {
      while(!(SCI0SR1&0x80)) ;     
      SCI0DRL= 0x0d;       				 //output'CR'
	    return;
  }
  while(!(SCI0SR1&0x80)) ; 		    //keep waiting when not empty  
  SCI0DRL=ch;
}
 
void putstr(char ch[])
{
  unsigned char ptr=0;
  while(ch[ptr]){
      uart_putchar((unsigned char)ch[ptr++]);
  }     
  
}
                                                 
static void padding( const int l_flag)
{
   int i;
 
   if (do_padding && l_flag && (len < num1))
      for (i=len; i<num1; i++)
          uart_putchar( pad_character);
}
 
static void outs( char* lp)
{
  /* pad on left if needed                          */
  len = strlen( lp);
  padding( !left_flag);
 
  /* Move string to the buffer                      */
  while (*lp && num2--)  uart_putchar( *lp++);
 
  /* Pad on right if needed                         */
  len = strlen( lp);
  padding( left_flag);
}
 
static void reoutnum(unsigned long num, unsigned int negative, const long base ) 
{
  char* cp;
  char outbuf[32];
  const char digits[] = "0123456789ABCDEF";
 
  /* Build number (backwards) in outbuf             */
  cp = outbuf;
  do {
    *cp++ = digits[(int)(num % base)];
    } while ((num /= base) > 0);
  if (negative)  *cp++ = '-';
  *cp-- = 0;
 
  /* Move the converted number to the buffer and    */
  /* add in the padding where needed.               */
  len = strlen(outbuf);
  padding( !left_flag);
  while (cp >= outbuf)
    uart_putchar( *cp--);
  padding( left_flag);
}
 
static void outnum(long num, const long base ,unsigned char sign)//1, signed  0 unsigned
{   
  unsigned int negative;
 
  if ( (num < 0L) && sign ) 
  {  
    negative=1;
    num = -num;
  }
  else negative=0;
 
  reoutnum(num,negative,base);  
} 
 
static int getnum( char** linep)
{
   int n;
   char* cp;
 
   n = 0;
   cp = *linep;
   while (isdigit(*cp))
      n = n*10 + ((*cp++) - '0');
   *linep = cp;
   return(n);
}
 
void printp( char* ctrl, ...)
{ 
   int long_flag;
   int dot_flag;
 
   char ch;
   va_list argp; 
   va_start( argp, ctrl); 
   for ( ; *ctrl; ctrl++) {  
      /* move format string chars to buffer until a  format control is found. */
      if (*ctrl != '%') {
         uart_putchar(*ctrl);
#if CR_as_CRLF==TRUE         
         if(*ctrl=='\n') uart_putchar('\r');
#endif         
         continue;
         } 
      /* initialize all the flags for this format.   */
      dot_flag = long_flag = left_flag = do_padding = 0;
      pad_character = ' ';
      num2=32767;  
try_next:
      ch = *(++ctrl);
      if (isdigit(ch)){
         if (dot_flag)
            num2 = getnum(&ctrl);
         else {
            if (ch == '0')
               pad_character = '0'; 
            num1 = getnum(&ctrl);
            do_padding = 1;
         }
         ctrl--;
         goto try_next;
      }       
      switch (tolower(ch)) {
         case '%':
              uart_putchar( '%');
              continue;  
         case '-':
              left_flag = 1;
              break;  
         case '.':
              dot_flag = 1;
              break;  
         case 'l':
              long_flag = 1;
              break;  
         case 'd':
              if (long_flag ==1 ) 
              {
              		if(ch == 'D')                {outnum( va_arg(argp, unsigned long), 10L , 0);continue;}
              	        else  /* ch == 'd' */        {outnum( va_arg(argp, long), 10L,1);continue;}
              }
              else 
              {
              		if(ch == 'D') {outnum( va_arg(argp, unsigned int),10L,0);continue;}
              		else  /* ch == 'd' */        
              		{
              		  outnum( va_arg(argp, int), 10L,1);
              		  continue;
              		}
              }                 
         case 'x':    // X 無符號 , x  有符號
              if (long_flag ==1 )
              {
              	if(ch == 'X')                
              	{
              	  outnum( va_arg(argp, unsigned long), 16L,0);
              	  continue;
              	}
              	else  /* ch == 'x' */        
              	{
              	  outnum( va_arg(argp, long), 16L,1);
              	  continue;
              	} 
              }
              else
              {
              	if(ch == 'X')                
              		{
              		  outnum( va_arg(argp, unsigned int), 16L,0);
              		  continue;
              		}
              		else  /* ch == 'x' */        
              		{
              		  outnum( va_arg(argp, int), 16L,1);
              		  continue;
              		}
              } //如果按照16進位制列印,將全部按照無符號數進行
              continue; 
         case 's':
              outs( va_arg( argp, char*));
              continue;   
         case 'c':
              uart_putchar( va_arg( argp, int));
              continue;  
         default:
              continue;
         }
      goto try_next;
      }
   va_end( argp);
}
 
 
/*****************************************************************
**    函式名: PLL_Init()
**    參  數:無
**    功  能:將匯流排時鐘倍頻至16M,32M,64M
**    注  意:    
******************************************************************/   
void PLL_Init(void) 
{
  CPMUPROT = 0x26;            //保護時鐘配置暫存器
  CPMUCLKS_PSTP = 0;          //禁用PLL
  CPMUCLKS_PLLSEL = 1;        //選擇PLL作為系統時鐘源
  CPMUOSC_OSCE = 1;           //外部晶振使能
  
  CPMUSYNR = 0x07;            //fVCO= 2*fOSC*(SYNDIV + 1)/(REFDIV + 1)                     
  CPMUREFDIV = 0x07;          //16M:07,0F;32M:07,07;64M:07,03
    
  CPMUPOSTDIV = 0x00;         // PLL CLOCK = VCO CLOCK / (POSTDIV + 1) 
                              
  _asm(nop);
  _asm(nop);
  
  CPMUPLL=0x10;               //鎖相環調頻啟用,用以減少噪音
    
  while(CPMUFLG_LOCK == 0);	  //等待PLL穩定	  
  CPMUPROT = 0x00;            //關閉保護時鐘
  CPMUCLKS_PLLSEL = 1;        //使能PLL
 }
 
static void SCI_Init(void) 
{
    SCI0CR1 = 0x00;
    SCI0CR2 = 0x2c;             //使能接收中斷,傳送與接收使能
    SCI0BD  = BusCLK_nM/16/9600;//超頻至32MHz時,匯流排頻率為16MHz 
                                //SCI0BDL=busclk/(16*SCI0BDL)
                                //busclk  8MHz, 9600bps,SCI0BD=0x34
                                //busclk 16MHz, 9600bps,SCI0BD=0x68
                                //busclk 24MHz, 9600bps,SCI0BD=0x9C
}                               //busclk 32MHz, 9600bps,SCI0BD=0xD0  
                                //busclk 40MHz, 9600bps,SCI0BD=0x106
  
/*****************************************************************
**    函式名: delayms()
**    參  數:xms
**    功  能:在32MHz匯流排時鐘下大約延時xms毫秒  
**    注  意:    
******************************************************************/
void delayms(uint xms)
{
  uint z,j;
	for(z=xms;z>0;z--)
	    for(j=5340;j>0;j--);
}
 
void main(void)
{
  unsigned char LedCnt=0;
  
  PLL_Init();
  SCI_Init();
  DDRD = 0xFF; 
  PORTD = 0;  
  EnableInterrupts;  
 
  for(;;) 
  {   
    delayms(1000);   //延時
    PORTD = ~LedCnt;    //LED取反 
    
    putstr("http://blog.csdn.net/dazhaozi\n");
    
  }
}

2.10 SPI配置



SPI 可定義為主機或從機方式,主要特性如下:(1)全雙工、三線同步傳送。(2)單個數據引腳的雙向傳送方式(單線雙向模式)(3)主機或從機工作方式。(4)每一晶體頻率下可通過程式選擇八種不同的主機位傳送頻率。(5)主機位傳送頻率最大 4MHz,當 MCU 匯流排頻率=8MHz 時最小為 31.25kHz。(6)從機位傳送頻率最大 4MHz,允許頻率範圍為 0-4MHz。(7)可程控設定位時鐘極性、相位和資料位傳送順序,即可選高位在前或低位在前。(8)傳送完成中斷標誌。(9)多主機系統控制衝突保護中斷標誌。(10)寫衝突標誌保護。(11)可方便地與各種簡單擴充套件器件介面,如 PLL、D/A、鎖存器、LCD 顯示驅動器等


2.11 CAN配置



2.12 看門狗配置











附件列表