0、宏定義
- 基地址(baseAddress)
#define TIMER_A1_BASE __MSP430_BASEADDRESS_T1A3__
- 定時器模式
#define TIMER_A_STOP_MODE MC_0
#define TIMER_A_UP_MODE MC_1
#define TIMER_A_CONTINUOUS_MODE MC_2
#define TIMER_A_UPDOWN_MODE MC_3
1、API函數
開啟定時器A計數器
void Timer_A_startCounter(uint16_t baseAddress, uint16_t timerMode);
配置定時器A的連續模式
void Timer_A_initContinuousMode(uint16_t baseAddress, Timer_A_initContinuousModeParam ∗param)
typedef struct Timer_A_initContinuousModeParam{
//! Selects Clock source. 選擇時鍾源
//! \n Valid values are:
//! - \b TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK [Default]
//! - \b TIMER_A_CLOCKSOURCE_ACLK
//! - \b TIMER_A_CLOCKSOURCE_SMCLK
//! - \b TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK
uint16_t clockSource;
//! Is the desired divider for the clock source 選擇分頻系數
//! \n Valid values are:
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_1 [Default]
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_2
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_3
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_4
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_5
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_6
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_7
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_8
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_10
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_12
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_14
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_16
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_20
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_24
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_28
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_32
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_40
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_48
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_56
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_64
uint16_t clockSourceDivider;
//! Is to enable or disable Timer_A interrupt 使能中斷
//! \n Valid values are:
//! - \b TIMER_A_TAIE_INTERRUPT_ENABLE
//! - \b TIMER_A_TAIE_INTERRUPT_DISABLE [Default]
uint16_t timerInterruptEnable_TAIE;
//! Decides if Timer_A clock divider, count direction, count need to be 定時器是否跳過清零
//! reset.
//! \n Valid values are:
//! - \b TIMER_A_DO_CLEAR
//! - \b TIMER_A_SKIP_CLEAR [Default]
uint16_t timerClear;
//! Whether to start the timer immediately 是否立即開始計時器
bool startTimer;
} Timer_A_initContinuousModeParam;
配置定時器A的上升模式
void Timer_A_initUpMode(uint16_t baseAddress, Timer_A_initUpModeParam ∗param)
typedef struct Timer_A_initUpModeParam{
//! Selects Clock source.
//! \n Valid values are:
//! - \b TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK [Default]
//! - \b TIMER_A_CLOCKSOURCE_ACLK
//! - \b TIMER_A_CLOCKSOURCE_SMCLK
//! - \b TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK
uint16_t clockSource;
//! Is the desired divider for the clock source
//! \n Valid values are:
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_1 [Default]
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_2
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_3
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_4
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_5
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_6
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_7
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_8
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_10
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_12
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_14
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_16
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_20
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_24
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_28
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_32
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_40
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_48
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_56
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_64
uint16_t clockSourceDivider;
//! Is the specified Timer_A period. This is the value that gets written
//! into the CCR0. Limited to 16 bits[uint16_t]
uint16_t timerPeriod;
//! Is to enable or disable Timer_A interrupt
//! \n Valid values are:
//! - \b TIMER_A_TAIE_INTERRUPT_ENABLE
//! - \b TIMER_A_TAIE_INTERRUPT_DISABLE [Default]
uint16_t timerInterruptEnable_TAIE;
//! Is to enable or disable Timer_A CCR0 captureComapre interrupt.
//! \n Valid values are:
//! - \b TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE
//! - \b TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE [Default]
uint16_t captureCompareInterruptEnable_CCR0_CCIE;
//! Decides if Timer_A clock divider, count direction, count need to be
//! reset.
//! \n Valid values are:
//! - \b TIMER_A_DO_CLEAR
//! - \b TIMER_A_SKIP_CLEAR [Default]
uint16_t timerClear;
//! Whether to start the timer immediately
bool startTimer;
} Timer_A_initUpModeParam;
配置定時器A的上升下降模式
void Timer_A_initUpDownMode(uint16_t baseAddress, Timer_A_initUpDownModeParam ∗param)
typedef struct Timer_A_initUpDownModeParam{
//! Selects Clock source.
//! \n Valid values are:
//! - \b TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK [Default]
//! - \b TIMER_A_CLOCKSOURCE_ACLK
//! - \b TIMER_A_CLOCKSOURCE_SMCLK
//! - \b TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK
uint16_t clockSource;
//! Is the desired divider for the clock source
//! \n Valid values are:
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_1 [Default]
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_2
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_3
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_4
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_5
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_6
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_7
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_8
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_10
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_12
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_14
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_16
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_20
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_24
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_28
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_32
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_40
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_48
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_56
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_64
uint16_t clockSourceDivider;
//! Is the specified Timer_A period
uint16_t timerPeriod;
//! Is to enable or disable Timer_A interrupt
//! \n Valid values are:
//! - \b TIMER_A_TAIE_INTERRUPT_ENABLE
//! - \b TIMER_A_TAIE_INTERRUPT_DISABLE [Default]
uint16_t timerInterruptEnable_TAIE;
//! Is to enable or disable Timer_A CCR0 captureComapre interrupt.
//! \n Valid values are:
//! - \b TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE
//! - \b TIMER_A_CCIE_CCR0_INTERRUPT_DISABLE [Default]
uint16_t captureCompareInterruptEnable_CCR0_CCIE;
//! Decides if Timer_A clock divider, count direction, count need to be
//! reset.
//! \n Valid values are:
//! - \b TIMER_A_DO_CLEAR
//! - \b TIMER_A_SKIP_CLEAR [Default]
uint16_t timerClear;
//! Whether to start the timer immediately
bool startTimer;
} Timer_A_initUpDownModeParam;
配置定時器的捕獲模式
void Timer_A_initCaptureMode(uint16_t baseAddress, Timer_A_initCaptureModeParam ∗param)
typedef struct Timer_A_initCaptureModeParam{
//! Selects the Capture register being used. Refer to datasheet to ensure
//! the device has the capture compare register being used.
//! \n Valid values are:
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_0
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_1
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_2
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_3
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_4
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_5
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_6
uint16_t captureRegister;
//! Is the capture mode selected.
//! \n Valid values are:
//! - \b TIMER_A_CAPTUREMODE_NO_CAPTURE [Default]
//! - \b TIMER_A_CAPTUREMODE_RISING_EDGE
//! - \b TIMER_A_CAPTUREMODE_FALLING_EDGE
//! - \b TIMER_A_CAPTUREMODE_RISING_AND_FALLING_EDGE
uint16_t captureMode;
//! Decides the Input Select
//! \n Valid values are:
//! - \b TIMER_A_CAPTURE_INPUTSELECT_CCIxA
//! - \b TIMER_A_CAPTURE_INPUTSELECT_CCIxB
//! - \b TIMER_A_CAPTURE_INPUTSELECT_GND
//! - \b TIMER_A_CAPTURE_INPUTSELECT_Vcc
uint16_t captureInputSelect;
//! Decides if capture source should be synchronized with timer clock
//! \n Valid values are:
//! - \b TIMER_A_CAPTURE_ASYNCHRONOUS [Default]
//! - \b TIMER_A_CAPTURE_SYNCHRONOUS
uint16_t synchronizeCaptureSource;
//! Is to enable or disable timer captureComapre interrupt.
//! \n Valid values are:
//! - \b TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE [Default]
//! - \b TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE
uint16_t captureInterruptEnable;
//! Specifies the output mode.
//! \n Valid values are:
//! - \b TIMER_A_OUTPUTMODE_OUTBITVALUE [Default]
//! - \b TIMER_A_OUTPUTMODE_SET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE_RESET
//! - \b TIMER_A_OUTPUTMODE_SET_RESET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE
//! - \b TIMER_A_OUTPUTMODE_RESET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE_SET
//! - \b TIMER_A_OUTPUTMODE_RESET_SET
uint16_t captureOutputMode;
} Timer_A_initCaptureModeParam;
配置定時器的比較模式
void Timer_A_initCompareMode(uint16_t baseAddress, Timer_A_initCompareModeParam ∗param)
typedef struct Timer_A_initCompareModeParam {
//! Selects the Capture register being used. Refer to datasheet to ensure
//! the device has the capture compare register being used.
//! \n Valid values are:
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_0
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_1
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_2
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_3
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_4
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_5
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_6
uint16_t compareRegister;
//! Is to enable or disable timer captureComapre interrupt.
//! \n Valid values are:
//! - \b TIMER_A_CAPTURECOMPARE_INTERRUPT_DISABLE [Default]
//! - \b TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE
uint16_t compareInterruptEnable;
//! Specifies the output mode.
//! \n Valid values are:
//! - \b TIMER_A_OUTPUTMODE_OUTBITVALUE [Default]
//! - \b TIMER_A_OUTPUTMODE_SET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE_RESET
//! - \b TIMER_A_OUTPUTMODE_SET_RESET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE
//! - \b TIMER_A_OUTPUTMODE_RESET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE_SET
//! - \b TIMER_A_OUTPUTMODE_RESET_SET
uint16_t compareOutputMode;
//! Is the count to be compared with in compare mode
uint16_t compareValue;
} Timer_A_initCompareModeParam;
使能中斷
void Timer_A_enableInterrupt(uint16_t baseAddress)
停止中斷
void Timer_A_disableInterrupt(uint16_t baseAddress)
獲取中斷標志位
uint32_t Timer_A_getInterruptStatus(uint16_t baseAddress)
返回TIMER_A_INTERRUPT_NOT_PENDING
或TIMER_A_INTERRUPT_PENDING
使能捕獲比較中斷
void Timer_A_enableCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister)
可選寄存器
#define TIMER_A_CAPTURECOMPARE_REGISTER_0 0x02
#define TIMER_A_CAPTURECOMPARE_REGISTER_1 0x04
#define TIMER_A_CAPTURECOMPARE_REGISTER_2 0x06
#define TIMER_A_CAPTURECOMPARE_REGISTER_3 0x08
#define TIMER_A_CAPTURECOMPARE_REGISTER_4 0x0A
#define TIMER_A_CAPTURECOMPARE_REGISTER_5 0x0C
#define TIMER_A_CAPTURECOMPARE_REGISTER_6 0x0E
停止捕獲比較中斷
void Timer_A_disableCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister)
獲取捕獲比較中斷標志位
uint32_t Timer_A_getCaptureCompareInterruptStatus(uint16_t baseAddress, uint16_t captureCompareRegister, uint16_t mask)
mask
:TIMER_A_CAPTURE_OVERFLOW
,TIMER_A_CAPTURECOMPARE_INTERRUPT_FLAG
返回TIMER_A_CAPTURE_OVERFLOW|TIMER_A_CAPTURECOMPARE_INTERRUPT_FLAG
清除定時器的配置timer clock divider, count direction, count
void Timer_A_clear(uint16_t baseAddress)
獲取同步捕獲比較輸入
uint8_t Timer_A_getSynchronizedCaptureCompareInput(uint16_t baseAddress, uint16_t captureCompareRegister, uint16_t synchronized)
synchronized
:TIMER_A_READ_SYNCHRONIZED_CAPTURECOMPAREINPUT
,TIMER_A_READ_CAPTURE_COMPARE_INPUT
返回TIMER_A_CAPTURECOMPARE_INPUT_HIGH
,TIMER_A_CAPTURECOMPARE_INPUT_LOW
獲取輸出模式的輸出位
uint8_t Timer_A_getOutputForOutputModeOutBitValue(uint16_t baseAddress, uint16_t captureCompareRegister)
獲取當前捕獲比較計數
uint16_t Timer_A_getCaptureCompareCount(uint16_t baseAddress, uint16_t captureCompareRegister)
設置輸出模式的輸出位
void Timer_A_setOutputForOutputModeOutBitValue(uint16_t baseAddress, uint16_t captureCompareRegister, uint8_t outputModeOutBitValue)
outputModeOutBitValue
:TIMER_A_OUTPUTMODE_OUTBITVALUE_HIGH
,TIMER_A_OUTPUTMODE_OUTBITVALUE_LOW
在上升模式配置下產生PWM波
void Timer_A_outputPWM(uint16_t baseAddress, Timer_A_outputPWMParam ∗param)
typedef struct Timer_A_outputPWMParam {
//! Selects Clock source.
//! \n Valid values are:
//! - \b TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK [Default]
//! - \b TIMER_A_CLOCKSOURCE_ACLK
//! - \b TIMER_A_CLOCKSOURCE_SMCLK
//! - \b TIMER_A_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK
uint16_t clockSource;
//! Is the desired divider for the clock source
//! \n Valid values are:
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_1 [Default]
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_2
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_3
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_4
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_5
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_6
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_7
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_8
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_10
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_12
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_14
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_16
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_20
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_24
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_28
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_32
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_40
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_48
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_56
//! - \b TIMER_A_CLOCKSOURCE_DIVIDER_64
uint16_t clockSourceDivider;
//! Selects the desired timer period
uint16_t timerPeriod;
//! Selects the compare register being used. Refer to datasheet to ensure
//! the device has the capture compare register being used.
//! \n Valid values are:
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_0
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_1
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_2
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_3
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_4
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_5
//! - \b TIMER_A_CAPTURECOMPARE_REGISTER_6
uint16_t compareRegister;
//! Specifies the output mode.
//! \n Valid values are:
//! - \b TIMER_A_OUTPUTMODE_OUTBITVALUE [Default]
//! - \b TIMER_A_OUTPUTMODE_SET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE_RESET
//! - \b TIMER_A_OUTPUTMODE_SET_RESET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE
//! - \b TIMER_A_OUTPUTMODE_RESET
//! - \b TIMER_A_OUTPUTMODE_TOGGLE_SET
//! - \b TIMER_A_OUTPUTMODE_RESET_SET
uint16_t compareOutputMode;
//! Specifies the dutycycle for the generated waveform
uint16_t dutyCycle;
} Timer_A_outputPWMParam;
停止定時器
void Timer_A_stop(uint16_t baseAddress)
設置捕獲比較寄存器的值
void Timer_A_setCompareValue(uint16_t baseAddress, uint16_t compareRegister, uint16_t
compareValue)
配置為輸出模式
void Timer_A_setOutputMode(uint16_t baseAddress, uint16_t compareRegister, uint16_t compareOutputMode)
compareOutputMode
:
#define TIMER_A_OUTPUTMODE_OUTBITVALUE OUTMOD_0
#define TIMER_A_OUTPUTMODE_SET OUTMOD_1
#define TIMER_A_OUTPUTMODE_TOGGLE_RESET OUTMOD_2
#define TIMER_A_OUTPUTMODE_SET_RESET OUTMOD_3
#define TIMER_A_OUTPUTMODE_TOGGLE OUTMOD_4
#define TIMER_A_OUTPUTMODE_RESET OUTMOD_5
#define TIMER_A_OUTPUTMODE_TOGGLE_SET OUTMOD_6
#define TIMER_A_OUTPUTMODE_RESET_SET OUTMOD_7
清除TAIFG
中斷標志位
void Timer_A_clearTimerInterrupt(uint16_t baseAddress)
清除捕獲比較中斷標志位
void Timer_A_clearCaptureCompareInterrupt(uint16_t baseAddress, uint16_t captureCompareRegister)
讀取當前定時器計數值
uint16_t Timer_A_getCounterValue(uint16_t baseAddress)
2、例程
(1)、定時器中斷實驗任務
要求
利用定時器A的定時中斷功能,控制一個LED燈開啟和關斷。在滿足接口條件下,開啟LED,同時定時器開始計時(如果查詢一直滿足接口條件則定時器在每次查詢時均重新開始計時);不滿足接口條件下,定時器計時檢查,到達5s則引起中斷,中斷服務程序完成關斷LED燈的操作。
思路說明
- 此處接口條件選取為按鍵S1(P1.2),按下時讀取為低電平則滿足接口條件;LED選取為L1(P8.1)
- 時鍾源選取SMCLK,10分頻,SMCLK配置為8MHz
- 定時器A配置時鍾為SMCLK,連續計數模式,每過1s進入中斷,計數+1,到5s時檢查是否滿足接口條件,若滿足則重新計數,不滿足則關閉LED
源碼
#include "driverlib.h"
#define FREQ_TIMER (8000000/10)
#define COMPARE_VALUE 50000
int led_sta = 0;
int cnt = 0;
void ClockInit()
{
//最終MCLK:16MHZ,SMCLK:8MHZ,ACLK:32KHZ
UCSCTL6 &= ~XT1OFF; //啟動XT1
P5SEL |= BIT2 + BIT3; //XT2引腳功能選擇
UCSCTL6 &= ~XT2OFF; //打開XT2
__bis_SR_register(SCG0);
UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
UCSCTL1 = DCORSEL_4; //DCO頻率范圍在28.2MHZ以下
UCSCTL2 = FLLD_5 + 1; //D=16,N=1
//n=8,FLLREFCLK時鍾源為XT2CLK;
//DCOCLK=D*(N+1)*(FLLREFCLK/n);
//DCOCLKDIV=(N+1)*(FLLREFCLK/n);
UCSCTL3 = SELREF_5 + FLLREFDIV_3;
//ACLK的時鍾源為DCOCLKDIV,
//MCLK\SMCLK的時鍾源為DCOCLK
UCSCTL4 = SELA_4 + SELS_3 +SELM_3;
//ACLK由DCOCLKDIV的32分頻得到,
//SMCLK由DCOCLK的2分頻得到
UCSCTL5 = DIVA_5 +DIVS_1;
}
// 消抖延時
void delay(int cnt)
{
while(cnt)
cnt--;
}
// IO口初始化
void IO_Init()
{
// LED
GPIO_setAsOutputPin(GPIO_PORT_P8, GPIO_PIN1);
GPIO_setOutputLowOnPin(GPIO_PORT_P8, GPIO_PIN1);
// S1
GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P1, GPIO_PIN2);
// 配置按鍵中斷
_enable_interrupts();
GPIO_enableInterrupt(GPIO_PORT_P1, GPIO_PIN2);
GPIO_selectInterruptEdge(GPIO_PORT_P1, GPIO_PIN2, GPIO_HIGH_TO_LOW_TRANSITION);
GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN2);
}
// 接口條件
int IS_Meet()
{
return !GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN2);
}
// 定時器A初始化
void TIMERA_Init()
{
Timer_A_initContinuousModeParam initContParam = {0};
initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_10;
initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
initContParam.timerClear = TIMER_A_DO_CLEAR;
initContParam.startTimer = false;
Timer_A_initContinuousMode(TIMER_A1_BASE, &initContParam);
Timer_A_clearCaptureCompareInterrupt(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
Timer_A_initCompareModeParam initCompParam = {0};
initCompParam.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_0;
initCompParam.compareInterruptEnable = TIMER_A_CAPTURECOMPARE_INTERRUPT_ENABLE;
initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_OUTBITVALUE;
initCompParam.compareValue = COMPARE_VALUE;
Timer_A_initCompareMode(TIMER_A1_BASE, &initCompParam);
}
void main()
{
WDT_A_hold(WDT_A_BASE);
ClockInit();
IO_Init();
TIMERA_Init();
return 0;
}
// 按鍵中斷函數
#pragma vector=PORT1_VECTOR
__interrupt
void Port_1(void)
{
delay(50000);
if(!(GPIO_getInputPinValue(GPIO_PORT_P1, GPIO_PIN2) | led_sta))
{
GPIO_setOutputHighOnPin(GPIO_PORT_P8, GPIO_PIN1);
led_sta = 1;
Timer_A_startCounter( TIMER_A1_BASE, TIMER_A_CONTINUOUS_MODE); //開啟計數器
}
//清除中斷標志位
GPIO_clearInterrupt(GPIO_PORT_P1, GPIO_PIN2 | GPIO_PIN3);
}
// 定時器中斷函數
#pragma vector=TIMER1_A0_VECTOR
__interrupt
void Timer_A0(void)
{
uint16_t compVal = Timer_A_getCaptureCompareCount(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0) + COMPARE_VALUE;
if(cnt == (5 * FREQ_TIMER / COMPARE_VALUE))
{
cnt = 0;
if(!IS_Meet())
{
if(led_sta)
{
GPIO_setOutputLowOnPin(GPIO_PORT_P8, GPIO_PIN1);
led_sta = 0;
Timer_A_stop(TIMER_A1_BASE); //停止計數器
}
}
}
else
cnt++;
Timer_A_setCompareValue(TIMER_A1_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0, compVal);
}
(2)、LED1呼吸燈效果
要求
使用提供的時鍾接口,將SMCLK時鍾頻率提高到8MHz,SMCLK做定時器A的時鍾。請制作一個自動呼吸燈,讓主板LED1自動呼吸,思路不限。
思路
使用PWM驅動LED,隨着時鍾計數改變PWM的占空比,實現LED的呼吸明暗控制
使用杜邦線將LED1連接端口P2.5/TA2.2
源碼
#include "driverlib.h"
#define PWM_PERIOD 100
// 配置時鍾
void ClockInit()
{
//最終MCLK:16MHZ,SMCLK:8MHZ,ACLK:32KHZ
UCSCTL6 &= ~XT1OFF; //啟動XT1
P5SEL |= BIT2 + BIT3; //XT2引腳功能選擇
UCSCTL6 &= ~XT2OFF; //打開XT2
__bis_SR_register(SCG0);
UCSCTL0 = DCO0+DCO1+DCO2+DCO3+DCO4;
UCSCTL1 = DCORSEL_4; //DCO頻率范圍在28.2MHZ以下
UCSCTL2 = FLLD_5 + 1; //D=16,N=1
//n=8,FLLREFCLK時鍾源為XT2CLK;
//DCOCLK=D*(N+1)*(FLLREFCLK/n);
//DCOCLKDIV=(N+1)*(FLLREFCLK/n);
UCSCTL3 = SELREF_5 + FLLREFDIV_3;
//ACLK的時鍾源為DCOCLKDIV,
//MCLK\SMCLK的時鍾源為DCOCLK
UCSCTL4 = SELA_4 + SELS_3 +SELM_3;
//ACLK由DCOCLKDIV的32分頻得到,
//SMCLK由DCOCLK的2分頻得到
UCSCTL5 = DIVA_5 +DIVS_1;
}
int main()
{
WDT_A_hold(WDT_A_BASE);
ClockInit();
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN5);
Timer_A_outputPWMParam PWMparam = {0};
PWMparam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
PWMparam.clockSourceDivider = TIMER_A_CLOCKSOURCE_DIVIDER_1;
PWMparam.timerPeriod = PWM_PERIOD;
PWMparam.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_2;
PWMparam.compareOutputMode = TIMER_A_OUTPUTMODE_RESET_SET;
int i;
while(1)
{
for(i = 0; i < PWM_PERIOD; i++)
{
PWMparam.dutyCycle = i;
Timer_A_outputPWM(TIMER_A2_BASE, &PWMparam);
__delay_cycles(100000);
}
for(i = PWM_PERIOD; i > 0; i--)
{
PWMparam.dutyCycle = i;
Timer_A_outputPWM(TIMER_A2_BASE, &PWMparam);
__delay_cycles(100000);
}
}
return 0;
}