找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5347|回復: 0
收起左側

MC9S12中文版培訓教材下載(WORD格式)

[復制鏈接]
ID:379731 發(fā)表于 2018-7-27 09:59 | 顯示全部樓層 |閱讀模式
目錄
第一章 PWM模塊
第一節(jié)  PWM模塊介紹
第二節(jié)  PWM寄存器簡介
2.1   PWME寄存器
2.2   PWMPOL寄存器
2.3   PWMCLK寄存器
2.4   PWMPRCLK寄存器
2.5   PWMCAE寄存器
2.6   PWMCTL寄存器
2.7   PWMSCLA寄存器
2.8   PWMCNTx寄存器
2.9   PWMPERx寄存器
2.10  PWMDTYx寄存器
第三節(jié)  PWM應用實例
3.1  周期和占空比計算舉例
3.2  PWM初始化步驟總結
3.3  PWM應用實例
第二章 ECT模塊
第一節(jié)  ECT模塊介紹
1.1 簡述
1.2 特征
1.3 運行模式
1.4 ECT的組成與工作模式
1.5 ECT的工作過程與設置
第二節(jié)  ECT寄存器簡介
2.1   IC/OC選擇寄存器(TIOS)
2.2   輸出比較通道7屏蔽寄存器(OC7M)
2.3   輸出比較通道7數(shù)據(jù)寄存器(OC7D)
2.4   定時器核心寄存器(TCNT)
2.5   計時器系統(tǒng)控制寄存器1(TSCR1)
2.6   計時器溢出綁定寄存器1(TTOV)
2.7   控制寄存器(TCTLl-TCTL4)
2.8   計時器中斷使能寄存器(TIE)
2.9   計時器系統(tǒng)控制寄存器2(TSCR2)
2.10  主定時器中斷標志寄存器(TFLG1、TFLG2)
2.11  IC/OC寄存器(TC0-TC7)
2.12  脈沖累加器A控制寄存器(PACTL)
2.13  脈沖累加器A標志寄存器(PAFLG)
2.14  脈沖累加寄存器(PACN3、PACN2、PACN1、PACN0)
2.15  模數(shù)遞減計數(shù)器控制寄存器(MCCTL)
2.16  輸入脈沖累加器控制寄存器(ICPAR)
2.17  輸入覆蓋控制寄存器(ICOVW)
2.18  輸入系統(tǒng)控制寄存器(ICSYS)
2.19  脈沖累加器B控制寄存器(PBCTL)
2.20  脈沖累加器B標志寄存器(PBFLG)
2.21  脈沖累加器保持寄存器(PA3H-PA0H)
2.22  模數(shù)遞減計數(shù)器工作寄存器(MCCNT)
2.23  IC保持寄存器(TC0H-TC3H)
第三節(jié)  ECT應用實例
3.1  定時器編程步驟
3.2  輸入捕捉IC:
3.3  通道6輸出比較
3.4  通道7輸出比較
3.5  模數(shù)遞減計數(shù)器
第三章 SCI模塊
第一節(jié)  SCI寄存器簡介
1.1  波特率控制寄存器(SCIBDH、SCIBDL)
1.2  控制寄存器1(SCICR1)
1.3  控制寄存器2(SCICR2)
1.4  狀態(tài)寄存器1(SCISR1)
1.5  狀態(tài)寄存器2(SCISR2)
1.6  數(shù)據(jù)寄存器(SCIDRH、SCIDRL)
第二節(jié)  SCI應用示例
第四章 SPI模塊
第一節(jié)  SPI模塊介紹
1.1  SPI的功能特點
1.2  SPl的組成與工作設置
第二節(jié)  SPI寄存器簡介
2.1  SPI控制寄存器1(SPICR1)
2.2  SPI控制寄存器2(SPICR2)
2.3  SPI波特率選擇寄存器
2.4  SPI狀態(tài)寄存器
2.5  SPI數(shù)據(jù)寄存器
第三節(jié)  SPI應用實例
第五章 A/D轉換模塊
第一節(jié)  A/D模塊介紹
1.1  A/D轉換原理
1.2  A/D轉換原理的應用前景
1.3  A/D轉換模塊
1.4  功能結構圖
1.5  HCS12A/D特點
第二節(jié)  A/D寄存器簡介
2.1  控制寄存器2(ATDCTL2)
2.2  控制寄存器3(ATDCTL3)
2.3  控制寄存器4(ATDCTL4)
2.4  控制寄存器5(ATDCTL5)
第三節(jié)  A/D應用示例
3.1  編程步驟
3.2  A/D程序示例—單通道查詢
3.3  A/D程序示例—濾波
3.4  A/D程序示例—定時采樣
第六章 EEPROM模塊
第一節(jié)  EEPROM模塊介紹
1.1  EEPROM功能
1.2  EEPROM結構
1.3  EEPROM特點
第二節(jié)  EEPROM寄存器簡介
2.1  時鐘分頻寄存器ECLKDIV
2.2  配置寄存器ECNFG
2.3  保護寄存器EPROT
2.4  狀態(tài)寄存器ESTAT
2.5  命令寄存器ECMD
第三節(jié)  EEPROM應用實例
3.1  EEPROM的寫入操作
3.2  EEPROM的擦除操作
3.3  EEPROM示例程序
第七章 FLASH模塊
第一節(jié)  FLASH模塊介紹
1.1  FLASH功能
1.2  FLASH結構
1.3  FLASH特點
第二節(jié)  FLASH寄存器簡介
2.1 時鐘分頻寄存器FCLKDIV
2.2 配置寄存器 FCNFG
2.3 安全寄存器 FSEC
2.4 保護寄存器 FPROT
2.5 狀態(tài)寄存器 FSTAT 狀態(tài)寄存器
2.6 命令寄存器 FCMD
第三節(jié)  FLASH應用實例
3.1  FLASH的寫入操作
3.2  FLASH的擦除操作
3.3  FLASH的擦寫操作注意事項
3.4  FLASH示例程序
第八章 CodeWarrior IDE 12應用


第一章 PWM模塊第一節(jié)  PWM模塊介紹
PWM調(diào)制波有8個輸出通道,每一個輸出通道都可以獨立的進行輸出。每一個輸出通道都有一個精確的計數(shù)器(計算脈沖的個數(shù)),一個周期控制寄存器和兩個可供選擇的時鐘源。每一個PWM輸出通道都能調(diào)制出占空比從0—100%變化的波形。
PWM的主要特點有:
1、它有8個獨立的輸出通道,并且通過編程可控制其輸出波形的周期。
2、每一個輸出通道都有一個精確的計數(shù)器。
3、每一個通道的PWM輸出使能都可以由編程來控制。
4、PWM輸出波形的翻轉控制可以通過編程來實現(xiàn)。
5、周期和脈寬可以被雙緩沖。當通道關閉或PWM計數(shù)器為0時,改變周期和脈寬才起作用。
6、8字節(jié)或16字節(jié)的通道協(xié)議。
7、有4個時鐘源可供選擇(A、SA、B、SB),他們提供了一個寬范圍的時鐘頻率。
8、通過編程可以實現(xiàn)希望的時鐘周期。
9、具有遇到緊急情況關閉程序的功能。
10、每一個通道都可以通過編程實現(xiàn)左對齊輸出還是居中對齊輸出。









第二節(jié)  PWM寄存器簡介2.1   PWME寄存器
PWME寄存器每一位如圖2所示:
圖2  PWME寄存器
每一個PWM的輸出通道都有一個使能位PWMEx。它是用來啟動和關閉波形輸出的。當任意的PWMEx位置1,則相關的PWM輸出通道就立刻可用。然而實際的PWM波形的輸出還取決于時鐘源。
此寄存器在任何時間都是可讀、可寫的,復位時全置0。
用法: PWME7=1;    7通道可對外輸出波形。
       PWME7=0;    7通道不能對外輸出波形。
注意:在通道使能后所輸出的第一個波形可能是不規(guī)則的。當輸出通道工作在串聯(lián)模式時(PWMCTL寄存器中的CONxx位被設置),那么使能相應的16位PWM輸出通道是由PWMEx的低電平位控制的(詳情見PWMCTL寄存器)。
2.2   PWMPOL寄存器
PWMPOL寄存器每一位如圖3所示:
圖3  PWMPOL寄存器
每一個PWM輸出通道的波形都可以選擇是在高電平時翻轉,還是在低電平時翻轉。此功能就是由PWMPOL寄存器實現(xiàn)的。
此寄存器在任何時間都是可讀、可寫的,復位時全置0。
用法: PWMPOL0=1;  0通道對外輸出波形先是高電平然后再變?yōu)榈碗娖健?/div>
       PWMPOL0=0; 0通道對外輸出波形先是低電平然后再變?yōu)楦唠娖健?/div>2.3   PWMCLK寄存器
PWMCLK寄存器每一位如圖4所示:
圖4  PWMCLK寄存器
每一個PWM輸出通道都有兩個時鐘可供選擇(A、SA或B、SB)。0、1、4、5通道可選用A、SA時鐘,2、3、6、7通道可選用B、SB通道。此寄存器在任何時間都是可讀、可寫的,復位時全置0。應當注意的是,如果當一個PWM輸出波形正在產(chǎn)生時,時鐘改變,這時就會產(chǎn)生一個平頭的或線形脈沖。
此寄存器在任何時間都是可讀、可寫的,復位時全置0。
用法:               PCLK1=1;    1通道的時鐘源設為SA。
          PCLK1=0;    1通道的時鐘源設為A。此為默認時鐘
PWMCLK_PCLK=1;
2.4   PWMPRCLK寄存器
PWMPRCLK寄存器每一位如圖5所示:
圖5  PWMPRCLK寄存器
PWMPRCLK寄存器是單獨用來給時鐘源A、B進行預分頻的。
PCKB2—PCKB0是對B時鐘源進行預分頻。PCKA2 —PCKA0是對A時鐘源進行預分頻。這6位可以隨時被讀、被寫。復位時置0。
其A時鐘設置分頻值如圖6所示:
其B時鐘設置分頻值如圖7所示:

圖6  時鐘A預分頻選擇值         圖7  時鐘B預分頻選擇值
2.5   PWMCAE寄存器
PWMCAE寄存器每一位如圖8所示:
圖8 PWMCAE寄存器
PWMCAE寄存器包含8個控制位來對每個PWM通道設置左對齊輸出或居中對齊輸出。如果CAEx置為1,則為居中對齊輸出。如果置為0,則為左對齊輸出。應當注意的是,只有輸出通道被關閉后才能對其進行設置,即通道被激活后不能對其進行設置。
2.6   PWMCTL寄存器
PWMCTL寄存器每一位如圖9所示:
圖9  PWMCTL寄存器
此寄存器的2—7位為可讀、可寫位。只有當相應的通道關閉后,才能改變這些控制字。
控制字介紹:
PWMCTL_CON67=1;這時通道6、7就串聯(lián)為同一個輸出通道。此時只有7通道的控制字有用。例如:7通道的PWME寄存器決定了他們的輸出情況,7通道的PWMPOL寄存器決定了他們是高電平翻轉還是低電平翻轉,7通道的PWMCLK寄存器決定了他們兩個的時鐘源,7通道的PWMCAE寄存器決定了他們是左對齊輸出還是居中對齊輸出等。
CON67=0 ;這時6,7通道分別作為獨立輸出通道對外輸出。
CON45、CON23、CON01的用法同CON67相似。設置此控制字的意義在于擴大了PWM對外輸出脈沖的頻率范圍。
PSWAI=1;則MCU一旦處于等待狀態(tài),就會停止時鐘的輸入。這樣就不會因時鐘在空操作而費電。當它置為0,則MCU就是處于等待狀態(tài),也允許時鐘的輸入。
2.7   PWMSCLA寄存器
PWMSCLA寄存器每一位如圖10所示:
圖10  PWMSCLA寄存器
時鐘SA是通過對PWMSCLA寄存器的設置來對A時鐘進行分頻而產(chǎn)生的。
           Clock SA=Clock A /(2*PWMSCLA)
PWMSCLB寄存器同PWMSCLA寄存器相似,時鐘SB就是通過對PWMSCLB寄存器的設置來對B時鐘進行分頻而產(chǎn)生的。
其計算公式為:
             Clock SB=Clock B /(2*PWMSCLB)
2.8   PWMCNTx寄存器
PWMCNTx寄存器共有8個,每一個通道都有一個。下面以PWMCNT0為例對PWMCNTx寄存器進行介紹。
PWMCNT0寄存器每一位如圖11所示:
圖11  PWMCNT0寄存器
計數(shù)器以所選時鐘源的頻率運行。計數(shù)器在任何時候都可以被讀,而不影響計數(shù),也不影響對PWM通道的操作。
任何值寫入PWMCNT0寄存器都會導致計數(shù)器復位置0,且其計數(shù)方向會被設置為向上計數(shù),并且會立刻從緩沖器載入任務和周期值,并會根據(jù)翻轉極性的設置來改變輸出。當計數(shù)器達到計數(shù)值后,會自動清零。只有當通道使能后,計數(shù)器才開始計數(shù)。此寄存器隨時都可以對其進行讀、寫操作。
2.9   PWMPERx寄存器            
PWMPERx寄存器共有8個,每一個通道都有一個這樣的周期寄存器。這個寄存器的值就決定了相關PWM通道的周期。每一個通道的周期寄存器都是雙緩沖的,因此如果當通道使能后,改變他們的值,將不會發(fā)生任何作用,除非當下列情況之一發(fā)生:
*有效的周期結束。
*對計數(shù)器進行寫操作(計數(shù)器復位成0)。
*通道不可用(PWMEx=0)。
這樣就會使PWM輸出波形要么是新波形要么是舊波形,并不會在兩者之間進行交替變換。如果通道不可用,那么對周期寄存器進行寫操作,將會直接導致周期寄存器同緩沖器一起閉鎖。圖12所示的是PWMPER0寄存器。
圖12  PWMPER0寄存器。
周期的計算方法:
1) 當CAEx=0時,即進行左線性輸出時:
PWMx周期=通道時鐘周期*PWMPERx
2) 當CAEx=1時,即進行居中對齊輸出時:
PWMx周期=通道時鐘周期*(2*PWMPERx)
2.10  PWMDTYx寄存器
PWMDTYx寄存器也有8個,每一個通道都有一個這樣的占空比常數(shù)寄存器。這個寄存器的值就決定了相關PWM通道輸出波形的占空比。每一個通道的占空比寄存器都是雙緩沖的,因此如果當通道被激活后,改變他們的值,將不會發(fā)生任何作用,除非當下列情況之一發(fā)生:
*有寫操作(計數(shù)器復位成0)。
*通道沒有被激活(P效的周期結束。
*對計數(shù)器進行WMEx=0)。

應當注意的是,在對PWMDTYx和PWMPERx進行設置時,PWMPERx寄存器的值應當大于PWMDTYx寄存器的值。

這樣就會使PWM輸出波形要么是新波形要么是舊波形,并不會在兩者之間進行交替變換。如果通道沒有被激活,那么對占空比常數(shù)寄存器進行寫操作,將會直接導致周期寄存器同緩沖器一起閉鎖。
當計數(shù)值與占空比常數(shù)PWMDTY相等時,則比較輸出器有效,這時就會將觸發(fā)器置位,然后PWMCNT繼續(xù)計數(shù),當計數(shù)值與周期常數(shù)PWMPER相等時,比較器輸出有效,將觸發(fā)器復位,同時也使PWMCNT復位,結束一個輸出周期。
占空比的計算方法:
當PPOL=0時:
             占空比=[(PWMPERx—PWMDTYx)/ PWMPERx]*100%
當PPOL=1時:
占空比=(PWMDTYx/ PWMPERx)*100%







第三節(jié)  PWM應用實例3.1  周期和占空比計算舉例
1   設CAEx=0;即為左線形輸出。此時,設E=10 MHz(100 ns),PPOLx=0,PWMPERx=4  周期寄存器是4,PWMDTYx=1  。
則    PWMx輸出頻率=10 MHz/4=2.5 MHz  
      PWMx輸出周期=1/(2.5  M)=400ns
      PWMx 占空比= 3/4=25%
公式總結:
     當為左線性輸出時:
         PWMx輸出頻率=時鐘頻率/ PWMPERx
           當PPOLx=0時
           占空比=[(PWMPERx—PWMDTYx)/ PWMPERx]*100%
           當PPOLx=1時
占空比=[PWMDTYx/ PWMPERx]*100%
2   設CAEx=1;即為劇中線性輸出。此時,設E=10 MHz(100 ns),PPOLx=0,PWMPERx=4,PWMDTYx=1。
則    PWMx輸出頻率=10 MHz/(4*2)=1.25 MHz
      PWMx輸出周期=1/(1.25 M)=800ns
      PWMx 占空比= 3/4=25%
公式總結:
     當為居中線性輸出時:
         PWMx輸出頻率=時鐘頻率/(2* PWMPERx)
           當PPOLx=0時
           占空比=[(PWMPERx—PWMDTYx)/ PWMPERx]*100%
          當PPOLx=1時
占空比=[PWMDTYx/ PWMPERx]*100%
應當注意的是,在對PWMDTYx和PWMPERx進行設置時,PWMPERx寄存器的值應當大于PWMDTYx寄存器的值。
3.2  PWM初始化步驟總結
1、禁止PWM  Disable PWM
PWME=0;
2、選擇時鐘 Select clock (prescaler and scale) for the PWM
PWMPRCLK,PWMSCLA,PWMSCLB,PWMCLK
3、選擇極性  Select polarity
PWMPOL
4、選擇對齊模式 Select center or left aligned mode
PWMCAE
5、對占空比和周期編程Program duty cycle and period
PWMDTYx, PWMPERx
6、使能PWM通道  Enable used PWM channels
PWME=1
3.3  PWM應用實例
例1:輸出占空比為25%的波形
(1)實驗設備:HCS12編程器、開發(fā)板、示波器
(2)軟件程序設計:本例子是輸出占空比為25%,周期為500Hz的波形。JPb8的0通道,開發(fā)板的地線和示波器相連。
(3)源程序如下:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dp256.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
void main(void)
{
  PWME_PWME0=0;   //關閉0通道
  PWMPRCLK=0X05;  //對總線時鐘進行預分頻,總線時鐘為8M,分頻后為250K
  PWMCLK_PCLK0=0; //設A為其時鐘源
  PWMSCLA=0X7D;   //A時鐘為2000Hz
  PWMPOL_PPOL0=1;//上升沿翻轉
  PWMCAE_CAE0=0;//左對齊輸出
  PWMDTY0=0X01; //占空比為25%的波形
  PWMPER0=0X04;  //輸出為500Hz的波
  PWMCNT0=0X00;//0通道計數(shù)器清0
  PWME_PWME0=1;//0通道使能,0通道為輸出通道
}
例2:步進電機的控制
(1)實驗設備:HCS12編程器、開發(fā)板、步進電機、5804芯片、穩(wěn)壓電源
(2)功能實現(xiàn):控制步進電機轉動90度,按下中斷后電機連續(xù)轉動。
(3)源程序如下:
  1. #include <mc9s12dp256.h>     /* derivative information */

  2. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

  3. int i=0;

  4. void main(void)

  5. {

  6.   DDRJ=0x00;

  7.   PIEJ=0X03;

  8.   EnableInterrupts; //中斷設置

  9.   PWME=0;   //關閉所有通道

  10.   PWMCTL_CON01=1;//對PWM控制寄存器進行設置,0,1合為一個通道

  11.   PWMCNT1=0X00;//0,1通道計數(shù)器清0

  12.   PWMPOL_PPOL1=1;//上升沿翻轉

  13.   PWMCLK_PCLK1=0; //設A為其時鐘源

  14.   PWMPRCLK=0X00;  //不對A時鐘進行分頻

  15.   PWMCAE_CAE1=1;//中心對齊輸出

  16.   PWMPER1=0X20;         

  17.   PWMPER0=0x4e;//per等于40000,即100赫茲

  18.   PWMDTY1=0X10;

  19.   PWMDTY0=0X27;//dty等于20000

  20.   PWME_PWME1=1;//0,1通道使能

  21. for(;i<=1854;)

  22. {

  23.   if(PWMCNT0==0X4e)

  24.   i++;

  25. }               //步進電機轉90度

  26.   PWME=0;//0,1通道關閉

  27.   while(1){;}

  28. }

  29. #pragma CODE_SEG __NEAR_SEG NON_BANKED

  30. interrupt void man(void)

  31. {

  32.    if(PIFJ_PIFJ0==1)

  33.   {

  34.       PWMPER1=0X2a;         

  35.       PWMPER0=0x68;//per等于26666,即150赫茲

  36.       PWMDTY1=0X15;

  37.       PWMDTY0=0X34;//dty等于13333

  38.       PWME_PWME1=0xff;//0,1通道使能

  39.    }

  40. }

復制代碼


第二章 ECT模塊

