📄 timerb1pluse.c
字号:
//方法:利用定时器产生方波脉冲;考虑使用中断法
#include<msp430x14x.h>
/*====================================================================
* 数据类型定义部分
====================================================================*/
#define uint32 unsigned long
#define ulong unsigned long
#define uint16 unsigned int
#define uint unsigned int
#define uchar unsigned char
#define uint8 unsigned char
/*====================================================================
* 数据端口定义部分
====================================================================*/
#define CLOCK_DIR P4DIR
#define CLOCK_SEL P4SEL
#define CLOCK_OUT P4OUT
#define CLOCK_IN P4IN
#define PWMCLOSE 0
#define PWMOPEN 1
/*****************在这个地方我犯了两次错误*************************************/
uint g_Pluse_Div = 1; //除数因子为1
uint g_TimerB_cycle = 500; //设置时钟脉冲周期(默认周期为1MS)
/*====================================================================
* 函数声明部分
====================================================================*/
void Set_TimerB( uint cycle );
void InitSys( void ); //系统初始化函数
void Timer_pluse( uint pluse_Div, uchar channel );
void SET_PWM_module( uint16 PWM_value, uint8 channel);
uchar GoPwm( uchar doPwm );
void Delay_n_Us( uint us );
void Delay_n_Ms( uint ms );
void main(void)
{
InitSys( );
P4DIR |= BIT5;
//可以把下面3个函数做成一个函数来
Set_TimerB( 1000 );
Timer_pluse(4,BIT2|BIT3|BIT4);
//SET_PWM_module( 250,BIT1 );
while(1);
}
/*====================================================================
* 定时器B参数设置函数
====================================================================*/
void Set_TimerB( uint cycle )
{
TBCTL = TBSSEL1 + TBCLR + TBIE ; //Select MCLK And Clear TAR And Enable TBIE Interrupt
g_TimerB_cycle = cycle;
TBCCR0 = g_TimerB_cycle; //设置频率周期
TBCTL |= MC0; //4分频 增模式 ID1 +
}
/*====================================================================
* 脉冲设置函数
====================================================================*/
void Timer_pluse( uint pluse_Div, uchar channel )
{
channel&=0x7e;
g_Pluse_Div = pluse_Div;
if(channel&0x02)
{
TBCCTL1 = OUTMOD_4 + CCIE ;
TBCCR1 = 0;
}
if(channel&0x04)
{
TBCCTL2 = OUTMOD_4 + CCIE;
TBCCR2 = 0;
}
if(channel&0x08)
{
TBCCTL3 = OUTMOD_4 + CCIE;
TBCCR3 = 0;
}
if(channel&0x10)
{
TBCCTL4 = OUTMOD_4 + CCIE;
TBCCR4 = 0;
}
if(channel&0x20)
{
TBCCTL5 = OUTMOD_4 + CCIE;
TBCCR5 = 0;
}
if(channel&0x40)
{
TBCCTL6 = OUTMOD_4 + CCIE;
TBCCR6 = 0;
}
CLOCK_SEL |= channel;
CLOCK_DIR |= channel; //选择输出通道
}
/*====================================================================
* 定时器B中断输出脉冲函数
====================================================================*/
interrupt [ TIMERB1_VECTOR ] void TimerBCCR_ISR( void )
{
static uchar out_Fg = 0;
_NOP( );
switch( TBIV )
{
case 0x02:
{
TBCCR1 += g_Pluse_Div;
}
case 0x04:
{
TBCCR2 += 2;
if( out_Fg == 0 )
{
out_Fg = 1;
CLOCK_OUT &= ~BIT5;
}
else
{
out_Fg = 0;
CLOCK_OUT |= BIT5;
}
}
case 0x06:
{
TBCCR3 += 8;
}
case 0x08:
{
TBCCR4 += 4;
}
case 0x0B:
{
TBCCR5 += g_Pluse_Div;
}
case 0x0c:
{
TBCCR6 += g_Pluse_Div;
}
case 0x0E:
{
_NOP( );
}
default:
{
_NOP( );
break;
}
}
}
/*====================================================================
* 系统初始化函数
====================================================================*/
void InitSys( void )
{
uint iq0;
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
BCSCTL1 &= ~XT2OFF; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for( iq0 = 0xFF; iq0 > 0; iq0-- );
}
while((IFG1 & OFIFG) != 0 );
BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2
//Init_TimerB( );
_EINT(); //打开全局中断控制
}
/***********************************************
** 函数名称: uchar GoPwm( uchar doPwm )
** 功能描述: 控制PWM和PLUSE的运行或者停止
** 晶 振: 4MHz
** 输 入: doPwm:PWMCLOSE:PWM And PLUSE停止, PWMOPEN :PWM And PLUSE运行
** 输 出: 运行状态
** 调用示例: uchar GoPwm( uchar doPwm );
************************************************/
uchar GoPwm( uchar doPwm )
{
TBCTL &= ~(MC0+MC1); //关闭定时器,也就是关闭PWM输出
if( doPwm == PWMOPEN )
{
TBCTL |= MC0; //打开定时器,也就是打开PWM输出
}
if(( TBCTL&MC_0 ) == 0)
return PWMCLOSE;
else
return PWMOPEN;
}
/*********************************************************************************************************
** 函数名称: void PWM_module(uint16 cycle,uint8 channel)
** 功能描述: 启动PWM,设置周期cycle,初始PWM为0,选择通道channel,确定管脚;
** 晶 振: 4MHz
** 输 入: cycle 需要设置的周期
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -