This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430FR4133:msp430FR4133

Guru**** 2609895 points
Other Parts Discussed in Thread: MSP430FR4133

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/658798/ccs-msp430fr4133-msp430fr4133

部件号:MSP430FR4133

工具/软件:Code Composer Studio

我正在尝试在msp430fr4133上使用PCF8583。日期和时间正确显示,但出现报警问题。设置了10秒警报,在pcf的前10秒INT引脚(引脚编号7)变为LOW (低)后,程序没有进入中断例程,INT引脚保持低电平。

这是我的密码

#include "driverlib.h"
包含"Board.h"
#include <sw_i2c.h>

//#包括"Board.h"

//定义LCD存储器的字词访问定义
#define pos1 1/*数字A1 - L4 */
#define pos2 2 /*数字A2 - L6 */
#define pos3 /*数字A3 - L8 */
#define pos4 4/*数字A4 - L10 */
Const char digit1[10];
extern const字符[10];

//volatile unsigned char * mode =&BAKMEM4_L;
void Init_lcd (void);
void diplay (uint8_t num, int posi);
void display_time();
void display_date();
void display_temp (float t);
void setsecondsalarm (int value);
void restartAlarm();

//void UART_INIT();
uINT8_t rec_buffer1[5];
uINT8_t (*ptr1)[5];
uINT8_t rec_buffer2[5];
uINT8_t (*ptr2)[5];
//=================================================================================== rtc===========================================================================================================================================
uINT8_t地址=0xA0>>1;
uINT8_t道;
uINT8_t秒= 10;
uINT8_t分钟=58;
UINT8_t小时=04;
UINT8_t日=16;
UINT8_t Month = 11;
int年=2018;
int year1=0;
UINT8_t YEAR_BASE = 2016;
uINT8_t setsec=5,setmin=2,setthr=2;
int bcd_to_byte(uint8_t bcd);
uINT8_t int_to_bcd (int in);
void Get_Time();
void set_time();
内部AM;



void interrupT_set();
/* int alarm_milisec;
int alarm_second;
int alarm_minute;
Int alarm_hour;
int alarm_dday;*/
uINT8_t _i2caddr=0x28;
UINT8_t状态;
浮点湿度;
浮子温度C;
浮子温度F;

int main (void){

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器


interrupT_set();
I2C_Init();
INIT_LCD();

pm_unlockLPM5();

set_time();

Setsecondsalarm (setsec);

// setminutesalarm (setmin);
// Sethoursalarm(sethr);
// set_daily_alarm();


而(1){

GET_TIME ();

//__delay_cycles (8万);
Display_Time();
// display_date();


IF (am=1){



Setsecondsalarm (setsec);
//__delay_cycles (8万);


AM=2;
}

__DELAY周期(1000);
__bis_sr_register (GIE);

}


}


#pragma vector=Port1_vector
__interrupt void P1_ISR (void)

