步骤1.首先cubemax创建一个工程,然后打开STLINK的工程文件,拷贝驱动文件,最后文件目录为:
然后移植W25Q驱动
步骤2.将Dev_Inf.c的设备信息改为如下内容:
struct StorageInfo const StorageInfo = {
#endif
"FXB_STM32L431_SPI_W25Q64", // Device Name + version number
SPI_FLASH, // Device Type
0x00000000, // Device Start Address
0x00800000, // Device Size in Bytes (8MBytes/64Mbits)
0x00000100, // Programming Page Size 256Bytes
0xFF, // Initial Content of Erased Memory
// Specify Size and Address of Sectors (view example below)
0x00000800, 0x00001000, // Sector Num: 2048 Sector Size: 4KBytes
0x00000000, 0x00000000,
};
其中,设备名称会显示在STLINK
步骤3.实现stm32_eval_spi_flash.c Flash 中全部的读写驱动
步骤4.Keil中添加依赖文件和配置
此文件要加入ABSOLUTE ,否则编译会报错 Error: L6265E: Non-PI Section stm32l4xx_hal.o(.data) cannot be assigned to PI Exec region PrgData,
如果加入ABSOLUTE之后,就不能有任何全局变量,最终还是会报错,所以不加入ABSOLUTE之后,KIEL编译器必须加入read-only position independent 和 read-write position independent 选项,ASM中也必须添加,此选项可以让代码执行在RAM中,并且不具有固定的地址空间。
设置输出文件的地址,一般为STLINK的安装目录
cmd.exe /C copy "!L" "D:\Program Files (x86)\ST-LINK Utility\ExternalLoader\@L.stldr"
步骤5:取消掉程序入口
没有这一步STLINK中无法识别到算法文件。
main函数需要注释掉或改名
驱动移植:
全局变量不能使用!只能在函数内创建变量,包括w25q初始化结构体,SPI读写时的SPI_HandleTypeDef都只能在函数中定义使用,否则使用全局变量程序会异常。
程序中还需要重写这两个函数定义,因为无法使用中断和定时器,这一步,必须!
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
return HAL_OK;
}
void HAL_Delay(__IO uint32_t Delay)
{
for(int i=0;i<Delay*4000;i++)
{
};
}