OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2545|回复: 1

打印 上一主题 下一主题 求助大神:从云服务器接收数据输出PWM,只实现了通信连接,没有PWM输出。代码如下

[复制链接]

9

主题

15

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-5-30
在线时间
9 小时
发表于 2018-5-30 00:26:48 | 显示全部楼层 |阅读模式
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;
    }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-5-31 01:36:00 | 显示全部楼层
单独测试PWM输出先
要学会简化问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-5 12:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表