第一節(jié)  ECT模塊介紹1.1 簡述
HC12增強型捕捉計時器模塊在HC12標準定時器的基礎上增加了一些特點,用以擴展它的應用范圍,特別是在汽車ABS方面。
基準計時器的核心仍然是一個16位的可編程計數(shù)器,其時鐘源來自一個預分頻器。該計時器可以被應用于多個方面,包括在對輸入波形進行測量的同時產(chǎn)生一個輸出波形。波形的脈寬可以在幾微秒到數(shù)秒的范圍內(nèi)變化。
對計數(shù)寄存器或者輸入捕捉/輸出比較寄存器的訪問可以發(fā)生在一個時鐘周期內(nèi)。對這些寄存器分別訪問其高字節(jié)和低字節(jié)與將它們作為一個字進行訪問所獲得的結果肯定不同。
1.2 特征
(1) 四個IC通道設置了16位保持寄存器,用于緩沖捕捉結果。
(2) 四個8位脈沖累加器、四個與緩沖IC通道關聯(lián)的8位保持寄存器。四個8位脈沖累加器通道可以級聯(lián),形成兩個16位的脈沖累加器。
(3) 具有4位定標器的16位遞減模數(shù)計數(shù)器。
(4) 四個可選的延遲計數(shù)器用于增強輸入抗干擾能力。
(5) 僅支持IP總線上的16位訪問。
1.3 運行模式
停止:由于時鐘停止,計時器和計數(shù)器均關閉。
凍結:計時器和計數(shù)器均保持運行,直到TSCR($06)的TSFRZ位被置1。
等待:計數(shù)器保持運行,直到TSCR($06)的TSWAI位被置1。
正常:計時器和計數(shù)器均保持運行,直到TSCR($06)的TEN位和MCCTL($26)的MCEN位被分別清0。
ECT增強模塊的存儲器圖譜見表55。每一個列出的寄存器地是其地址的偏移量?偟刂肥荅CT模塊的基地址與偏移地址之和。
1.4 ECT的組成與工作模式
ECT具有8個IC/OC通道、4個8位或者2個16位的脈沖累加器(PAD通道,其OC部分與第6章的TIM模塊相同,但IC及PAI部分與TIM模塊有一定區(qū)別,其中4個IC通道與TIM模塊相近,當相關引腳出現(xiàn)預定動作時,通過各自的捕捉寄存器TCn記錄定時器的值;另外四個IC通道,除了捕捉寄存器TCn,還各有一個緩沖器TCnH,稱為保持寄存器,可以在不產(chǎn)生中斷的前提下,連續(xù)兩次捕捉定時器的值。4個8位的PAl通道0-3與4個緩沖IC通道IC0-3相關聯(lián),并共享輸入引腳PORTT0-3。每一個脈沖累加器通道都擁有一個緩沖器PACnH,也稱為保持寄存器,可以在外部引腳出現(xiàn)預定動作時,保存它的累加值。兩對8位的脈沖累加器還可以通過級聯(lián)形成16位的脈沖累加器PACA、PACB。
16位遞減模數(shù)計數(shù)器(MDC)是ECT增設的,它既是一個功能完善的定時器,具有獨立的可程控定標器、自動重裝載和中斷能力,又可為IC、PAI寄存器向保持寄存器的傳送提供定時控制信號。每當MDC回0時,將在給定的時間段內(nèi)控制IC和PAI寄存器的內(nèi)容向各自的緩沖寄存器傳輸。當然,MDC也可作為具有定時中斷功能的獨立時鐘基準。
1.4.1  IC通道組
IC通道組由四個標準的緩沖通道IC0-IC3和四個非緩沖通道IC4-IC7組成,兩部分的基本功能都是捕捉外部事件發(fā)生的時刻,但是緩沖通道除了IC/OC寄存器TCn外,還設有保持寄存器TCnH,此外還在入口設置了延遲計數(shù)器,用來提高抗干擾能力。非緩沖通道沒有保持寄存器,入口也沒有延遲計數(shù)器,但每個通道入口設置了一個2輸入端的多路器,事件觸發(fā)信號可以是來自本通道的輸入引腳PORTn,也可以是來自其關聯(lián) 通道PORT(n-4)的延遲計數(shù)器輸出,使用更加靈活。當延遲功能有效時,輸入引腳檢測到一個有效的邊沿后,延遲計數(shù)器開始對P時鐘(模塊時鐘)進行計數(shù),當?shù)竭_設定的計數(shù)值后,延遲計數(shù)器在其輸出端有條件地產(chǎn)生一個脈沖,這個條件就是延遲前后的引腳電平相反。這樣可以避免對窄輸入脈沖做出反應。延遲計數(shù)結束后,計數(shù)器自動清除。輸入信號兩個有效邊沿之間的持續(xù)時間必須大于設定的延遲時間。
  在ECT中,所有IC通道均設置了覆蓋保護功能,可以通過寄存器ICOVW設置是否允許某個通道用新的捕捉結果覆蓋上一個結果。
對于緩沖的IC通道PT0-PT3,還具有鎖存與隊列兩種工作方式。在鎖存方式下,每個有效的引腳事件只將自由定時器的值放入捕捉寄存器TCn,而TCn到保持寄存器TCnH的傳送必須依賴遞減模數(shù)計數(shù)器回0或者其他強制鎖存命令才能實現(xiàn),這時IC的工作情形與第6章的TIM模塊相似。在隊列方式下(圖7-2),TCn與TCnH形成了一個類似先進先出的隊列,每個捕捉結果從TCn進入,然后隨著下一個捕捉結果的到來移入TCnH,程序可以從TCnH取得結果,然而這個隊列是開放的,即程序也可以直接從TCn取得捕捉結果。隊列方式為CPU提供了充分的響應時間。
由于PAC0-3與IC0-3共享相同的引腳,而且共享入口的邏輯,因此在兩種方式下,PAI與IC都可以同時工作,對同一引腳進行記錄,前者記錄脈沖或者邊沿的數(shù)量,后者記錄具體的時刻。
1.4.2  脈沖累加器
脈沖累加器由4個8位的通道PAC0-PAC3組成,可以通過級聯(lián)形成兩個 16位通道PACA、PACB,它可以統(tǒng)計輸入引腳上出現(xiàn)的有效邊沿的數(shù)量,也可以統(tǒng)計有效電平出現(xiàn)的累計時間。各個通道的8位保持寄存器是與4個緩沖IC通道相關聯(lián)的,它們共享邊沿檢測與延遲電路。當IC工作在兩種不同的隊列方式時, PAC保持寄存器也處于不同的工作狀態(tài),在鎖存方式下,PCnH的加載依靠MDC計數(shù)器或者強制命令實現(xiàn),而在隊列方式下,則依靠IC通道的TCnH讀命令。可見在ECT模塊下, IC與PAI的工作聯(lián)系更加緊密。
此外,脈沖累加器還有飽和記憶功能,當8位的脈沖累加器計數(shù)超過$FF后記憶保持,而不回滾到0,這時,計數(shù)值$FF意味著計數(shù)已經(jīng)達到或超過255,如不需要,該功能可以關閉。這可以用來監(jiān)視某個通道的計數(shù)值是否已經(jīng)達到預定的目標值。
值得注意的是,PACl、PAC0級聯(lián)后,輸入引腳為PT0,而PAC3、PAC2級聯(lián)后,輸入引腳并不是PT2,而是PT7,這樣可以與那些無ECT的MCU保持一致性。
1.4.3  模數(shù)遞減計數(shù)器
16位遞減模數(shù)計數(shù)器(MDC)可以用作時鐘基準,產(chǎn)生周期性的中斷請求,也可用于將IC寄存器和脈沖累加器的值鎖存到各自的保持寄存器中。鎖存動作可以通過程序設定為周期性的或一次性的。MDC的時鐘頻率可通過獨立的定標器設定,內(nèi)部設有定時常數(shù)寄存器,可以實現(xiàn)自動重裝載,但MDC的常數(shù)寄存器與MDC計數(shù)器使用相同的地址,加載時通過特殊的時序?qū)崿F(xiàn)。
每當MDC回0時,將在給定的時間段內(nèi)控制貯和PAI寄存器的內(nèi)容向各自的緩沖寄存器傳輸。反映了MDC在IC、PAI系統(tǒng)中的作用。
1.5 ECT的工作過程與設置1.5.1  自由定時器、模數(shù)遞減計數(shù)器與時鐘頻率設置
ECT的自由定時器與TIM模塊基本相同,惟一的區(qū)別是TMSK2中的 PR2-PR0提供了7個預分頻系數(shù)選項,包括1、2、4、8、16、32、64、128,而原來的TIM只提供了前6個選項,這樣定時器時鐘頻率可以更低,周期更長。
ECT特有的模數(shù)遞減計數(shù)器(MDC)邏輯結構,其核心為一個16位的遞減計數(shù)器MDC($37、$36),其外圍配備了常數(shù)寄存器MCCNT和預分頻器,分別為其提供定時常數(shù)和時鐘信號。當寄存器MCCTL中的MCEN=0時,MDC被復位成$FFFF,以避免在計數(shù)器啟動的初期置位中斷標志。將MCEN置1,MDC啟動并從當前值開始對預分頻器輸出的時鐘進行遞減計數(shù),分頻系數(shù)為1、4、8、16可選,具體由MCCTL中的MCPR1 、 MCPRO確定(參看后面關于MCCTL的說明)。
MDC有兩種工作方式,由MODMC決定,當MODMC=0時,MDC為單此計數(shù)方式,回到$0000后停止,反之為循環(huán)工作方式。
無論在那種方式下,當MDC計數(shù)回0后,首先置位寄存器MCFLG($27)的MCZF標志,若MCCTL中的中斷允許位MCZI=1,則向CPU發(fā)出中斷請求,中斷矢量為$FFCC、 $FFCD,向MCFLG的MCZF位寫1將清除該標志。MDC回0的另一個動作是向IC、PAC發(fā)出數(shù)據(jù)保持命令(參看IC、PAC部分),這是MDC的重要任務之一。此外在連續(xù)方式即 MODMC=1時,MDC回0后還將自動從MCCNT加載定時常數(shù),但在單次方式即MODMC=0時,MDC回0后停止。
MCCNT與MDC占用相同的I/O地址($37、$36),由控制位RDMCL決定每次讀操作的具體訪問對象。當RDMCL=0/1時,讀操作分別返回MDC和MCCNT的當前值。對 MCCNT的寫操作要求在MODMC=1時進行,但MDC并不立即更新,必須等到計數(shù)器回0后重新加載,但向寄存器MCCTL($26)中的FLMC位寫1可以實現(xiàn)MDC的立即加載,同時還將復位預分頻器。如果MODMC:0,對地址$37、$36進行寫入操作也將復位預分頻器,并用寫入值立即更新MDC計數(shù)器,然后開始一次遞減計數(shù),回到$0000后停止?梢娫趩未畏绞较驴梢灾苯又付ǘ〞r常數(shù),而在連續(xù)方式下則必須通過常數(shù)寄存器 MCCNT。
當寄存器ICSYS($AB)中的LATQ、BUFEN均為1時,如果將$0000寫入到MCCNT和模數(shù)計數(shù)器,輸入捕捉和脈沖累加寄存器將被鎖存。將$0000寫入到MCCNT后,模數(shù)計數(shù)器將保持為0,且不會將MCFLG中的MCZF標志置位。
1.5.2  IC通道組
IC通道分為緩沖與非緩沖兩類,緩沖類又具有鎖存與隊列兩種工作方式,下面分別介紹其邏輯結構與寄存器的設置。
1.緩沖的IC通道
緩沖的IC通道共有四個,即PT0-3,其最大特點是在捕捉寄存器TCn的基礎上,又增加了保持寄存器TCnH,這樣可以連續(xù)兩次捕捉而不需要CPU干預。
單個緩沖IC通道主要由有效輸入邊沿檢測、延遲濾波、捕捉與保持寄存器子系統(tǒng)等組成。當TIOS的IOS0=0,即PT0設置為IC輸入后,每當PT0引腳的邏輯電平發(fā)生變化時,內(nèi)部邊沿檢測電路首先對其進行判別,判別的規(guī)則由寄存器TCLA中的EDGOB、EDGOA決定,判別的結果送到延遲計數(shù)器進行濾波處理。所謂濾波,即啟動延遲計數(shù)器開始對P時鐘(模塊時鐘)進行計數(shù),當?shù)竭_預先設定的計數(shù)值后,延遲計數(shù)器在其輸出端有條件地產(chǎn)生一個脈沖,這個條件就是延遲前后的引腳電平相反。這樣可以避免對窄輸入脈沖做出反應。延遲時間由寄存器DLYCT中的DLY1、DLY0控制,四個選項分別為0(旁路)、256、512、1024個P時鐘周期。延遲計數(shù)結束后,計數(shù)器自動清除,輸入信號兩個有效邊沿之間的持續(xù)時間必須大于選定的延遲時間。
延遲后的有效信號送到捕捉邏輯,然后根據(jù)ICOVW、ICSYS等相關位的設置決定是否捕捉TCNT的當前值以及是否處理保持寄存器TCOH,此外還要決定是否設置中斷請求標志——寄存器TFLGl中的COF。一旦COF置位,如果COI=1且CCR中的I=1,CPU將會收到中斷請求并予以響應,中斷矢量為$FFEE、$FFEF。通過寄存器TFLG1向C0F寫1將清除該標志位。對于鎖存方式和隊列方式,緩沖IC通道的捕捉條件和標志位的設置條件有所不同,下面將分別介紹。
(1)鎖存方式。當設定為該方式時(LATQ=1),有效的引腳事件將主定時器值復制到寄存器TC0。在下述情況下,TC0還將被鎖存到各自的保持寄存器中,這些情況包括模數(shù)計數(shù)器自然回0、向模數(shù)計數(shù)器直接寫$0000、向控制寄存器MCCTL中的ICLAT位直接寫1等。若寄存器ICOVW中的NOVWx位被清0,而這時出現(xiàn)新的捕捉事件,IC寄存器的內(nèi)容將被新值覆蓋。如果發(fā)生鎖存操作,那么保持寄存器的內(nèi)容也會被覆蓋。若寄存器ICOVW中的NOVWx位被置1,  那么捕捉寄存器和保持寄存器必須處于 清空狀態(tài)才允許寫入,否則不能寫入。這樣可以避免讀取或者轉移到保持寄存器前,TC0被覆蓋。
(2)隊列方式(參看圖7-2)。當設定為該方式時(LATQ=0),有效的引腳事件將主定時器值復制到IC寄存器。寄存器ICOVW中的NOVWx位被清0,而這時出現(xiàn)新的捕捉事件,IC寄存器的內(nèi)容將被轉移到保持寄存器。空出來的IC寄存器存放新的捕獲值。若寄存器ICOVW中的NOVWx位被置1,那么捕捉寄存器和保持寄存器必須處于清空狀態(tài)才允許寫入,否則不能寫入。在該方式下讀保持寄存器TC0H會將相關的脈沖累加器值轉移到對應的保持寄存器。在上述兩種方式下,C3F-C0F中斷標志的建立條件如圖7-6所示。
2.非緩沖IC通道
這類通道與TIM模塊相似,但是增加了覆蓋控制位、入口處的延遲計數(shù)器及引入了雙引腳控制(例如PT0)。當PT4引腳出現(xiàn)有效事件時,主定時器的值可能被記錄到IC寄存器TC4,但是受覆蓋控制寄存器ICOVW的影響,具體如下:
(1)如果輸入覆蓋控制寄存器ICOVW中的對應位NOVWx為0,當發(fā)生新的捕捉事件時,IC寄存器將用新的時間值覆蓋上次捕捉結果。
(2)如果上述控制位為1,那么IC寄存器將不被覆蓋,除非此時它處于清空狀態(tài)。這可以阻止捕捉值在讀取之前被覆蓋掉。
1.5.3  脈沖累加器
ECT的四個8位的脈沖累加器可以獨立使用,也可級聯(lián)使用,這樣可以滿足不同的分辨率和通道數(shù)量要求。具體取決于PAEN、PBEN以及PAEN3-PAEN0的設置。當PAEN=PBEN=0時,PAC3-PAC0獨立工作,當PAENn=1時,對應的PACn通道使能。當PAEN=1時,PAC3、PAC2級聯(lián)成16位通道A,這時PAEN3、PAEN2無效,當PBEN=1時,PAC1、PAC0級聯(lián)成16位通道B,這時PAEN1、PAEN0無效。級聯(lián)后形成的通道A與TIM模塊兼容,而通道B則功能相對簡單。下面分別介紹級聯(lián)前的四個8位通道PAC3-0、級聯(lián)后的16位通道A和通道B各自的邏輯結構與設置。
1、8位通道PAC3-PAC0
PAC3-PAC0與IC聯(lián)系十分密切,二者共享引腳、邊沿檢測和延遲計數(shù)電路,因此使用PAC通道時對應引腳必須通過寄存器TIOS設置為IC方式。
當TIOS中的IOS0、IOSl等于0時,PT0/PTl引腳信號進入邊沿檢測電路,有效邊沿將被送到延遲計數(shù)部分進行窄脈沖消除,然后分別送到PACN0/PACNl,如果寄存器ICPACR中的PAENl、PAEN0為1,則PACNl、PACN0對輸入進行計數(shù)。各通道的有效邊沿可以通過寄存器TCL4單獨設置,可選項包括切斷、上升沿、下降沿和雙向邊沿,延遲時間則通過寄存器DLYCT設置,可選項包括0、256、512、 1024個P時鐘周期,但所有通道共用一個延遲時間,不能分別設置。PACN3具有溢出中斷功能,但PACN2沒有,當PACN3從$FF回滾到$oo時,寄存器PBFLG中的PBOVF標志置 1,如果寄存器PBCTL中的PBOVI=1,同時CPU全局中斷屏蔽位I=1,將向CPU申請中斷,中斷矢量為$FFCA、$FFCB。通過程序向PBOVF寫1將清除該標志。
PAC3-PAC0通道設置了飽和記憶功能,當ICSYS中的PACMX=1時,該功能啟動,這時如果某個通道計數(shù)器PACNx計數(shù)達到$FF,那么PACNx將停止對后續(xù)事件的計數(shù),而保持在$FF,因此發(fā)現(xiàn)某個PACNx=$FF說明其計數(shù)結果大于或者等與255。
當ICSYS中的BUFEN=1時,保持寄存器PAlH、PAOH有效,用來保存PACN1、PACN0的累計結果,傳送控制信號由MCCTL中的ICLAT或遞減計數(shù)器MDC發(fā)出,但是與ICSYS中的LATQ有關。當BUFEN=0時,保持寄存器無效。
(1)脈沖累加器的鎖存方式;當LATQ=1(鎖存方式)時,模數(shù)遞減計數(shù)器回0、將$0000寫入模數(shù)計數(shù)器或者強制鎖存控制位ICLAT被置1三者之一發(fā)生時,脈沖累加器的值將被轉移到與它對應的保持寄存器,其自身同時清0。
(2)脈沖累加器的隊列方式。當LATQ=0(隊列方式)時,只在讀取對應的IC通道的保持寄存器(TClH、TCOH)時,才會產(chǎn)生傳送動作,其他的傳送控制信號無效。
此外,PAC設置了覆蓋限制功能,當保持寄存器為空時,將允許進行結果傳送,但當保持寄存器非空時則禁止覆蓋。覆蓋控制通過寄存器ICSYS實現(xiàn)。
對于PAC2、PAC3,其邏輯結構與設置與PAC0、PAC1相似,只是涉及的某些寄存器不同,有關的設置這里不再贅述。
2、16位通道A
當寄存器PACTL中的PAEN=1時,通道PAC3、PAC2不復存在,PACN3、 PACN2級聯(lián)成通道A(PAl),但為了與TIM保持一致,PAl仍然使用引腳PT7,而不使用引腳PT2,當然也不能使用PT2的邊沿檢測和延遲電路。該部分的工作過程與TIM的PAI完全相同。
3、16位通道B
當寄存器PBCTL中的PBEN=1時,通道PACl、PAC0不復存在,PACN1、 PACN0級聯(lián)成通道B,它使用引腳PT0,因此仍然可以使用FT0的邊沿檢測和延遲電路,但沒有門控時間累加方式,此外該通道只有溢出中斷,這與通道A均不同。通道B只有事件計數(shù)方式,其他與通道A類似,讀者可參看第6章的有關部分,這里不再贅述。
第二節(jié)  ECT寄存器簡介2.1   ICOC選擇寄存器(TIOS)
寄存器偏移量:$0000
Bit7      6        5        4       3       2       1      Bit0
IOS7
IOS6
IOS5
IOS4
IOS3
IOS2
IOS1
IOS0
復位后:0      0        0       0        0       0      0       0
可在任何時候讀或?qū)憽?/div>
TIOS寄存器用于指定各個通道的功能,即工作于IC還是OC方式。當某個位IOSn=0時,對應的通道n為輸入捕捉(1C)通道,否則當IOSn=1時,通道n為輸出比較(OC)通道。其中的各位可以在任何時候?qū)懭牖蜃x出。上電后該寄存器默認為$00,TSCR中的TEN默認也為0,這時所有通道處于通用I/O方式,將TEN置位后各個通道進入IC方式,要將某些通道設置成OC方式,必須對TIOS進行設置,即將有關位置1。設置成OC的通道其引腳具有降功率驅(qū)動功能,設置成IC的通道具有內(nèi)部上拉功能,但上電后均處于關閉狀態(tài),可以根據(jù)需要啟用。
2.2   輸出比較通道7屏蔽寄存器(OC7M)
寄存器偏移量:$0002
Bit7     6       5       4        3        2      1      Bit0
OC7M7
OC7M6
OC7M5
OC7M4
OC7M3
OC7M2
OC7M1
OC7M0
復位后:0      0       0        0         0       0      0      0
可在任何時候讀或?qū)憽?/div>
前面已經(jīng)說明,OC7具有特殊地位,它匹配時可以直接改變其他7個輸出引腳的狀態(tài),并覆蓋各個引腳原來的匹配動作結果,寄存器OC7M決定哪些通道將處于OC7的管理之下。 OC7M中的各位與PORTT口寄存器的各位一一對應。當通過TIOS將某個通道設定為輸出比較時,將OC7M中的相應位置1,對應的引腳就是輸出狀態(tài),與DDR中的對應位的狀態(tài)無關。但OC7Mn并不改變DDR相應位的狀態(tài)。
OC7M具有更高的優(yōu)先級,它優(yōu)于通過TCTL1和TCTL2寄存器中的OMn和OLn設定的引腳動作,若OC7M中某個位置1,就會阻止相應引腳上由OM和OL設定的動作。
2.3   輸出比較通道7數(shù)據(jù)寄存器(OC7D)
寄存器偏移量:$0003
Bit7     6       5       4        3        2       1     Bit0
OC7D7
OC7D6
OC7D5
OC7D4
OC7D3
OC7D2
OC7D1
OC7D0
復位后:0      0       0        0        0       0      0        0
可在任何時候讀或?qū)憽?/div>
OC7M對于其他OC輸出引腳的管理限于將某個二進制值送到對應引腳,這個值保存在寄存器OC7D中的對應位中。當OC7匹配成功后,若某個OC7Mn=1,則內(nèi)部邏輯將OC7Dn送到對應引腳。
OC7D中的各位與PORTT口寄存器的各位一一對應。當通道7比較成功時,如果OC7M中的某個位為1,OC7D中的對應位將被輸出到PORTT的對應引腳。
當OC7M中的某個位為1時,通道7匹配成功的動作如果與通道6-0的動作發(fā)生在同一個周期,前者將覆蓋后者。因此各個通道的動作將依賴于OC7D中各個位的設置。
2.4   定時器核心寄存器(TCNT)
寄存器偏移量:$0004-$0005
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0      0       0        0         0       0       0      0
TCNT是遞增計數(shù)器,它不停地對內(nèi)部時鐘信號計數(shù)、程序可隨時讀取,但在普通模式下禁止寫入。TCNT應按字訪問,分別訪問高、低字節(jié)可能得到錯誤的結果。
在特殊模式下,TCNT可寫,但因為寫操作與預分頻器時鐘不同步,TCNT寄存器寫入后,其第一個周期可能是一個不同的值。
2.5   計時器系統(tǒng)控制寄存器1TSCR1
寄存器偏移量:$0006
Bit7      6        5       4       3       2        1      Bit0
TEN
TSWAI
TSFRZ
TFFCA