{IF (P1IFG&BIT3){


GPIO _toggleOutputOnPin (GPIO_PORT_P4,GPIO _PIN0);

GPIO清除中断(GPIO_PORT_P1,GPIO _PIN3);
__delay_cycles (2000年);

AM=1;



}

void interrupT_set(){

GPIO _setAsOutputPin (GPIO端口P4,GPIO _PIN0);
GPIO _setOutputLowOnPin (GPIO端口P4,GPIO _PIN0);
GPIO_setAsInputPinWithPullUp阻 器(GPIO_PORT_P1,GPIO_PIN3);
// gPIO_setAsInputPin (gPIO_PORT_P1,gPIO_PIN3);
GPIO _启用中断(GPIO_PORT_P1,GPIO _PIN3);
// gPIO_selectInterruptEdge (gPIO_PORT_P1,gPIO_PIN3,gPIO_LLOW至HIGH过渡);
GPIO_selectInterruptEdge (GPIO端口P1,GPIO PIN5,GPIO _高_至_低_转换);
GPIO清除中断(GPIO_PORT_P1,GPIO _PIN3);



}


void Get_time()
uINT8_t rec_buffer [5];
UINT8_t (* PTR)[5];
ptr =&rec_buffer;
UINT8_t寄存器;
// uint8_t注册表12;
ptr1 =&rec_buffer1;
UINT8_t年;

rec_buffer[0]=0;
寄存器=0xC0;
I2C_WriteData (* PTR,地址,寄存器,1);


寄存器=0x10;
I2C_ReadData (* PTR,地址,寄存器,1);
year1 =(rec_buffer[1])<8;
year1 =(year1 |(rec_pbuffer [0]));


rec_buffer[0]=0;
寄存器=0xFF;
I2C_WriteData (* PTR,地址,寄存器,1);

//__delay_cycles (2000);

寄存器=0x02;
I2C_ReadData (* PTR,地址,寄存器,5);
秒= bcd_to_byte(crate_buffer[0]);
分钟= bcd_to_byte(crate_buffer[1];
hour = bcd_to_byte(crate_buffer[2]);


UINT8_t incoming = rec_buffer[3];//年/日期计数器
Day = bcd_to_byte (Incoming & 0x3f);//3f

Year=(int)((传入>> 6)和0x03);//仅保留4年...
Incoming = rec_buffer_[4];
Month = bcd_to_byte(incoming & 0x1f);
道琼斯指数=来港>> 5;

年=年+年1;


}

int bcd_to_byte(uint8_t bcd){
返回((bcd >> 4)* 10)+(bcd和0x0F);
}

uINT8_t int_to_bcd (int in){
回报(((in / 10)<4)+(in %10);
}


void set_time()
{uint8_t rec_buffer [5];
UINT8_t (* PTR)[5];
ptr =&rec_buffer;
UINT8_t寄存器;

ptr1 =&rec_buffer1;

/*如果(!IsLeapYear (year)&& 2 ==月&& 29 ==天){
月=3;
天= 1;
}*/

//尝试查找上一个闰年
/* yyear _base = year -(year % 4);
如果(!IsLeapYear (Year_base)){
//不是闰年(新世纪),请确保日历不会使用29天的二月。
year _base =年份-1;
}*/

// dow = DayOfWeek (*这);


rec_buffer[0]=0;
寄存器=0xC0;
I2C_WriteData (* PTR,地址,寄存器,1);

寄存器=0x10;
// rec_buffer1[0]=(2000-(年-(年%4)))>>8;
//rec_buffer1[1]=((int) yar_base和0x00ff);
// I2C_WriteData(*ptr1,地址,寄存器,2);
rec_buffer1[1]=(((year -(year % 4)))>>8);//<8);//0x07;//<<
rec_buffer1[0]=(年-(年% 4))和0x00ff);//0xE0;//
I2C_WriteData (* ptr1,地址,寄存器,2);
rec_buffer2[0]=bcd_to_byte(Rec_buffer1[0]);//bcd_to_byte(Rec_buffer1[0]);
//rec_buffer2[1]=bcd_to_byte(rec_buffer1[1]);


寄存器=0x02;
rec_buffer[0]=(int_to_bcd(second));
rec_buffer[1]=(int_to_bcd(分钟));
rec_buffer[2]=(int_to_bcd(hour));
rec_buffer[3]=((((int)(year - yyear _base)<<6)| int_to_bcd(date));
//rec_buffer[3]=(int)((year <6)& 0x03)|( int_to_bcd (day)& 0x1f);
rec_buffer[4]=((dow <<5)|(int_to_bcd(MONTS)& 0x1f));
I2C_WriteData (* PTR,地址,寄存器,5);


}


布尔IsLeapYear (int year){
返回!(年% 400)||(年% 100)&!(年% 4));
}


/*uint8_t DayOfWeek(){
静态字符PROGMEM MonthTable[24]={0,3,3,6,1, 4,6,2,5,0, 3,5,-1,2,3, 6,1,4,6,2, 5,0,3,5};
uINT8_t y =年份% 100,c = 6 - 2 *(年/ 100)% 4);
返回(天+ pgm_read_byte_near (MonthTable + IsLeapYear (year)* 12 +月- 1)+ y +(y / 4)+ c)% 7;
}*/


void setsecondsalarm (int value){
uINT8_t rec_buffer [5];
UINT8_t (* PTR)[5];
ptr =&rec_buffer;
UINT8_t寄存器;
//控制和状态寄存器
寄存器=0x00;
rec_buffer[0]=0x04;
I2C_WriteData (* PTR,地址,寄存器,1);
__DELAY周期(80);
//报警控制寄存器
寄存器=0x08;
rec_buffer[0]=0x4A;
I2C_WriteData (* PTR,地址,寄存器,1);
__DELAY周期(80);
//预设值
寄存器=0x0F;
rec_buffer[0]=(int_to_bcd(99-value));
I2C_WriteData (* PTR,地址,寄存器,1);
__DELAY周期(80);
寄存器=0x07;
rec_buffer[0]=(int_to_bcd(99-value));
I2C_WriteData (* PTR,地址,寄存器,1);
__DELAY周期(80);
}


void restartAlarm()
uINT8_t rec_buffer [5];
UINT8_t (* PTR)[5];
ptr =&rec_buffer;
UINT8_t寄存器;
//控制和状态寄存器
寄存器=0x00;
rec_buffer[0]=0x04;//0x05
I2C_WriteData (* PTR,地址,寄存器,1);
__DELAY周期(80);

寄存器=0x07;
rec_buffer[0]=(int_to_bcd(99-5));
I2C_WriteData (* PTR,地址,寄存器,1);
__DELAY周期(80);

}

//=========================================================================================================== lcd===================================================================================================================================================

//用于LCD位置5,6,7,8,9,10
const char digit [10]={
0xFA,/*"0"*/
0x60,/*"1"*/
0xBC,/*"2"*/
0xf4,/*"3"*/
0x66,/*"4"*/
0xD6,/*"5"*/
0xDE,/*"6"*/
0x72,/*"7"*/
0xFE,/*"8"*/
0xF6 /*"9"*/
};
//用于LCD位置1,2,3,4
const char digit1[10]=

0xf5,//"0"
0x60,//"1"
0xD3,//"2"
0xF2,//"3"
0x66,//"4"
0xB6,//"5"
0xB7,//"6"
0xE4,//"7"
0xF7,//"8"
0xF6 //"9"
};

void Init_lcd()

//已选择L0~L26和L36~L39引脚
LCD_E_setPinAsLCDFunctionEx (LCD_E_BASE,LCD_E_SEGMENT_LINE_0,LCD_E_SEGMENT_LINE_26);
LCD_E_setPinAsLCDFunctionEx (LCD_E_BASE,LCD_E_SEGMENT_LINE_36,LCD_E_SEGMENT_LINE_39);

LCD_E_initParam initParams = LCD_E_INIT_Param;
initParams.clockDivider = LCD_E_CLOCKDIVIDER_3;
initParams.mxRate = LCD_E_4_MUX;
initParams.segments = LCD_E_Segments启用;
initParams.Waveforms= LCD_E_low_POWER_Waveforms;
//将LCD初始化为4-mux模式
LCD_E_INIT (LCD_E_BASE,&initParams);

// LCD操作-模式3,内部3.02v,充油泵256Hz
LCD_E_setVLCDSource (LCD_E_BASE,LCD_E_INTERNAL参考电压,LCD_E_EXTERNAL电源电压);
LCD_E_setVLCDVoltage (LCD_E_BASE,LCD_E_reference_voltage_2_96V);

LCD_E_enableChargePump (LCD_E_BASE);
LCD_E_setChargePumpFreq (LCD_E_BASE,LCD_E_CHARGEPUMP_FREQ_16);

//清除液晶屏内存
LCD_E_clearAllMemory (LCD_E_BASE);

//配置coms和SEG
// L0 = COM0,L1 = COM1,L2 = COM2,L3 = COM3
LCD_E_setPinAsCOM (LCD_E_BASE,LCD_E_SEGMENT_LINE_0,LCD_E_MEMORY_COM0);
LCD_E_setPinAsCOM (LCD_E_BASE,LCD_E_SEGMENT_LINE_1,LCD_E_MEMORY_COM1);
LCD_E_setPinAsCOM (LCD_E_BASE,LCD_E_SEGMENT_LINE_2,LCD_E_MEMORY_COM2);
LCD_E_setPinAsCOM (LCD_E_BASE,LCD_E_SEGMENT_LINE_3,LCD_E_MEMORY_COM3);

//选择以显示主LCD内存
LCD_E_selectDisplayMemory (LCD_E_BASE,LCD_E_DISPLAYSOURCE_MEMORY);

//打开LCD
LCD_E_ON (LCD_E_BASE);
}


void diplay (uint8_t num, int posi){
UINT8_t Lower,higher;
lower = num/10;
higher=num-lower *10;
开关(位置){
案例1:

LCDM8 =数字[下部];
LCDM9 =数字[更高];
中断;
}
案例2:{
LCDM10 =数字[下部];
LCDM11 =数字[更高];
中断;
}
案例3:{
LCDM2 =数字[下部];
LCDM3 =数字[更高];
中断;
}
}

}

void display_temp (float t){
UINT16_t temp,T1,T2,T3,T4;
temp=t*10;
t1=temp/1000;
t2=(tem-(T1*1000))/100;
t3=(tem-(t1*1000)-(T2*100))/10;
T4=(tem-(T1*1000)-(T2*100)-(T3*10));
LCDM4 = digit1[T1];
LCDM5 = digit1[T2];
LCDM6 = digit1[T3];
LCDM7 = digit1[T4];
LCDM7=LCDM7|(0x08);
}

void display_time()
显示(小时,位置1);
显示(分钟,位置2);
显示(第二,位置3);
LCDM10 = LCDM10|0x01;
LCDM2= LCDM2|0x01;
LCDM8 = LCDM8|0x01;
}
void display_date()
// year1=(year>>8);
// year2=(year & 0x00FF);
year1=year-0x7D0;
显示(日期,位置1);
显示(月,位置2);
显示(第1年,第3年);
LCDM10 = LCDM10|0x01;
LCDM2= LCDM2|0x01;
//LCDM9= LCDM8|0x01;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    我认为您可能做了错误的GPIO设置。 为什么使用PIN3作为中断输入引脚,而配置PIN5?

    // gPIO_selectInterruptEdge (gPIO_PORT_P1,gPIO_PIN3,gPIO_LLOW至HIGH过渡);
    GPIO_selectInterruptEdge (GPIO端口P1,GPIO PIN5,GPIO _高_至_低_转换);

    此致,
    冬季游