keguo
keguo
This guy hasn't written anything yet

注册于 1 year ago

回答
6
文章
0
关注者
0

是ukf 卡尔曼滤波,更新使用很多的矩阵和向量,每次调用要申请和释放(这是可以优化的,想先找到问题)。函数调用1000多次后,申请内存就失败了,大概率是动态内存是哪里没及时释放。

我仔细查找了一下,是宏定义没有加入到内

应该不是,换到 stm32F4的开发板上,可以正常单步调试

也不知道怎么回事,我把IDE都关掉,然后重启就可以了

我有一个文件的buf 设置为512 正常,设置为1024 出现 UNALIGNED错误

增加打印发现在驱动drv_sdio.c 中,已经开启了DMA, 但是针对的应该是write函数,

void SD_LowLevel_DMA_TxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize)
{
#if defined(SOC_SERIES_STM32F1)
static uint32_t size = 0;
size += BufferSize * 4;
sdio_obj.cfg = &sdio_config;
sdio_obj.dma.handle_tx.Instance = sdio_config.dma_tx.Instance;
sdio_obj.dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
sdio_obj.dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
sdio_obj.dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE;
sdio_obj.dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
sdio_obj.dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE;
sdio_obj.dma.handle_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
/* DMA_PFCTRL */
HAL_DMA_DeInit(&sdio_obj.dma.handle_tx);
HAL_DMA_Init(&sdio_obj.dma.handle_tx);

HAL_DMA_Start(&sdio_obj.dma.handle_tx, (uint32_t)src, (uint32_t)dst, BufferSize);

#elif defined(SOC_SERIES_STM32L4)
static uint32_t size = 0;
size += BufferSize * 4;
sdio_obj.cfg = &sdio_config;
sdio_obj.dma.handle_tx.Instance = sdio_config.dma_tx.Instance;
sdio_obj.dma.handle_tx.Init.Request = sdio_config.dma_tx.request;
sdio_obj.dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
sdio_obj.dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE;
sdio_obj.dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE;
sdio_obj.dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
sdio_obj.dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
sdio_obj.dma.handle_tx.Init.Mode = DMA_NORMAL;
sdio_obj.dma.handle_tx.Init.Priority = DMA_PRIORITY_MEDIUM;

HAL_DMA_DeInit(&sdio_obj.dma.handle_tx);
HAL_DMA_Init(&sdio_obj.dma.handle_tx);

HAL_DMA_Start(&sdio_obj.dma.handle_tx, (uint32_t)src, (uint32_t)dst, BufferSize);
#else
static uint32_t size = 0;
size += BufferSize * 4;
sdio_obj.cfg = &sdio_config;
sdio_obj.dma.handle_tx.Instance = sdio_config.dma_tx.Instance;
sdio_obj.dma.handle_tx.Init.Channel = sdio_config.dma_tx.channel;
sdio_obj.dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
sdio_obj.dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE;
sdio_obj.dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE;
sdio_obj.dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
sdio_obj.dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
sdio_obj.dma.handle_tx.Init.Mode = DMA_PFCTRL;
sdio_obj.dma.handle_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
sdio_obj.dma.handle_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
sdio_obj.dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
sdio_obj.dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4;
sdio_obj.dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4;
/* DMA_PFCTRL */
HAL_DMA_DeInit(&sdio_obj.dma.handle_tx);
HAL_DMA_Init(&sdio_obj.dma.handle_tx);
//LOG_I("3 - SD_LowLevel_DMA_TxConfig");
HAL_DMA_Start(&sdio_obj.dma.handle_tx, (uint32_t)src, (uint32_t)dst, BufferSize);
#endif
}

没有使用fsync 时,数据不写入文件中

你好,
sdio 有类似于在rtconfig.h 下面配置DMA的方式吗?

#define BSP_UART6_RX_USING_DMA
#define BSP_UART6_TX_USING_DM


发现不能直接配置,上了文件系统,通过,open ,write 对文件进行读写操作,不能使用 rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX|RT_DEVICE_FLAG_DMA_TX); 进行管理DMA的配置,需要改动驱动哪里的代码呢?

你们怎么把数据写到磁盘上的,fsync 耗时有点长

已经解决,在中间增加一个16us 的延时

rt_spi_send(spi_dev_adis16475, adis16475_id_reg, 2);
rt_hw_us_delay(16);
rt_spi_recv(spi_dev_adis16475, id3, 2);

请问下,你是怎么把串口DMA配置成功的,我用官方例子,测试的 DMA_RX的时候发现打开失败,请问下还需要什么别的配置;

请问这个问题解决了没,我的stm32F427 也是这样的,跑的还是官方的例子

    本帖最后由 keguo 于 2020-1-19 09:55 编辑


SPI 驱动代码编译错误,看了下路径依赖都有,没问题,还需要其他的配置吗? 使用STM32 构建没有错误[img][/img]

spi_error.png
stm32_构建.png

回到
顶部

发布
问题

投诉
建议