復位后:0       0       0        0        0      0       0        0
可在任何時候讀或?qū)憽?/div>
TSCR1寄存器是定時器模塊的總開關,它決定模塊是否啟動以及在中斷等待、BDM方式下的行為,還包括標志的管理方式。其各位的意義如下:
TEN:定時器使能位,此外它還控制定時器的時鐘信號源。要使用定時器模塊的IC/OC功能,必須將TEN置位。如果因為某種原因定時器沒有使能,脈沖累加器也將得不到ECLK/64時鐘,因為ECLK/64是由定時器的分頻器產(chǎn)生的,這種情況下,脈沖累加器將不能進行引腳電平持續(xù)時間的累加。
0:主計時器、包括計數(shù)器均被禁止,有利于降低功耗。
1:定時器使能,正常工作。
TSWAI:等待模式下計時器關閉控制位。
注意定時器中斷不能用于使MCU退出等待模式。
0:在中斷等待模式下允許MCU繼續(xù)運行。
1:當MCU進入中斷等待模式時,禁止計時器。
TSFRZ:在凍結模式下計時器和計數(shù)器停止位。
0:在凍結模式下允許計時器和計數(shù)器繼續(xù)運行。
1:在凍結模式下禁止計時器和計數(shù)器,用于仿真調(diào)試。
注意:TSFRZ不能停止脈沖累加。
TFFCA:定時器標志快速清除選擇位。
0:定時器標志普通清除方式。
1:對于TFLGl($0E)中的各位,讀輸入捕捉寄存器或者寫輸出比較寄存器會自動清除相應的標志位CnF。
對于TFLG2($0F)中的各位,任何對TCNT寄存器($04、$05)的訪問均會清除TOF標志;任何對PACN3和PACN2寄存器($22,$23)的訪問都會清楚清除PAFLG寄存器($21)中的PAOVF和PAIF位。任何對PACN1和PACN0寄存器($24,$25)的訪問都會清除PBFLG寄存器($21)中的PBOVF位。這種方式的好處是削減了另外清除標志位的軟件開銷。此外,必須特別注意避免對標志位的意外清除。
2.6   計時器溢出綁定寄存器1TTOV
寄存器偏移量:$0007
Bit7      6       5       4       3        2       1      Bit0
TOV7
TOV6
TOV5
TOV4
TOV3
TOV2
TOV1
TOV0
復位后:0       0       0      0        0        0        0       0
可在任何時候讀或?qū)憽?/div>
TOVx:溢出綁定管腳標志位。
TOVx在輸出比較時,如果發(fā)現(xiàn)溢出,則綁定該管腳。這一功能僅在輸出比較模式下有效,它的優(yōu)先級高出強制輸出比較,而低于通道7的輸出比較。
0:輸出比較的管腳發(fā)生溢出時綁定功能不發(fā)生作用。
1:輸出比較的管腳發(fā)生溢出時綁定功能使能。
2.7   控制寄存器(TCTLl-TCTL4
TCTL1    寄存器偏移量:$0008
Bit7      6       5       4       3        2      1      Bit0
OM7
OL7
OM6
OL6
OM5
OL5
OM4
OL4
復位后:0       0       0        0       0        0      0       0
TCTL2    寄存器偏移量:$0009
Bit7      6       5       4       3        2        1     Bit0
OM3
OL3
OM2
OL2
OM1
OL1
OM0
OL0
復位后:0       0      0        0       0       0       0       0
TCTL3    寄存器偏移量:$000A
Bit7      6       5       4       3        2      1       Bit0
EDG7B
EDG7A
EDG6B
EDG6A
EDG5B
EDG5A
EDG4B
EDG4A
復位后:0       0         0      0       0       0      0       0
TCTL4    寄存器偏移量:$000B
Bit7     6        5       4       3        2      1     Bit0
EDG3B
EDG3A
EDG2B
EDG2A
EDG1B
EDG1A
EDG0B
EDG0A
復位后:0      0       0        0        0       0       0       0
可在任何時候讀或?qū)憽?/div>
TCTLl-TCTL4分為兩組,分別對IC和OC電路進行設定,每組16個二進制位,每兩個二進制位管理一個通道。其中TCTLl、TCTL2設定各個OC通道匹配時的動作,包括切斷OC與輸出引腳的聯(lián)系,而TCTL3、TCTL4設定IC響應引腳的何種動作,包括禁止IC的響應。各個控制位的作用如下:
OMn、OLn 分別設定輸出方式和輸出電平,這8對控制位(OM7、OL7-OMO、OL0)編碼后用于指定通道比較成功后的輸出動作(參看表7-3)。如果每對當中至少有一個為1,對應引腳就固定為相應通道的輸出,而與DDRT中的對應位無關。當二者同時為0時,OC與輸出引腳斷開。
表7-3  輸出比較動作設置
OMn
OLn
動作
0
0
定時器與輸出引腳斷開
0
1
OCn輸出翻轉
1
0
OCn輸出清0
1
1
OCn輸出置1
EDGnB、EDGnA 輸入捕捉邊沿控制位,這8對控制位(EDG7B、EDG7A—EDGOB、EDGOA)對輸入捕捉的邊沿檢測電路進行設置(參看表7-4)。當二者同時為0時,IC與輸入引腳斷開。
表7-4 輸入捕捉邊沿檢測電路設置
EDGnB
EDGnA
邊沿檢測器電路設置
0
0
捕捉禁止
0
1
僅捕捉上升沿
1
0
僅捕捉下降沿
1
1
上升、下降沿均捕捉
    注意:為了使OMn、OLn指定的引腳動作有效,OC7M中的對應位必須清0。若要使用16位脈沖累加器A和B,并使它們分別獨立于IC/OC7和IC/OC0,必須設置對應的IOSn:1、OMn=0、OLn=0,同時寄存器OC7M中的C7M7、OC7M0位必須清0。
2.8   計時器中斷使能寄存器(TIE
寄存器偏移量:$000C
Bit7      6       5       4       3        2       1     Bit0
C7I
C6I
C6I
C4I
C3I
C2I
C1I
C0I
復位后:0       0       0        0       0       0       0       0
可在任何時候讀或?qū)憽?/div>
TIE寄存器中的位與狀態(tài)寄存器TFLG1中的標志位相對應。如果將TIE中的某位清0,相應的標志位就不能引起硬件中斷。如果被置1,相應的標志位就可以引起中斷。
C7I-C0I:輸入捕捉/輸出比較“x”中斷使能。
2.9   計時器系統(tǒng)控制寄存器2(TSCR2)
寄存器偏移量:$000D
Bit7      6      5       4        3       2        1     Bit0
TOI
0
0
0
TCRE
PR2
PR1
PR0
復位后:0       0       0        0       0        0      0       0
可在任何時候讀或?qū)憽?/div>
TOI:計時器溢出中斷使能。
0:中斷被禁止。
1:當TOF標志被置位時發(fā)出硬件中斷請求。
TCRE:時鐘計數(shù)器復位使能。
該位在通道7成功輸出比較之后允許時鐘計數(shù)器復位。該操作模式類似于遞增型計數(shù)器。
0:計數(shù)器復位禁止,計數(shù)器自由計數(shù)。
1:通道7成功輸出比較后計數(shù)器將被復位。
如果TC7=$0000并且TCRE=1,TCNT將繼續(xù)保持$0000。
如果TC7=#FFFF并且TCRE=1,當TCNT從$FFFF到$0000之間被復位后TOF將永遠不被置位。
PR2,PR1,PR0:計數(shù)器預分頻選擇。
這三位所決定的分頻因子如下表所示。
表7-5  分頻因子選擇
PR2
PR1
PR0
Prescale Factor
0
0
0
1
0
0
1
2
0
1
0
4
0
1
1
8
1
0
0
16
1
0
1
32
1
1
0
64
1
1
1
128
新設定的分頻因子不會立即起作用,直到下一個觸發(fā)沿到來那里所有預分頻計數(shù)器值均為零。
2.10  主定時器中斷標志寄存器(TFLG1、TFLG2)
TFLG1    寄存器偏移量:$000E
Bit7      6       5       4       3       2       1     Bit0
C7F
C6F
C5F
C4F
C3F
C2F
C1F
C0F
復位后:0       0       0        0       0       0       0       0
TFLG2    寄存器偏移量:$000F
Bit7      6         5       4       3       2      1     Bit0
TOF
0
0
0
0
0
0
0
復位后:0       0       0        0       0       0       0       0
所示的TFLG1、TFLG2為中斷標志寄存器,其中TFLG1對應8個IC/OC通道,當某CnF=1時說明對應的IC/OC通道有動作。TFLG2只有一個標志位TOF,作為核心計數(shù)器的中斷請求標志。當TOF=1時說明核心計數(shù)器溢出。要清除某個標志位,只需向該位寫1,向某位寫0不影響該位的狀態(tài)。當TSCR中的TFFCA位置位時,讀IC通道或?qū)慜C通道 ($10-$1F)將自動清除該通道標志CnF,對TCNT的任何訪問將自動清除TFLG2。
CnF:IC/OC通道中斷請求標志。
0:上次清除標志以來,IC/OC通道沒有有效動作。
1:IC/OC通道已經(jīng)出現(xiàn)動作。將寄存器ICSYS($2B)中的TFMOD位和ICOVW寄存器($2A)聯(lián)合使用,可以使定時器在兩次捕捉后才產(chǎn)生中斷,而不是每次捕捉均產(chǎn)生動作。兩次捕捉結果分別在捕捉和保持寄存器里面。
TOF:定時器溢出標志,當16位自由定時器從$FFFF回滾到$0000時,該位置位。將$80寫入到TFLG2將自動清除該位。詳見前面關于TMSK2中TCRE控制位的解釋。
2.11  ICOC寄存器(TC0-TC7)
每個IC或OC通道都設置有一個16位的寄存器,對于IC(輸入捕捉)通道,當通道的邊沿探測器檢測到由EDGnA、EDGnB指定的條件時,將自由定時器的值捕捉到寄存器TCn,隨后程序可以讀取和處理;對于OC(輸出比較)通道,程序?qū)㈩A定的時刻寫入到TCn,當自由定時器的值與其相等時,觸發(fā)由OMn、OLn所指定的輸出動作。定時器模塊共有 TC7-TC0等8個16位IC/OC寄存器。
對于設定為IC的通道,相應通道寫操作無意義。上述所有寄存器復位后為$0000。
TC0    寄存器偏移量:$0010-$0011
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0       0       0        0       0        0       0      0
TC1    寄存器偏移量:$0012-$0013
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0       0       0        0       0       0        0       0
TC2    寄存器偏移量:$0014-$0015
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0       0       0        0       0       0       0       0
TC3    寄存器偏移量:$0016-$0017
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0       0       0        0       0       0       0       0
TC4    寄存器偏移量:$0018-$0019
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0       0       0        0       0       0       0       0
TC5    寄存器偏移量:$001A-$001B
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0       0       0        0       0       0       0       0
TC6    寄存器偏移量:$001C-$001D
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0       0       0        0       0       0       0       0
TC7    寄存器偏移量:$001E-$001F
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0       0       0        0       0       0       0       0
2.12  脈沖累加器A控制寄存器(PACTL)
寄存器偏移量:$0020
Bit7     6      5       4       3         2        1     Bit0
0
PAEN
PAMOD
PEDGE
CLK1
CLK0
PAOVI
PAI
復位后:0       0       0        0       0      0        0       0
可在任何時候讀或?qū)憽?/div>
寄存器PACTL決定了PAI的工作方式及其參數(shù),還包括PAI的啟動、確定定時器系統(tǒng)的時鐘信號源、中斷管理等。其各位作用如下:
PAEN:脈沖累加系統(tǒng)使能位,該位與TEN相互獨立。PAEN=1時,PAl的輸入部分才進行引腳信號檢測,同時8位脈沖累加器PAC3、PAC2被禁止。
0:PAI系統(tǒng)禁止。
1:PAI系統(tǒng)使能。
PAMOD:脈沖累加器模式控制位。當TEN=0時,沒有ECLK/64時鐘,如果啟動PAI,
它只能工作在事件計數(shù)方式。
0:事件計數(shù)模式。   
1:門控時間累加模式。這時TEN必須為1。
PEDGE:脈沖累加器有效邊沿設定位,該位的作用效果與PAMOD的狀態(tài)有關。
(1)PAMOD:0  (事件計數(shù)模式)時:
0:對脈沖輸入引腳(PT7/PAI)的下降沿計數(shù)。
1:對脈沖輸入引腳(PT7/PAI)的上升沿計數(shù)。
(2)PAMOD:1  (門控時間累加模式)時:
0:當脈沖輸入引腳(PT7/PAI)為高電平時,允許ECLK/64時鐘脈沖計入脈沖累加器,并在隨后的輸入引腳下降沿置位PAIF標志。
1:當脈沖輸入引腳(PT7/PAI)為低電平時,允許ECLK/64時鐘脈沖計入脈沖累加器,并在隨后的輸入引腳上升沿置位PAIF標志。
CLKI、CLK0:定時器模塊時鐘選擇位,如果脈沖累加器被禁止(PAEN:0),來自定時器的預分頻器時鐘總是作為定時計數(shù)器的時鐘源。時鐘源的改變在這兩位寫入后立即生效。其作用見表7-6。
表7-6  時鐘選擇
CLK1
CLK0
定時計數(shù)器時鐘源
0
0
預分頻時鐘
0
1
PACLK
1
0
PACLK/256
1
1
PACLK/65536

PAOVI:脈沖累加器溢出中斷允許位。
  0:禁止溢出中斷。
  1:當PAOVF置位時申請中斷。
