关于CC253 硬件模式输出 IR PWM的问题

2019-07-25 14:28发布

请各位帮忙看看 我的程序如下:
#include"bool_ir.h"

/*******************************************
定时器1装载比较寄存器以及 定时器3操作
*******************************************/

#define T1_0_set(dat)     T1CC0L = dat; T1CC0H = dat >> 8   //通道0
#define T1_4_set(dat)     T1CC4L = dat; T1CC4H = dat >> 8   //通道4

#define T3_start()  T3CTL |= 0x10    //启动定时器3
#define T3_stop()   T3CTL &= ~0x10   //停止定时器3

uchar flag = 1;

/********************************
系统32M晶振初始化
*********************************/
void init_sck(void)
{
  CLKCONCMD &= ~0X7f;      //系统时钟源是32MHZ    hig clock
  while(CLKCONSTA & 0x40); //等待时钟稳定     
  

}


/**************************************************************************
**********************                                 ********************
                   以下部分用于红外信号PWM发射配置
**********************                                 ********************
***************************************************************************/



/**********************************
配置IR输出IO引脚  IR输出引脚 P0.6
***********************************/
void init_IR_io (void)
{
  P0SEL |= 0x40;      //P0.6 选择为外设
  P0DIR |= 0x40;      //P0.6 选择为输出
  
  
  P0_6 = 0;         
}


/*************************************
定时器1的配置初始化
**************************************/
void init_T1_timer(void)
{
  T1IE = 0;              //关闭定时器1中断
  
  T1CTL = 0x02 ;         //定时器1设定在 摸模式
  T1CCTL0 = 0x04 ;       //定时器1通道0设定在比较值清除
  T1CCTL4 = 0x74 ;       //定时器1通道4设定在110 关闭中断  在T1CC0输出 T1CC4清楚
}

/**************************************
定时器3的配置初始化
**************************************/
void init_T3_timer(void)
{
  T3IE = 0;               //关闭定时器3中断
  T3CTL = 0x46;           //定时器3设四分频,莫模式
  T3CCTL0 = 0x04;
  T3CCTL1 = 0x24;         //定时器3开通道1 设定在101 同定时器1
  
  T3CC0 = 211;            //38K载波3分之1占空比
  T3CC1 = 70;
}


/*****************************************
睡眠定时器的配置
*****************************************/

void init_SLEEP_timer(void)
{
  ST2 = 0x00;
  ST1 = 0x00;
  ST0 = 0x00;
  
  EA = 1;        //开中断
  STIE = 1;      //睡眠定时器中断使能
  STIF = 0;       //中断状态置0
}



/***************************************
设置睡眠定时器时间,用来控制周期  1*大约30uS
***************************************/
void set_ST_period(uint sec)
{
  
  ulong sleeptime = 0;  //睡眠时间
  
  sleeptime |= ST0;                     //读初始值
  sleeptime |= (ulong) ST1 << 8;
  sleeptime |= (ulong) ST2 << 16;
  
  sleeptime += sec;   //睡眠时间
  
  ST2 = (uchar)(sleeptime >> 16);        //赋值睡眠时间
  ST1 = (uchar)(sleeptime >> 8);
  ST0 = (uchar) sleeptime;
}

/*********************************************
以NEC协议格式发送
包括9MS高电平+4.5MS低电平引导码
以及发送 双字节数据
*********************************************/
void send_IR_data()         //传输数据的类型可能需要改改
{
  
  IRCTL = 0x01;        //将定时器3和定时器1连接起来 定时器3的方波用作定时器1的脉冲
  T3_start();          //启动定时器3

  // 发送9MS 的高电平+ 4.5MS 的低电平 引导码
  
  T1_0_set(513);       //9+4.5 MS
  T1_4_set(342);       //9 MS
  set_ST_period(486);  //睡眠时间14.7MS
  while( flag);      //定时时间到                           
  flag = 1;                 //清除
  
  T3_stop();   //停止定时器3
}




void main(void)
{
  init_sck();
  init_IR_io();
  init_T1_timer();
  init_T3_timer();
  init_SLEEP_timer();
  
  P2DIR = 0x01;
  P2_0 = 0;
  
  while(1)
  {
    send_IR_data();
  }
}




#pragma vector =  ST_VECTOR
__interrupt void ST_ISR(void)
{
   STIF = 0;
   
   flag = 0;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
天凡云赐
2019-07-25 15:56
还有就是 我之前使用的睡眠定时器控制时间是这样的


set_ST_period(486);  //睡眠时间14.7MS
while( !(IRCON & 0x80));  //定时时间到
    STIF = 0;                 //清除


结果发现程序会卡死在  while( !(IRCON & 0x80));  //定时时间到这个位置  所以换成了打开ST_VECTOR的中断改成flag检测 才不会卡死~这是什么原因呢~我的睡眠定时器触发了中断好像也不会停止~和手册说的有点不一样啊~

一周热门 更多>