hal库读写w25q128
时间: 2025-01-08 08:12:35 浏览: 9
### 使用STM32 HAL库操作W25Q128 Flash
#### 初始化SPI外设
为了通过SPI接口与W25Q128通信,需要先设置好相应的硬件参数。这通常涉及到配置SPI的工作模式、波特率以及数据帧格式等。
```c
// 定义SPI句柄结构体变量
extern SPI_HandleTypeDef hspi1;
void MX_SPI1_Init(void)
{
// 这里省略了具体的初始化函数实现细节...
}
```
上述代码片段展示了如何声明一个用于控制SPI1的`SPI_HandleTypeDef`类型的全局对象,并定义了一个名为`MX_SPI1_Init()`的函数来完成实际的初始化工作[^4]。
#### 函数:使能/禁用写保护状态
在执行任何写入之前,应该解除设备上的写保护位;当不需要再修改内容时,则可以重新启用此特性以防止意外更改。
```c
static void W25QXX_Write_Enable(void)
{
uint8_t cmd = WRITE_ENABLE;
W25QXX_CS_LOW();
HAL_SPI_Transmit(&hspi1, &cmd, 1, W25QXX_TIMEOUT);
W25QXX_CS_HIGH();
}
static void W25QXX_Write_Disable(void)
{
uint8_t cmd = WRITE_DISABLE;
W25QXX_CS_LOW();
HAL_SPI_Transmit(&hspi1, &cmd, 1, W25QXX_TIMEOUT);
W25QXX_CS_HIGH();
}
```
这里实现了两个简单的辅助方法——分别用来开启和关闭允许写入的状态标志位[^3]。
#### 功能:查询忙闲状况并等待直到空闲为止
由于Flash内部可能正在进行诸如擦除之类的耗时较长的操作,在尝试新的指令前必须确认其已经就绪:
```c
static void W25QXX_Wait_Busy(void)
{
uint8_t status_reg;
const uint8_t read_status_cmd = READ_STATUS_REG1;
do {
W25QXX_CS_LOW();
HAL_SPI_Transmit(&hspi1, &read_status_cmd, sizeof(read_status_cmd), W25QXX_TIMEOUT);
HAL_SPI_Receive(&hspi1, &status_reg, sizeof(status_reg), W25QXX_TIMEOUT);
W25QXX_CS_HIGH();
} while (status_reg & STATUS_WIP_MASK); // While Write In Progress bit is set.
}
```
这段逻辑会持续轮询状态寄存器中的某个特定位置(`STATUS_WIP_MASK`),直至发现该位被清除才返回给调用者继续后续流程。
#### 实现页编程(Write Page)
向指定地址处的一整页(通常是256字节大小)连续空间内填充新数据的过程称为“页编程”。下面给出了一种可行的方式来进行这项任务:
```c
HAL_StatusTypeDef W25QXX_Page_Program(uint32_t addr, uint8_t* pBuf, uint32_t numToWrite)
{
uint8_t cmd[4];
int i=0;
if(numToWrite > PAGE_SIZE || ((addr % PAGE_SIZE) + numToWrite) > PAGE_SIZE){
return HAL_ERROR;
}
cmd[i++] = PAGE_PROGRAM_CMD;
cmd[i++] = (uint8_t)((addr >> 16) & 0xFF);
cmd[i++] = (uint8_t)((addr >> 8 ) & 0xFF);
cmd[i++] = (uint8_t)( addr & 0xFF);
W25QXX_Write_Enable();
W25QXX_CS_LOW();
HAL_SPI_Transmit(&hspi1, cmd , i, W25QXX_TIMEOUT);
HAL_SPI_Transmit(&hspi1, pBuf, numToWrite, W25QXX_TIMEOUT);
W25QXX_CS_HIGH();
W25QXX_Wait_Busy();
return HAL_OK;
}
```
在此基础上还可以进一步封装更高层次的功能比如扇区擦除(Sector Erase),批量传输(Bulk Transfer)等等。
阅读全文