OpenEdv-开源电子网

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

STM32操作GPS,不能接受数据,用软件是可以看到的

[复制链接]

36

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2013-8-3
在线时间
0 小时
发表于 2013-11-8 20:31:32 | 显示全部楼层 |阅读模式

这个是程序:void  INit()
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE); //因为A口为复用时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);

 ///////////////////////////////////////////////////////////////////////
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4;   //CE 引脚控制模式选择,因为要用来控制它的
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;    //它的电平,所以选择输出方式((》》》))
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;   //
  GPIO_Init(GPIOA,&GPIO_InitStructure);      //
  Set_NRF2401_CE;         ///必须先拉高,因为不工作时为H
  Set_nss;          //先拉高,不让工作
 //////////////////////////////////////////////////////////////////////
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_6|GPIO_Pin_7;    //用一个使能,先拉高 ((b)),把所有的片选都配置上了
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//因为用它来控制外面的,所以选择输出,上下拉随意
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  Set_NRF2401_CS;      //
  //GPIO_SetBits(GPIOB,GPIO_Pin_6);  //
  //GPIO_SetBits(GPIOB,GPIO_Pin_7);  //
  ////////////////////////////////////////////////////////////////////
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;    //IRQ 中断引脚
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;////上拉输入
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
      GPIO_Init(GPIOA,&GPIO_InitStructure);
   GPIO_SetBits(GPIOA,GPIO_Pin_2);   //初始化时先拉高,因为触发时为L
  //////////////////////////////////////////////////////////////////////
  ////////////////////设置俩处,1:GPIO 2:SPI那里的/////////////////////
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //复用推挽输出 ,只有这样才可以区别不是普通IO口
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
 //////////////////////////////////////////////////
 ////////////////////////////////////////////////////////usart
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//选择口
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
   GPIO_Init(GPIOD,&GPIO_InitStructure);
   //////////////////////////////////////////////////////
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//选择口
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
   GPIO_Init(GPIOD,&GPIO_InitStructure);
 //////////////////////////////////////////////////
  ////////////////////////////////////////////////////////usart
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//选择口
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA,&GPIO_InitStructure);
   //////////////////////////////////////////////////////
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//选择口
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
   GPIO_Init(GPIOA,&GPIO_InitStructure);
 //////////////////////////////////////////////////
  /*GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_InitStructure); */

}

void USART2_init()  //串口初始化
{
   USART_InitTypeDef USART_InitStructure;  //
  NVIC_InitTypeDef NVIC_InitStructure;
   USART_ClockInitTypeDef USART_ClockInitStructure; //
   USART_InitStructure.USART_BaudRate=9600;    //
   USART_InitStructure.USART_WordLength=USART_WordLength_8b; //
   USART_InitStructure.USART_StopBits=USART_StopBits_1; //
   USART_InitStructure.USART_Parity=USART_Parity_No;//
   USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  //
   USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;        //
   USART_ClockInitStructure.USART_Clock=USART_Clock_Disable;
   USART_ClockInitStructure.USART_CPOL=USART_CPOL_Low;
   USART_ClockInitStructure.USART_CPHA=USART_CPHA_2Edge;
   USART_ClockInitStructure.USART_LastBit=USART_LastBit_Disable;
   USART_Init(USART2,&USART_InitStructure);
   USART_ClockInit(USART2,&USART_ClockInitStructure);
  USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
   USART_Cmd(USART2,ENABLE);
 ////////////////////////////////
  NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}


//////中断函数////////////////

void interrupt()
{
 if((USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET))
 {
  table0[i++]=USART_ReceiveData(USART2);
  if(table0[0]=='$')
  {
    flag=1;
    if(i>=70)
     i=0;
  }
  else i=0;
 }
}

void GPS_GetDATA()

  u8 i,j,k=0 ;
  if(flag==1)
  { 
  flag=0;
   if(table0[4]=='G')
   {  
      for(j=0;i<70;j++)
   {
   
   printf("\r\n table2==%c\r\n",table0);
   
  }
       if (table0[j]==',')
    {
   k++;
   if(k==0)
   {
       for(i=0;i<10;i++)
    {
      table2=table0[j+i]; //时间
     printf("\r\n table2==%c\r\n",table2);
    }
   }
        if(k==1)
       {
      for(i=0;i<10;i++)
      {
       table3=table0[j+i];//纬度
      }
       }
        if(k==2)
        {
         for(i=0;i<10;i++)
         {
           table4=table0[j+i];//经度
         }
        }
         if(k==8)
          {
            for(i=0;i<10;i++)
          {
           table5=table0[j+i];  //高度
          }
          }
   }
  }
      }
    }
 这个是总的代码,

现象是这样的:由于中断进不了,所以flag 不能被置位,可是不知哪的错,原子哥给看看

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-8 23:05:22 | 显示全部楼层
void interrupt()
这个中断服务函数名字,你是怎么得来的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2013-8-3
在线时间
0 小时
 楼主| 发表于 2013-11-9 17:18:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------我自己随便写的,这个有影响吗??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-9 18:06:32 | 显示全部楼层
那随便写个函数,能作为中端服务函数?
CPU凭什么要执行你这个interrupt函数?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2013-8-3
在线时间
0 小时
 楼主| 发表于 2013-11-9 20:33:03 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
好吧,多谢原子哥,受教了,恩,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-9 10:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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