1. 程式人生 > >MSP430微控制器各種暫存器總結(2)——UCS

MSP430微控制器各種暫存器總結(2)——UCS

作者:BerenCamlost

本文針對於南京理工大學的王巨集波老師的MSP430微控制器原理與應用課程,請在複習時使用。

參考資料:

  1. 王巨集波老師的PPT
  2. MSP430F6638使用者手冊
  3. 王巨集波老師實驗教程

本章最新更新日期:2018.12.22

第二章 UCS暫存器

2.1 UCSCTL0

UCSCTL0

bit Field Description
12-8 DCO DCO輸出頻率範圍控制引數
7-3 MOD DCO輸出頻率範圍控制引數

上述的兩個區域並不需要設定,在配置FFL的時候直接設定成0即可,FLL配置完成後會自動被設定。

2.2 UCSCTL1

UCSCTL1
DCORSEL,DCOCLK的頻率範圍設定引數,通過它來設定DCOCLK的頻率範圍,比如:設定DCOCLK的輸出頻率範圍為0.64~14.0MHz

  • 如下圖所示,可知設定頻率為0.64~14.0MHz的DCO需要將DCORSEL的值設定為3.

DCO Frequency

UCSCTL1 = DCORSEL_3; //DCORSEL_3是巨集定義,為0x0030

2.3 UCSCTL2 & UCSCTL3

2.3.1 暫存器示意圖

UCSCTL2
UCSCTL3

2.3.2 鎖頻環FLL

上述兩個是關於鎖頻環FFL的控制暫存器,FLL示意圖如下,務必背過此圖
FLL

2.3.3 FLL的計算公式

f D C O C

L K ÷ [ D × ( N + 1 ) ] = f F L L R E F C L K ÷ n f_{DCOCLK}\div [D\times (N+1)]=f_{FLLREFCLK}\div n

2.3.4 暫存器中各個位的解釋

Field Description 預設值 預設值對應的分頻係數
FLLD 圖中的FLLD分頻,公式中的D 1H 2
FLLN 圖中的FLLN分頻,公式中的N,實際的分頻係數是N+1 1FH 31+1
FLLREFDLV 圖中的FLLREFDLV分頻,公式中的n 0 1

2.4 UCSCTL4

2.4.1 暫存器示意圖

UCSCTL4

  • 這個暫存器的作用是,為SMCLK、ACLK、MCLK選取訊號源。在UCS的實驗中幾乎是必用的。

2.4.2 暫存器功能

BIT Field Description 預設值 預設值對應的選項
10-8 SELA ACLK時鐘源選擇 0 XT1CLK
6-4 SELS SMCLK時鐘源選擇 4 DCOCLKDIV
2–0 SELM MCLK時鐘源選擇 4 DCOCLKDIV

2.4.3 例程

SMCLK=MCLK=DCOCLK,ACLK=XT1CLK

//注意這裡的賦值用“=”,而不是“|=”,區別不講了,重複過很多次了
UCSCTL4 = SELA__XT1CLK + SELM__DCOCLK + SELS__DCOCLK;
/*
#define SELA__XT1CLK           (0x0000)
#define SELS__DCOCLK           (0x0030)
#define SELM__DCOCLK           (0x0003)
*/

2.5 UCSCTL6

UCSCTL6
這個暫存器只需要知道兩個位:

BITS FIELD Description 預設
8 XT2OFF 關閉XT2CLK 關閉
0 XT1CLK 關閉XT1CLK 關閉

注意,這裡的關閉的條件是,該時鐘訊號沒有被作為ACLK、SMCLK、MCLK、FLL參考時鐘的時鐘源

2.6 UCSCTL7

UCSCTL7
振盪器故障標誌位暫存器,如果想要穩定XT1CLK,需要將這個暫存器的相應區域置0(復位)。
例如下列程式:

do
{
	UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags
	SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag

* 2.7 SFRIE1 & SFRIFG1

SFRIE1
SFRIFG1

Name Description 預設
OFIE 振盪器故障中斷使能 0
OFIFG 振盪器失效中斷標誌位 1
WDTIE 看門狗在間隔定時器模式下的中斷使能 0
WDTIFG 看門狗中斷標誌位 0

*2.8 BAKCTL

BAKCTL

  • LOCKBAK:在使用XT1CLK的時候,需要先將這一位置0來解鎖XT1CLK的引腳。
while(BAKCTL & LOCKBAK) // Unlock XT1 pins
    	BAKCTL &= ~(LOCKBAK);