说明:
QSPI的内存映射模式,自动查询模式和间接模式。
间接模式就是相对于内存映射时,可以是总线直接访问来说的。
==============================================================================
##### 驱动如何使用 #####
==============================================================================
1、底层初始化HAL_QSPI_MspInit。
(1)__HAL_RCC_QSPI_CLK_ENABLE
(2)函数__HAL_RCC_QSPI_FORCE_RESET() 配合 __HAL_RCC_QSPI_RELEASE_RESET()可复位QSPI(3)__HAL_RCC_GPIOx_CLK_ENABLE
(3)HAL_GPIO_Init配置复用模式
(4)如果使用中断模式,调用函数HAL_NVIC_SetPriority() 和 HAL_NVIC_EnableIRQ()设置
(5)使用DMA传输时,用的是MDMA,
a、__HAL_RCC_MDMA_CLK_ENABLE
b、HAL_MDMA_Init
c、__HAL_LINKDMA
如果需要中断处理,需要配置NVIC
a、HAL_NVIC_SetPriority
b、HAL_NVIC_EnableIRQ
c、SDMMC的中断使能和禁止函数__HAL_SD_ENABLE_IT,__HAL_SD_DISABLE_IT
d、中断标志位处理__HAL_SD_GET_IT和__HAL_SD_CLEAR_IT
e、SDMCC不需要通用的DMA,因为内部自带一个DMA。
(7)函数HAL_QSPI_Init配置flash大小,时钟分频,fifo阀值,时钟模式,采样偏移,CS高电平时间。
2、间接模式
(1)函数HAL_QSPI_Command或者HAL_QSPI_Command_IT配置命令时序
a、这几个阶段都是可以配置是否使用的。
b、指令阶段。
c、地址阶段。
d、可选字节阶段。
e、空周期阶段。
f、数据阶段。
DDR模式配置,时钟的上升沿和下降沿均可做数据收发。
Sending Instruction Only Once (SIOO)模式配置,这种模式发送一次指令后,就可以方便的做读写操作,不过需要外部Flash支持这种模式才行。
(2)如果命令不需要数据,则将其直接发送到内存:
在轮询模式下,输出功能在传输完成时完成。
在中断模式下,传输完成后将调用HAL_QSPI_CmdCpltCallback。
(3)间接模式写操作可以调用use HAL_QSPI_Transmit(), HAL_QSPI_Transmit_DMA() 或者 HAL_QSPI_Transmit_IT()
a、在轮询模式下,写操作在传输完成时完成。
b、在中断模式,达到FIFO阀值的时调用回调函数HAL_QSPI_FifoThresholdCallback,传输完成的时候调用回调函数HAL_QSPI_TxCpltCallback。
c、在DMA模式,半传输完成的时候调用回调函数HAL_QSPI_TxHalfCpltCallback,而全部传输完成的时候调用回调函数HAL_QSPI_TxCpltCallback
(4)间接模式读操作可以调用HAL_QSPI_Receive(), HAL_QSPI_Receive_DMA() 或者 HAL_QSPI_Receive_IT()
a、在轮询模式下,读操作在传输完成时完成。
b、在中断模式,达到FIFO阀值的时调用回调函数HAL_QSPI_FifoThresholdCallback,传输完成的时候调用回调函数HAL_QSPI_RxCpltCallback。
c、在DMA模式,半传输完成的时候调用回调函数HAL_QSPI_RxHalfCpltCallback,而全部传输完成的时候调用回调函数HAL_QSPI_RxCpltCallback。
3、自动查询模式
(1)函数HAL_QSPI_AutoPolling() 或者 HAL_QSPI_AutoPolling_IT()配置时序
a、这几个阶段都是可以配置是否使用的。
b、指令阶段。
c、地址阶段。
d、可选字节阶段。
e、空周期阶段。
f、数据阶段。
g、Sending Instruction Only Once (SIOO)模式配置,这种模式发送一次指令后,就可以方便的做读写操作,不过需要外部Flash支持这种模式才行。
h、状态字节的大小,匹配值,使用的掩码,匹配模式(OR / AND),轮询间隔和激活自动停止。
(2)配置完成后:
a、在轮询模式下,写操作在达到状态匹配时完成,同时激活自动停止以避免无限循环。
b、在中断模式下,每次状态匹配时都会调用HAL_QSPI_StatusMatchCallback()。
4、内存映射模式
(1)函数HAL_QSPI_MemoryMapped配置命令时序和内存映射
a、这几个阶段都是可以配置是否使用的。
b、指令阶段。
c、地址阶段。
d、可选字节阶段。
e、空周期阶段。
f、数据阶段。
g、DR模式配置,时钟的上升沿和下降沿均可做数据收发。
h、Sending Instruction Only Once (SIOO)模式配置,这种模式发送一次指令后,就可以方便的做读写操作,不过需要外部Flash支持这种模式才行。
i、超时激活和超时时间。
(2)配置完成后,只要地址范围内的AHB总线访问完成,就会使用QuadSPI。超时到期时将调用HAL_QSPI_TimeOutCallback()。
5、错误管理和终止功能
(1)HAL_QSPI_GetError()函数给出上一次操作期间引发的错误。
(2)HAL_QSPI_Abort()和HAL_QSPI_AbortIT()函数中止任何正在进行的操作并刷新fifo:
a、在轮询模式下,当传输完成位被置位,忙位清零时,写操作完成。
b、在中断模式下,当传输完成位被置位时,回调函数HAL_QSPI_AbortCpltCallback()将被调用。
6、控制和状态获取功能
(1)HAL_QSPI_GetState() 用于获取当前的驱动状态f。
(2)HAL_QSPI_SetTimeout() 配置溢出时间。
(3)HAL_QSPI_SetFifoThreshold() 配置FIFO的阀值。
(4)HAL_QSPI_GetFifoThreshold() 给出当前的FIFO阀值。
7、QSPI的一个勘误处理:
在读传输结束时写入FIFO的额外数据
/* 初始化和复位初始化 */
HAL_StatusTypeDef HAL_QSPI_Init (QSPI_HandleTypeDef *hqspi);
HAL_StatusTypeDef HAL_QSPI_DeInit (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_MspInit (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi);
/* QSPI IRQ */
void HAL_QSPI_IRQHandler(QSPI_HandleTypeDef *hqspi);
/* QSPI 间接模式 */
HAL_StatusTypeDef HAL_QSPI_Command (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, uint32_t Timeout);
HAL_StatusTypeDef HAL_QSPI_Transmit (QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout);
HAL_StatusTypeDef HAL_QSPI_Receive (QSPI_HandleTypeDef *hqspi, uint8_t *pData, uint32_t Timeout);
HAL_StatusTypeDef HAL_QSPI_Command_IT (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd);
HAL_StatusTypeDef HAL_QSPI_Transmit_IT (QSPI_HandleTypeDef *hqspi, uint8_t *pData);
HAL_StatusTypeDef HAL_QSPI_Receive_IT (QSPI_HandleTypeDef *hqspi, uint8_t *pData);
HAL_StatusTypeDef HAL_QSPI_Transmit_DMA (QSPI_HandleTypeDef *hqspi, uint8_t *pData);
HAL_StatusTypeDef HAL_QSPI_Receive_DMA (QSPI_HandleTypeDef *hqspi, uint8_t *pData);
/* QSPI 状态标志查询模式 */
HAL_StatusTypeDef HAL_QSPI_AutoPolling (QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg, uint32_t Timeout);
HAL_StatusTypeDef HAL_QSPI_AutoPolling_IT(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_AutoPollingTypeDef *cfg);
/* QSPI 内存映射模式 */
HAL_StatusTypeDef HAL_QSPI_MemoryMapped(QSPI_HandleTypeDef *hqspi, QSPI_CommandTypeDef *cmd, QSPI_MemoryMappedTypeDef *cfg);
/* 非阻塞回调函数 */
void HAL_QSPI_ErrorCallback (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_AbortCpltCallback (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_FifoThresholdCallback(QSPI_HandleTypeDef *hqspi);
/* QSPI 间接模式 */
void HAL_QSPI_CmdCpltCallback (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_RxCpltCallback (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_TxCpltCallback (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_RxHalfCpltCallback (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_TxHalfCpltCallback (QSPI_HandleTypeDef *hqspi);
/* QSPI 状态标志查询模式 */
void HAL_QSPI_StatusMatchCallback (QSPI_HandleTypeDef *hqspi);
/* QSPI 内存映射模式 */
void HAL_QSPI_TimeOutCallback (QSPI_HandleTypeDef *hqspi);
/* 外设控制和状态函数 */
HAL_QSPI_StateTypeDef HAL_QSPI_GetState (QSPI_HandleTypeDef *hqspi);
uint32_t HAL_QSPI_GetError (QSPI_HandleTypeDef *hqspi);
HAL_StatusTypeDef HAL_QSPI_Abort (QSPI_HandleTypeDef *hqspi);
HAL_StatusTypeDef HAL_QSPI_Abort_IT (QSPI_HandleTypeDef *hqspi);
void HAL_QSPI_SetTimeout (QSPI_HandleTypeDef *hqspi, uint32_t Timeout);
HAL_StatusTypeDef HAL_QSPI_SetFifoThreshold(QSPI_HandleTypeDef *hqspi, uint32_t Threshold);
uint32_t
相关文章
- 02-16muduo库学习笔记十三:base库之ThreadLocalSingleton
- 02-16python基础课程_学习笔记15:标准库:有些收藏夹——fileinput
- 02-16python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
- 02-16python基础教程_学习笔记18:标准库:一些最爱——shelve
- 02-16PCL点云库学习笔记(二)——kd-tree和八叉树
- 02-16学习笔记(12):150讲轻松搞定Python网络爬虫-requests库-发送POST请求
- 02-16阿里P7深入Binder原理讲解,书籍+视频+学习笔记+技能提升资源库
- 02-16[XD学习笔记5]:系统及数据库
- 02-16(HAL库学习7)STM32CubeMX HAL库 PWM输出
- 02-16阿里P7级别面试经验总结,书籍+视频+学习笔记+技能提升资源库