OpenEdv-开源电子网

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

stm32f103HAL库+FATFS批量写数据到SD卡出现卡死情况

[复制链接]

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2023-11-27
在线时间
13 小时
发表于 2023-12-13 15:09:46 | 显示全部楼层 |阅读模式
1金钱
MCU型号:STM32F103VET6,使用SDIO 4bit模式操作SD卡,并配置了使用FATFS
1秒写一次采集到传感器的数据到SD卡。
问题描述:
SD卡读写操作时,经常出现卡死的情况。
通过J-Link调试,发现卡死时程序在HAL_SD_ReadBlocks()函数

    while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))//卡在此句1
    {
      if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_RXFIFOHF) && (dataremaining > 0U))
      {
        /* Read data from SDIO Rx FIFO */
        for(count = 0U; count < 8U; count++)
        {
          data = SDIO_ReadFIFO(hsd->Instance);
          *tempbuff = (uint8_t)(data & 0xFFU);
          tempbuff++;
          dataremaining--;
          *tempbuff = (uint8_t)((data >> 8U) & 0xFFU);
          tempbuff++;
          dataremaining--;
          *tempbuff = (uint8_t)((data >> 16U) & 0xFFU);
          tempbuff++;
          dataremaining--;
          *tempbuff = (uint8_t)((data >> 24U) & 0xFFU);
          tempbuff++;
          dataremaining--;
        }
      }

      if(((HAL_GetTick()-tickstart) >=  Timeout) || (Timeout == 0U))//卡在此句2
      {
        /* Clear all the static flags */
        __HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
        hsd->ErrorCode |= HAL_SD_ERROR_TIMEOUT;
        hsd->State= HAL_SD_STATE_READY;
        hsd->Context = SD_CONTEXT_NONE;
        return HAL_TIMEOUT;
      }
    }
  请各位高手指点!!!!!!!!!

最佳答案

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

__disable_irq(); HAL_SD_ReadBlocks __enable_irq(); __disable_irq(); HAL_SD_WriteBlocks __enable_irq();
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3506
金钱
3506
注册时间
2016-3-19
在线时间
846 小时
发表于 2023-12-13 15:09:47 | 显示全部楼层
    __disable_irq();
    HAL_SD_ReadBlocks
    __enable_irq();

    __disable_irq();
    HAL_SD_WriteBlocks
    __enable_irq();
Nothing is impossible
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3506
金钱
3506
注册时间
2016-3-19
在线时间
846 小时
发表于 2023-12-14 09:42:56 | 显示全部楼层
持续关注一下
Nothing is impossible
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3506
金钱
3506
注册时间
2016-3-19
在线时间
846 小时
发表于 2023-12-14 13:50:10 | 显示全部楼层
SD卡读写操作时,有没有关闭中断??
Nothing is impossible
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2023-11-27
在线时间
13 小时
 楼主| 发表于 2023-12-14 14:42:08 | 显示全部楼层
unnormal 发表于 2023-12-14 13:50
SD卡读写操作时,有没有关闭中断??

没有开中断
void BSP_SD_MspInit(void *Params)
{
  GPIO_InitTypeDef gpioinitstruct = {0};
  
  /* Enable SDIO clock */
  __HAL_RCC_SDIO_CLK_ENABLE();
  
  /* Enable DMA2 clocks */
  __DMAx_TxRx_CLK_ENABLE();

  /* Enable GPIOs clock */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
//  __SD_DETECT_GPIO_CLK_ENABLE();
  
  /* Common GPIO configuration */
  gpioinitstruct.Mode      = GPIO_MODE_AF_PP;
  gpioinitstruct.Pull      = GPIO_PULLUP;
  gpioinitstruct.Speed     = GPIO_SPEED_FREQ_HIGH;
  
  /* GPIOC configuration */
  gpioinitstruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
   
  HAL_GPIO_Init(GPIOC, &gpioinitstruct);

  /* GPIOD configuration */
  gpioinitstruct.Pin = GPIO_PIN_2;
  HAL_GPIO_Init(GPIOD, &gpioinitstruct);

//  /* SD Card detect pin configuration */
//  gpioinitstruct.Mode      = GPIO_MODE_INPUT;
//  gpioinitstruct.Pull      = GPIO_PULLUP;
//  gpioinitstruct.Speed     = GPIO_SPEED_FREQ_HIGH;
//  gpioinitstruct.Pin       = SD_DETECT_PIN;
//  HAL_GPIO_Init(SD_DETECT_GPIO_PORT, &gpioinitstruct);
   
//  /* NVIC configuration for SDIO interrupts */
//  HAL_NVIC_SetPriority(SDIO_IRQn, 0xC, 0);
//  HAL_NVIC_EnableIRQ(SDIO_IRQn);
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3506
金钱
3506
注册时间
2016-3-19
在线时间
846 小时
发表于 2023-12-14 14:50:32 | 显示全部楼层
本帖最后由 unnormal 于 2023-12-14 15:04 编辑
pcb1122 发表于 2023-12-14 14:42
没有开中断
void BSP_SD_MspInit(void *Params)
{

恩恩  知道您的这个SD卡是通过查询方式操作的  不是中断方式

我说的中断是指其它中断  比如定时器   串口一类的

一般来说   调用  HAL_SD_ReadBlocks   和  HAL_SD_WriteBlocks  之前 要关闭全局中断  之后再开启全局中断
Nothing is impossible
回复

使用道具 举报

11

主题

2130

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4724
金钱
4724
注册时间
2015-1-10
在线时间
590 小时
发表于 2023-12-14 15:49:09 | 显示全部楼层
建议开DMA,SDIO读写用查询的话容易被其他中断打断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 09:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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