OpenEdv-开源电子网

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

内存卡读写,读内存卡时程序跳进硬件中断,求大神。。。。。

[复制链接]

14

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2014-7-23
在线时间
5 小时
发表于 2015-5-15 21:07:14 | 显示全部楼层 |阅读模式
5金钱
这是我存数据的代码

void cunshuju(int num,u32 shanqu)
{



   u8* buff;
  
  u32 shanquhao;
   sprintf(buff,"%s",num);


   SD_WriteDisk(buff,shanquhao,1);

}

这是我读数据的代码

int jisuan( u32 shanqu)
{
        u16 b3,s3,g3,d3;

     u8 bufff[4];


        SD_ReadDisk(bufff,shanqu,1);

   
b3=(int)(bufff[0]-48);
s3=(int)(bufff[1]-48);
g3=(int)(bufff[2]-48);
          d3=(int)(bufff[3]-48);
   return b3*1000+s3*100+g3*10+d3;

}

程序出现卡死现象,在线调试,发现程序运行到SD_ReadDisk(bufff,shanqu,1);时 会跳到
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}

查看调用栈



这个问题已经困扰了好多天了,真的搞不明白到底是哪里出了问题。。。。。。
求大神帮忙解答一下,指点一二

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-15 21:07:15 | 显示全部楼层
bufff[4],定义成4字节,这么小。不死才怪。
read disk是以扇区为单位,至少一次读512字节。
你别傻乎乎的把bufff[4]改为bufff[512]就以为可以了
堆栈可能不够用,照死不误。
所以,bufff[4]定义成bufff[512],而且要放全局数组!
应该就可以解决你这个问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2014-7-23
在线时间
5 小时
 楼主| 发表于 2015-5-15 21:09:15 | 显示全部楼层
真的没有办法了。求大神 
 片子是F103VCT6
程序移植的MINI板例程
回复

使用道具 举报

14

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2014-7-23
在线时间
5 小时
 楼主| 发表于 2015-5-15 21:11:02 | 显示全部楼层
#include "spi2.h"
#include "usart.h"
#include "stm32f10x_spi.h"
//////////////////////////////////////////////////////////////////////////////////  
//±????ò???©?§?°??????????×÷???í???????????????ü????????
//Mini STM32??·?°?
//SPI ????????   
//??????×?@ALIENTEK
//????????:www.openedv.com
//????????:2010/6/13 
//°?±???V1.0
//°??¨?ù??????°?±?????
//Copyright(C) ??????×? 2009-2019
//All rights reserved
//////////////////////////////////////////////////////////////////////////////////  
 

//??????SPI???é?????????ú???????????÷?ú??????·???SD Card/W25X16/24L01/JF24C  
//SPI????????
//??????????SPI2????????



void SPI2_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  SPI_InitTypeDef  SPI_InitStructure;

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB?±?????? 
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2,  ENABLE );//SPI2?±??????
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15???????ì???? 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15????

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //?è??SPI???ò?ò?????ò??????????:SPI?è???????????ò?????¤
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //?è??SPI?¤×÷????:?è?????÷SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //?è??SPI???????ó??:SPI·???????8?????á??
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //???????®???±????????:?±???ü????
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //?????????????????±????
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS???????????¨NSS?????©?????í???¨????SSI???©???í:????NSS??????SSI??????
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //?¨???¨?????¤·???????:?¨?????¤·???????16
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //???¨??????????MSB??????LSB??????:??????????MSB??????
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC?????????à????
SPI_Init(SPI2, &SPI_InitStructure);  //?ù??SPI_InitStruct?????¨???????????????èSPIx?????÷
 
SPI_Cmd(SPI2, ENABLE); //????SPI???è

SPI2_ReadWriteByte(0xff);//????????  

}   
//SPI ?????è??????
//SpeedSet:
//SPI_BaudRatePrescaler_2   2·???   
//SPI_BaudRatePrescaler_8   8·???   
//SPI_BaudRatePrescaler_16  16·???  
//SPI_BaudRatePrescaler_256 256·??? 
  
void SPI2_SetSpeed(u8 SpeedSet)
{
SPI2->CR1&=0XFFC7; 
SPI2->CR1|=SpeedSet;
SPI_Cmd(SPI2,ENABLE); 


//SPIx ????????×???
//TxData:????????×???
//·?????:????????×???
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //?ì?é???¨??SPI±ê?????è????·?:·?????????±ê????
{
retry++;
if(retry>200)return 0;
}  
SPI_I2S_SendData(SPI2, TxData); //?¨?????èSPIx·???????????
retry=0;

while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //?ì?é???¨??SPI±ê?????è????·?:????????·???±ê????
{
retry++;
if(retry>200)return 0;
}      
return SPI_I2S_ReceiveData(SPI2); //·????¨??SPIx×??ü??????????    
}
这是SPI2配置文件
回复

使用道具 举报

14

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2014-7-23
在线时间
5 小时
 楼主| 发表于 2015-5-15 21:20:38 | 显示全部楼层
还有一个怪现象 
在读数据中,如果我把  数据缓存 BUFFF这个数组在MAIN函数里面定义,程序可以一直运行,但是这个数组定义在外面,不管是全局变量还是什么,程序都会卡死。。。
回复

使用道具 举报

14

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2014-7-23
在线时间
5 小时
 楼主| 发表于 2015-5-16 20:48:45 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
竟然是这样子,感激涕零。、。。。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 11:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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