请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:MSP432P401R 我在MSP432P401R中尝试过以下代码以进行红外传输,但它不起作用。实际上,此代码是从用于红外增强器组件的MSP430 IR代码中修改的。
我是否可以为MSP432P401R安装IR增强器包? 如果可以,下面的代码是否有效。如果不能,请更正或为我提供代码。
#include "msp.h"
/* DriverLib包括*/
#include "driverlib.h"
/*标准包括*/
#include <stdint.h>
无符号char IR_code;
无符号char IR_flag;
unsigned char IR_STOP;
无符号char byte_cnt;
unsigned int bit_sel;
unsigned char *send_addr;
unsigned char send_data[4]={0x55, 0xAA, 0x00, 0xff};
#define EN_DECIMAL_PT 0x7F
#define DIS_DECIMAL_PT 0xFF
#define BeT_FREQ 512
#define BUTDEB_LEN (BEAT_FREQ / 4)
#define MAX_State 9.
#define State_LEN 4.
// xmit -启动38kHz IR LED调制的标志
// xmitstate -串行协议的状态机
//当前状态-当前选定的数字[0-9]
//小数掩码-设置或清除小数点的掩码
// butdeb -按钮去抖计数器
volatile int xmit=0,xmitstate=0,currstate=0,SaveState=0,
小数掩码= DIS_DECIMAL_PT,butdeb[2]={0,0};
//七段位字段。 低电平有效。 {[0-9] E (rror)}
unsigned const char digits[]={ 0x82, 0xBB, 0xA4, 0xA1, 0x99,
0xC1,0xC0,0xAB,0x80,0x89,
0xc4 };
/*应用程序定义 */
#define timer_period 0x2DC6.
/* Timer_A上行模式配置参数*/
Const Timer_a_UpModeConfig =
{
Timer_A_CLOCKSOURCE_ACLK, // ACLK时钟源
Timer_a_CLOCKSOURCE_diverer_1, // ACLK/1 = 32.768kHz
Timer_Period, // 5000 tick period
Timer_a_TAIE_INTERRUST_DISABLE, //禁用计时器中断
Timer_a_CCIE_CCR0_interrupT_enable, //启用CCR0中断
Timer_a_DO清除 //清除值
};
int main (void){
/*停止监视计时器*/
MAP_WDT_A_HoldTimer();
/*将WFP 1.0 配置为输出*/
MAP_GPIO_setAsOutputPin (GPIO端口P1,GPIO _PIN0);
MAP_GPIO_setOutputLowOnPin (GPIO端口P1,GPIO _PIN0);
/*将WFP 5.0 配置为输出*/
MAP_GPIO设置输出引脚(GPIO_PORT_P5, GPIO_PIN0);
MAP_GPIO_setOutputLowOnPin (GPIO端口P5,GPIO _PIN0);
/*启动和启用ACLK (32kHz)*/
MAP_CS_setReference振 荡器频率(CS_REFO_128KHZ);
MAP_CS_INITClockSignal (CS_ACLK,CS_REFOCLK_SELECT,CS_CLock_diverer_4);
/*为UP模式配置Timer_A0 */
MAP_Timer_a_configureUpMode(Timer_A0_base,&upConfig);
/*为UP模式配置Timer_A1 */
MAP_Timer_a_configureUpMode(Timer_A1_base,&upConfig);
/*启用中断并启动计时器*/
MAP_Interrupt_enableSleepOnIsrExit();
MAP_Interrupt_enableInterrupt (INT_TA1_0);
MAP_Timer_a_startCounter (TIMER_A1_BASE,TIMER_A_UP_MODE);
/*启用主中断*/
MAP_Interrupt_enableMaster();
IR_STOP = 1; //禁用IR发射器
同时(1)
{
//清除标记和计数器
IR_FLAG = 0;
byte_cnt = 0;
bit_sel =0;
IF (IR_STOP == 0)
{
//配置IR输出引脚
P5SEL0|= BIT0;//使用内部IR调制器
//在IR发射期间禁用端口5和端口2中断
P2IE = 0;
P5IE = 0;
//配置IR调制:ASK
/*
SYSCFG1 = IRDSEL + IREN;
TA1CCTL0 = CCIE;
TA1CCTL2 = OUTMOD_7;//输出模式:重置/设置
TA0CCTL2 = OUTMOD_7; //输出模式:重置/设置
*/
/*
// 38kHz 1/4占空比载波波形长度设置
TA0CCR0 = 104;
TA0CCR2 = 25;
TA1CCR0 = 640; // TA0的初始时间应长于TA1
TA1CCR2 = 320;
*/
//将按钮编号写入缓冲区
send_data[2]= IR_code;
send_data[3]=~IR_code;
send_addr =&send_data[0];
//停止,直到IR代码结束
while (IR_STOP == 0);
TA0CCTL0 = 0;
TA0CCTL2 = 0;
TA0CTL = 0;
TA0CCR0 = 0;
TA0CCR2 = 0;//禁用timer0
TA1CCTL0 = 0;
TA1CCTL2 = 0;
TA1CTL = 0;
TA1CCR0 = 0;
TA1CCR2 = 0;//禁用Timer1
P5IE ||(BIT3 + BIT4 + BIT5);//启用GPIO中断
P2IE |= BIT7;
}
MAP_PCM_GotoLPM0();// 进入低功率模式
IR_STOP = 0;//启用IR代码发射
}
}
//************************************************************************************************
//
//这是TIMERA中断矢量服务例程。
//
//************************************************************************************************
void TA1_0_IRQHandler (void)
{
开关(TA1IV)
{
案例 0:
{
IF (IR_FLAG)
{
IR_STOP=1;//停止IR调制器
TA1CCTL0 &=~CCIE;//禁用TIMER_A0中断
}
IF ((byte_cnt=0)&&(bit_sel=0) // IR代码的前导脉冲突发
{
TA1CCR0 = 5.3999万; // 9毫秒高
TA1CCR2 = 3.5999万; //低4.5毫秒
byte_cnt+; //字节计数器
bit_sel++; //位计数器
}
否则,如果((byte_cnt>=5)&&(bit_sel=1) // IR代码结束
{
TA1CCR0 = 2249; //0.562毫秒脉冲脉冲串以显示结束
TA1CCR2 = 2249;
IR_FLAG=1;
}
否则
{
IF ((*发送地址和位数)== 0)// data "0"
{
TA1CCR0 = 4499; //高0.562毫秒 低0.562毫秒
TA1CCR2 = 2249;
bit_sel<<=1;
}
ELSE //数据"1"
{
TA1CCR0 = 8999; //高0.562毫秒 低1.687毫秒
TA1CCR2 = 2249;
bit_sel<<=1;
}
if (bit_sel>=256)//开始一个新字节
{
send_addr++;
byte_cnt++;
bit_sel=1;
}
}
中断;
}
默认值:中断;
}
}