大家好,我在MSP430fr2433上的IR模块获得稳定输出时遇到问题。
我已经在WFP 1.2 的示波器上确认我正在使用Timer_A0生成一个38 kHz的信号。
我还在WFP 1.4 上确认我正在用Timer_A1生成一个500 Hz的信号。
用户手册(slau445g)的第53页似乎表示我需要设置以下寄存器
IRDATA = 0
IRDSEL = 1
IRMSEL = 0
IREN = 1
当我把这些放到示波器上时,我得到的只是一个高输出的WFP 2.6
我的代码如下。 是否有人对我做错了事有任何建议?
// IR发射器测试
#include "driverlib.h"
#include "MSP430-h"
//************************************************************************************************
////
引脚编号
////**************************************************************************************
//引脚1.0 =用于MSP430FR2433开发板的板载红色LED -设置为基本输出
//引脚2.6 = IR LED。 引脚设置为IR传输模式IREN
//引脚2.7 =用于MSP430FR2433开发板的板载开关。 设置为从高到低的触发
器//************************************************************************************************
////
函数原型
////******************************************************************************
void Init_Clock(void);
void Init_GPIO (void);
void Start_38k_Timer(void);
void Start_Envelope_Timer(void);
void BlinkLED();
//************************************************************************************************
////
全局变量
////******************************************************************************
易失性UINT32_t按钮Debouncy;/************
照明相关全局变量************** ///
空白表示NOW
/************ IR TX相关全局变量************ ///unsigned
char IR_code =0;
//unsigned char IR_flag =0;
unsigned char IR_stop =0;
unsigned char byte_cnt =0;
unsigned int bit_sel =0;
unsigned char *send_addr;
unsigned char send_data[4]={0x55, 0xAA, 0x00, 0x00, 0xFF);//默认值。每隔一个字节为逆向
/************ 计时器相关全局变量************ /
UINT32_t MclockValue = 0; //用于存储当前MClock值
的变量UINT32_t SMclockValue =0; //用于存储当前SMClock值
UINT32_t AlclockValue =0的变量; //用于存储当前AClock值
的变量/************ 时钟频率************ //MCLK
的目标频率(单位:kHz
)#define CS_MCLK_Desired _Frequency_in_kHz 8000
//MCLK/FLLRef Ratio
//将其设为MCLK值除以3.2万。 这将设置一个倒计时计时器,以允许FLL适应所需的MCLK值
#define CS_MCLK_FLLREF_Ratio 250
void main (void)
{
//停止看门狗计时器
WDT_A_HOLD (WDT_A_BASE);
//初始化所有内容
init_gPIO(); //初始化GPIO
init_Clock(); //初始化时钟
//验证时钟设置是否符合预期
MclockValue = CS_getMCLK();
SMclockValue = CS_getSMCLK();
AcclockValue = CS_getACLK();
IR_STOP = 0;//启用IR发射器
同时(1)
{
//清除标记和计数器
//IR_flag = 0;
byte_cnt = 0;
bit_sel =0;
IF (IR_STOP == 0)
{
//在IR发射期间禁用端口1和端口2中断
P1IE = 0;
P2IE = 0;
//开始生成38khz信号
Start_38k_Timer();
Start_Envelope_Timer();
//停下来,坐在这里,发出稳定的38khz信号
while (1);
}
__bis_sr_register (LPM3_bits + GIE); //在启用全局中断的情况下输入LPM3
IR_STOP = 0; //启用IR代码发射
}
//输入带中断的LPM3
//__bis_sr_register (LPM3_bits + GIE);
//用于调试器
__no_operation();
}//**********************************************************************************************
////
职能
////**********************************************************************************************
//初始化时钟
无效Init_Clock (void)
{
//此函数使用driverlib来设置主板的时钟值
//有关这些函数的详细信息,请参见driverlib文档
//设置DCO FLL参考= REFO
Cs_initClockSignal (CS_FLLREF,CS_REFCLK_SELECT,CS_CLock_diver_1);
//设置比率和所需MCLK频率并初始化DCO
CS_INITFLLSettle (CS_MCLK_Desired频率_in_kHz,CS_MCLK_FLLREF_Ratio);
//设置ACLK = REFO
Cs_initClockSignal (CS_ACLK,CS_REFOCLK_SELECT,CS_CLock_diver_1);
// DCOCLK = MCLK和SMCLK源
CSCTL5 || DIVM_0 | DIVS_1; // MCLK = DCOCLK = 8MHZ,
// SMCLK = MCLK/2 = 4MHz
}//
初始化GPIO
void Init_gPIO(void)
{
//************** IR配置************** //
//配置IR输出引脚
//设置P 2.6 以输出来自IR模块的信号
GPIO_setAsPeripheralModuleFunctionOutputPin (
GPIO端口P2,
GPIO _PIN6,
GPIO主要模块功能
);
// debug -设置P 1.2 以输出Timer_A0中的信号
//有关如何手动设置的说明,请参阅第328页上的slau445g
GPIO_setAsPeripheralModuleFunctionOutputPin (
GPIO端口P1,
GPIO _PIN2,
GPIO辅助模块功能
);
// debug -设置P 1.4 以输出Timer_A1中的信号
GPIO_setAsPeripheralModuleFunctionOutputPin (
GPIO端口P1,
GPIO _PIN4,
GPIO辅助模块功能
);
//当前设置为FSK调制,输出设置为高
//配置IR调制-请参阅第78页的slau445g
//位4 = IRDATA
//位3= IRDSSEL - IR数据源选择0=硬件|1= IRDATA位
//位2 = IRMSEL - IR模式选择0 = ASK | 1 = FSK
//位1 = IRPSEL -极性(请勿触摸)
//位0 = IREN - IR启用0=关|1=开
SYSCFG1 = IRDSEL + IREN; //数据源= IRDATA位,ASK模式
pm_unlockLPM5();
}
void Start_38k_Timer(void){
//此设置使用timer_A0配置并启动稳定的38khz信号
//自slau445g第363页起的计时器配置步骤顺序
//第1步-清除所有内容slau445g第377页
TA0CTL = TCLR;
//步骤2 -初始化Timer_A0捕获/比较寄存器slau445g,第381页
// 38kHz 1/4占空比载波波形长度设置 sla644b第10页
//基于4 MHz时钟进行配置!!
TA0CCR0 = 104; //(4000 / 38 = 105)(计时器计数从0开始)
TA0CCR2 = 25; //(105 / 4 = 26)(1/4个省电工作周期)
//步骤3 -配置Timer_A0捕获/比较控制寄存器 slau445g第379页
TA0CCTL2 = OUTMOD_7; //输出模式:重置/设置
//步骤4 -配置Timer_A0控制寄存器 slau445g第377页
//定时器操作模式设置
// TALCLR =定时器A计数器清除
// tassel_2 =定时器A时钟源选择:2- SMCLK
// mc_1. =定时器A模式控制:1-至CCR0
TA0CTL = tassel_2 + MC_1;
}
作废Start_Envelope_Timer(void){
//此设置使用timer_A0配置信封定时信号
//自slau445g第363页起的计时器配置步骤顺序
//当前配置为输出恒定的高信号
//第1步-清除所有内容slau445g第377页
TA1CTL = TCLR;
//步骤2 -初始化Timer_A1捕获/比较寄存器slau445g第381页
// 9毫秒
//基于4 MHz时钟进行配置!!
TA1CCR0 = 8000 - 1; //(400万 x 0.001 = 4000 + TA1CCR2 = 8000)(低1毫秒)
TA1CCR2 = 4000 - 1; //(400万 x 0.001 = 4000)(1毫秒高)
//步骤3 -配置Timer_A1捕获/比较控制寄存器 slau445g第379页
TA1CCTL2 = OUTMOD_7; //输出模式:重置/设置
//步骤4 -配置Timer_A1控制寄存器 slau445g第377页
//定时器操作模式设置
// TALCLR =定时器A计数器清除
// tassel_2 =定时器A时钟源选择:2- SMCLK
// mc_1. =定时器A模式控制:1-至CCR0
TA1CTL = tassel_2 + MC_1;
}