PAI:脈沖累加器輸入中斷允許位。
0:禁止輸入中斷
1:當PAIF置位時申請中斷。
2.13  脈沖累加器A標志寄存器(PAFLG)
寄存器偏移量:$0021
Bit7     6       5       4        3        2       1     Bit0
0
0
0
0
0
0
PAOVF
PAIF
復位后:0      0       0        0        0       0       0       0
可在任何時候讀或?qū)憽?/div>
PAI子系統(tǒng)可能產(chǎn)生兩種中斷,累加器溢出和事件中斷。當PACNT溢出時,先置位PAOVF,當PAOVI=1時將發(fā)出中斷請求。而PAIF則在PAI檢測到有效事件時置位,當PAI=1時還將發(fā)出中斷請求。當TSCR寄存器中的TFFCA=1時,  訪問PACNT將清除 PAFLG中的所有標志位。PAOVF、PAIF位于寄存器PAFLG中,其意義如下:
PAOVF:脈沖累加器溢出標志位。
0:上次清除以來,PACNT沒有回滾到$0000。
1:PACNT從$FFFF回滾到$0000。將$02寫入到PAFLG將自動清除該位。PAIF:脈沖累加器輸入邊沿有效標志位。
0:上次清除以來,PAI引腳尚未檢測到預期的有效邊沿。
1:在輸入引腳檢測到有效邊沿。在事件計數(shù)模式下,選定的有效邊沿在計數(shù)的同時觸發(fā)該位置1;在門控時間累加模式下,輸入引腳門控信號的后沿觸發(fā)該位置1,將$01寫入到PAFLG將自動清除該位.
2.14  脈沖累加寄存器(PACN3、PACN2PACN1、PACN0)
PACN3     寄存器偏移量:$0022
Bit7
6
5
4
3
2
1
Bit0
復位后:0      0        0       0        0       0       0        0
PACN2     寄存器偏移量:$0023
Bit7
6
5
4
3
2
1
Bit0
復位后:0       0       0       0        0       0       0        0
PACN1     寄存器偏移量:$0024
Bit7
6
5
4
3
2
1
Bit0
復位后:0      0       0        0        0       0       0       0
PACN0     寄存器偏移量:$0025
Bit7
6
5
4
3
2
1
Bit0
復位后:0      0       0        0        0       0       0       0
可在任何時候讀或?qū)憽?/div>
PACN3、PACN2、PACN1、PACN0是四個8位的寄存器,PAC3、PAC2級連后形成PACA, PAC1、PAC0級連后形成PACB,它們反映外部事件或者時間的累計結果,程序可以隨時讀取或通過寫入設定初始值。當PACA/PACB允許  (PACTL:$20寄存器中的PAEN=1/PBCTL:$30寄存器中的PBEN=1)時,寄存器PACN3、PACN2/PACNl、PACN0分別是PACA、 PACB的高、低位字節(jié),當PACNl從$FF回滾到$00,寄存器PBFLG($31)中的PBOVF中斷標志置1。
正確的寄存器訪問方式是在單個時鐘周期內(nèi)完成,即采用字讀寫指令。分開訪問高/低位字節(jié)可能得到錯誤的結果。但如果只需要寄存器的高8位或低8位,則讀操作不受限制,但寫操作仍需要注意。
2.15  模數(shù)遞減計數(shù)器控制寄存器(MCCTL)
寄存器偏移量:$0026
Bit7    6        5       4         3      2       1      Bit0
MCZI
MODMC
RDMCL
ICLAT
FLMC
MCEN
MCPR1
MCPR0
復位后:0      0       0        0        0       0      0        0
可在任何時候讀或?qū)憽?/div>
該寄存器主要控制MDC及相關操作。各位意義及作用如下:
MCZI:  模數(shù)計數(shù)器下溢出中斷允許位。當MDC回0標志MCZF置位時,是否申請中斷取決于MCZI。
0:禁止中斷。
1:允許中斷。
MODMC:模數(shù)方式允許位。該位設定MDC的工作方式,即選擇單次或模數(shù)循環(huán)方式。
0:  單次計數(shù)方式,計數(shù)器從設定值遞減到0后停止。
1:  模數(shù)計數(shù)方式,當計數(shù)器遞減回0后,加載最新設定值,并開始新一輪計數(shù)過程。
注意:為保證正確運行,修改MODMC位之前,必須清除MCEN位使模數(shù)計數(shù)器復位到$FFFF。
RDMCL:模數(shù)讀取選擇位。該位決定讀模數(shù)寄存器返回的內(nèi)容。
0: 返回模數(shù)計數(shù)器的當前值。
1: 返回重新加載所用的常數(shù)。
ICLAT:捕捉寄存器強制轉移控制位。當輸入捕捉工作在鎖存方式時(ICSYS($2B)寄存器中的LATQ和BUFEN位置位),向該位寫1立即強制將捕捉寄存器TC0-TC3以及對應的8位脈沖累加器的內(nèi)容轉移到保持寄存器,同時相關的脈沖累加器自動清0。向該位寫0無效,讀該位總是返回0。
FLMC:模數(shù)計數(shù)器強制加載控制位。該位只在模數(shù)遞減計數(shù)器允許時(MCEN=1)有效,向該位寫1將把模數(shù)常數(shù)寄存器的值加載到模數(shù)計數(shù)器,同時復位模數(shù)計數(shù)器的定標器。向該位寫0無效。
當MODMC=0時,計數(shù)器開始計數(shù),并在到達$0000后停止。讀該位總是返回0。
MCEN:模數(shù)遞減計數(shù)器允許位。當MCEN=0時,計數(shù)器被預置為$FFFF,這可以避免在計數(shù)器啟動的初期出現(xiàn)中斷標志。
0: 模數(shù)計數(shù)器禁止運行。
1: 模數(shù)計數(shù)器使能。
MCPR1、MCPR0:模數(shù)計數(shù)器定標器分頻常數(shù)設定位。設定的分頻常數(shù)不能立即起作用,必須等到模數(shù)計數(shù)器進行加載操作。當MCPR1、MCPR0=00、01、10、11時,對應的分頻常數(shù)分別為1、4、8、16。
2.16  輸入脈沖累加器控制寄存器(ICPAR)
寄存器偏移量:$0028
Bit7    6        5        4       3        2      1      Bit0
0
0
0
0
PA3EN
PA2EN
PA1EN
PA0EN
復位后:0     0        0        0        0       0       0       0
可在任何時候讀或?qū)憽?/div>
8位脈沖累加器PAC3、PAC2只有在PACTL($20)中的PAEN=0時,才能被允許,若PAEN=1,PA3EN和PA2EN無效。同樣,8位脈沖累加器PACl、PAC0只有在PBCTL($30)中的PBEN=0時,才能被允許,若PBEN=1,PAlEN和PAOEN無效。當PAxEN=1時,對應的8位脈沖累加器通道x使能,反之則禁止。
2.17  輸入覆蓋控制寄存器(ICOVW)
寄存器偏移量:$002A
Bit7     6       5        4       3        2      1      Bit0
NOVW7
NOVW6
NOVW5
NOVW4
NOVW3
NOVW2
NOVW1
NOVW0
復位后:0      0        0       0        0       0       0       0
可在任何時候讀或?qū)憽?/div>
該寄存器共有8個覆蓋禁止位,對應8個IC通道,用來選擇上次捕捉結果是否允許被覆蓋。如果某位NOVWx=0,新的捕捉事件或轉移動作發(fā)生時,不論捕捉或保持寄存器是否為空,均直接保存新的結果:反之若NOVWx:1,對應的寄存器不允許被覆蓋,但若處于空白狀態(tài)則仍然允許覆蓋。這樣可以避免捕捉結果在被讀取或者轉移到保持寄存器前丟失。
2.18  輸入系統(tǒng)控制寄存器(ICSYS)
寄存器偏移量:$002B
Bit7     6       5       4        3        2       1     Bit0
SH37
SH26
SH15
SH04
TFMOD
PACMX
BUFEN
LATQ
復位后:0      0       0        0        0       0       0       0
可在任何時候讀。
可能一次可寫(test mode=0時)但是當test mode=1時,寫總是被允許的。
該寄存器用于對IC和PAC部分的工作進行設置與控制。其各位意義和作用如下:
SHxy:  x、y通道輸入共享控制位。
0:  x、y通道正常工作,各自使用對應的引腳。
1:  通道x的邊沿檢測電路及延遲電路同時作用于x、y通道,即在y通道上也引發(fā)與x通道相同的動作。
TFMOD:  標志設置方式控制位,寄存器ICSYS($2B)中的TFMOD位與寄存器ICOVW($2A)一起使用可以使定時器的中斷在捕捉到兩個事件后才產(chǎn)生,而不是每次捕捉事件都產(chǎn)生中斷,兩次捕捉的結果分別存放在捕捉和保持寄存器中。如果在隊列方式下將TFMOD置1,同時NOVW置位且某通道n的捕捉和保持寄存器均為空白狀態(tài),那么第一個捕捉事件將首先用主定時器值更新對應的輸入捕捉寄存器 TCn,下一個事件發(fā)生時,TCn中的數(shù)值將首先被轉移到保持寄存器TCnH,然 后  更新TCn。這時,CnF中斷標志才被置位。
在所有其他的輸入捕捉情況下,PTn引腳發(fā)生的有效外部事件將置位中斷標志。
0:  當對應的輸入引腳滿足預定的捕捉條件時,寄存器TFLGl($0E)中的標志C3F-COF將被相應置位。
1:  如果在隊列方式下  (BUFEN=1且LATQ=0),那么標志位C3F-COF只有在對應的保持寄存器被填充后才置位。如果沒有啟用隊列方式,那么標志位C3F-COF的置位條件與TFMOD:0時相同。
PACMX:  8位脈沖累加器飽和控制位,即選擇計數(shù)到$FF后是否保持不變。飽和功能允許時$FF就代表計數(shù)值已經(jīng)達到255或更多。換言之,可記憶是否曾經(jīng)達到$FF。
0:  正常工作,計數(shù)達到$FF后,下一計數(shù)使其回到$oo。
1:  計數(shù)達到$FF時,停止加1操作,即進入飽和狀態(tài)。
BUFEN: IC緩沖允許位。
0:  禁止IC及PAC的保持寄存器。
1:  IC及PAC保持寄存器使能。鎖存方式由控制位LATQ設定,當位LATQ=1時,向寄存器MCCTL($26)中的ICLAT位寫1,將導致捕捉寄存器和脈沖累加器將其中數(shù)值轉移到各自的保持寄存器。
LATQ:  輸入鎖存及隊列方式允許位。當控制位BUFEN=1時,IC和PAC的保持寄存器使能,反之不能通過LATQ進入鎖存方式。當LATQ、BUFFEN同時為1時,向MCCTL($26)中的ICLAT位寫1,IC和PAC寄存器內(nèi)容將轉移到保持寄存器。
0:  IC工作在隊列方式。當輸入引腳滿足預定的捕捉條件時,主定時器的值被記錄到捕捉寄存器,當下一個捕捉事件出現(xiàn)時,捕捉寄存器將其內(nèi)容轉移到保持寄存器,以便存放新的捕獲值。
1:  IC工作在鎖存方式。當模數(shù)計數(shù)器自然回0,或者向計數(shù)器MCCNT直接寫$0000時,將進行鎖存操作,結果,捕捉寄存器和脈沖累加器將其內(nèi)容轉移到保持寄存器,同時8位的脈沖累加器清0。
2.19  脈沖累加器B控制寄存器(PBCTL)
寄存器偏移量:$0030
Bit7     6       5        4        3       2       1     Bit0
0
PBEN
0
0
0
0
PBOVI
0
復位后:0     0        0        0        0       0       0       0
可在任何時候讀或?qū)憽?/div>
16位的脈沖累加器B(PACB)系兩個8位的脈沖累加器PACl和PAC0級連后形成的。當PBEN置1時,PACB啟動,它與IC0共享同一個輸入引腳。
PBEN:  脈沖累加器B使能位,它與TEN相互獨立。只要PBEN=1,脈沖累加器B即可工作,與定時器是否允許無關,這與脈沖累加器A不同。
0:  脈沖累加器B禁止。8位的PACl和PAC0可通過各自的允許位(在寄存器ICPACR中,地址$28)使能。
1: 脈沖累加器B使能。實際上PACB為PACl、PAC0級連形成,PACl為高位、而PAC0為低位字節(jié),這時寄存器ICPACR中的控制位PAlEN、PAOEN無效。
PBOVI: 脈沖累加器B溢出中斷允許位。
0:  禁止PBOVF申請中斷。
1:  當PBOVF=1時,申請中斷。
2.20  脈沖累加器B標志寄存器(PBFLG)
寄存器偏移量:$0031
Bit7     6       5        4       3        2       1     Bit0
0
0
0
0
0
0
PBOVF
0
復位后:0     0        0        0        0       0       0       0
可在任何時候讀或?qū)憽?/div>
該寄存器只有一個標志位PBOVF,當16位的PACB從$FFFF回滾到$0000,或8位脈沖累加器3(PACl)從$FF回滾到$00時,該位置1。將$01寫入PBFLG清除該位。當寄存器TSCR($06)中的TFFCA位置位時,訪問PACNl和PACN0清除該標志。
2.21  脈沖累加器保持寄存器(PA3H-PA0H
PAC3H     寄存器偏移量:$0032
Bit7
6
5
4
3
2
1
Bit0
復位后:0     0        0        0        0       0       0       0
PA2H     寄存器偏移量:$0033
Bit7
6
5
4
3
2
1
Bit0
復位后:0      0       0        0        0       0       0       0
PA1H     寄存器偏移量:$0034
Bit7
6
5
4
3
2
1
Bit0
復位后:0     0        0        0        0       0       0        0
PA0H     寄存器偏移量:$0035
Bit7
6
5
4
3
2
1
Bit0
復位后:0     0        0        0        0       0       0      0
可在任何時候讀。寫不起作用。
當ICPACR($28)中PAnEN=1時,通道PAn使能,寄存器PA3H-PAOH用于為PAn提供鎖存功能。
2.22  模數(shù)遞減計數(shù)器工作寄存器(MCCNT)
寄存器偏移量:$0036-$0037
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:1      1       1        1        1       1       1       1
MDC啟動后,MCCNT用來對定標器輸出的時鐘進行遞減計數(shù),也可作為定時基準。對該寄存器的訪問應在一個時鐘周期內(nèi)完成,即按字訪問。對高低位字節(jié)分別訪問可能得到錯誤的結果。如果MCCTL中的RDMCL=0,讀MCCNT寄存器返回計數(shù)器的當前值;反之如果RDMCL=1,返回每次重新加載所用的常數(shù)。
當寄存器ICSYS($2B)中的LATQ、BUFEN均為1時,如果將$0000寫入到MCCNT和模數(shù)計數(shù)器,輸入捕捉和脈沖累加寄存器將被鎖存。將$0000寫入到MCCNT后,模數(shù)計數(shù)器將保持為0,且不會將MCFLG中的MCZF標志置位。
如果模數(shù)方式允許(MODMC=1),對該地址進行寫操作將更新常數(shù)寄存器,但計數(shù)器不會立即更新,必須等到計數(shù)器回0后重新加載;如果希望立即加載,通過寄存器MCCTL ($26)中的FLMC位可以將新值立即加載到計數(shù)器。如果模數(shù)方式未允許(MODMC=0),寫該地址將清0定標器,并用寫入值立即更新計數(shù)器,然后開始一次遞減計數(shù),到0后停止。
2.23  IC保持寄存器(TC0H-TC3H
TCOH    寄存器偏移量:$0038-$0039
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0     0        0        0        0       0       0       0
TC1H    寄存器偏移量:$003A-$003B
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0      0       0        0        0       0       0       0
TC2H    寄存器偏移量:$003C-$003D
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0      0       0        0        0       0       0       0
TC3H    寄存器偏移量:$003E-$003F
Bit15
Bit14
Bit13
Bit12
Bit11
Bit10
Bit9
Bit8
Bit7
Bit6
Bit5
Bit4
Bit3
Bit2
Bit1
Bit0
復位后:0      0       0        0       0        0       0       0
這些寄存器用于為相應的捕捉寄存器TC0-TC3提供鎖存功能。
定時器與I/O共享引腳的說明
定時器與PORTT共享8個I/O引腳,復位后各個引腳默認為通用輸兒輸出,當定時器相關功能使能后,將取代通用I/O功能。引腳PT0-3由IC/OC、PAC及通用I/O共享,引腳 PT4-7由IC/OC及通用I/O共享,此外引腳PT0、PT7還供16位脈沖累加器A、B作為輸入使用。其他請參看第6章TIM模塊有關說明,不再贅述。
不同模式下的定時器及模數(shù)計數(shù)器的運行狀況
    (1)停止(STOP):因為PCLK和ECLK均已停止,定時器和模數(shù)計數(shù)器關閉。
    (2)調(diào)試方式(BDM):只要不滿足TSBCK=1,定時器保持運行。
    (3)中斷等待(WAIT):只要不滿足TSWAI=1,計數(shù)器保持運行。
    (4)正常(Normal):只要不滿足TEN=0和MCEN(MCCTL中)=0,定時器保持運行。
    (5)禁止(TEN=0):定時器和MDC停止,但寄存器可訪問。ECLK/64時鐘被禁止。
    (6)禁止(PAEN=0):所有的脈沖累加器動作停止,但寄存器可以訪問。
    (7)MCEN:0:模數(shù)計數(shù)器停止。
    (8)PAEN:1:16位脈沖累加器A激活。
    (9)PAEN:0:8位脈沖累加器3和2可以激活。
    (10)PBEN:1:16位脈沖累加器B激活。
    (11)PBEN:0:8位脈沖累加器1和0可以激活。
第三節(jié)  ECT應用實例3.1  定時器編程步驟
1、初始化:
設定預分頻系數(shù),設定工作方式,定時器溢出中斷使能,定時器使能
2、中斷函數(shù)
用戶自己的代碼,清標志位
void ECT_Init(void)
{
   TSCR2_PR   = 7;  //預分頻系數(shù)為8
   …………………..
   TSCR2_TOI  = 1;  //定時器溢出中斷使能
   TSCR1_TEN  = 1;  //定時器使能
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void TimerOverFlow(void)
{
     //用戶自己的代碼
TFLG2_TOF  = 1;  //清楚定時器溢出中斷標志位
}
3.2  輸入捕捉IC
本試驗的輔助設備有:信號發(fā)生器、示波器。
試驗目的:通過連續(xù)記錄輸入信號的兩個上升沿,用該程序可以計算出輸入信號的頻率;同時,利用脈沖累加器可以記錄輸入脈沖數(shù)。
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dp256.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
    int count=0;
    float f;
    double f1=2000000,first=0,second=0,n,N;
    void main(void)
    {      
       DisableInterrupts;      
       TSCR2=0X82;
       PACTL=0X20;      
       TIOS=0XFE;    //設定pt0輸入捕捉口
       TCTL4=0X01;
       ICSYS=0X0A;
       PBCTL_PBEN=0X00;      
       ICPAR=0X01;      
       TIE=0X01;
       TSCR1=0X80;            
       EnableInterrupts;      
       for(;;)
       {; }
    }
      #pragma CODE_SEG __NEAR_SEG NON_BANKED
      interrupt void CH0IC(void)
      {
        first=TC0H;
        second=TC0;
        n=count*65535+second-first;
        f=f1/n;
        N=PA0H;
        TFLG1=0X01;
        count=0;
      }
        interrupt void TOI(void)
      {
         count++;         
         TFLG2_TOF=1;         
      }
3.3  通道6輸出比較
本試驗的輔助設備有:示波器。
試驗目的:利用定時器溢出中斷產(chǎn)生脈沖周期,利用通道6輸出比較產(chǎn)生不同脈寬的波形,但此方法產(chǎn)生的波形其周期不能改變。
  1. double count,counter;

  2. void main(void) {

  3.        DisableInterrupts;

  4.        TSCR2=0X82;      

  5.        TIOS=0XFE;//設定pt6輸出捕捉口

  6.        TCTL1=0X30;      

  7.        TC6=0X3333;

  8.        TTOV=0X40;     

  9.        TIE=0X00;

  10.        TSCR1=0X80;              

  11.        EnableInterrupts;  

  12.        for(;;)

  13.        {; }

  14. }

  15.        #pragma CODE_SEG __NEAR_SEG NON_BANKED

  16.       interrupt void CH6OC(void)

  17.       {

  18.         counter++;

  19.         if(counter==100)

  20.         TC6=0X8888;

  21.         if(counter==200)

  22.         TC6=0XCCCC;

  23.         if(counter==300)

  24.         TC6=0XDEEE;         

  25.         TFLG2_TOF=1;

  26.       }
復制代碼


3.4  通道7輸出比較
本試驗的輔助設備有:示波器。
試驗目的:利用通道7輸出比較中斷產(chǎn)生脈沖周期,利用通道6、4輸出比較產(chǎn)生不同脈寬的波形,此方法產(chǎn)生的波形既可以改變周期同時也能夠改變脈寬。
  1. #include <hidef.h>      /* common defines and macros */

  2. #include <mc9s12dp256.h>     /* derivative information */

  3. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

  4. double count,counter;

  5. void main(void) {

  6.        DisableInterrupts;      

  7.        TIOS=0XF0;//設定pt6輸出捕捉口

  8.        TSCR2=0X0a;

  9.        TFLG1=0X00;

  10.        TFLG2=0X00;      

  11.        TCTL1=0X62;

  12.        ICSYS=0X0a;      

  13.        OC7M=0X50;

  14.        OC7D=0X50;

  15.        TC7=0X00C0;

  16.        TC6=0X0060;

  17.        TC4=0X0099;

  18.        TIE=0X00;

  19.        TSCR1=0X80;              

  20.        EnableInterrupts;      

  21.        for(;;)

  22.        {; }

  23. }
復制代碼


3.5  模數(shù)遞減計數(shù)器
本試驗的輔助設備有:連接導線若干。
試驗目的:利用模數(shù)遞減計數(shù)器回零中斷,控制五個小燈依次點亮,同時點亮的時間間隔由慢到快。
  1. #include <hidef.h>      /* common defines and macros */

  2. #include <mc9s12dp256.h>     /* derivative information */

  3. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

  4. long counter=0;

  5. void main(void)

  6. {     

  7.        DisableInterrupts;                 

  8.        DDRB=0XFF;

  9.        PORTB=0X00;

  10.        MCCTL_MCEN=0;

  11.        MCCTL_MCZI=1;

  12.        MCCTL_MODMC=1;

  13.        MCCTL_MCPR1=1;

  14.        MCCTL_MCPR0=1;

  15.        MCCNT=0XAAAA;  

  16.        TSCR1=0X80;

  17.        TSCR2=0X00;

  18.        MCCTL_MCEN=1;              

  19.        EnableInterrupts;            

  20.        for(;;)

  21.        {; }

  22. }

  23.       #pragma CODE_SEG __NEAR_SEG NON_BANKED

  24.       interrupt void MDC(void)

  25.       {

  26.         counter++;

  27.         if(counter<=10)

  28.         PORTB=0X01;      

  29.         if((counter>10)&&(counter<=20))

  30.         {

  31.           PORTB=0X02;

  32.           MCCNT=0X2222;

  33.         }

  34.         if((counter>20)&&(counter<=30))

  35.         {

  36.           PORTB=0X04;

  37.           MCCNT=0X4444;

  38.         }

  39.         if((counter>30)&&(counter<=40))

  40.         {

  41.           PORTB=0X08;

  42.           MCCNT=0X8888;

  43.         }

  44.         if((counter>40)&&(counter<=50))      

  45.         {

  46.           PORTB=0X10;

  47.           MCCNT=0XDDDD;

  48.         }

  49.         if(counter>50)

  50.         counter=0;

  51.         MCFLG_MCZF=1;

  52.       }

復制代碼




第三章 SCI模塊第一節(jié)  SCI寄存器簡介
SCI是一種采用NRZ格式的異步串行通信接口,它內(nèi)置獨立的波特率產(chǎn)生電路和SCI收發(fā)器,可以選擇發(fā)送8或9個數(shù)據(jù)位(其中一位可以指定為奇或偶校驗位)。
SCI是全雙工異步串行通信接口,主要用于MCU與其他計算機或設備之間的通信,幾個獨立的MCU也能通過SCI實現(xiàn)串行通信,形成網(wǎng)絡。
MC12里有兩個SCI(SCI0和SCI1)。設計SCI串口通信程序,主要是掌握八個寄存器,設置好初始化。
1.1  波特率控制寄存器(SCIBDHSCIBDL)
SCIBDH和SCIBDL一起構成了一個16位的波特率控制寄存器。SBR12~SBR0為波特率常數(shù),見表9-1。
表9-1 波特率控制寄存器
寄存器名:SCIBDH、SCIBDL;地址:$00C0、$00C1;復位默認值:00000000B、00000100B
讀操作:任意;寫操作:SBR12~SBR0任意,低位字節(jié)寫入后生效。SBR13~SBR15未定義
B7
B6
B5
B4
B3
B2
B1
B0
SCIBDH
讀寫
未定義
未定義
未定義
SBR12
SBR11
SBR10
SBR9
SBR8
SCIBDL
讀寫
SBR7
SBR6
SBR5
SBR4
SBR3
SBR2
SBR1
SBR0

SCI的波特率由下述公式?jīng)Q定:
波特率:MCLK/(16×BR)
或BR:MCLK/(16×波特率)
其中BR是波特率常數(shù),設定時寫入到SBRl2~SBR0。復位后,在SCICR2寄存器中的 TE、RE位第一次置1前,波特率發(fā)生器是關閉的,而且,當SBRl2~
表9-2常用波特率及波特率常數(shù)
波特率
110
300
600
1200
2400
4800
9600
14400
19200
38400
波特率因子
P=4MHz
2273
833
417
208
104
52
26
17
13
P=8MHz
4545
1667
833
417
208
104
52
35
26
13
SBR0=0時,波特率發(fā)生器也會被關閉。
通常選用波特率為9600。
BTST、BSPL和BRLD保留用于檢測功能。
1.2  控制寄存器1(SCICR1)
SCI的工作方式主要由該寄存器設置,包括回送、單線等方式選擇,幀格式、喚醒、空閑檢測類型以及奇偶校驗等,見表9-3。其各位意義如下:
表9-3 SCI控制寄存器1
寄存器名:SCICR1;地址:$00C2;復位默認值:00000000B;讀操作:任意;寫操作:任意
B7
B6
B5
B4
B3
B2
B1
B0
讀寫
LOOPS
SCISWAI
RSRC
M
WAKE
ILT
PE
PT
LOOPS  SCI回送模式/單線模式允許位,接收器的輸入由RSRC位選擇確定,發(fā)送器的輸出受相應的DDRS位(S口I/O方向控制位)控制。要使用回送或者單線模式,發(fā)送、接收器必須同時允許工作。在LOOPS=1期間,如果與TxD引腳對應的方向控制位被置1,那么TxD引腳就輸出SCI的信號;如果方向控制位被清0,那么這時若RSRC=0,TxD引腳就變成高電平(空閑狀態(tài)),反之若RSRC=1,TxD引腳就變成高阻態(tài)。
0:SCI發(fā)送和接收部分正常工作。
1:SCI接收部分與RxD引腳斷開,空出來的RxD引腳可以用作通用I/O。
SCISWAI等待模式下SCI停止位
0:在等待模式下允許SCI
1:在等待模式下禁止SCI
RSRC:接收器信號源選擇位,當LOOPS=1時,RSRC決定接收器的內(nèi)部反饋信號路徑。
0:接收器的輸入在內(nèi)部連接到發(fā)送器輸出(并非TxD引腳)。
1:接收器的輸入連接到TxD引腳。
M:方式選擇位(選擇字符幀格式)。
0:1個起始位,8個數(shù)據(jù)位,1個停止位。
1:1個起始位,8個數(shù)據(jù)位,第9個數(shù)據(jù)位,1個停止位。
WAKE:喚醒選擇位。
0:介質(zhì)空閑喚醒。
I:地址標志(最后一個數(shù)據(jù)位為1)喚醒。
ILT空閑檢測方式選擇位,該位在SCI接收器可以使用的兩種空閑檢測方式中選擇一種。
0:快速檢測,SCI在一個幀的開始位后立即開始對“1”計數(shù),因此,停止位以及停止位前面的任何“1”均被計算在內(nèi),這樣可以提前檢測到空閑狀態(tài)。
1:保守檢測,SCI在停止位后才開始對“1”計數(shù),因此最后一個字節(jié)的停止位以及該位以前的各個為“廣的位,對檢測的時間長短無影響。
PE:奇偶校驗允許位。
0:禁止奇偶校驗。
1:允許奇偶校驗。
PT奇/偶校驗選擇位,如果奇偶校驗允許,該位決定收發(fā)器使用奇校驗還是偶校驗。如果選擇偶校驗,當數(shù)據(jù)中有偶數(shù)個“廣時,校驗位置0,否則校驗位置1。
0:選擇偶校驗。
1:選擇奇校驗。
1.3  控制寄存器2(SCICR2)
   該寄存器主要控制收發(fā)器的使能、中斷允許及其他輔助操作,見表9-4。其各位意義如下:
表9-4 SCI控制寄存器2
寄存器名:SCICR2;地址:$00C3;復位默認值:00000000B;讀操作:任意值;寫操作:任意
B7
B6
B5
B4
B3
B2
B1
B0
讀寫
TIE
TCIE
RIE
ILIE
TE
RE
RWU
SBK

TIE 發(fā)送中斷允許位,清0時禁止TDRE產(chǎn)生中斷,若置1則允許TDRE位置1時產(chǎn)生SCI中斷請求。
TCIE發(fā)送結束中斷允許位,清0時禁止TC產(chǎn)生中斷,若置1則允許TC位置1時產(chǎn)生SCI中斷請求。
RIE接收中斷允許位,清0時禁止RDRF和OR產(chǎn)生中斷,若置1則允許RDRF或OR置1時產(chǎn)生SCI中斷請求。
ILIE空閑中斷允許位,清0時禁止IDLE產(chǎn)生中斷,若置1則允許IDLE位置1時產(chǎn)生SCI中斷請求。
TE  發(fā)送允許位。該位由0置1時可用來發(fā)送空閑報頭。
0:  發(fā)送器禁止。
1:  允許SCI發(fā)送部分工作,TxD引腳(PSl/PS3)用于發(fā)送。
RE  接收允許位。
0:  接收器禁止。
1;  允許SCI接收器工作。 RWU:  接收器喚醒控制位。
RWU接收器喚醒控制位
0:SCI接收器正常工作。
1:允許喚醒功能,禁止接收器中斷。通常,硬件通過自動清除該位來喚醒接收器。
SBK中止符發(fā)送允許位。只要該位保持為1,發(fā)送器就不停地發(fā)出“0”;如果變?yōu)?,當前的全“0”幀發(fā)送結束后,TxD引腳將變成空閑狀態(tài)。如果SBK開關一次,發(fā)送器將只發(fā)出10(11)個“0”,然后復原,處于空閑或發(fā)送數(shù)據(jù)狀態(tài)。
0:  中止符產(chǎn)生器關閉。
1:  產(chǎn)生中止符,至少10或11個連續(xù)的“0”。
1.4  狀態(tài)寄存器1SCISR1
該寄存器反映SCI運行過程中的各種狀態(tài),包括發(fā)送器和接收器的狀態(tài)信息和接收器的出錯信息,見表9-5。
表9-5 SCI狀態(tài)寄存器
寄存器名:SCISR1;地址:$00C4;復位默認值:11000000B;讀操作:任意;寫操作:無意義
B7
B6
B5
B4
B3
B2
B1
B0
TDRE
TC
RDRF
IDLE
OR
NF
FE
PR
當SCI硬件處于某些狀態(tài)時,SCISR1中的對應位置位,并通過特定的確認動作清除。先后對SCISR1和SCIDRL進行讀操作將清除與接收有關的標志位(RDRF、IDLE、OR、 NF、FE和PF),讀SCISR1然后寫SCIDRL將清除與發(fā)送有關的標志位(TDRE和TC)。
TDRE  發(fā)送保持器空標志位。發(fā)送前必須讀SCISR1,并確認TDRE=1,然后將新的數(shù)據(jù)寫入發(fā)送保持器以開始發(fā)送過程。復位后該位為1。
0:SC0DR處于忙狀態(tài)。
1:發(fā)送保持器的數(shù)據(jù)已被傳送到發(fā)送移位器,這時可以向發(fā)送保持器寫入新的數(shù)據(jù)
TC 發(fā)送結束標志。該位在發(fā)送器空閑(無發(fā)送動作)時置位。讀SCISRl,然后寫SCIDR將清除該位。   
0:發(fā)送器忙。
1:發(fā)送器空閑。
RDRF:接收數(shù)據(jù)就緒標志。當收到的字符已經(jīng)在SCIDR中就緒時,RDRF置1,順次讀取SCISRl和SCIDR將會自動清除RDRF。該位被清除后,必須等到RxD線變?yōu)榛顒樱缓笾匦伦兂煽臻e以后,IDLE位才會被再次置1。
0:SCIDR空。
1:SCIDR中數(shù)據(jù)已就緒。
IDLE  空閑標志。檢測到接收器RxD端空閑(收到10或者11個以上連續(xù)的“1”)。當RWU位為1時,空閑狀態(tài)不會使該位置1。該位被清除后,必須等到RDRF置位(RxD線變?yōu)榛顒,然后重新變成空閑),IDLE位才會被再次置1。
0:RxD線活動。
1:RxD線空閑。
OR:重疊錯誤標志。如果接收數(shù)據(jù)寄存器中的數(shù)據(jù)尚未讀取(RDRF=1),接受移位寄存器又準備向其傳送新的數(shù)據(jù),則稱為重疊錯誤,該位被置1。必須清除該位,才能使新的數(shù)據(jù)進入接收數(shù)據(jù)寄存器。
0:無重疊。
1:出現(xiàn)重疊錯誤。
NF噪聲錯誤標志。噪聲錯誤出現(xiàn)時,該位與RDRF在同一個周器內(nèi)置位,但如果同時或已經(jīng)出現(xiàn)重疊錯誤,該位不置位。
0:采樣結果一致。
1:在起始位、數(shù)據(jù)位或停止位接收期間檢測到噪聲。
FE幀格式錯誤。如果在應該出現(xiàn)停止位的時刻,檢測到0,則該位置位。順次讀取寄存器SCISRl和SCIDR將清除FE標志。
0:檢測到停止位。
1:在預期的停止位處檢測到0。
PF奇偶錯誤標志。指示收到數(shù)據(jù)的奇偶性與校驗位是否一致。奇偶校驗允許(PE=1)時,該標志才有意義。所要求的奇偶性由SC0CR1中的PT位決定。
0:奇偶校驗正確。
1:奇偶校驗錯誤。
1.5  狀態(tài)寄存器2(SCISR2)
表9-6 SCI狀態(tài)寄存器2
寄存器名:SCISR2;地址:$00C5;復位默認值:00000000B;讀操作:任意;寫操作:寫RAF無意義
B7
B6
B5
B4
B3
B2
B1
B0
讀寫
未定義
未定義
未定義
未定義
未定義
BRK13
TXDIR
RAF
BRK13中止符長度控制位。
0:中止符長度為10或11位。
1:中止符長度為13或14位。
TXDIR單線模式下發(fā)送管腳數(shù)據(jù)方向控制位。
0:單線模式下TxD腳用于輸入。
1:單線模式下TxD腳用于輸出。
RAF接收器活動標志位。反映接收器是否處于活動狀態(tài)。在搜索起始位的RT1期間該位置1,當接收器器檢測到空閑狀態(tài)或者出現(xiàn)一個偽起始位(通常由于噪聲或波特率匹配錯誤引起)時,該位清0。該位由接收器前端控制,
1.6  數(shù)據(jù)寄存器(SCIDRH、SCIDRL)
  SCI內(nèi)部分別設有發(fā)送和接收兩個數(shù)據(jù)寄存器,其低位都通過SCIDRL訪問,讀操作返回接收數(shù)據(jù)寄存器RDR的內(nèi)容,寫操作數(shù)據(jù)置入發(fā)送數(shù)據(jù)寄存器TDR。當M=1即運行在9位數(shù)據(jù)模式時,SCIDRL和SCIDRH形成9位的SCI數(shù)據(jù)字,這時必須先寫入SCIDRH,以便與低位字節(jié)(SCIDRL)一起進入發(fā)送移位器。如果M=0即SCI只用于7位或8位的數(shù)據(jù)傳送,可以只訪問SCIDRL。當PE=1即奇偶校驗允許時,奇偶校驗位由硬件負責,無需軟件干預,見表9-7。
表9-7 SCI數(shù)據(jù)寄存器
寄存器名:SCIDRH、SCIDRL;地址:$00C6、$00C7;復位默認值;00000000B、00000000B;
讀操作:任意;寫操作:任意但寫R8無意義。
B7
B6
B5
B4
B3
B2
B1
B0
SCIBDH
R8
T8
0
0
0
0
0
0
未定義
未定義
未定義
未定義
未定義
未定義
未定義
SCIBDL
R7T7
R6T6
R5T5
R4T4
R3T3
R2T2
R1T1
R0T0
R8接收到的位8,該位寫操作無效。當SCI設置成9位數(shù)據(jù)運行模式時,該位是從串行數(shù)據(jù)流中接收到的第9位。
T8發(fā)送位8,任何時候可寫。當SCI設置成9位數(shù)據(jù)模式時,該位是送到串行數(shù)據(jù)流的第9位。該位不必為每個數(shù)據(jù)重新設置,每次發(fā)送可重復使用。 R7T7-ROT0:  收/發(fā)數(shù)據(jù)位7-0,讀操作返回只讀寄存器RDR的內(nèi)容,寫操作寫入只寫寄存器TDR。
第二節(jié)  SCI應用示例
下面看看實驗:
1、本實驗需軟件程序“穿口調(diào)試助手V2.0”。
2、實驗步驟:
1)保證單片機5V電源、串口通訊線與仿真板的連接無誤;
2)上電后建立新建文件,在main.c中輸入下面程序并寫如flash;
3)點擊圖標運行后,打開“助手”,在下面的發(fā)送框中輸入任意數(shù)字或字符,然后選擇自動或手動發(fā)送。
3、試驗結果
在“助手”下邊的發(fā)送框中輸入任意數(shù)字或字符,然后發(fā)送,接收到數(shù)據(jù)后,上面的顯示區(qū)就會將其以ASCII碼或十六進制的形式(可選)顯示出來。
4、源程序
  1. #include <hidef.h>      /* common defines and macros */

  2. #include <mc9s12dp256.h>     /* derivative information */

  3. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

  4. byte sci_data;

  5. //發(fā)送子函數(shù)

  6. void SCI_Transmit(byte data){

  7. while(!SCI0SR1_TDRE);//SC0DR處于忙狀態(tài),等待。

  8. SCI0DRL=data;

  9. }

  10. //接收子函數(shù)

  11. void SCI_Receive(byte *data)

  12. {

  13. *data=SCI0DRL;

  14. }

  15. void main(void)

  16. { SCI0BDL=0x34; //總線為8M,波特率為9600

  17.   SCI0CR2=0X2C; //允許中斷,允許發(fā)送,允許接受

  18.   while(1)

  19.   {

  20.     while(!SCI0SR1_RDRF);  //SCIDRL為空,等待數(shù)據(jù)就緒。

  21.     SCI_Receive(&sci_data);

  22.     SCI_Transmit(sci_data);

  23.   }

  24. }
復制代碼


下面的源程序是利用SCI做的一個足球答題系統(tǒng),感興趣的同學可以看一下:
  1. #include <hidef.h>      /* common defines and macros */
  2. #include <mc9s12dp256.h>     /* derivative information */
  3. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
  4. byte sci_data;
  5. //中斷初始化
  6. void SCI_Init(void) {
  7. SCI0BDL=0x34;
  8. SCI0CR2=0X2C;
  9. }
  10. //發(fā)送子函數(shù)
  11. void SCI_Transmit(byte data){
  12. while(!SCI0SR1_TDRE) ;
  13. SCI0DRL=data;
  14. }
  15. //接收子函數(shù)
  16. void SCI_Receive(byte *data){
  17. *data=SCI0DRL;
  18. }
  19. //特定輸出子函數(shù)
  20. void printf(char *str){
  21. while(*str!='\r'){
  22. SCI_Transmit(*str);
  23. *str++;
  24. }
  25. }
  26. N0Choose(byte data){
  27. switch(data){
  28.   case '1':
  29.   NO1();
  30.   break;
  31.   case '2':
  32.   NO2();
  33.   break ;
  34.   case '3':
  35.   NO3();
  36.   break;
  37.   case '4':
  38.   NO4();
  39.   break;
  40.   case '5':
  41.   NO5();
  42.   break;

  43.   dafault:
  44.   break;
  45. }
  46. }
  47. void main(void) {
  48. SCI_Init();
  49. printf("welcome to lipu's football-quiz system!\n\r");
  50. printf("choose the problem number(1to5)\n\r");
  51. while(1){
  52. while(!SCI0SR1_RDRF);
  53. SCI_Receive(&sci_data);
  54. SCI_Transmit(sci_data);
  55. N0Choose(sci_data);
  56. }
  57. }
  58. void Right(void){
  59. printf("\nyou are RIGHT.\nchoose the next question\n\r");}
  60. void Wrong(void){
  61. printf("\nyou are WRONG.\nchoose the next question\n\r");}
  62. int NO1(void){
  63. printf(".which country is the champion of World Cup at 2006?\n\r") ;
  64. printf("A:Brazil  B:Italy\n\r");
  65. while(!SCI0SR1_RDRF);
  66. SCI_Receive(&sci_data);
  67. SCI_Transmit(sci_data);
  68. switch(sci_data){
  69.   case 'A':
  70.   Wrong();
  71.   break;
  72.   case 'B':
  73.   Right();
  74.   break;
  75.   default:
  76.   break;
  77. }
  78. }
  79. int NO2(void){
  80. printf(".which country have the most champions of World Cup?\n\r") ;
  81. printf("A:Brazil  B:Italy\n\r");
  82. while(!SCI0SR1_RDRF);
  83. SCI_Receive(&sci_data);
  84. SCI_Transmit(sci_data);
  85. switch(sci_data){
  86.   case 'B':
  87.   Wrong();
  88.   break;
  89.   case 'A':
  90.   Right();
  91.   break;
  92.   default:
  93.   break;
  94. }
  95. }
  96. int NO3(void){
  97. printf(".which club is the champion of Spanish Prinera Divison at 06-07\n\r") ;
  98. printf("A:Barcelona  B:Real Madrid\n\r");
  99. while(!SCI0SR1_RDRF);
  100. SCI_Receive(&sci_data);
  101. SCI_Transmit(sci_data);
  102. switch(sci_data){
  103.   case 'A':
  104.   Wrong();
  105.   break;
  106.   case 'B':
  107.   Right();
  108.   break;
  109.   default:
  110.   break;
  111. }
  112. }
  113. int NO4(void){
  114. printf(".which club is the champion of Italian Serie A at 06-07\n\r") ;
  115. printf("A:Inter Milan  B:AC.Milan\n\r");
  116. while(!SCI0SR1_RDRF);
  117. SCI_Receive(&sci_data);
  118. SCI_Transmit(sci_data);
  119. switch(sci_data){
  120.   case 'B':
  121.   Wrong();
  122.   break;
  123.   case 'A':
  124.   Right();
  125.   break;
  126.   default:
  127.   break;
  128. }
  129. }
  130. int NO5(void){
  131. printf(".who is the FIFA World Player at 2006\n\r") ;
  132. printf("A:Henry  B:Ronaldiaho\n\r");
  133. while(!SCI0SR1_RDRF);
  134. SCI_Receive(&sci_data);
  135. SCI_Transmit(sci_data);
  136. switch(sci_data){
  137.   case 'B':
  138.   Wrong();
  139.   break;
  140.   case 'A':
  141.   Right();
  142.   break;
  143.   default:
  144.   break;
  145. }
  146. }
復制代碼





第四章 SPI模塊第一節(jié)  SPI模塊介紹1.1  SPI的功能特點
串行設備接口SPI主要用于同步串行通信,它使MCU具備了與外圍設備以及其他微處理器進行同步通信的能力,也能夠在多主系統(tǒng)中實現(xiàn)處理器間的通信?蛇B接的設備包括簡單的移位寄存器(例如74LSl65用作并行輸入口,或74LSl64用作并行輸出口等)、LCD顯示驅(qū)動器或AID轉換器的接口。MCU可選擇8種不同的位傳送頻率、兩種不同的時鐘極性、相位和位傳送順序,因此可直接與各個廠家生產(chǎn)的多種標準的串行外圍接口器件連接。在串行外圍接口中,數(shù)據(jù)和時鐘線是分開的,在SPI格式中,時鐘不包括在數(shù)據(jù)流中,它必須是另一個獨立的信號線。MC9S12DP256的SPI可定義為主機或從機方式,主要特性如下:(1)全雙工、三線同步傳送。
(2)單個數(shù)據(jù)引腳的雙向傳送方式。
(3)主機或從機工作方式。
(4)每一晶體頻率下可通過程序選擇八種不同的主機位傳送頻率。
(5)主機位傳送頻率最大4MHz,當MCU總線頻率=8MHz時最小為31.25kHz。
(6)從機位傳送頻率最大4MHz,允許頻率范圍為0-4MHz。
(7)可程控設置位時鐘極性、相位和數(shù)據(jù)位傳送順序,即可選高位在前或低位在前。
(8)發(fā)送完成中斷標志。
(9)多主機系統(tǒng)控制沖突保護中斷標志。
(10)寫沖突標志保護。
(11)可方便地與各種簡單擴展器件接口,如PLL、D/A、鎖存器、LCD顯示驅(qū)動器等。
SPI系統(tǒng)可在軟件控制下構成各種不同復雜程度的系統(tǒng),例如:
(1)一個主MCU和一個或者幾個從MCU。
(2)幾個MCU相互聯(lián)接構成多主機的系統(tǒng)(全分布式系統(tǒng))。
(3)一個主MCU和一個或者幾個從I/O設備。
(4)一個其他主微機系統(tǒng)和一個或者幾個從MCU。
1.2  SPl的組成與工作設置
(一)SPl的結構與工作過程
    1.SPI的結構組成
SPI系統(tǒng)主要由8位移位寄存器、時鐘控制邏輯、引腳控制邏輯、SPI控制邏輯和分頻器以及波特率寄存器SPIBR、狀態(tài)寄存器SPISR、控制寄存器1SPICR1、控制寄存器2SPICR2、數(shù)據(jù)寄存器SPIDR等5個寄存器組成,如圖1所示。
SPI的核心是一個8位移位寄存器。發(fā)送或接收時,引腳的數(shù)據(jù)流在時鐘信號SCK的作用下移出或移入該寄存器。該寄存器對用戶透明,CPU通過SPIDR與其聯(lián)系。發(fā)送時將數(shù)據(jù)寫入SPIDR將直接進入移位寄存器,即所謂單緩沖;而接受到的數(shù)據(jù)則通過讀數(shù)據(jù)緩沖器到達SPIDR,因此稱為雙緩沖,這樣可以保證移位寄存器正在接收時,CPU能正確讀取上一個收到的字節(jié)。
時鐘邏輯主要用于為移位寄存器提供工作時鐘。在主模式下,內(nèi)部波特率產(chǎn)生邏輯為其提供時鐘源,同時還通過SCK引腳輸出到外部從器件;在從模式下,外部主器件通過SCK引腳提供時鐘源。分頻器的時鐘頻率通過對SPIBD的設定來選擇,因而可以得到各種位傳送速率。時鐘控制邏輯將產(chǎn)生各種極性和相位的位時鐘(SCK)信號,還可以選擇傳送時數(shù)據(jù)高位在先還是低位在先,以適應各種不同的外圍器件。
控制寄存器SPICR1、SPICR2和SPIBR用來設置SPI的工作方式,包括主/從模式、數(shù)據(jù)位順序、時鐘極性、相位、波特率以及引腳邏輯等參數(shù)。狀態(tài)寄存器SPISR保存SPI的工作狀態(tài),包括傳送結束、寫沖突和模式錯誤等。
    SPI0與PS口共享PS7-PS4引腳,SPI1與PP口共享PP7-PP4引腳, SPI2與PP口共享PP3-PP0引腳。當SPI系統(tǒng)使能時,四個引腳一般由通用I/O變?yōu)镾PI的有關引腳(、SCK、MISO、MOSI)。但當 SPI工作在雙向模式時,個別引腳仍可用作通用I/O。
圖1 SPI接口的邏輯結構與寄存器設置
2.SPI引腳
對于SPI0,當SPE=1即SPI系統(tǒng)使能時,SPI使用PS口的四個引腳:串行位時鐘SCK、主機輸入/從機輸出數(shù)據(jù)線MISO、主機輸出/從機輸入數(shù)據(jù)線MOSI和低有效的從機選擇線。在SPI系統(tǒng)關閉時,這四個引腳用作通用I/O線PS7-PS4。在通用I/O方式下,數(shù)據(jù)方向寄存器DDRS完全控制PS口引腳的數(shù)據(jù)方向,但SPI系統(tǒng)使能后,DDRS仍然參與對PS7-PS4引腳的控制,它與SPI控制寄存器共同決定相應引腳的功能。
從機選擇信號:該信號總是由主機發(fā)給從機,低電平有效。
當 MSTR=0時,MCU的SPI被設置為從機方式,其引腳為自身工作允許端(輸入狀態(tài)), SCK由外部主器件提供。若引腳輸入為邏輯1,SPI不理會外部的SCK時鐘,并且MISO引腳為高阻抗狀態(tài)。當輸入為邏輯0時,SPI被允許,在外部SCK的作用下接收或發(fā)送數(shù)據(jù)。在該方式下,不受DDS7和SSOE的控制,固定為器件選擇輸入引腳。
若MSTR=1,SPI處于主機方式,其引腳可選三種功能。
當DDS7=SSOE=0時,引腳輸出從機選擇信號,SCK輸出SPI工作時鐘。若要選中外部從機,引腳必須輸出邏輯 0,外部從機在SCK的作用下接收或發(fā)送數(shù)據(jù)。當輸出邏輯1時,從器件被禁止。每一次傳送時,輸出自動變低以選中外部器件,在傳送中間的空閑狀態(tài)回到高電平以釋放外部器件。
當DDS7=SSOE=1時,引腳為SPI系統(tǒng)的工作方式?jīng)_突錯誤檢測輸入,正常情況下保持高電平。在分布式多主機系統(tǒng)中,多個器件均可能作為主機,但是同一時刻只能有一個主機。當已有一個器件作為主機并正在選擇從器件時,引腳被其拉低到邏輯0,這時若 MCU將自身SPI設為主機,即置MSTR=1,SPI將會發(fā)現(xiàn)已經(jīng)為邏輯0,表示已經(jīng)存在主機,于是發(fā)生了工作方式?jīng)_突錯誤,SPI自動置位MODF標志,并在SPIE=1時申請中斷,通知CPU處理。
當DDS7=1、SSOE=0時,引腳為通用輸出引腳,與SPI系統(tǒng)無關。
當DDS7=0、SSOE=1時,引腳為系統(tǒng)保留功能,用戶不能使用。
(2)串行數(shù)據(jù)線(MISO、MOSI)。MISO為主入/從出線,MOSI為主出/從入線,它們用于串行接收和發(fā)送數(shù)據(jù);數(shù)據(jù)高低位傳送順序由LSBF選擇。每個MOSI、MISO引腳都是雙向引腳,當SPICR寄存器的MSTR位由軟件置1時,SPI設置為主機方式,其MISO、 MOSI分別是數(shù)據(jù)輸入/輸出線,這時主機從它的MOSI腳輸出數(shù)據(jù),從它的MISO引腳輸入數(shù)據(jù)。當器件設置為從機方式時,其MISO變?yōu)閿?shù)據(jù)輸出線,而MOSI成為數(shù)據(jù)輸入線。在多主機系統(tǒng)中,無論主從,所有SCK引腳、MISO引腳和MOSI分別聯(lián)在一起。時鐘信號由主SPI的SCK引腳輸出,送到所有的從SPI的SCK引腳,主SPI的數(shù)據(jù)從其MOSI引腳輸出,送到所有從SPI的MOSI引腳;被選中的從SPI的數(shù)據(jù)從其MISO輸出,送到主SPI的MISO引腳。
(3)串行時鐘(SCK)。在SPI設置為主機方式時,SCK信號來自內(nèi)部MCU時鐘,并從其SCK引腳輸出。在主機起動一次傳送時,自動在SCK端產(chǎn)生8個SCK時鐘脈沖。對于從機,只有其引腳為邏輯低電平時,才接收SCK時鐘信號,并與SCK同步發(fā)送或接收數(shù)據(jù)。無論是主SPI或從SPI,都是在SCK信號的一個跳變沿進行數(shù)據(jù)移位,在數(shù)據(jù)穩(wěn)定后的另一個跳變沿進行采樣。主機設備的SPIBR選擇時鐘頻率,與從機無關。主機和從機的SPI數(shù)據(jù)與位時鐘之間的傳送定時關系必須相同(由SPICR1的CPOL和CPHA位控制)。
另外,數(shù)據(jù)方向寄存器的DDRS4-DDRS6分別影響MISO、MOSI和SCK。若某一引腳作為輸出時,應使DDRS對應位置1,若作為輸入,則不受DDRS位影響。
3.SPI的雙向模式(MOMI或SISO)
當控制寄存器SPOCR2中的SPC0=1時,SPI進入一種雙向模式,事實上SPI原來就是雙向的,因此這里的雙向模式確切地說是單線雙向模式。在該模式下,SPI使用單一引腳與外部器件接口,具體引腳由MSTR控制位決定,在主模式下MOSI成為雙向引腳 MOMI,而在從模式下MISO成為雙向引腳SISO,引腳數(shù)據(jù)方向取決于相應的DDRS位。如表1所示。在使用雙向模式的系統(tǒng)中,所有需要雙向傳輸?shù)钠骷仨毠ぷ髟陔p向模式下。在雙向模式下,無論SPI作為主器件或從器件,均有一引腳重新獲得通用I/O功能。
表1 普通模式與雙向模式
4.SPI數(shù)據(jù)與位時鐘的各種時序關系
兩器件之間傳送信息,它們的時序必須一致。為了能與各種標準外圍設備接口,MCU提供了四種數(shù)據(jù)和位時鐘的時序關系,由CPOL和CPHA控制位選擇。將CPOL置1相當于在時鐘信號中串入一個反相器。除此以外,SPI還可以選擇數(shù)據(jù)位的傳送順序。時序相同時,將主機和從機的MISO、MOSI、SCK分別直接相聯(lián),即可構成一個主從系統(tǒng)。
圖2、圖3分別表示了CPHA為0、1時,單個字節(jié)數(shù)據(jù)傳送的時序。由圖可見,每個字節(jié)需要8個時鐘周期,傳送期間從器件選中信號必須有效。這里以CPOL=O、LSBF=O為例,主機發(fā)送數(shù)據(jù)為例,對兩個時序圖簡單說明如下。
圖2 CHPA=O時的數(shù)據(jù)位與時鐘時間關系
圖3 CHPA=1時的數(shù)據(jù)位與時鐘時間關系
在圖2中,主機的輸出邏輯0,選中從器件,同時MOSI輸出數(shù)據(jù)最高位,經(jīng)過半個時鐘周期后,在SCK的上升沿,從器件采樣MOSI線,保存結果。在SCK的下降沿,主機輸出下一個數(shù)據(jù)位,在下一個SCK的上升沿,從器件又采樣MOSI線,保存結果,如此循環(huán)八次,數(shù)據(jù)傳送結束,然后再延遲半個時鐘周期后釋放,回到高電平,等待半個周期后可以開始下一次傳送過程。
在圖3中,有效后,時鐘信號沒有立即輸出,因此傳送過程并沒有真正開始,而是半個周期后,時鐘和數(shù)據(jù)同時輸出,然后在時鐘的下降沿從器件采樣MOSI線,保存結果,其他與圖9-5類似。  
5.SPI的工作過程
系統(tǒng)工作時,主機發(fā)送數(shù)據(jù)的同時也接收從機來的數(shù)據(jù),從機接收的同時也向主機發(fā)送數(shù)據(jù),這個過程就好像分別位于主從器件的兩個8位寄存器被“連接”在一起形成了一個分布式的16位寄存器。當進行數(shù)據(jù)傳輸時,該寄存器在主器件時鐘SCK控制下,連續(xù)循環(huán)移動8位,于是數(shù)據(jù)在主從器件之間實現(xiàn)了數(shù)據(jù)的有效交換。對于主器件來講,寫入SPIDR寄存器的數(shù)據(jù)成為送往從器件的輸出數(shù)據(jù),經(jīng)傳輸操作后,從SPIDR讀出的數(shù)據(jù)則是來自從器件的輸入數(shù)據(jù)。
當SPI控制寄存器SPICR1中的SPE=1時,SPI系統(tǒng)使能。SPICR1中的相位控制位CPHA和極性控制位CPOL用于決定當前的SPI系統(tǒng)使用的時鐘格式。CPOL只選擇正向還是反向時鐘,而CPHA則通過選擇是否將時鐘移相180度,來協(xié)調(diào)兩種不同的協(xié)議。
在主機方式中,CPU將數(shù)據(jù)寫入SPIDR時(寫入SPIDR的數(shù)據(jù)立即裝入8位移位寄存器中),起動一個傳送過程。SCK腳輸出8個位傳送時鐘,MOSI腳串行移位輸出數(shù)據(jù)到從機SPI。同時,數(shù)據(jù)也由從SPI通過MISO腳串行移位輸入到這個8位移位寄存器中。在傳送的第8次移位后,數(shù)據(jù)并行傳送到SPIDR,此后,CPU可讀出它的內(nèi)容。每完成一次數(shù)據(jù)傳送,SPRF狀態(tài)位置位,讀SPISR(SPRF為1時),訪問SPIDR,將SPIF位清0。
在從機方式中,CPU可先向SPIDR寫入需傳送到主機的數(shù)據(jù),該數(shù)據(jù)從內(nèi)部總線并行裝入8位移位寄存器中。與主機不同,該寫入不起動傳送,從機需等待主機的信號。當CPHA為0時,腳的邏輯低電平,使數(shù)據(jù)的最高位輸出,在SCK的第一個跳變沿采樣輸入,在另一個跳變沿將數(shù)據(jù)的次高位輸出,當CPHA=1且=0時,SCK引腳的第一個跳變沿啟動從機移位,將數(shù)據(jù)的最高位輸出,在下一個跳變沿采樣輸入,這使從機與主機同步。這時,來自主機的數(shù)據(jù)由從機的MOSI腳串行輸入,并移入8位移位寄存器,同時原來8位移位寄存器的數(shù)據(jù)由從機的MISO腳串行輸出至主機。在8次數(shù)據(jù)移位后,接收的數(shù)據(jù)并行傳送到SPIDR中,等待CPU讀出。同主機一樣,每完成一次數(shù)據(jù)的傳送,SPRF位置1,這時讀 SPSR隨后訪問SPIDR將SPRF位清0。
主機可發(fā)可收,從機可收可發(fā)。主機從機之間的數(shù)據(jù)傳送是雙向的。對于主機發(fā)、從機收的情況,主機由寫入SPIDR起動一次發(fā)送過程。對于主機收、從機發(fā)的場合,也由主機寫入SPIDR起動一次傳送過程,不過寫入SPIDR的數(shù)據(jù)與傳送無關。
正在傳送時,若寫入SPIDR,將引起寫沖突錯誤。對于主機,將打斷數(shù)據(jù)的傳送,對從機若寫入SPIDR,對數(shù)據(jù)的傳送無影響。
(二)波特率設置
P時鐘經(jīng)過一組級聯(lián)的分頻器形成SPI時鐘,分頻系數(shù)由SPIBR寄存器中的SPPR2~SPPR0和SPR2~SPR0共六位控制。波特率分頻因子的表達式為:
該波特率產(chǎn)生器必須滿足兩個條件才能激活:一是SPI為主器件,二是串行傳輸正在進行,否則處于關閉狀態(tài)以降低功率消耗。詳見波特率寄存器SPIBR的說明。
(三)中斷管理
SPI設置了兩種中斷,一是數(shù)據(jù)傳送結束中斷,另一個是模式?jīng)_突中斷,二者受同一個中斷允許位SPIE的控制,每次SPIF或MODF狀態(tài)標志置位時,若CCR中的全局中斷允許位I=1,則向CPU發(fā)出硬件中斷請求。讀SPOSR寄存器、然后讀或?qū)慡PI數(shù)據(jù)寄存器將清除標志位SPIF,讀SPOSR寄存器、然后寫SPI數(shù)據(jù)寄存器將清除標志位MODF。
第二節(jié)  SPI寄存器簡介2.1  SPI控制寄存器1(SPICR1)
SPI的工作方式主要由該寄存器設置,包括主從方式、單線雙向模式選擇,時鐘及位順序等,甚至包括引腳工作特性的設置,見表2。其各位意義如下:

表2 SPI控制寄存器1
寄存器名:SPICR1;地址:$00D0;復位默認值:00000100B;讀操作:任意; 寫操作:任意。
B7
B6
B5
B4
B3
B2
B1
B0
讀寫
SPIE
SPE
SPTIE
MSTR
CPOL
CPHA
SSOE
LSBF
SPIESPI中斷允許位。
0:  禁止SPI中斷。
1:  每次SPRF或MODF狀態(tài)標志置位時發(fā)出硬件中斷請求。
SPESPI系統(tǒng)允許位。
當MODF=1時,SPE讀取結果總是0,SPOCR1的寫操作指令必須作為模式故障恢復序列的一部分嵌入其中。
0:SPI內(nèi)部硬件完成初始化,但SPI系統(tǒng)處于低功耗的禁止狀態(tài)。
1:SPI使能。
SPTIE
0:SPTEF中斷不被允許。
1:SPTEF中斷允許。
MSTR主、從模式選擇位,用于設定本機SPI以主器件還是從器件身份出現(xiàn)。
0:從模式。
1:主模式。
CPOLCPHA  SPI時鐘極性、相位選擇位,這兩位用來指定SPI的時鐘格式。當無傳輸動作且CPOL=0時,主器件的SCK引腳處于低電平,而如果CPOL=1,SCK則閑置在高電平。參看圖9-6、圖9-7。
SSOE  從器件選中輸出信號()允許位,輸出功能只有在主模式下通過置位SSOE和DDRS7實現(xiàn)。
0:  禁止輸出。
1:  允許輸出,但同時DDRS7必須為1。
LSBF  SPI數(shù)據(jù)位傳輸順序選擇位,通常要求LSBF=0,即傳輸過程高位在先。該位只決定傳輸過程中各位的先后順序,不影響數(shù)據(jù)位在寄存器中的順序,因此讀寫操作正常進行,即高位(MSB)在第7位(BIT7)。對于僅由MC9S12DP256構成的互連系統(tǒng),只要各個SPI的LSBF相同,對傳輸結果無影響,但在與外圍設備或器件連接時,SPI必須根據(jù)該設備或器件所要求的位順序正確設置LSBF。
0:  數(shù)據(jù)傳輸高位(MSB)在先。
1:  數(shù)據(jù)傳輸?shù)臀?LSB)在先。
2.2  SPI控制寄存器2(SPICR2)
表3 SPI控制寄存器2
寄存器名:SPICR2;地址:$00D1;復位默認值:00001000B;讀操作:任意;寫操作:任意。
B7
B6
B5
B4
B3
B2
B1
B0
讀寫
未定義
未定義
未定義
MODFEN
BIDIROE
未定義
SPISWAI
SPC0
MODFEN模式錯誤使能位
0:禁止模式錯誤標志位置位。
1:允許模式錯誤標志位置位。
BIDIROE雙向模式下輸出緩沖使能位
0:雙向模式下禁止輸出緩沖。
1:雙向模式下允許輸出緩沖。
SPISWAI等待模式下SPI工作方式
0:等待模式下停止SPI時鐘。
1:等待模式下SPI時鐘正常工作。
SPC0串行引腳控制,該位與MSTR位一起決定串行引腳功能設置。見表3
2.3  SPI波特率選擇寄存器
該寄存器只有六個有效位SPPR2~SPPR0和SPR2~SPR0,用來確定SPI系統(tǒng)工作時鐘SCK的頻率,即波特率。復位默認值為0,。參看表9-11。
表4 SPI波特率選擇寄存器
寄存器名:SPIBDR;地址:$00D2;復位默認值為:00000000$;讀操作:任意;寫操作:任意。
B7
B6
B5
B4
B3
B2
B1
B0
讀寫
未定義
SPPR2
SPPR1
SPPR0
未定義
SPR2
SPR1
SPR0
SPPR2-SPPR0:波特率預選位;
SPR2-SPR0:波特率選擇位。
波特率分頻因子表達式為:
2.4  SPI狀態(tài)寄存器
該寄存器反映SPI的工作狀態(tài),其中包括傳輸結束、寫沖突和模式故障三個標志位,程序可以檢查各位的狀態(tài),也可以通過特定的寄存器訪問序列將標志位清0,見表9—12。其各位意義如下:
表5 SPI狀態(tài)寄存器
寄存器名:SPISR;地址:$00D2;復位默認值:00100000B;讀操作:任意;寫操作:無意義。
B7
B6
B5
B4
B3
B2
B1
B0
SPIF
未定義
SPTEF
MODF
未定義
未定義
未定義
未定義
SPIFSPI中斷請求位,在數(shù)據(jù)傳輸過程中,SPRF在第8個SCK周期后置位,通過讀SPISR寄存器并隨后讀或?qū)憯?shù)據(jù)寄存器SPIDR清0。
0:傳輸正在進行或者根本沒有傳輸。
1:一次傳輸已經(jīng)結束。
SPTEF 當SPIDR中的值送入移位寄存器中是,該位置1。同時如果SPTIE位為1,則向CPU發(fā)出中斷請求。讀SPISR然后寫SPIDR將清除該位。
0:SPI數(shù)據(jù)寄存器非空。
1:SPI數(shù)據(jù)寄存器空。
MODFSPI模式錯誤中斷狀態(tài)位。當MSTR=1時,如果從選擇引腳在外部被拉低成邏輯0,該位由SPI硬件自動置1。這時本機SPI已經(jīng)不能成功設定為主機,顯然這種情況在正常情況下是不允許的。當DDRS7=1時,PS7是通用輸出或輸出引腳,而不是專用于SPI系統(tǒng)的輸入引腳,在這種特殊情況下,模式故障功能被禁止,MODF保持為0。讀SPOSR隨后寫入SPOCR1將清0該位。
0:無異常。
1:系統(tǒng)中已經(jīng)出現(xiàn)另一個主機,并正在選中從器件。
2.5  SPI數(shù)據(jù)寄存器
表6 SPI數(shù)據(jù)寄存器
寄存器名:SPIDR;地址:$00D5;復位默認值;讀操作:任意,一般在讀SPIF位后,寫操作:任意,讀SPTEF后
B7
B6
B5
B4
B3
B2
B1
B0
讀寫
D7
D6
D5
D4
D3
D2
D1
D0
該8位寄存器是SPI數(shù)據(jù)寄存器,具有輸入、輸出雙重功能,見表6。對該寄存器進行讀操作時所訪問的輸入部分是雙緩沖的,但寫操作則直接將數(shù)據(jù)送到串行移位器。注意:某些簡單的從器件可能只有發(fā)送功能,只向主器件發(fā)送數(shù)據(jù)而不向主器件請求數(shù)據(jù),例如并行輸入串行輸出的TTL邏輯電路:或者只有接收功能,只從主器件接收而不返回數(shù)據(jù),例如串行輸入并行輸出的TTL邏輯電路。由于SPI的傳輸是一次交換過程,對于只發(fā)送數(shù)據(jù)的從器件,交換前主機可向SPODR寫入任何數(shù)據(jù);對于只接收數(shù)據(jù)的從器件,交換后主機 SPODR中的數(shù)據(jù)無意義。
第三節(jié)  SPI應用實例
利用單片機與顯示驅(qū)動芯片MC14489的SPI通訊實現(xiàn)計時器功能
(1)實驗設備:HCS12編程器、開發(fā)板、MC14489驅(qū)動芯片、數(shù)碼管
(2)軟件程序設計:串型外部通訊是單片機與外界設備聯(lián)系的重要方式。本例子利用HCS12單片機與MC14489芯片構成的具有串型通訊功能的電路,實現(xiàn)單片機與外部設備的串口通訊。并且利用程序的相應算法實現(xiàn)計時器的功能。
(3)源程序
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dp256.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
/*聲明變量*/
int n1,n2,n3,n4,n5,j=0;
word t1,t2,time;
byte mode=0;
/*SPI初始化*/
void SPI (void) {
SPI0CR1=0b01010000;
DDRS=0x60; //S5,S6為輸出,其余為輸入
SPI0BR=0x12;
SPI0CR2=0x00;               
DDRT=0X01;//t0為輸出,其余為輸入
PTT=0X01;//T0=1
}
/*鍵盤中斷初始化*/
  void PortInit(void){
   DDRJ=0x00;   //j腳數(shù)據(jù)方向寄存器為輸入
   PIEJ=0X03;   //j腳中斷允許寄存器
}
/*延時程序*/
  void delay(word time){
   for(t2=0;t2<time;t2++){
      for(t1=0;t1<100;t1++){   
      }
   }
}
/*將單字節(jié)數(shù)據(jù)寫入14489的配置寄存器*/
  void DanZiJie(void) {
PTT=0X00;
delay(1);
SPI0DR=0b00000001;
while(!SPI0SR_SPTEF){;}
delay(3);
PTT=0X01;  
  }
