完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#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测试程序rn"); UART1_SendString("GPRS模块在注册网络rn"); Delay_nS(1); UART2_SendString("+++");//退出透传模式,避免模块还处于透传模式中 Delay_nS(2); Wait_CREG(); //等待模块注册成功 UART1_SendString("GPRS模块注册成功rn"); UART1_SendString("GPRS模块开始连接服务器rn"); Set_ATE0(); //取消回显 Connect_Server(); //设置GPRS参数 UART1_SendString("连接成功rn"); 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 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!=' |