需提前学习:MSP430F5529库函数学习——串口;MSP430F5529库函数定时器A——捕获实验;MSP430F5529库函数定时器A——硬件PWM;MSP430F5529库函数定时器A——定时中断
目录
定时器B与定时器A的不同
定时器B中断
代码
定时器基地址
中断向量
结构体设置
定时器B硬件PWM
代码
结构体参数
定时器基地址
捕获实验
代码
结构体参数
中断向量
Switch部分
定时器B比定时器A强大,但是对于绝大多数人都只要使用定时器中断,硬件PWM,输入捕获。对于这三个部分,和定时器A使用起来是一样的。所以我就直接给例程了
定时器B与定时器A的不同
① Timer_B计数长度为8位、10位、12位和16位可编程,而Timer_A的计数长度固定为16位。
② Timer_B没有实现Timer_A中的SCCI寄存器位的功能。
③ Timer_B在比较模式下的捕获/比较寄存器功能与Timer_A的不同,增加了比较锁存器。
④ 有些型号芯片中的Timer_B输出实现了高阻抗输出。
⑤ 比较模式的原理有所不同。在Timer_A中,CCRx寄存器中保存与TAR相比较的数据,而在Timer_B中,CCRx寄存器中保存的是要比较的数据,但并不直接与定时计数器TBR相比较,而是将CCRx送到与之相对应的锁存器之后,由锁存器与定时计数器TBR相比较。从捕获/比较寄存器向比较锁存器传输数据的时机也是可以编程的,可以是在写入捕获/比较寄存器后立即传输,也可以由一个定时事件来触发。
⑥ Timer_B支持多种、同步的定时功能,多重的捕获/比较功能和多重的波形输出功能。而且通过对比较数据的两级缓冲,可以实现多个PWM信号周期的同步更新。
说实话,上面这些我看的也云里雾里,所以就不多啰嗦了。反正我们的原则就是能用就行。代码我全部测试过了,没毛病。
定时器B中断
代码
一般我们使用定时器中断,都是使用的增计数模式。 所以我这里以增计模式为例,使用的是CCR0中断,创立一个周期为1S,占空比为50%的PWM。不明白的可以看MSP430F5529库函数定时器A——定时中断
#include "driverlib.h"
void Timer_B_Init(void)
{
Timer_B_initUpModeParam htim = {0};
htim.clockSource = TIMER_B_CLOCKSOURCE_SMCLK; //时钟源选为SMCLK = 1048576 HZ
htim.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_32; //32分频 32768
htim.timerPeriod = 16384 - 1; //计数值设为16375(32768/2=16375),定时0.5s
htim.timerInterruptEnable_TBIE = TIMER_B_TBIE_INTERRUPT_DISABLE; //失能TALE中断
htim.captureCompareInterruptEnable_CCR0_CCIE = TIMER_A_CCIE_CCR0_INTERRUPT_ENABLE; //失能CCR0中断
htim.timerClear = TIMER_A_DO_CLEAR; //把定时器的定时计数器,分频计数器的计数值清零
htim.startTimer = true; //初始化后立即启动定时器
Timer_B_initUpMode(TIMER_B0_BASE, &htim); //定时器B的定时器0连续计数模式
}
void main (void)
{
//Stop WDT
WDT_A_hold(WDT_A_BASE);
//P4.1为输出
GPIO_setAsOutputPin(GPIO_PORT_P4, GPIO_PIN1);
Timer_B_Init();
//interrupts enabled
__bis_SR_register(GIE);
while(1)
{
}
}
#pragma vector=TIMER0_B0_VECTOR
__interrupt
void TIMER0_A0_ISR (void)
{
GPIO_toggleOutputOnPin(GPIO_PORT_P4, GPIO_PIN1);
}
定时器基地址
TIMER_B0_BASE //好像只有这一个
中断向量
这里需要注意,定时器A的定时器0的CCR0中断是TIMER0_A0_VECTOR,而定时器B的定时器0的CCR0中断向量是TIMER0_B0_VECTOR。
TIMER0_B0_VECTOR //定时器B好像只有定时器0
结构体设置
定时器B的结构体与定时器A的结构体也不同,定时器B的增计模式结构体如下
typedef struct Timer_B_initUpModeParam {
clockSource:选择时钟源,一般都是选择ACLK或者SMCLK作为时钟源
TIMER_B_CLOCKSOURCE_EXTERNAL_TXCLK [Default]
TIMER_B_CLOCKSOURCE_ACLK
TIMER_B_CLOCKSOURCE_SMCLK
TIMER_B_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK
clockSourceDivider:设置分频次数
TIMER_B_CLOCKSOURCE_DIVIDER_1 [Default]
TIMER_B_CLOCKSOURCE_DIVIDER_2
TIMER_B_CLOCKSOURCE_DIVIDER_3
TIMER_B_CLOCKSOURCE_DIVIDER_4
TIMER_B_CLOCKSOURCE_DIVIDER_5
TIMER_B_CLOCKSOURCE_DIVIDER_6
TIMER_B_CLOCKSOURCE_DIVIDER_7
TIMER_B_CLOCKSOURCE_DIVIDER_8
TIMER_B_CLOCKSOURCE_DIVIDER_10
TIMER_B_CLOCKSOURCE_DIVIDER_12
TIMER_B_CLOCKSOURCE_DIVIDER_14
TIMER_B_CLOCKSOURCE_DIVIDER_16
TIMER_B_CLOCKSOURCE_DIVIDER_20
TIMER_B_CLOCKSOURCE_DIVIDER_24
TIMER_B_CLOCKSOURCE_DIVIDER_28
TIMER_B_CLOCKSOURCE_DIVIDER_32
TIMER_B_CLOCKSOURCE_DIVIDER_40
TIMER_B_CLOCKSOURCE_DIVIDER_48
TIMER_B_CLOCKSOURCE_DIVIDER_56
TIMER_B_CLOCKSOURCE_DIVIDER_64
timerPeriod:设置CCR0中断周期,数值必须是在0-65535,因为是16个bit
timerInterruptEnable_TBIE:设置定时器B的TBIE中断,TBIE中断和定时器TAIE中断一致,换了一个名字而已
TIMER_B_TBIE_INTERRUPT_ENABLE //开启TBIE中断
TIMER_B_TBIE_INTERRUPT_DISABLE [Default] //关闭TBIE中断
captureCompareInterruptEnable_CCR0_CCIE:设置定时器B的CCR0中断,使用与定时器A的CCR0中断一致
TIMER_B_CCIE_CCR0_INTERRUPT_ENABLE //开启CCR0中断
TIMER_B_CCIE_CCR0_INTERRUPT_DISABLE [Default] //关闭CCR0中断
timerClear:把定时器的定时计数器,分频计数器的计数值清零
TIMER_B_DO_CLEAR //清零
TIMER_B_SKIP_CLEAR [Default] //不清零
startTimer:初始化后是否立即启动定时器
ture //初始化后立即启动定时器
false //初始化后不立即启动定时器
} Timer_B_initUpModeParam;
定时器B硬件PWM
代码
不明白的可以看MSP430F5529库函数定时器A——硬件PWM
#include "driverlib.h"
#define TIMER_PERIOD 8192
void Timer_B0_PWM_Init(void)
{
Timer_B_outputPWMParam htim = {0};
//P7.4复用输出
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P7, GPIO_PIN4);
//时钟源选为SMCLK = 1048576 HZ
htim.clockSource = TIMER_B_CLOCKSOURCE_SMCLK;
//分频系数设为32 32768HZ
htim.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_32;
//装载值设为8192 - 1 ,周期为0.25s
htim.timerPeriod = TIMER_PERIOD - 1;
//P7.4 对应 TB0.2 故设为TIMER_B_CAPTURECOMPARE_REGISTER_2 定时器为0
htim.compareRegister = TIMER_B_CAPTURECOMPARE_REGISTER_2;
//选择复位置位模式
htim.compareOutputMode = TIMER_B_OUTPUTMODE_RESET_SET;
//设置占空比,为5%
htim.dutyCycle = TIMER_PERIOD / 20 ;
//P7.4 对应 TB0.2 为TIMER_B0_BASE
Timer_B_outputPWM(TIMER_B0_BASE, &htim);
}
int main(void)
{
WDT_A_hold(WDT_A_BASE);
Timer_B0_PWM_Init();
//interrupts enabled
__bis_SR_register(GIE);
//Timer_A_setCompareValue (TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,Timer_A_getCaptureCompareCount(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_1) - TIMER_PERIOD / 10);
while(1)
{
}
}
结构体参数
typedef struct Timer_B_outputPWMParam {
clockSource:选择时钟源,一般都是选择ACLK或者SMCLK作为时钟源
TIMER_B_CLOCKSOURCE_EXTERNAL_TXCLK [Default]
TIMER_B_CLOCKSOURCE_ACLK
TIMER_B_CLOCKSOURCE_SMCLK
TIMER_B_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK
clockSourceDivider:设置分频次数
TIMER_B_CLOCKSOURCE_DIVIDER_1 [Default]
TIMER_B_CLOCKSOURCE_DIVIDER_2
TIMER_B_CLOCKSOURCE_DIVIDER_3
TIMER_B_CLOCKSOURCE_DIVIDER_4
TIMER_B_CLOCKSOURCE_DIVIDER_5
TIMER_B_CLOCKSOURCE_DIVIDER_6
TIMER_B_CLOCKSOURCE_DIVIDER_7
TIMER_B_CLOCKSOURCE_DIVIDER_8
TIMER_B_CLOCKSOURCE_DIVIDER_10
TIMER_B_CLOCKSOURCE_DIVIDER_12
TIMER_B_CLOCKSOURCE_DIVIDER_14
TIMER_B_CLOCKSOURCE_DIVIDER_16
TIMER_B_CLOCKSOURCE_DIVIDER_20
TIMER_B_CLOCKSOURCE_DIVIDER_24
TIMER_B_CLOCKSOURCE_DIVIDER_28
TIMER_B_CLOCKSOURCE_DIVIDER_32
TIMER_B_CLOCKSOURCE_DIVIDER_40
TIMER_B_CLOCKSOURCE_DIVIDER_48
TIMER_B_CLOCKSOURCE_DIVIDER_56
TIMER_B_CLOCKSOURCE_DIVIDER_64
timerPeriod:设置CCR0中断周期,数值必须是在0-65535,因为是16个bit
compareRegister:选择比较引脚,根据引脚手册查看复位的引脚是TB0.x,如果x为1,选择TIMER_B_CAPTURECOMPARE_REGISTER_1,如果x为2,选择TIMER_B_CAPTURECOMPARE_REGISTER_1
TIMER_B_CAPTURECOMPARE_REGISTER_0
TIMER_B_CAPTURECOMPARE_REGISTER_1
TIMER_B_CAPTURECOMPARE_REGISTER_2
TIMER_B_CAPTURECOMPARE_REGISTER_3
TIMER_B_CAPTURECOMPARE_REGISTER_4
TIMER_B_CAPTURECOMPARE_REGISTER_5
TIMER_B_CAPTURECOMPARE_REGISTER_6
compareOutputMode:选择比较模式
TIMER_B_OUTPUTMODE_OUTBITVALUE [Default]
TIMER_B_OUTPUTMODE_SET
TIMER_B_OUTPUTMODE_TOGGLE_RESET
TIMER_B_OUTPUTMODE_SET_RESET
TIMER_B_OUTPUTMODE_TOGGLE
TIMER_B_OUTPUTMODE_RESET
TIMER_B_OUTPUTMODE_TOGGLE_SET
TIMER_B_OUTPUTMODE_RESET_SET
dutyCycle:设置占空比,数值必须是在0-65535,因为是16个bit
} Timer_B_outputPWMParam;
定时器基地址
TIMER_B0_BASE //好像只有这一个
捕获实验
代码
详情请看:MSP430F5529库函数定时器A——捕获实验;
需要注意我们这里要打印浮点数据,所以需要配置一下。详情看MSP430F5529库函数学习——串口浮点数据打印部分
#include "driverlib.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
void UART_printf(uint16_t baseAddress, const char *format,...)
{
uint32_t length;
va_list args;
uint32_t i;
char TxBuffer[128] = {0};
va_start(args, format);
length = vsnprintf((char*)TxBuffer, sizeof(TxBuffer), (char*)format, args);
va_end(args);
for(i = 0; i < length; i++)
USCI_A_UART_transmitData(baseAddress, TxBuffer[i]);
}
//9600
void Usart1_Init()
{
//P4.4=UCA1TXD P4.5=UCA1RXD
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P4, GPIO_PIN5+GPIO_PIN4);
USCI_A_UART_initParam param1 = {0};
param1.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;
param1.clockPrescalar = 6;
param1.firstModReg = 13;
param1.secondModReg = 0;
param1.parity = USCI_A_UART_NO_PARITY; //无校验位
param1.msborLsbFirst = USCI_A_UART_LSB_FIRST; //低位先行
param1.numberofStopBits = USCI_A_UART_ONE_STOP_BIT; //1停止位
param1.uartMode = USCI_A_UART_MODE;
param1.overSampling = USCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION;
if (STATUS_FAIL == USCI_A_UART_init(USCI_A1_BASE, ¶m1)){
return;
}
//Enable UART module for operation
USCI_A_UART_enable(USCI_A1_BASE);
//Enable Receive Interrupt
USCI_A_UART_clearInterrupt(USCI_A1_BASE,USCI_A_UART_RECEIVE_INTERRUPT);
USCI_A_UART_enableInterrupt(USCI_A1_BASE,USCI_A_UART_RECEIVE_INTERRUPT);
}
uint32_t Sign_Counts = 0;
void Timer_B0_Capture_Init()
{
Timer_B_initContinuousModeParam htim = {0};
htim.clockSource = TIMER_B_CLOCKSOURCE_SMCLK; //1048576Hz
htim.clockSourceDivider = TIMER_B_CLOCKSOURCE_DIVIDER_1; //一分频,1048576Hz
htim.timerInterruptEnable_TBIE = TIMER_B_TBIE_INTERRUPT_ENABLE; //使能TBIE中断
htim.timerClear = TIMER_B_DO_CLEAR; //把定时器的定时计数器,分频计数器的计数值清零
htim.startTimer = true; //初始化后立即启动定时器
Timer_B_initContinuousMode(TIMER_B0_BASE, &htim); //设置为连续计数模式
GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P7, GPIO_PIN4); //复用P7.4
Timer_B_initCaptureModeParam capture_htim = {0};
capture_htim.captureRegister = TIMER_B_CAPTURECOMPARE_REGISTER_2; //因为P7.4使用的是TB0.2,所以这里是REGISTER_2
capture_htim.captureMode = TIMER_B_CAPTUREMODE_RISING_AND_FALLING_EDGE; //选择双边沿触发
capture_htim.captureInputSelect = TIMER_B_CAPTURE_INPUTSELECT_CCIxA; //因为是CCI2A所以选择INPUTSELECT_CCIxA
capture_htim.synchronizeCaptureSource = TIMER_B_CAPTURE_SYNCHRONOUS; //捕获源与计时器时钟同步
capture_htim.captureInterruptEnable = TIMER_B_CAPTURECOMPARE_INTERRUPT_ENABLE; //打开定时器中断
capture_htim.captureOutputMode = TIMER_B_OUTPUTMODE_OUTBITVALUE; //定时器输出电平由OUT位控制
Timer_B_initCaptureMode(TIMER_B0_BASE,&capture_htim);
}
int main(void)
{
//关闭看门狗
WDT_A_hold(WDT_A_BASE);
//打开输入捕获
Timer_B0_Capture_Init();
Usart1_Init();
//interrupts enabled
__bis_SR_register(GIE);
while(1)
{
//UART_printf(USCI_A1_BASE,"hi");
delay_ms(1000);
UART_printf(USCI_A1_BASE,"高电平持续时间:%f ms",1000.*Sign_Counts/1048576); //注意,这里1000后面必须+'.'表示是浮点运算!!!否则结果为0!!!
}
}
#pragma vector=TIMER0_B1_VECTOR
__interrupt
void TIMER0_B0_ISR (void)
{
static uint16_t Overflow_Times = 0;
static uint16_t Sign_Begin = 0, Sign_End = 0;
switch(TB0IV)
{
case TB0IV_TBCCR2:
if(GPIO_getInputPinValue(GPIO_PORT_P7,GPIO_PIN4)) //获取P7.4引脚电平,如果为高电平,将当前寄存器值存入Sign_Begin
{
Sign_Begin = Timer_B_getCaptureCompareCount(TIMER_B0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
}
else //获取P2.5引脚电平,如果为低电平,将当前寄存器值存入Sign_End
{
Sign_End = Timer_B_getCaptureCompareCount(TIMER_B0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
if(!Overflow_Times) //计算高电平时间,如果高电平和低电平都在一个计数周期之内,进入
Sign_Counts = Sign_End - Sign_Begin; //如果高低电平在同一个计数周期内,那么直接相减
else //计算高电平时间,如果高电平和低电平不在一个计数周期之内,进入
{
//注意,这里强制类型转换,是因为uint16_t 的最大值为65535,此处的Sign_Counts值会明显大于65535
Sign_Counts = (uint32_t)(65536 * Overflow_Times + Sign_End - Sign_Begin); //如果高低电平不在同一个计数周期,需要先加上一个周期的计数值
Overflow_Times = 0;
}
}
Timer_B_clearCaptureCompareInterrupt(TIMER_B0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_2);
break;
case TB0IV_TBIFG:
if(GPIO_getInputPinValue(GPIO_PORT_P7,GPIO_PIN4)) //获取P7.4引脚电平。如果定时器都溢出中断了,现在还是高电平,那么表明高电平和低电平不在同一个定时周期内
{
++Overflow_Times;
}
else //获取P7.4引脚电平。如果定时器溢出中断了,现在不是高电平,那么表明高电平和低电平在同一个定时周期内
Overflow_Times = 0;
Timer_B_clearTimerInterrupt(TIMER_B0_BASE);
break;
default:
break;
}
}
结构体参数
typedef struct Timer_B_outputPWMParam {
clockSource:选择时钟源,一般都是选择ACLK或者SMCLK作为时钟源
TIMER_B_CLOCKSOURCE_EXTERNAL_TXCLK [Default]
TIMER_B_CLOCKSOURCE_ACLK
TIMER_B_CLOCKSOURCE_SMCLK
TIMER_B_CLOCKSOURCE_INVERTED_EXTERNAL_TXCLK
clockSourceDivider:设置分频次数
TIMER_B_CLOCKSOURCE_DIVIDER_1 [Default]
TIMER_B_CLOCKSOURCE_DIVIDER_2
TIMER_B_CLOCKSOURCE_DIVIDER_3
TIMER_B_CLOCKSOURCE_DIVIDER_4
TIMER_B_CLOCKSOURCE_DIVIDER_5
TIMER_B_CLOCKSOURCE_DIVIDER_6
TIMER_B_CLOCKSOURCE_DIVIDER_7
TIMER_B_CLOCKSOURCE_DIVIDER_8
TIMER_B_CLOCKSOURCE_DIVIDER_10
TIMER_B_CLOCKSOURCE_DIVIDER_12
TIMER_B_CLOCKSOURCE_DIVIDER_14
TIMER_B_CLOCKSOURCE_DIVIDER_16
TIMER_B_CLOCKSOURCE_DIVIDER_20
TIMER_B_CLOCKSOURCE_DIVIDER_24
TIMER_B_CLOCKSOURCE_DIVIDER_28
TIMER_B_CLOCKSOURCE_DIVIDER_32
TIMER_B_CLOCKSOURCE_DIVIDER_40
TIMER_B_CLOCKSOURCE_DIVIDER_48
TIMER_B_CLOCKSOURCE_DIVIDER_56
TIMER_B_CLOCKSOURCE_DIVIDER_64
timerPeriod:设置CCR0中断周期,数值必须是在0-65535,因为是16个bit
compareRegister:选择比较引脚,根据引脚手册查看复位的引脚是TB0.x,如果x为1,选择TIMER_B_CAPTURECOMPARE_REGISTER_1,如果x为2,选择TIMER_B_CAPTURECOMPARE_REGISTER_1
TIMER_B_CAPTURECOMPARE_REGISTER_0
TIMER_B_CAPTURECOMPARE_REGISTER_1
TIMER_B_CAPTURECOMPARE_REGISTER_2
TIMER_B_CAPTURECOMPARE_REGISTER_3
TIMER_B_CAPTURECOMPARE_REGISTER_4
TIMER_B_CAPTURECOMPARE_REGISTER_5
TIMER_B_CAPTURECOMPARE_REGISTER_6
compareOutputMode:选择比较模式
TIMER_B_OUTPUTMODE_OUTBITVALUE [Default]
TIMER_B_OUTPUTMODE_SET
TIMER_B_OUTPUTMODE_TOGGLE_RESET
TIMER_B_OUTPUTMODE_SET_RESET
TIMER_B_OUTPUTMODE_TOGGLE
TIMER_B_OUTPUTMODE_RESET
TIMER_B_OUTPUTMODE_TOGGLE_SET
TIMER_B_OUTPUTMODE_RESET_SET
dutyCycle:设置占空比,数值必须是在0-65535,因为是16个bit
} Timer_B_outputPWMParam;
typedef struct Timer_B_initCaptureModeParam {
captureRegister:选择波形捕获引脚,根据引脚手册查看复位的引脚是TB0.x,如果x为1,选择TIMER_B_CAPTURECOMPARE_REGISTER_1,如果x为2,选择TIMER_B_CAPTURECOMPARE_REGISTER_1
TIMER_B_CAPTURECOMPARE_REGISTER_0
TIMER_B_CAPTURECOMPARE_REGISTER_1
TIMER_B_CAPTURECOMPARE_REGISTER_2
TIMER_B_CAPTURECOMPARE_REGISTER_3
TIMER_B_CAPTURECOMPARE_REGISTER_4
TIMER_B_CAPTURECOMPARE_REGISTER_5
TIMER_B_CAPTURECOMPARE_REGISTER_6
captureMode:选择捕获模式
TIMER_B_CAPTUREMODE_NO_CAPTURE [Default] //不捕获
TIMER_B_CAPTUREMODE_RISING_EDGE //上升沿触发
TIMER_B_CAPTUREMODE_FALLING_EDGE //下降沿触发
TIMER_B_CAPTUREMODE_RISING_AND_FALLING_EDGE //双边沿触发
captureInputSelect:选择捕获输入口,一般都是TIMER_B_CAPTURE_INPUTSELECT_CCIxA。具体查看引脚手册,如果是 CCIxA input,那么选择TIMER_B_CAPTURE_INPUTSELECT_CCIxA。如果是CCIxB,选择TIMER_B_CAPTURE_INPUTSELECT_CCIxB
TIMER_B_CAPTURE_INPUTSELECT_CCIxA [Default]
TIMER_B_CAPTURE_INPUTSELECT_CCIxB
TIMER_B_CAPTURE_INPUTSELECT_GND
TIMER_B_CAPTURE_INPUTSELECT_Vcc
synchronizeCaptureSource:决定捕获源是否应该与Timer_B时钟同步
TIMER_B_CAPTURE_ASYNCHRONOUS [Default] //不同步
TIMER_B_CAPTURE_SYNCHRONOUS //同步
captureInterruptEnable:是启用或禁用Timer_B捕获比较中断
TIMER_B_CAPTURECOMPARE_INTERRUPT_DISABLE [Default] //禁用Timer_B捕获比较中断
TIMER_B_CAPTURECOMPARE_INTERRUPT_ENABLE //启用Timer_B捕获比较中断
captureOutputMode:指定输出模式。因为是捕获,所以引脚不需要输出,故选择TIMER_B_OUTPUTMODE_OUTBITVALUE
TIMER_B_OUTPUTMODE_OUTBITVALUE [Default]
TIMER_B_OUTPUTMODE_SET
TIMER_B_OUTPUTMODE_TOGGLE_RESET
TIMER_B_OUTPUTMODE_SET_RESET
TIMER_B_OUTPUTMODE_TOGGLE
TIMER_B_OUTPUTMODE_RESET
TIMER_B_OUTPUTMODE_TOGGLE_SET
TIMER_B_OUTPUTMODE_RESET_SET
} Timer_B_initCaptureModeParam;
中断向量
这里因为我们是使用的TBIE中断,所以是TIMER0_B1_VECTOR中断向量
TIMER0_B1_VECTOR //定时器B的TBIE中断
TIMER0_B0_VECTOR //定时器B的CCR0中断
Switch部分
因为TBIE中断中包含了很多,如下
switch(TB0IV)
{
case TB0IV_TBCCR1: break; //CCR1中断,由引脚触发
case TB0IV_TBCCR2: break; //CCR2中断,由引脚触发
case TB0IV_TBCCR3: break; //CCR3中断,由引脚触发
case TB0IV_TBCCR4: break; //CCR4中断,由引脚触发
case TB0IV_TBCCR5: break; //CCR5中断,由引脚触发
case TB0IV_TBCCR6: break; //CCR6中断,由引脚触发
case TB0IV_TBIFG: break; //TBIFG中断,由定时器计数到65535——0这一过程触发
default: break;
}