新手上路
- 积分
- 46
- 金钱
- 46
- 注册时间
- 2018-5-30
- 在线时间
- 9 小时
|
1金钱
#include "stm32f10x.h"
#include "usart.h"
#include "Led.h"
#include "SysTick.h"
#include "timer.h"
#include "string.h"
#include "sys.h"
#define Buf2_Max 199 //串口2缓存长度
/************* 本地常量声明 **************/
const char *string = "AT+CIPSTART=\"TCP\",\"114.115.171.24\",5050";//IP登录服务器,需要根据自己的IP和端口做修改
/************* 本地变量声明 **************/
char Power_On_Flag; //判断是否GPRS模块开机
char Uart2_Buf[Buf2_Max+1]; //串口2接收缓存
char *p1,*p2;
u8 Times=0,shijian=0;
u8 Timer0_start; //定时器0延时启动计数器
/************* 本地函数声明 **************/
void System_Initialization(void); //STM32系统初始化
void Ram_Initialization(void); //内存变量初始化
void NVIC_Configuration(void); //中断向量组初始化
void CLR_Buf2(void); //清串口2接收缓存
u8 Find(char *a); //查找字符串
void Second_AT_Command(char *b,char *a,u8 wait_time); //发送AT指令
void Wait_CREG(void); //查询等待模块注册成功
void Set_ATE0(void); //取消回显
void Connect_Server(void); //配置GPRS连接参数,并进入透传模式
void Rec_Server_Data(void); //接收服务器数据并返回
/************* 外部函数和变量声明*****************/
/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入 :
* 输出 :
* 返回 :
* 注意 : 串口2负责与MG323模块通信,串口1用于串口调试,可以避免在下载程序时数据
还发送到模块
*******************************************************************************/
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
System_Initialization(); //系统初始化
Ram_Initialization(); //变量初始化
GPIO_WriteBit(GPIOC,GPIO_Pin_7,Bit_RESET);
Delay_nMs(3750);
GPIO_WriteBit(GPIOC,GPIO_Pin_7,Bit_SET);
GPIO_WriteBit(GPIOC,GPIO_Pin_8,Bit_SET);
Delay_nMs(3750);
UART1_SendString("GPRS模块GPRS测试程序\r\n");
UART1_SendString("GPRS模块在注册网络\r\n");
Delay_nS(1);
UART2_SendString("+++");//退出透传模式,避免模块还处于透传模式中
Delay_nS(2);
Wait_CREG(); //等待模块注册成功
UART1_SendString("GPRS模块注册成功\r\n");
UART1_SendString("GPRS模块开始连接服务器\r\n");
Set_ATE0(); //取消回显
Connect_Server(); //设置GPRS参数
UART1_SendString("连接成功\r\n");
while(1)
{
// if(Power_On_Flag)
Rec_Server_Data();//接收数据并原样返回
}
}
/*******************************************************************************
* 函数名 : System_Initialization
* 描述 : STM32系统初始化函数(初始化STM32时钟及外设)
* 输入 : 无
* 输出 : 无
* 返回 : 无
* 说明 : 无
*******************************************************************************/
void System_Initialization(void)
{
RCC_Configuration(); //设置系统时钟为72MHZ(这个可以根据需要改)
SysTick_Init_Config(); //初始化系统滴答时钟SysTick
NVIC_Configuration(); //STM32中断向量表配配置
Timer2_Init_Config(); //定时器2初始化配置
USART1_Init_Config(115200); //串口1初始化配置
USART2_Init_Config(115200); //串口2初始化配置
TIM3_PWM_Init(989,0); //不分频 个 。PWM频率=72000000/900=80Khz
GPIO_Config(); //初始化GPIO
}
/*******************************************************************************
* 函数名 : Ram_Initialization
* 描述 : 变量初始化函数
* 输入 : 无
* 输出 : 无
* 返回 : 无
* 说明 : 无
*******************************************************************************/
void Ram_Initialization(void)
{
Times=0;
shijian=0;
Timer0_start=0;
p1=Uart2_Buf;
p2=p1;
}
/*******************************************************************************
* 函数名 : NVIC_Configuration
* 描述 : STM32中断向量表配配置
* 输入 : 无
* 输出 : 无
* 返回值 : 无
* 说明 : 设置KEY1(PC11)的中断优先组
*******************************************************************************/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //定义NVIC初始化结构体
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级组为2,先占优先级和从优先级各两位(可设0~3)
/*定时器2中断向量配置*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //设置中断向量号
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //设置抢先优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能NVIC
NVIC_Init(&NVIC_InitStructure);
/*串口1中断向量配置*/
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置中断向量号
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //设置抢先优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能NVIC
NVIC_Init(&NVIC_InitStructure);
/*串口2中断向量配置*/
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //设置中断向量号
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //设置抢先优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //设置响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能NVIC
NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* 函数名 : USART2_IRQHandler
* 描述 : 串口1中断服务程序
* 输入 : 无
* 返回 : 无
* 说明 :
*******************************************************************************/
void USART2_IRQHandler(void)
{
u8 Res=0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
Res=USART_ReceiveData(USART2);
*p1 = Res; //将接收到的字符串存到缓存中
p1++; //缓存指针向后移动
if(p1>&Uart2_Buf[Buf2_Max]) //如果缓存满,将缓存指针指向缓存的首地址
{
p1=Uart2_Buf;
}
}
}
/*******************************************************************************
* 函数名 : TIM2_IRQHandler
* 描述 : 定时器2中断断服务函数
* 输入 : 无
* 输出 : 无
* 返回 : 无
* 说明 : 无
*******************************************************************************/
void TIM2_IRQHandler(void) //TIM2中断
{
static u8 flag =1;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中断标志
if(Timer0_start)
Times++;
if(Times > shijian)
{
Timer0_start = 0;
Times = 0;
}
if(flag)
{
LED4_ON();
flag=0;
}
else
{
LED4_OFF();
flag=1;
}
}
}
/*******************************************************************************
* 函数名 : CLR_Buf2
* 描述 : 清除串口2缓存数据
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void CLR_Buf2(void)
{
u16 k;
for(k=0;k<Buf2_Max;k++) //将缓存内容清零
{
Uart2_Buf[k] = 0x00;
}
p1=Uart2_Buf; //接收字符串的起始存储位置
}
/*******************************************************************************
* 函数名 : Find
* 描述 : 判断缓存中是否含有指定的字符串
* 输入 :
* 输出 :
* 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
* 注意 :
*******************************************************************************/
u8 Find(char *a)
{
if(strstr(Uart2_Buf,a)!=NULL)
return 1;
else
return 0;
}
/*******************************************************************************
* 函数名 : Second_AT_Command
* 描述 : 发送AT指令函数
* 输入 : 发送数据的指针、发送等待时间(单位:S)
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Second_AT_Command(char *b,char *a,u8 wait_time)
{
u8 i;
char *c;
c = b; //保存字符串地址到c
CLR_Buf2();
i = 0;
while(i == 0)
{
if(!Find(a))
{
if(Timer0_start == 0)
{
b = c; //将字符串地址给b
for (; *b!='\0';b++)
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
USART_SendData(USART2,*b);//UART2_SendData(*b);
}
UART2_SendLR();
Times = 0;
shijian = wait_time;
Timer0_start = 1;
}
}
else
{
i = 1;
Timer0_start = 0;
}
}
CLR_Buf2();
}
/*******************************************************************************
* 函数名 : Wait_CREG
* 描述 : 等待模块注册成功
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Wait_CREG(void)
{
u8 i;
u8 k;
i = 0;
while(i == 0)
{
CLR_Buf2();
UART2_SendString("AT+CREG?"); //查询等待模块注册成功
UART2_SendLR();
Delay_nMs(5000);
for(k=0;k<Buf2_Max;k++)
{
if(Uart2_Buf[k] == ':')
{
if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5')) //说明注册成功
{
i = 1;
UART1_SendLR();
break;
}
}
}
UART1_SendString("注册中.....");
}
}
/*******************************************************************************
* 函数名 : Set_ATE0
* 描述 : 取消回显
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Set_ATE0(void)
{
Second_AT_Command("ATE0","OK",3); //取消回显
}
/*******************************************************************************
* 函数名 : Connect_Server
* 描述 : GPRS连接服务器函数
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Connect_Server(void)
{
UART2_SendString("AT+CIPCLOSE=1"); //关闭连接
Delay_nMs(100);
Second_AT_Command("AT+CIPSHUT","SHUT OK",2); //关闭移动场景
Second_AT_Command("AT+CGCLASS=\"B\"","OK",2);//设置GPRS移动台类别为B,支持包交换和数据交换
Second_AT_Command("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",2);//设置PDP上下文,互联网接协议,接入点等信息
Second_AT_Command("AT+CGATT=1","OK",2);//附着GPRS业务
Second_AT_Command("AT+CIPCSGP=1,\"CMNET\"","OK",2);//设置为GPRS连接模式
Second_AT_Command("AT+CIPMUX=0","OK",2);//设置为单路连接
Second_AT_Command("AT+CIPHEAD=1","OK",2);//设置接收数据显示IP头(方便判断数据来源,仅在单路连接有效)
Second_AT_Command("AT+CIPMODE=1","OK",2);//打开透传功能
Second_AT_Command("AT+CIPCCFG=4,5,200,1","OK",2);//配置透传模式:单包重发次数:2,间隔1S发送一次,每次发送200的字节
Second_AT_Command((char*)string,"OK",5);//建立连接
Delay_nMs(100); //等待串口数据接收完毕
CLR_Buf2(); //清串口接收缓存为透传模式准备
}
/*******************************************************************************
* 函数名 : Rec_Server_Data
* 描述 : 接收服务器数据函数,并原样返回
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void Rec_Server_Data(void)
{
if(p2!=p1) //说明还有数据未发出
{
while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);
USART_SendData(USART2,*p2);
TIM_SetCompare2(TIM3,(int)((*p2)*300) );
p2++;
if(p2>&Uart2_Buf[Buf2_Max])
p2=Uart2_Buf;
}
}
|
|