📄 msp430_gprs.c
字号:
作用域:本地文件调用
作为主框架程序
* 功能: 项目主函数,系统的循环运行
* 参数:
* 返回值:
* 创建人:
*
* 修改历史:(每条详述)
\********************************************************/
void main(void)
{
//看门狗定时器WDT的设置:
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗WDT ,WDTPW看门狗的口令
//时钟模块的设置:
BCSCTL2|=SELS+SELM1; //SELS表示用XT2CLK作为SMCLK的时钟源
//SELM1表示用XT2CLK作为MCLK时钟源
//ACLK---辅助时钟,用于软件选择分频因子,也可用软件选做各外围模块的时钟信号
//MCLK---主时钟,主要用于CPU和系统,也可软件选择分频因子
//SMCLK--子时钟,由软件选择用于外围模块
// BCSCTL2|=DIVS_3; //选择SMCLK时钟的分频因子为8
// BCSCTL2|=DIVM_3; //选择MCLK时钟的分频因子为8
//-------------------------------
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
for (i = 0xFF; i > 0; i--);
}
while ( IFG1 & OFIFG ); // OSCFault flag still set?
//--------------------------------
for (i = 60000; i > 0; i--);
//定时器TA的设置
TACTL|=TASSEL1; //输入时钟选择MCLK
TACTL|=TACLR; //定时器A清除位CLR清零
TACTL|=MC1; //定时器A选择连续增记数模式
// TACTL|=TAIE; //定时器A溢出中断允许
TAR=0; //定时器A的值清零
TACCTL0|=OUT; //TXD2 Idle as Mark
TACCTL1|=OUT; //TXD3 Idle as Mark
TACCTL2|=OUT; //TXD4 Idle as Mark
//定时器TB的设置
TBCTL|=TBSSEL1; //输入时钟源选择MCLK
TBCTL|=TBCLR; //定时器B清除位CLR清零
TBCTL|=MC1; //模式为连续增记数
// TBCTL|=TBIE; //定时器B溢出中断允许
TBR=0; //寄存器B的值清零
TBCCTL0|=CCIE;
/*
=============================================================================
波特率的计算方式
8000 000 /19200=416.6667D(十进制)=01A0H+?0.67D(11010101B/8=0XD5/8)
8000 000/9600 =833.333D(十进制)=0341H+0.333D(1010100B/8=0X54/8)
8000 000/4800 =1666.66666D(十进制)=0682H+0.67(11010101B/8=0XD5/8)
=============================================================================
*/
//串口0设置(接收是中断形式,发送不产生中断)
//将与G20通讯的波特率设置为4800
UTCTL0|=SSEL1; //发送选择系统时钟
URCTL0|=URXEIE; //所有字符都可使的URXIFG置位
//波特率9600
UBR10=0x03;
UBR00=0x41;
UMCTL0=0x54;
//波特率4800
/*
UBR10=0x06;
UBR00=0x82;
UMCTL0=0xD5;
*/
UCTL0|=CHAR; //选择8位字符发送接收
UCTL0&=(~SWRST);
//串口1设置(接收是中断形式,发送不产生中断)
//波特率9600
UTCTL1|=SSEL1; //发送选择系统时钟
URCTL1|=URXEIE; //所有字符都可使的URXIFG置位
UBR11=0x03;
UBR01=0x41;
UMCTL1=0x54;
UCTL1|=CHAR; //选择8位字符发送接收
UCTL1&=(~SWRST);
//中断允许1
IE1|=URXIE0; //URSART0接受中断允许
// IE1|=UTXE0; //URSART0发送中断允许
IE1|=OFIE; //振荡器故障中断允许
//中断允许2
IE2|=URXIE1; //USART1接收中断允许
// IE2|=UTXE1; //USART1发送中断允许
//模块允许1
ME1|=URXE0; //USART0接收允许(UART模式)
ME1|=UTXE0; //USART0发送允许(UART模式)
//模块允许2
ME2|=URXE1; //USART1接收允许(UART模式)
ME2|=UTXE1; //USART1发送允许(UART模式)
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
设置定义三个模拟串口的相关管脚定义
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
P3SEL=0;
P3SEL|=BIT4+BIT5+BIT6+BIT7; //P3SEL--P3端口选择寄存器,选择UART0,UART1功能
P1SEL += TXD2; // P1.5/TA0 for TXD function
P1DIR += TXD2; // TXD output on P1
P1SEL += RXD2; // P1.1/TA0 as RXD input
P1SEL += TXD3; // P1.6/TA0 for TXD function
P1DIR += TXD3; // TXD output on P1
P1SEL += RXD3; // P1.2/TA0 as RXD input
P1SEL += TXD4; // P1.7/TA0 for TXD function
P1DIR += TXD4; // TXD output on P1
P1SEL += RXD4; // P1.3/TA0 as RXD input
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
设置定义控制部分相关管脚的定义
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
P6DIR|=POWER_ON_OFF;
P6OUT&=~POWER_ON_OFF; //设置POWER_ON_OFF为低电平
P1DIR|=MCU_STATUS;
P6DIR|=STOP_Q2+STOP_Q1; //设置为输出模式
P6OUT&=~STOP_Q2; //设置STOP_Q2为低电平
P6OUT&=~STOP_Q1; //设置STOP_Q1为低电平
P6SEL |= BIT1; //将A1设置为外围模块功能,即ADC功能
P6DIR|=WDI; //设置WDI为输出模式
P6OUT&=~WDI; //外部硬件看门狗的设置
P6DIR|=SEL_MIC;
P6OUT&=~SEL_MIC;
Init_OperFlash();
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
关于串行存储器AT45DB041B的管脚定义
器件默认为工作模式3,则为SCK的上升沿发送和接收数据
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
//CS,RST,SCK,SI,WP设置为输出模式
P2DIR|=SPI45DB041_CS+SPI45DB041_RST+SPI45DB041_SCK+SPI45DB041_SI;
P2OUT|=SPI45DB041_CS; //置SPI45DB041_CS为高
P2OUT|=SPI45DB041_RST; //置SPI45DB041_RST为高
P2OUT&=~SPI45DB041_SCK; //置SPI45DB041_SCK为低
P6DIR|=SPI45DB041_WP;
P6OUT&=~SPI45DB041_WP; //置SPI45DB041_WP为低
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
设置定义P6.1,P6.2,P6.3管脚为外围模块功能,即ADC转换功能定义
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
_EINT(); //开中断
//WDTCTL=WDTPW; //启动看门狗
TAUARTCTL|=TAUARTIE; //比较器A的中断允许
RX2_Ready();
RX3_Ready();
RX4_Ready();
gTimer=0;
while(gTimer<2000) {Clear_Exter_WatchDog();}
Send_COM1_String((unsigned char *)MAINSYS,sizeof(MAINSYS));
//初始化模块各参数
gInternal_Flag=0;
gGeneral_Flag=0;
gOther_Flag=0;
Init_MAIN_Module();
gGPS_No_Output_Timer=0;
gNO_Sram_Data_Timer=0;
Clear_Exter_WatchDog();
while(1)
{
//调试部分的串口显示程序
if( (Debug_Timer>20000)&&((gGeneral_Flag&TCP_PHONE_F_1)==0) )
{
RX2_Ready();RX3_Ready();RX4_Ready();
//调试串口1写外部SRAM和读外部SRMA的程序检验部分
Debug_Timer=0;
//显示M22的工作方式状态
Send_COM1_Byte(ASCII(gM22_Status/10));
Send_COM1_Byte(ASCII(gM22_Status%10));
Send_COM1_Byte('=');
//显示系统正在周期发送数据的类型
Send_COM1_Byte(ASCII(gCycle_Send_Status/10));
Send_COM1_Byte(ASCII(gCycle_Send_Status%10));
Send_COM1_Byte('=');
Send_COM1_Byte(ASCII(gAlarm_Type/10));
Send_COM1_Byte(ASCII(gAlarm_Type%10));
Send_COM1_Byte('[');
Send_COM1_Byte(ASCII(gStatus1_Flag/0x10));
Send_COM1_Byte(ASCII(gStatus1_Flag%0x10));
Send_COM1_Byte(':');
Send_COM1_Byte(ASCII(gStatus2_Flag/0x10));
Send_COM1_Byte(ASCII(gStatus2_Flag%0x10));
Send_COM1_Byte(':');
Send_COM1_Byte(ASCII(gStatus3_Flag/0x10));
Send_COM1_Byte(ASCII(gStatus3_Flag%0x10));
Send_COM1_Byte(']');
if(gGeneral_Flag&GPS_VALID_F_1)
{
Send_COM1_Byte('A');
}
else Send_COM1_Byte('V');
Send_COM1_Byte(':');
if(gGeneral_Flag&NUM1_VAILD_F_1)
{
Send_COM1_Byte('P');
}
else Send_COM1_Byte('N');
Send_COM1_Byte(':');
if(gInternal_Flag&CENTER_NUM_VAILD_F_1)
{
Send_COM1_Byte('C');
}
else Send_COM1_Byte('N');
Send_COM1_Byte(':');
if(gGeneral_Flag&LAND_TCP_ERROR_F_1)
{
Send_COM1_Byte('G');
}
else Send_COM1_Byte('N');
Send_COM1_Byte(':');
if(gInternal_Flag&SEND_CIRCLE_F_1)
{
Send_COM1_Byte('S');
}
else Send_COM1_Byte('N');
Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
}
Do_GPS_Module();
Clear_Exter_WatchDog();
Do_Disp_Module();
Clear_Exter_WatchDog();
Do_Handle_Module();
Do_Other_Module();
Clear_Exter_WatchDog();
Do_Record_Module();
Clear_Exter_WatchDog();
//主控系统中的两个模块处于需要断电状态的循环程序
if( ((gGeneral_Flag&OFF_M22_F_1)||(gGeneral_Flag&OFF_GPS_F_1))
&& (gPhone_Status==READY) )
{
//处理两个模块的掉电子程序
Do_OFF_Power();
Clear_Exter_WatchDog();
gGPS_No_Output_Timer=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -