OpenEdv-开源电子网

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

关于stm32的c语言数组的问题

[复制链接]

3

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-5-24
在线时间
14 小时
发表于 2016-5-24 20:02:23 | 显示全部楼层 |阅读模式
6金钱
stm32f103RCT6芯片,正在做液晶示波器,但是出现了应该是关于数组的问题,编译未出错,运行通过串口测试是卡在下面函数的36行,红字标识,下面是出错的函数,其余部分没有对这段函数产生影响。

麻烦大神帮忙解答。


#include "stm32f10x.h"
#include "delay.h"
#include "tft.h"
#include "lcd.h"
#include "gui.h"
#include "adc.h"
#include "time.h"
#include "jshz.h"
#include "bxhs.h"

unsigned char Num[10]={0,1,2,3,4,5,6,7,8,9};
unsigned int m=0;
static int z;
void bxhs10_50HZ(void)
{
float temp1[128],temp2[128],adcx,num=0;
float tempx[128],tempy[128];
int hz=0,x,y,a,b;
  USART_SendData(USART1,0);
  delay_ms(10);

  TIM_Cmd(TIM3,ENABLE);//?aê???ê±
for(x=0;x<128;x++)//?áμúò?′?μ?
  {   
   USART_SendData(USART1,1);
   delay_ms(10);
   while(m==0);
   m=0;
   USART_SendData(USART1,2);
   delay_ms(10);
   adcx=Get_Adc_Average(ADC_Channel_1,2);


   temp1[x]=(float)adcx*(3.3/4096)*20;//-1.64;   
本函数就是卡在这个temp1数组这里出不去,这是个adc接收并存在数组的for循环, 当这条指令的数组的改成tempx时便能运行出去,下面的temp2也是一样,

   USART_SendData(USART1,3);
   delay_ms(10);
  }
  TIM_Cmd(TIM3,DISABLE);//í£?1??ê±
// z=jshz(temp1,z);//?????μ?ê
  
  /*for(x=0;x<128;x++)
  {
   for(y=0;y<10;y++)
   {
    num=num+temp1[x*10+y];
   }
   tempx[x]=num/10;
   num=0;
  }*/
  USART_SendData(USART1,0);
  delay_ms(10);
  for(x=0;x<127;x++)//2áμú?t′?μ?
  {
   a=tempy[x];
   b=tempy[x+1];
   if(a>31)a=31;
   if(a<-31)a=-31;
   if(b>31)b=31;
   if(b<-31)b=-31;
   Gui_DrawLine(x,31-a,x,31-b,BLACK);
  }
  USART_SendData(USART1,1);
  delay_ms(10);
  
  wg();
  hz=10000/z;
  Gui_DrawFont_GBK16(62,105,GREEN,BLACK,"f=");
if(hz>=10000)
  {
   if(hz>99999)hz=99999;
   Gui_DrawFont_SZHS16(70,105,GREEN,BLACK,Num[hz/10000]);
   Gui_DrawFont_GBK16(78,105,GREEN,BLACK,".");
   Gui_DrawFont_SZHS16(86,105,GREEN,BLACK,Num[hz/1000%10]);
   Gui_DrawFont_SZHS16(94,105,GREEN,BLACK,Num[hz/100%10]);
   Gui_DrawFont_GBK16(102,105,GREEN,BLACK,"KHZ");
  }
  else
  {
   Gui_DrawFont_SZHS16(70,105,GREEN,BLACK,Num[hz/1000]);
   Gui_DrawFont_SZHS16(78,105,GREEN,BLACK,Num[hz/100%10]);
   Gui_DrawFont_SZHS16(86,105,GREEN,BLACK,Num[hz/10%10]);
   Gui_DrawFont_GBK16(102,105,BLACK,BLACK,"KHZ");
   Gui_DrawFont_GBK16(94,105,GREEN,BLACK,"HZ");
  }
  USART_SendData(USART1,2);
  delay_ms(10);
  
  for(x=0;x<127;x++)//D′μúò?′?μ?
  {
   a=tempx[x];
   b=tempx[x+1];
   if(a>31)a=31;
   if(a<-31)a=-31;
   if(b>31)b=31;
   if(b<-31)b=-31;
   Gui_DrawLine(x,31-a,x,31-b,WHITE);
  }
  USART_SendData(USART1,3);
  delay_ms(10);

  TIM_Cmd(TIM3,ENABLE);//?aê???ê±
  for(x=0;x<128;x++)//?áμú?t′?μ?
  {
   while(m==0);
   m=0;
   adcx=Get_Adc_Average(ADC_Channel_1,2);
   temp2[x]=(float)adcx*(3.3/4096)*20;//-1.64;
   //Gui_DrawFont_GBK16(5,73,GREEN,BLACK,temp);
  }
  TIM_Cmd(TIM3,DISABLE);//í£?1??ê±
  
  //z=jshz(temp2,z);//?????μ?ê
   
  /*for(x=0;x<128;x++)
  {
   for(y=0;y<10;y++)
   {
    num=num+temp2[x*10+y];
   }
   tempy[x]=num/10;
   num=0;
  }*/
  
  for(x=0;x<127;x++)//2áμúò?′?μ?
  {
   a=tempx[x];
   b=tempx[x+1];
   if(a>31)a=31;
   if(a<-31)a=-31;
   if(b>31)b=31;
   if(b<-31)b=-31;
   Gui_DrawLine(x,31-a,x,31-b,BLACK);
  }
  wg();
  
  hz=10000/z;
  Gui_DrawFont_GBK16(62,105,GREEN,BLACK,"f=");
if(hz>=10000)
  {
   if(hz>99999)hz=99999;
   Gui_DrawFont_SZHS16(70,105,GREEN,BLACK,Num[hz/10000]);
   Gui_DrawFont_GBK16(78,105,GREEN,BLACK,".");
   Gui_DrawFont_SZHS16(86,105,GREEN,BLACK,Num[hz/1000%10]);
   Gui_DrawFont_SZHS16(94,105,GREEN,BLACK,Num[hz/100%10]);
   Gui_DrawFont_GBK16(102,105,GREEN,BLACK,"KHZ");
  }
  else
  {
   Gui_DrawFont_SZHS16(70,105,GREEN,BLACK,Num[hz/1000]);
   Gui_DrawFont_SZHS16(78,105,GREEN,BLACK,Num[hz/100%10]);
   Gui_DrawFont_SZHS16(86,105,GREEN,BLACK,Num[hz/10%10]);
   Gui_DrawFont_GBK16(102,105,BLACK,BLACK,"KHZ");
   Gui_DrawFont_GBK16(94,105,GREEN,BLACK,"HZ");
  }
  
  for(x=0;x<127;x++)//D′μú?t′?μ?
  {
   a=tempy[x];
   b=tempy[x+1];
   if(a>31)a=31;
   if(a<-31)a=-31;
   if(b>31)b=31;
   if(b<-31)b=-31;
   Gui_DrawLine(x,31-a,x,31-b,WHITE);
  }
  
}

