帮我写一段程序,STM32L431 SDMMC写入2048字节数据,不使用DMA
时间: 2023-04-09 17:03:09 浏览: 102
好的,以下是一段可以实现 STM32L431 SDMMC 写入 2048 字节数据的程序,不使用 DMA:
```
#include "stm32l4xx.h"
#define SDMMC_BLOCK_SIZE 512
void SDMMC_Write_Block(uint32_t block_addr, uint8_t *data)
{
uint32_t i;
// 等待 SDMMC 空闲
while ((SDMMC1->STA & SDMMC_STA_BUSY) != 0);
// 设置块大小
SDMMC1->DCTRL = SDMMC_BLOCK_SIZE << 4;
// 设置块地址
SDMMC1->ARG = block_addr * SDMMC_BLOCK_SIZE;
// 发送写块命令
SDMMC1->CMD = SDMMC_CMD_CMD24 | SDMMC_CMD_WAITRESP | SDMMC_CMD_CPSMEN;
// 等待命令完成
while ((SDMMC1->STA & SDMMC_STA_CMDSENT) == 0);
// 发送数据
for (i = 0; i < SDMMC_BLOCK_SIZE; i += 4) {
SDMMC1->FIFO = ((uint32_t)data[i+3] << 24) |
((uint32_t)data[i+2] << 16) |
((uint32_t)data[i+1] << 8) |
((uint32_t)data[i]);
}
// 等待数据传输完成
while ((SDMMC1->STA & SDMMC_STA_TXUNDERR) == 0 &&
(SDMMC1->STA & SDMMC_STA_DATAEND) == 0);
// 清除状态标志
SDMMC1->ICR = SDMMC_ICR_TXUNDERRC | SDMMC_ICR_DATAENDC;
}
```
这段程序使用了 SDMMC1 接口,将数据写入 SD 卡的指定块地址。注意,这里没有使用 DMA,而是直接将数据写入 SDMMC1 的 FIFO 中。如果需要写入多个块,可以在循环中多次调用该函数。
阅读全文