/*發(fā)三字節(jié)數(shù)據(jù)*/
void SanZiJie (void) {
PTT=0X00;
delay(1);
SPI0DR=0x80+n1;               
while(!SPI0SR_SPTEF){;}
SPI0DR=0x00+n2*16+n3;
while(!SPI0SR_SPTEF){;}  
SPI0DR=0x00+n4*16+n5;
while(!SPI0SR_SPTEF){;}
delay(3);
PTT=0X01;
}
/*主程序*/
void main(void) {
  SPI();
  DanZiJie();        
  PortInit();
  EnableInterrupts;
  while(1){
  n1=j/10000;
  n2=j/1000%10;
  n3=j/100%10;
  n4=j/10%10;
  n5=j%10;
  j++;
  SanZiJie();
  delay(15600);
  }
}
/*鍵盤中斷子程序*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void PortJISR(void){
   switch(PIFJ){   //J腳中斷標志寄存器
      case 0x01: mode=0;  PIFJ_PIFJ0=1;
       for (;;){
       }
       break;
   }   
}
(4)調(diào)試結果
程序運行,計時器開始工作,本計時器的工作范圍(1s—99999s)。按下Key1計時停止,記錄時間,按下Reset鍵,計時重新開始。


第五章 A/D轉換模塊第一節(jié)  A/D模塊介紹1.1  A/D轉換原理
模擬信號依次通過抽樣和保持(S/H)電路和模擬轉換器(A/D)后轉換為數(shù)字格式。
抽樣和保持電路以均勻間隔對模擬信號進行抽樣,并且在每個抽樣運算后在足夠的時間內(nèi)保持抽樣值恒定,以保證輸出值可以被A/D轉換器精確轉換。
下一步是通過模數(shù)轉換器將抽樣和保持電路的輸出轉換為數(shù)字形式。模數(shù)轉換器的輸出通常表示為二進制編碼的形式。
轉換精度由分辨率來表示,它由離散級數(shù)量決定。比如,對一個以二進制形式編碼的長度為N位的長的輸出,有效地離散級數(shù)量是2的N次方,分辨率為離散數(shù)量級的倒數(shù)。
1.2  A/D轉換原理的應用前景
A/D轉換器是模擬信號源與計算機或其他數(shù)字系統(tǒng)之間聯(lián)系的橋梁,它的任務是將連續(xù)變化的模擬信號轉換為數(shù)字信號,以便計算機或數(shù)字系統(tǒng)進行處理、存儲、控制和顯示。在工業(yè)控制和數(shù)據(jù)采集及許多其他領域中,A/D轉換器是不可缺少的重要組成部分。
1.3  A/D轉換模塊
12中A/D轉換共有兩個方塊,每個方塊各有8個輸入通道,使用時應以標頭ATD0或ATD1標識。
1.4  功能結構圖
圖 2.1 功能結構圖
圖中所示的是A/D模塊的功能結構,這個功能模塊被虛線劃分成為圖示所示的虛線所隔離的三個部分:IP總線接口、轉換模式控制/寄存器列表,自定義模擬量。
IP總線接口負責該模塊與總線的連接,實現(xiàn)A/D模塊和通用I/O的目的,還起到分頻的作用;
轉換模式控制寄存器列表中有控制該模塊的所有的寄存器,執(zhí)行左右對齊運行和連續(xù)掃描。
自定義模擬量負責實現(xiàn)模擬量到數(shù)字量的轉換。包括了執(zhí)行一次簡單轉換所需的模擬量和數(shù)字量。
1.5  HCS12A/D特點
8/10 位精度;7 us, 10-位單次轉換時間.;采樣緩沖放大器;可編程采樣時間;左/右對齊, 有符號/無符號結果數(shù)據(jù);外部觸發(fā)控制;轉換完成中斷;模擬輸入8通道復用;模擬/數(shù)字輸入引腳復用;1到8轉換序列長度;連續(xù)轉換模式;多通道掃描方式。
ATD模塊有模擬量前端、模擬量轉換、控制部分及結果存儲等四部分組成。其中模擬前端包括多路轉換開關、采樣緩沖器、放大器等,結果存儲部分主要有8個16位的存儲器和反映工作狀態(tài)的若干標志位。
第二節(jié)  A/D寄存器簡介
要完成ATD轉換的特定功能,必須對相關寄存器有所了解。在12ATD模塊中,ATDCTL2,3,4,5為常用的控制寄存器,ATDSTAT0,1為常用的兩個狀態(tài)控制器,ATDDR0-7為八個結果寄存器。
ATD工作時,由CPU發(fā)出啟動命令,然后經(jīng)采樣、模數(shù)轉換,最后將結果保存到相應的寄存器。
ATD每次啟動要進行若干個掃描循環(huán),每個掃描循環(huán)稱為一個轉換序列,每個轉換序列能包含1-8最多8次轉換,由控制寄存器ATDCTL3中的S8C/S4C/S2C/S1C等位來決定。
這些轉換序列可以針對某個單一通道,也可以針對幾個相鄰通道,每個通道可以使外部模擬輸入,也可以是參考電壓或其他保留信號,ATD可支持多種不同的通道信號組合。每次轉換包括哪些通道由ATDCTL5中的CC、CB、CA決定的。
對單一通道連續(xù)進行多次轉換有利于實現(xiàn)濾波,一次轉換多個通道則可以通過一次啟動命令快速瀏覽多個信號,中間無需CPU干涉,節(jié)約了CPU時間。
ATD的運行方式分為單次和連續(xù)運行兩種。
在單次方式下,每個轉換序列完成后,寄存器ATDSTAT中的SCF置位,然后ATD模塊暫停。
在連續(xù)方式下,轉換以轉換序列為單位連續(xù)進行,當?shù)谝粋轉換序列完成后,SCF置位,同時ATD模塊開始下一個轉換序列。
在上述兩種方式下,每個通道的轉換結果進入到對應結果寄存器后,寄存器ATDSTAT1種對應的CCF位置1,對存放轉換結果的寄存器進行讀操作后,CCF位將自動清0。轉換過程的啟動是通過寫入寄存器5ATDCTL5實現(xiàn)的。
ATD轉換所需要的時鐘周期數(shù)是固定不變的,但是采樣時間和時鐘頻率可以通過ATDCTL4在一定范圍內(nèi)選擇,因此轉換時間也可以選擇。
2.1  控制寄存器2ATDCTL2

ADPU - A/D 電源使能/禁止
  1 =  A/D模塊上電
  0 =  禁止A/D,以減少功耗
AFFC - A/D 快速轉換完成標志位清零
  1 = 快速標志位清零順序   每次讀取結果寄存器自動清零
  0 = 正常標志位清零順序    需要手動對狀態(tài)標志位清零
AWAI - A/D 等待模式
1 = 等待模式下,轉換
0 = 等待模式下,禁止轉換
ASCIE - A/D 順序完成中斷使能
ETRIGLE
ETRIGP
ETRIGE
SCAN
描述
x
x
0
0
忽略外部觸發(fā),執(zhí)行一次轉換后停止
x
x
0
1
忽略外部觸發(fā),執(zhí)行連續(xù)轉換后
0
0
1
X
下降沿觸發(fā),每次觸發(fā),執(zhí)行一次轉換
0
1
1
X
上升沿觸發(fā),每次觸發(fā),執(zhí)行一次轉換
1
0
1
X
低電平觸發(fā),每次觸發(fā),執(zhí)行連續(xù)轉換
1
1
1
X
高電平觸發(fā),每次觸發(fā),執(zhí)行連續(xù)轉換


2.2  控制寄存器3ATDCTL3
FIFO – 結果寄存器 FIFO
  1 = 結果寄存器映射到轉換序列
  0 = 結果寄存器沒有映射到轉換序列

2.3  控制寄存器4ATDCTL4
SRES8 - A/D 精度選擇
  1 = 8 位
  0 = 10位
5位 模數(shù)計數(shù)器預分頻器
  - 由A/D控制寄存器中的PRS[4:0]控制
  - 分頻系數(shù)從2到64
  - 如果 PRS[4:0] = 0, 預分頻不起作用
注: 設置PRS[4:0]時,  A/D Clock 不能大于 2 MHz.

SMP [1:0]
采樣時間
00
2 A/D時鐘周期
01
4 A/D時鐘周期
10
8 A/D時鐘周期
11
16 A/D時鐘周期

轉換時間計算:


2.4  控制寄存器5ATDCTL5

2.5  狀態(tài)寄存器

SCF – 轉換序列完成標志
     - 在單次轉換模式時,當轉換完成后置位 (SCAN = 0)
      在連續(xù)轉換模式時,當?shù)谝淮无D換完成后置位 (SCAN = 1).
當 (AFFC = 0) ,寫1清零.
ETORF - 外部觸發(fā)覆蓋標志
  • 如果在轉換過程中高/低電平出現(xiàn),置位FIFOR
–當結果寄存器在讀出之前已經(jīng)被寫入時,置位 ( CCF沒有清零)
CC[2:0]轉換計數(shù)器
3-位計數(shù)器指向下一個將要轉換的通道
CCF7 -CCF0–獨立通道轉換完成標志位              
每個相應的通道轉換結束后置位,  當相應的A/D結果寄存器被讀出時,清零 ,注意當AFFC位不同時的情況
第三節(jié)  A/D應用示例3.1  編程步驟
要讓ATD開始轉換工作,必須經(jīng)過以下三個步驟:
1.將ADPU置1,使ATD啟動;
2.按照要求對轉換為數(shù)、掃描方式、采樣時間、時鐘頻率及標志檢查等方式進行設置;
3.發(fā)出啟動命令;
如果上電默認狀態(tài)即能滿足工作要求,那么只要將ADPU置1,然后通過控制寄存器發(fā)出轉換命令,即可實現(xiàn)轉換。
3.2  A/D程序示例單通道查詢
  1. #include <hidef.h>      /* common defines and macros */

  2. #include <mc9s12dp256.h>     /* derivative information */

  3. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

  4. int ADValue;

  5. void AD_Init(void) //初始化

  6. {

  7. ATD0CTL2=0xc0; //定義寄存器2

  8. ATD0CTL3=0x20; //定義寄存器3

  9. ATD0CTL4=0xc3; //定義寄存器4

  10. ATD0CTL5=0xa6; //定義寄存器5

  11. ATD0DIEN=0x00; // 禁止數(shù)字輸入

  12. }

  13. int AD_GetValue(void) //讀取AD轉換結果

  14. {

  15. ADValue = ATD0DR0;  //讀結果寄存器

  16. }

  17. void main(void)

  18. {

  19.   AD_Init();   //AD初始化

  20. DDRB = 0xFF;//portB均為輸出通道

  21.   PORTB  = 0x00;

  22.   for(;;)

  23.   {

  24.    while(!(ATD0STAT1&0x01)){;}   //等待轉換結束

  25.    AD_GetValue();  //讀取轉換結果

  26.    PORTB = (int)ADValue;  //在B口顯示轉換值

  27.   }

  28. }
復制代碼


3.3  A/D程序示例濾波
12中A/D系統(tǒng)啟動一次A/D轉換,能對同一模擬量輸入連續(xù)執(zhí)行多次轉換。利用此功能,使用下面的程序,可在一次采樣中執(zhí)行四取二數(shù)字濾波,從而可濾除干擾,得到精度較高的A/D轉換結果。
  1. #include <hidef.h>      /* common defines and macros */

  2. #include <mc9s12dp256.h>     /* derivative information */

  3. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

  4. static long ADValue0, ADValue1,ADValue2,ADValue3;

  5. long a,b,c,d;

  6. long m,n,sum;

  7. long max();

  8. long min();

  9. void AD_Init(void) //初始化

  10. {

  11. ATD0CTL2=0xc0; //定義寄存器2

  12. ATD0CTL3=0x20; //定義寄存器3

  13. ATD0CTL4=0xc3; //定義寄存器4

  14. ATD0CTL5=0x86; //定義寄存器5

  15. ATD0DIEN=0x00; // 禁止數(shù)字輸入

  16. }

  17. void AD_GetValue0(void) //讀取AD轉換結果

  18. {

  19. ADValue0 = ATD0DR0;  //讀結果寄存器0

  20. a=ADValue0;

  21. }

  22. void AD_GetValue1(void) //讀取AD轉換結果

  23. {

  24. ADValue1 = ATD0DR1;  //讀結果寄存器1

  25. b=ADValue1;

  26. }

  27. void AD_GetValue2(void) //讀取AD轉換結果

  28. {

  29. ADValue2 = ATD0DR2;  //讀結果寄存器2

  30. c=ADValue2;

  31. }

  32. void AD_GetValue3(void) //讀取AD轉換結果

  33. {

  34. ADValue3 = ATD0DR3;  //讀結果寄存器3

  35. d=ADValue3;

  36. }

  37. void main(void)

  38. {

  39.   AD_Init();   //AD初始化

  40.   DDRB = 0xFF;

  41.   PORTB  = 0x00;

  42.   for(;;)

  43.   {

  44.    while(!(ATD0STAT1&0x01)){;}     //等待轉換結束

  45.    AD_GetValue0();                  //讀取轉換結果

  46.    while(!(ATD0STAT1&0x02)){;}     //等待轉換結束

  47.    AD_GetValue1();                  //讀取轉換結果

  48.    while(!(ATD0STAT1&0x04)){;}     //等待轉換結束

  49.    AD_GetValue2();                  //讀取轉換結果

  50.    while(!(ATD0STAT1&0x08)){;}     //等待轉換結束

  51.    AD_GetValue3();                  //讀取轉換結果

  52.    m=max(a,b,c,d);

  53.    n=min(a,b,c,d);

  54.    sum=(a+b+c+d-m-n)/2;

  55.   }

  56. }
復制代碼


3.4  A/D程序示例定時采樣
在實際應用中,經(jīng)常需每隔一段時間對某個模擬量進行一次采樣。為實現(xiàn)定時A/D采樣,可使用12中的輸出比較功能來控制定時,其定時時間間隔可設定。在發(fā)生定時器輸出比較中斷時,進行啟動A/D轉換。然后等待A/D轉換完成,讀入數(shù)據(jù)。為了不浪費CPU時間去等待轉換的完成,可使用中斷方式。
本程序有兩部分組成:一為初始化和啟動程序,另一位定時器輸出比較中斷處理程序。CCF為標志字節(jié),它的最高位為1,表示完成一次A/D轉換,由程序可讀入的值,并應清零該位。TOF為定時器控制標志位,=0表示為處于啟動A/D狀態(tài);=1表示為等待定時時間到,以便下次采樣。
  1. #include <hidef.h>      /* common defines and macros */

  2. #include <mc9s12dp256.h>     /* derivative information */

  3. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

  4. int ADValue0;

  5. unsigned int i=0;

  6. int  counter=0;

  7. void AD_Init(void) //初始化

  8. {

  9. ATD0CTL2=0xc0; //定義寄存器2

  10. ATD0CTL3=0x08; //定義寄存器3

  11. ATD0CTL4=0xc3; //定義寄存器4

  12. ATD0CTL5=0xa0; //定義寄存器5

  13. ATD0DIEN=0x00; // 禁止數(shù)字輸入

  14. }

  15. void AD_GetValue0(void) //讀取AD轉換結果

  16. {

  17. ADValue0 = ATD0DR0;  //讀結果寄存器0

  18. }

  19. void main(void)

  20. {

  21.   TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8

  22.   TSCR2_TOI  = 1;  //timer overflow interrupt enable

  23.   TSCR1_TEN  = 1;  //timer enable

  24.   AD_Init();   //AD初始化

  25.   DDRB = 0xFF;

  26.   PORTB  = 0x00;

  27.   EnableInterrupts;

  28.   for(;;) {

  29.   }

  30. }

  31. #pragma CODE_SEG NON_BANKED

  32. #pragma TRAP_PROC

  33. void Int_TimerOverFlow(void)

  34. {

  35. {

  36.    counter++;

  37.    if(counter==10)

  38.    {

  39.     while(!(ATD0STAT1&0x01)){;}     //等待轉換結束

  40.     AD_GetValue0();                  //讀取轉換結果

  41.     PORTB = (int)ADValue0;         //在B口顯示轉換值

  42.     for(i=0;i<=1000;i++);   //delay

  43.      counter=0;

  44.    }

  45. }

  46. TFLG2_TOF  = 1;  //clear timer overflow flag

  47. }

  48. #pragma CODE_SEG DEFAULT
復制代碼





第六章 EEPROM模塊
    MC9S12DP256B內(nèi)部同時集成了兩種非易失存儲器:FLASH和EEPROM,前者用于存儲程序,后者可用來保存組態(tài)、設置等關鍵數(shù)據(jù),它們均為防止誤操作而設置了各種保護措施。本章主要介紹EEPROM的功能、特點及使用,包括擦除與寫入步驟。
第一節(jié)  EEPROM模塊介紹1.1  EEPROM功能
MC9S12DP256內(nèi)部集成了4KB的EEPROM存儲器,具有單塊和整塊擦除、編程、靈活保護和安全功能、快速區(qū)域擦除和字編程模式特點,規(guī)范字訪問可在單總線周期內(nèi)完成。EEPROM是一種非易失性存儲介質(zhì),具有穩(wěn)定、保密性好的特點,在系統(tǒng)掉電后,EEPROM中的內(nèi)容仍能可靠保持不變,可以用來保存一些短時間不變的內(nèi)容(如環(huán)境參數(shù)、產(chǎn)品序列等)。EEPROM可以同RAM一樣地讀,但要向EEPROM寫入需要一定的時序和花費比RAM多的時間,即需要一段特定的程序來寫EEPROM。
1.2  EEPROM結構
$0000~$0FFF是4KB為EEPROM的存儲空間,復位時默認的EEPROM地址是從0開始的,而單片機各I/O寄存器的地址已經(jīng)占用了從0地址開始的1KB空間,故EEPROM中開始的1KB空間($0000---$03FF)看不到了,所以實際上用戶可以訪問的是$0400---$0FFF的3KB的存儲空間。
EEPROM設有保護機制,用戶可以通過編程$0FFD,在普通模式下設定需要的保護空間,保護空間可在64B、128B、192B、256B、320B、384B、448B、512B中進行選擇,相應的保護區(qū)在$0XXX---$0FFFF。由于設定保護地址所訪問的地址也在所保護的區(qū)域中,所以一旦用戶在普通模式下對$0FFD的內(nèi)容進行了編程,就無法再在此模式下修改保護區(qū)的內(nèi)容,從而也就達到了寫保護或禁止局部擦除的效果。要改變保護區(qū)的設定,需要單片機工作在“特殊模式”下,訪問EPROT寄存器,而一旦在特殊模式下取消了保密屬性,該區(qū)的內(nèi)容也就被擦除了。
1.3  EEPROM特點
①單電源供電擦寫
②自動編程和擦除算法
③命令執(zhí)行完可產(chǎn)生中斷
④快速扇區(qū)擦除和字編程操作
⑤靈活的保護機制,避免意外編程和擦除
第二節(jié)  EEPROM寄存器簡介2.1  時鐘分頻寄存器ECLKDIV
   
EDIVLD:EEPROM時鐘分頻加載。ECLKDIV寄存器被寫入時此位置“1”;若此位置“0”,F(xiàn)CLKDIV寄存器從最后復位后沒有寫入。在沒有寫入此寄存器之前,擦寫和編程eeprom將引起進入錯誤和命令不被執(zhí)行。
1:最后復位后寄存器寫入。
0:寄存器沒有寫入。
PRDIV8:8分頻控制。
0 - 晶振時鐘為EEPROM時鐘分配器的時鐘源
1 - 晶振時鐘除以8后,為EEPROM時鐘分配器的時鐘源
EDIV[5:0] 時鐘分配器位
PRDIV8和EDIV[5:0]聯(lián)合用于將外部晶振頻率分頻為150~200KHZ。
注意:在對EEPROM進行操作之前,必須對時鐘進行初始化
這個頻率用于驅(qū)動EEPROM擦寫和編程。外部晶振頻率大于12.8MHZ,PRDIV8置1位,CLK=OSCCLK/8。反之,PRDIV8 置零,CLK=OSCCLK。
ECK=CLK/(EDIV[5:0]+1)。
2.2  配置寄存器ECNFG
   
CBEIE:命令緩沖區(qū)空中斷允許位,
0:命令緩沖區(qū)空中斷關閉。
1:命令緩沖區(qū)空中斷允許。
CCIE — 指令完成中斷使能,當所有指令被完成該位產(chǎn)生中斷
0:命令完成中斷關閉。
2.3  保護寄存器EPROT
   
EPOPEN:開啟EEPROM編程/擦寫
1:全部EEPROM或是部分EEPROM可以擦寫;
0:所有EEPROM塊保護。
EPDIS:EEPROM部分保護位
1:不作部分保護EEPROM。
0:EEPROM部分保護。
EP[2:0]——EEPROM保護地址范圍
2.4  狀態(tài)寄存器ESTAT
CBEIF:命令緩沖區(qū)空中斷標志,表示地址、數(shù)據(jù)命令緩沖去空,新的命令序列開始,標志寫“1”清零,通過標志清零,發(fā)出命令序列。寫“0”將取消沒有發(fā)出的命令序列,并ACCERR標志置“1”。
1:緩沖準備好接受新的命令。
0:緩沖器滿
CCIF— 命令完成中斷標志,表明不再有未決的指令。該標志通過硬件寫入來清除,寫操作不起作用。
1:所有命令完成。
0:命令正在進行。
PVIOL:保護沖突標志。表示在保護地址空間內(nèi)進行了擦寫或編程操作,在此標志置位同時,后續(xù)的擦寫或編程操作無法進行。標志寫“1”清零,寫“0” 無影響。在CBEIF清零后或者當CCIF清零時,寫入新的有效命令可以使保護錯誤標志清零。
1:保護沖突已發(fā)生。
0:無故障。
BLANK — 空白校驗標志
表明在響應一條擦除校驗指令后EEPROM塊已被完全地擦除
該標志位通過寫“1”被清除.
1 = EEPROM 被完全擦除.
0 = EEPROM未被完全擦除
ACCERR— 存取錯誤標志
表明在編程或擦除時序中有錯誤。該標志位通過寫“1”來清除。
1 = 存取錯誤已出現(xiàn)
0 = 指令時序或執(zhí)行被成功完成
ACCERR:進入錯誤標志。表示非法進入EEPROM塊或者與定義命令序列沖突。以下命令序列會引起ACCERR置位:
1在初始化ECLKDIV之前,向EEPROM地址寫值;
2向EEPROM地址寫入錯誤的字或字節(jié);
3在CBEIF未置1時,向EEPROM地址寫值;
4在執(zhí)行前一個編程或擦除命令之前,向EEPROM地址寫入第二個字
5在向EEPROM地址空間寫入字后,接著寫其它EEPROM寄存器,沒有寫ECMD寄存器;
6在執(zhí)行前一個寫好的命令之前,向ECMD寄存器寫入第二個命令;
7在對有保護的EEPROM空間,向ECMD寄存器寫入整塊擦除命令;
8在對有保護的EEPROM空間,向ECMD寄存器寫入部分擦除命令;
9在寫完命令寄存器后,接著寫其它EEPROM寄存器,而沒有寫ESTAT寄存器;
10在命令行列已開始或擦/寫命令已執(zhí)行的同時,從EEPROM塊讀取。這樣讀到無效數(shù)據(jù)。
2.5  命令寄存器ECMD
ERASE:EEPROM擦除
0:  無意義
1:  在MASS=0時,區(qū)域擦除;在MASS=1時,區(qū)域擦除;
PROG:EEPROM編程
0:  無意義。
1: EEPROM 編程。
ERVER:擦除校驗:
0:  無意義。
1:  區(qū)域擦除后擦除校驗。
MASS: 全局鏟除
0: 部分擦除
1: 全部擦除
注意:只有在ERASE和MASS同時置1時,才能實現(xiàn)全部擦除。
有關寄存器ECMD的命令字的設置:
第三節(jié)  EEPROM應用實例3.1  EEPROM的寫入操作
EEPROM的寫入操作可以按照以下步驟進行:
1. ECLKDIV寄存器初始化,確定分頻因子
2. 檢查EEPROM時鐘分頻寄存器(ECLKDIV_EDIVLD)是否已  經(jīng)設置
3. 檢查命令緩沖區(qū)(ESTAT_CBEIF)是否為空
4. 對讀寫錯誤(ESTAT_ACCER)標志位清零(寫1清零)
5. 對保護區(qū)編程錯誤(ESTAT_PVIOL)標志位清零(寫1清零)
6.檢查保護寄存器(EPROT_EPOPEN)是否允許編程/寫
7. 將編程的數(shù)據(jù)賦值給要編程的EEPROM地址
8. 對EEPROM命令寄存器(ECMD)寫入編程命令(0x20)
9. 對命令緩沖區(qū)空標志位(ESTAT_CBEIF)清零(寫1清零)
10. 等待,直到命令完成標志位(ESTAT_CCIF)置位
3.2  EEPROM的擦除操作
1. ECLKDIV寄存器初始化,確定分頻因子
2. 檢查EEPROM時鐘分頻寄存器(ECLKDIV_EDIVLD)是否已經(jīng)設置
3.檢查命令緩沖區(qū)(ESTAT_CBEIF)是否為空
4.對讀寫錯誤(ESTAT_ACCER)標志位清零(寫1清零)
5.對保護區(qū)編程錯誤(ESTAT_PVIOL)標志位清零(寫1清零)
6.檢查保護寄存器(EPROT_EPOPEN)是否允許編程/寫
7. 在要擦除的EEPROM的段地址內(nèi)寫入任意數(shù)據(jù)
8. 對EEPROM命令寄存器(ECMD)寫入段擦除命令(0x40)
9. 對命令緩沖區(qū)空標志位(ESTAT_CBEIF)清零(寫1清零)
10. 等待,直到命令完成標志位(ESTAT_CCIF)置位
3.3  EEPROM示例程序(見附件)


第七章 FLASH模塊
    MC9S12DP256B內(nèi)部同時集成了兩種非易失存儲器:FLASH和EEPROM,前者用于存儲程序,后者可用來保存組態(tài)、設置等關鍵數(shù)據(jù),它們均為防止誤操作而設置了各種保護措施。本章主要介紹flash的功能、特點及使用,包括擦除與寫入步驟。