最佳答案

查看完整内容[请看2#楼]

你把数组定义为全局变量试试,或者把栈设置大一点
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

347

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
2078
金钱
2078
注册时间
2014-12-19
在线时间
710 小时
发表于 2016-5-24 20:02:24 | 显示全部楼层
你把数组定义为全局变量试试,或者把栈设置大一点
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-5-24
在线时间
14 小时
 楼主| 发表于 2016-5-25 00:42:03 | 显示全部楼层
原子哥求帮助
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11475
金钱
11475
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-5-25 08:26:31 | 显示全部楼层

通过串口测试是卡在下面函数的36行
串口怎么测试?不懂。

说了很多话,但还是听不明白。



回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-5-25 09:01:57 | 显示全部楼层
本帖最后由 止天 于 2016-5-25 09:04 编辑

怎么看出来卡在那里了又没有溢出
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-5-24
在线时间
14 小时
 楼主| 发表于 2016-5-25 14:08:23 来自手机 | 显示全部楼层
xuande 发表于 2016-5-25 08:26
通过串口测试是卡在下面函数的36行
串口怎么测试?不懂。


首先我是通过注释法发现问题出在那个for循环,然后每运行一条指令就发送一次串口数据,发现是卡在36行,不过只要把数组名更改一下,与下面的显示函数的数组相同就运行正常。但是我现在需要提高采集量,多加两个数组,程序就卡在那里了。
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-5-24
在线时间
14 小时
 楼主| 发表于 2016-5-25 14:09:39 来自手机 | 显示全部楼层
止天 发表于 2016-5-25 09:01
怎么看出来卡在那里了又没有溢出

用串口,每运行一条指令就串口发送一条特定数据,然后卡在36行不动了。
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-5-25 16:15:42 | 显示全部楼层
7楼说的对,还真有可能是堆栈溢出,我忘考虑了
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-5-24
在线时间
14 小时
 楼主| 发表于 2016-5-26 14:44:54 | 显示全部楼层
止天 发表于 2016-5-25 16:15
7楼说的对,还真有可能是堆栈溢出,我忘考虑了

怎么解决溢出问题呢
回复

使用道具 举报

3

主题

13

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2016-5-24
在线时间
14 小时
 楼主| 发表于 2016-5-26 14:46:05 | 显示全部楼层
lvehe 发表于 2016-5-24 20:02
你把数组定义为全局变量试试,或者把栈设置大一点

设置了全局变量,他就只是运行了一遍程序就不运行了,把栈设置大点我试试
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 09:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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