第一節(jié)  FLASH模塊介紹1.1  FLASH功能
MC9S12DP256內(nèi)部集成了256KB的FLASH存儲器,具有單塊和整塊擦除、編程、靈活保護和安全功能、快速區(qū)域擦除和字編程模式特點,規(guī)范字訪問可在單總線周期內(nèi)完成。可以存放整個程序或者需要高速訪問或經(jīng)常運行的程序代碼,如操作系統(tǒng)核心或標準子程序庫、數(shù)據(jù)表格等。FLASH模塊對于單芯片應用系統(tǒng)是理想的程序存放處,它允許在現(xiàn)場進行代碼更新。
Flash是一種非易失性存儲介質(zhì),讀取它的內(nèi)容同RAM的讀取一樣方便,而對它的寫操作卻比EPROM還要快。同時,在系統(tǒng)掉電后,F(xiàn)lash中的內(nèi)容仍能可靠保持不變。Flash的主要優(yōu)點是結構簡單、集成密度大、成本低。由于Flash可以局部擦除,且寫入、擦除次數(shù)可達數(shù)萬次以上,從而使開發(fā)微控制器不再需要昂貴的仿真器。
1.2  FLASH結構
$4000~4FFFF是48KB為FLASH的存儲空間,分成3個16KB空間如圖1-1所示。最后16KB空間的最后256B,即$FF00~$FFFF是中斷向量表空間。由于FLASH模塊的地址范圍超過STAR12(16位)最大地址64KB空間,因此模塊采用從一個$8000~$BFFF 16KB地址窗口分配地址,其余的地址位分配在分頁寄存器PPAGE。256KB的FLASH由4個64KB塊組成,如表3-1所示,每塊64KBFLASH按照16位二進制方式組織,支持按字節(jié)或字方式訪問。字節(jié)和規(guī)則字的訪問可在單總線周期內(nèi)完成,非規(guī)則字訪問需兩個總線256KB的FLASH被分成4個64KB塊,每一塊又可以繼續(xù)細分為16KB一頁,共16頁。每一頁再細分為4KB、2KB、1KB、或者512B一段。
              圖1-1 MC9S12DP256B置位后的內(nèi)存
1.3  FLASH特點
• 自動編程和擦除算法
• 快速扇區(qū)擦除和字編程操作
• 指令完成時中斷
• 2段命令流水線,快速實現(xiàn)多個字的編程
• 靈活的保護機制,避免意外編程和擦除
• 預防非法訪問的加密特征
第二節(jié)  FLASH寄存器簡介
FLASH寄存器如表2-1所示
2.1 時鐘分頻寄存器FCLKDIV
FDIVLD:FLASH時鐘分頻加載。FCLKDIV寄存器被寫入時此位置“1”;若此位置“0”,F(xiàn)CLKDIV寄存器從最后復位后沒有寫入。在沒有寫入此寄存器之前,擦寫和編程FLASH將引起進入錯誤和命令不被執(zhí)行
0 - FCLKDIV 寄存器沒有被寫過
1 - FCLKDIV 寄存器從最近一次復位起已經(jīng)被寫過
PRDIV8 使能時鐘8分頻
0 - 晶振時鐘為FLASH時鐘分配器的時鐘源
1 - 晶振時鐘除以8后,為FLASH時鐘分配器的時鐘源
FDIV[5:0] 時鐘分配器位
—PRDIV8 和FDIV[5:0]的設置,必須滿足FLASH時鐘在150 kHz – 200 kHz范圍內(nèi)。最大的分頻系數(shù)為512。在對FLASH進行操作之前,必須對時鐘進行初始化,否則接下來的任何操作將是無效的。
2.2 配置寄存器 FCNFG
CBEIE — 指令緩沖區(qū)空中斷使能
該位在空地址,數(shù)據(jù)和指令緩沖區(qū)的情況下使能中斷。
1 = CBEIF標志被置位產(chǎn)生中斷請求
0 = 指令緩沖區(qū)空中斷禁止
CCIE — 指令完成中斷使能
當所有指令被完成該位產(chǎn)生中斷
1 = CCIF 標志被置位產(chǎn)生中斷請求
0 = 指令完成中斷禁止
KEYACC — 使能安全密匙寫入
1 = 寫入flash模塊被解釋成打開后門的密匙.
0 = Flash 寫入后編程或擦除過程的開始
2.3 安全寄存器 FSEC
KEYEN:安全門碼控制。
1:允許通過BDM或外部總線接口開啟安全門。
0:禁止通過BDM或外部總線接口開啟安全門。
當KEYEN置1時,用戶可以通過以下步驟避開安全檢查
FCNFG寄存器中KEYACC置1。
通過安全門比較碼地址向FLASH 寫四個正確16位字。
將FCNFG寄存器中KEYACC置0。
如果全部四個字與FALSH內(nèi)容相符,強制通過SEC[1:0]處于非安全狀態(tài),使MCU處于非安全狀態(tài)。
6.如果全部四個字與FALSH內(nèi)容不相符,MCU處于安全狀態(tài),向CPU發(fā)回安全沖突信號。
NV[6:2]:非沖突標志位。這5位是用戶可以用做非沖突標志。
SEC0[1:0] 存儲安全位。這2位決定設備的安全狀態(tài)。如表2-2所示
表2-3  SEC0[1:0] 與安全狀態(tài)關系
SEC0[10]
00
01
10
11
描述
安全
安全
非安全
安全

2.4 保護寄存器 FPROT
FPOPEN—FLASH編程或擦除保護
1 = FPHDIS和FPLDIS定義的FLASH地址區(qū)域不被保護
0 =
FPHDIS—Flash 保護高地址范圍禁止
該位用來決定在Flash塊地址映射的較高末端是否存在一個被保護的區(qū)域
1 = 保護禁止
0 = 保護使能
FPHS[1:0]—Flash 保護高地址范圍
這兩位用來決定保護區(qū)域的范圍。
FPLDIS—Flash 保護較低的地址范圍禁止
該位用來決定在Flash塊地址映射的較低末端是否存在一個被保護的區(qū)域
1 = 保護禁止
0 = 保護使能
FPLS[1:0]—Flash保護低地址范圍
這兩位用來決定保護區(qū)域的范圍
2.5 狀態(tài)寄存器 FSTAT 狀態(tài)寄存器
CBEIF— 指令緩沖區(qū)空中斷標志
表明地址,數(shù)據(jù)和指令緩沖區(qū)為空因此一個新的指令序列可以開始。
該標志通過寫人“1”清除。指令序列通過清除該位來開始。
寫入“0” 可異常中止一個尚未開始的指令序列且置ACCERR標志
1 = 緩沖區(qū)準備接收一個新指令
0 = 緩沖區(qū)滿
CCIF— 指令完成中斷標志
表明不再有未決的指令。該標志通過硬件寫入來清除
寫操作不起作用。
1 = 所有指令都被完成
0 = 指令進行中
PVIOL— 保護錯誤標志
表明試圖對被保護的存儲器區(qū)域中的一個地址編程或擦除。
若該位被置1則并行的編程或擦除指令不能被執(zhí)行。該標志通過寫入“1”被
清除,也可通過在CBEIF被清零后或當CCIF 被清除時寫一條新的,有效
的指令來清除
1 = 保護系統(tǒng)侵犯已出項
0 = 無故障
ACCERR— 存取錯誤標志
表明在編程或擦除時序中有一個錯誤。該標志位通過寫
“1”來清除。
1 = 存取錯誤已出現(xiàn)
0 = 指令時序或執(zhí)行被成功完成
ACCERR:進入錯誤標志。表示非法進入FLASH塊或者與定義命令序列沖突。以下命令序列會引起ACCERR置位:
1.在初始化FCLDIV之前,向FLASH地址寫值;
2.當分頁寄存器沒有選擇16KBFLASH塊,向$8000~$BFFF地址空間的FLASH寫值;
3.向$4000~$7FFF地址空間的FLASH寫值或在BKSEL[1:0]沒選FALSH 0下,向$C000~$FFFF地址空間的FLASH寫值;
向FLASH地址空間寫入錯誤的字或字節(jié);
4.CBEIF未置1時,向FLASH地址寫值;
5.在執(zhí)行前一個編程或擦除命令之前,向FLASH地址空間寫入第二個字;
6.在向FLASH地址空間寫入字之后,接著寫其他FLASH寄存器,沒有寫FCMD寄存器;
7.在執(zhí)行完前一個寫好的命令之前,向FCMD寄存器寫入第二個命令;
8.在對有保護FLASH空間,向FCMD寄存器寫入整塊擦除命令;
9.在對有保護FLASH空間,向FCMD寄存器寫入部分擦除命令;
10.在寫完命令寄存器后,接著寫其他FLASH寄存器,沒有寫FSTAT寄存器;
11.在命令序列已開始或擦除/編程命令以執(zhí)行的同時,從FLASH塊讀取。這樣讀到無效數(shù)據(jù),但能讀其他沒有編程的FLASH塊。
BLANK:FLASH塊校驗標志,表示響應的擦除—校驗命令時FLASH塊全部擦除,標志寫“1”清零,寫“0” 無影響。
1:FLASH塊全部擦除
0:FLASH塊沒有全部擦除
BITS[1:0] 這兩位用于工廠測試預留,用戶無法使用。
2.6 命令寄存器 FCMD
ERASE:FLASH 擦除
0:  無意義
1:  在MASS=0時,區(qū)域擦除;在MASS=1時,區(qū)域擦除;
PROG:FLASH 編程
0:  無意義。
1: FLASH 編程。
ERVER:擦除校驗:
0:  無意義。
1:  區(qū)域擦除后擦除校驗。
MASS: 全局鏟除
0: 部分擦除
1: 全部擦除。
第三節(jié)  FLASH應用實例3.1  FLASH的寫入操作
FLASH的寫入操作可以按照以下步驟進行:
1. FCLKDIV寄存器初始化,確定分頻因子
2.設置FCNFG寄存器和PPAGE寄存器,用于管理命令序列。寫FCNFG寄存器中的BKSEL[1;0]位,選擇要擦除或編程的FALKSH塊狀的相應寄存器。如果編程在8000~BFFF地址范圍內(nèi),向(內(nèi)核)寄存器(X030)寫入值選擇要編程的某一16KB頁。當編程在4000~7FFF或C000~FFFF地址范圍,沒有必要寫分頁寄存器。
3. 檢查FLASH時鐘分頻寄存器(FCLKDIV_FDIVLD)是否已經(jīng)設置
4. 檢查命令緩沖區(qū)(FSTAT_CBEIF)是否為空
5. 對讀寫錯誤(FSTAT_ACCER)標志位清零(寫1清零)
6. 對保護區(qū)編程錯誤(FSTAT_PVIOL)標志位清零(寫1清零)
7. 將編程的數(shù)據(jù)賦值給要編程的FLASH地址
8. 對FLASH命令寄存器(FCMD)寫入編程命令(0x20)
9. 對命令緩沖區(qū)空標志位(FSTAT_CBEIF)清零(寫1清零)
10. 等待,直到命令緩沖區(qū)標志位(FSTAT_CBEIF)置位
11. 檢查是否還有新的數(shù)據(jù)需要寫入到FLASH,如有轉到第7步
12. 等待,直到命令完成標志位(FSTAT_CCIF)置位
3.2  FLASH的擦除操作
1. FCLKDIV寄存器初始化,確定分頻因子
2.設置FCNFG寄存器和PPAGE寄存器,用于管理命令序列。寫FCNFG寄存器中的BKSEL[1;0]位,選擇要擦除或編程的FALKSH塊狀的相應寄存器。如果編程在8000~BFFF地址范圍內(nèi),向(內(nèi)核)寄存器(X030)寫入值選擇要編程的某一16KB頁。當編程在4000~7FFF或C000~FFFF地址范圍,沒有必要寫分頁寄存器。
3. 檢查FLASH時鐘分頻寄存器(FCLKDIV_FDIVLD)是否已經(jīng)設置
4. 檢查命令緩沖區(qū)(FSTAT_CBEIF)是否為空
5. 對讀寫錯誤(FSTAT_ACCER)標志位清零
6. 對保護區(qū)編程錯誤(FSTAT_PVIOL)標志位清零
7. 在要擦除的FLASH的段地址內(nèi)寫入任意數(shù)據(jù)
8. 對FLASH命令寄存器(FCMD)寫入段擦除命令(0x40)
9. 對命令緩沖區(qū)空標志位(FSTAT_CBEIF)清零
10. 等待,直到命令完成標志位(FSTAT_CCIF)置位
3.3  FLASH的擦寫操作注意事項
a、由于在FLASH的擦除和寫入過程中,F(xiàn)LASH是不能讀的,故擦除和寫入FLASH的程序要放在RAM中,換言之,在FLASH的擦除或?qū)懭胫,要把擦除或(qū)懭氲目蓤?zhí)行代碼復制到RAM中去,并讓程序在RAM中執(zhí)行。這段程序的編譯是在FLASH中的程序段復制到RAM中的數(shù)據(jù)段,不論這段程序復制到RAM中的哪一段,即無論程序的起始地址在哪里,程序都能正確執(zhí)行。這就要求生成的程序和裝載地址無關,程序可以重載。
b、系統(tǒng)初始化后一定要嚴格按照上述步驟規(guī)范設置,這樣避免出現(xiàn)邏輯錯誤也便于檢查錯誤。此外,在編程選擇寫入或者擦除的范圍時,一定要明確所選區(qū)域是否需要設置分頁寄存器。
3.4  FLASH示例程序
  1. #include <hidef.h>      /* common defines and macros */
  2. #include <mc9s12dp256.h>     /* derivative information */
  3. #pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
  4. #define portb (*((volatile unsigned char*)(0x0001)))
  5. #define ddrb  (*((volatile unsigned char*)(0x0003)))
  6. #define ppage  (*((volatile unsigned char*)(0x0030)))
  7. #define fclkdiv  (*((volatile unsigned char*)(0x0100)))
  8. #define fcnfg (*((volatile unsigned char*)(0x0103)))
  9. #define fprot (*((volatile unsigned char*)(0x0104)))
  10. #define fstat  (*((volatile unsigned char*)(0x0105)))         
  11. #define fcmd  (*((volatile unsigned char*)(0x0106)))
  12. #define any  (*((volatile unsigned char*)(erase)))
  13. #define a  (*((volatile unsigned char*)(0x2000)))
  14. #define EraseInSector 0x40;
  15. #define ProgramInAlignedWord 0x20;
  16. unsigned  char *flashaddr;
  17. unsigned  char *progaddr;
  18. unsigned  char *erase,*base,*end1,*end2;
  19. unsigned  int i;
  20.         /*flash擦除函數(shù)*/        
  21.         void eraseflash ()
  22.     {
  23.       while(erase<=(volatile unsigned char*)(end1))
  24.      {
  25.         while(!(fclkdiv&0x80))    //時鐘是否加載
  26.                {}
  27.         while(!(fstat&0x80))     //命令緩沖區(qū)是否為空
  28.                {}
  29.         while(!(fprot&0x80))      //flash是否允許寫入或者擦除
  30.                {}
  31.          any=0xff;
  32.         fcmd=EraseInSector;       //扇區(qū)擦除命令,每次擦除512B
  33.       fstat|=0x80;               //準備接收新的命令                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
  34.       while(!(fstat&0x40))       //判斷命令是否完成,沒有則等待
  35.              {}
  36.       erase+=512;                 //擦除地址遞加
  37.      }
  38.    }
  39.         /*flash寫入函數(shù)*/
  40.        void  writeflash ()
  41.     {
  42.       while(flashaddr<=(volatile unsigned char*)(end2))
  43.       {
  44.          while(!(fclkdiv&0x80))
  45.                  {}
  46.          while(!(fstat&0x80))
  47.                  {}
  48.          while(!(fprot&0x80))
  49.                  {}
  50.          while(!SCI0SR1_RDRF) ;      //等待接收數(shù)據(jù)
  51.               SCI_Receive(&a) ;
  52.          *flashaddr=*progaddr ;
  53.             if(SCI0SR1_TDRE)
  54.       SCI_Transmit(*flashaddr);
  55.              flashaddr++;
  56.               progaddr++;
  57.      FCMD=ProgramInAlignedWord;
  58.              FSTAT|=0x80;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
  59.       while(!(FSTAT&0x40))
  60.                 {}
  61.       }
  62.    }
  63.       /*flash初始化函數(shù)*/
  64.         void  flash_init ()
  65.        {
  66.          fclkdiv=0x4a;   //時鐘分頻
  67.            FCNFG=0x00;    /*選擇flash模塊0*/
  68.            FSTAT=0X30;    //清除上次的錯誤標示位
  69.         // PPAGE=0x30;    /*分頁寄存器設置,選擇30頁
  70.        }
  71.        // 串口初始化函數(shù)
  72.      int SCI_Init(void) {
  73.           SCI0BDL=0x34;
  74.           SCI0CR2=0X2C;
  75.         }
  76.         //發(fā)送子函數(shù)
  77.        int SCI_Transmit(byte data){
  78.         while(!SCI0SR1_TDRE) ;
  79.               SCI0DRL=data;
  80.             }
  81.         //接收子函數(shù)
  82.    int SCI_Receive(byte *data){
  83.       *data=SCI0DRL;
  84.        }
  85.      void main(void)
  86.     {
  87.       ddrb=0xff;
  88.       erase=(volatile unsigned char*)(0x4000);
  89.       end1= (volatile unsigned char*)(0xbfff);
  90.       end2= (volatile unsigned char*)(0x5000);
  91.       flashaddr=(volatile unsigned char*)(0x4000);
  92.       progaddr=(volatile unsigned char*)(0x2000);
  93.        flash_init () ;//flash初始化函數(shù)調(diào)用
  94.         portb=0xf0;
  95.         SCI_Init();     // 串口初始化函數(shù)調(diào)用
  96.         eraseflash () ;     //flash擦除函數(shù)
  97.         for(i=0;i<=10000;i++)
  98.         portb=0x0f;            //演示擦除完畢
  99.         writeflash ();        // flash寫入函數(shù)
  100.          while(1) {}
  101.      }
復制代碼

各位智能車同仁,加油哦!當然記得支持本店哦!我們一定會竭誠為你服務


第八章 CodeWarrior IDE 12應用
第一步:雙擊桌面CodeWarrior IDE 12圖標,進入CodeWarrior IDE 12運用界面。在打開的界面中點擊菜單File,在其下拉菜單中點擊New,新建數(shù)據(jù)庫文件。
第二步:新建一個數(shù)據(jù)庫,如圖選擇第一行(HC(s)12New Project Wizard),然后再右面命名123(任意命名均可),確定。
第三步:進入歡迎界面,點擊下一步。然后選擇芯片型號MC9S12DP256B,點擊下一步。程序一定要與單片機型號一直,否則在硬件調(diào)試中會出現(xiàn)錯誤。
第四步:選擇使用的語言,在此選擇C語言,點擊“下一步”。
第五步:選擇調(diào)試專家,在此選擇“NO”,點擊“下一步”。
第六步:界面如下圖所示,選擇“NO”,點擊“下一步”。
第七步:界面如下圖所示,選擇” ANSI startup code” ,點擊“下一步”。
第八步:選擇有無浮點格式,根據(jù)自己情況而定,本程序在此選擇“None”,點擊“下一步”。
第九步:界面出現(xiàn)“選擇存儲模式?”,選擇Banked,點擊下一步。
第十步:界面出現(xiàn)“選擇硬件連接電纜型號?”,前兩項全選中,點擊“完成”。
第十一步:進入如下界面,點擊左側Sources文件前面的加號,選擇主程序中的Main.c,雙擊左鍵進入。
第十二步:顯示界面如下,其中右側為Main.c的編輯環(huán)境,可以在此輸入你的單片機程序,也可以刪除、修改或拷貝你前面編輯完成的程序。
例如當輸入以下源程序:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dp256.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
void main(void)
{
  PWME_PWME0=0;   //關閉0通道
  PWMPRCLK=0X05;  //對總線時鐘進行預分頻,總線時鐘為8M,分頻后為250K
  PWMCLK_PCLK0=0; //設A為其時鐘源
  PWMSCLA=0X7D;   //A時鐘為2000Hz
  PWMPOL_PPOL0=1;//上升沿翻轉
  PWMCAE_CAE0=0;//左對齊輸出
  PWMDTY0=0X01; //占空比為25%的波形
  PWMPER0=0X04;  //輸出為500Hz的波
  PWMCNT0=0X00;//0通道計數(shù)器清0
  PWME_PWME0=1;//0通道使能,0通道為輸出通道
}
第十三步:程序輸入以后,點擊工具欄的圖標(make)檢查程序是否有錯,如果有錯,會在編輯框上方提示錯誤警告,以為標志,程序中會隨之用紅色箭頭在程序中標出出錯位置。例如下圖中的程序有兩個錯誤(第12行少了一個分號,導致無法編譯通過)。檢查程序并修改,直到?jīng)]有錯誤為止。
前面介紹的屬于程序在計算機中的編譯運行,不需要開發(fā)工具,適用于初試開發(fā)和檢查程序有無語法錯誤。下面介紹采用開發(fā)板的實際調(diào)試過程:
第一步:在上述單片機程序編譯的基礎上,將編程器與仿真試驗板連接好,編程器下載口用數(shù)據(jù)線同計算機相連,試驗板與5V直流電源相連。點擊圖標開始調(diào)試(debug),進入調(diào)試仿真狀態(tài)后會出現(xiàn)如下界面。
第二步:在上面的界面中點擊“確定”以后。會出現(xiàn)下面界面“連接失敗”,仍點擊“確定”。
第三步:在上面的界面單擊“確定”以后,會出現(xiàn)如下界面單擊“取消”


第四步:在單擊“取消”以后,出現(xiàn)“硬件連接”失敗界面如下圖所示,單擊確定。
,


第五步:在上面的界面單擊“確定”以后,會發(fā)現(xiàn)光標在COMMAND窗口in>后閃動,輸入字母set gdi(注意set和gdi之間有一個空格)后單擊“回車鍵”。
第六步:單擊Browse按鈕,在安裝的軟件文件夾mc12中找到指定文件tbdml_gdi12.dll,然后單擊“確定”。




第七步:在上面的界面單擊“確定”以后,在圖示窗口輸入晶振頻率數(shù)值16:00后單擊“OK”。
第八步:在上面的界面單擊“確定”以后,在如下界面中單擊“OK”。
第九步:在TBDML HCS12中單擊Load,然后在自己建立的文件夾里找到bin文件夾,單擊bin文件夾然后再雙擊其中的第一個文件即可將源程序下載到flash中。
第十步:單擊圖示按鈕即可執(zhí)行所編程序功能。



完整的Word格式文檔51黑下載地址:
MC9S12中文版培訓教材1.doc (2.17 MB, 下載次數(shù): 26)



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表