Начало работы над прерываниями

This commit is contained in:
alexey
2024-08-14 18:27:50 +03:00
parent 981dbf9bfa
commit fd7d230e10
3 changed files with 598 additions and 42 deletions

View File

@@ -22,20 +22,22 @@
/////////////////////////////////////////////////////////////////////
////////////////////////////---DEFINES---////////////////////////////
/**
* @brief SPI Transmit.
* @param _hmemspi_ - указатель на хендл внешней памяти.
* @param _data_ - указатель на данные для отправки.
* @param _size_ - размер данных для отправки.
* @param _timeout_ - время, за которое должна быть осуществлена отправка.
* @brief SPI Transmit IT.
* @note Здесь вызывается только функция HAL, и ничего больше.
*/
#define MEMSPI_SPI_Transmit(_hmemspi_, _data_, _size_, _timeout_) HAL_SPI_Transmit(&_hmemspi_->sspi.hspi, _data_, _size_, _timeout_)
#define MEMSPI_SPI_Transmit_IT(_hmemspi_, _data_, _size_) HAL_SPI_Transmit_IT(&_hmemspi_->sspi.hspi, _data_, _size_)
/**
* @brief SPI Receive IT.
* @note Здесь вызывается только функция HAL, и ничего больше.
*/
#define MEMSPI_SPI_Receive_IT(_hmemspi_, _data_, _size_) HAL_SPI_Receive_IT(&_hmemspi_->sspi.hspi, _data_, _size_)
/**
* @brief SPI Transmit.
* @note Здесь вызывается только функция HAL, и ничего больше.
*/
#define MEMSPI_SPI_Transmit(_hmemspi_, _data_, _size_, _timeout_) HAL_SPI_Transmit(&_hmemspi_->sspi.hspi, _data_, _size_, _timeout_)
/**
* @brief SPI Receive.
* @param _hmemspi_ - указатель на хендл внешней памяти.
* @param _data_ - указатель на буффер для прниема данных.
* @param _size_ - размер данных для приема.
* @param _timeout_ - время, за которое должен быть осуществлен прием.
* @note Здесь вызывается только функция HAL, и ничего больше.
*/
#define MEMSPI_SPI_Receive(_hmemspi_, _data_, _size_, _timeout_) HAL_SPI_Receive(&_hmemspi_->sspi.hspi, _data_, _size_, _timeout_)
@@ -111,30 +113,58 @@ typedef struct
unsigned fSavePrevoisData:1;
}MEMSPI_WriteInitTypeDef;
typedef struct
typedef enum
{
uint16_t SR;
SPI_HandleTypeDef hspi;
GPIO_TypeDef *CS_GPIOx;
uint32_t CS_PIN;
GPIO_TypeDef *CLK_GPIOx;
uint32_t CLK_PIN;
GPIO_TypeDef *MISO_GPIOx;
uint32_t MISO_PIN;
GPIO_TypeDef *MOSI_GPIOx;
uint32_t MOSI_PIN;
}MEMSPI_GPIOTypeDef;
WAIT_FOR_CMD = 0x00,
WRITE_ENABLE = MEMSPI_WRITE_ENABLE,
WRITE_DISABLE = MEMSPI_WRITE_DISABLE,
WRITE_STATUS_REG = MEMSPI_WRITE_STATUS_REG,
READ_DATA = MEMSPI_READ_DATA,
ERASE_SECTOR = MEMSPI_ERASE_SECTOR,
PAGE_PROGRAM = MEMSPI_PAGE_PROGRAM,
WRITE_EEPROM = MEMSPI_WRITE_EEPROM,
READ_STATUS_REG = MEMSPI_READ_STATUS_REG,
READ_JEDEC_ID = MEMSPI_READ_JEDEC_ID,
READ_UNIQUE_ID = MEMSPI_READ_UNIQUE_ID,
}MEMSPI_CommandsTypeDef;
typedef enum
{
WAIT_FOR_UNBUSY,
READ_MEMORY,
EEPROM_WRITE,
FLASH_PROGRAM,
FLASH_ERASE,
}MEM_OperationsTypeDef;
typedef enum
{
MEM_READY = 0x00,
MEM_SEND_COMMAND = 0x01,
MEM_RECEIVE_DATA = 0x02,
}MEM_StateTypeDef;
typedef struct
{
uint16_t SR;
SPI_SettingsTypeDef sspi;
// MEMSPI_GPIOTypeDef GPIOs;
GPIO_TypeDef *CS_GPIOx;
uint32_t CS_PIN;
uint32_t hNextAddr;
uint16_t hNextPage;
uint16_t hNextSector;
SPI_SettingsTypeDef sspi;
GPIO_TypeDef *CS_GPIOx;
uint32_t CS_PIN;
MEM_OperationsTypeDef Active_OP;
MEMSPI_CommandsTypeDef Active_CMD;
MEM_StateTypeDef MEM_State;
uint8_t *pRxBuffPtr;
uint16_t RxXferSize;
uint32_t hNextAddr;
uint16_t hNextPage;
uint16_t hNextSector;
}MEMSPI_HandleTypeDef;
extern MEMSPI_HandleTypeDef hmemspi;
@@ -148,6 +178,17 @@ extern MEMSPI_HandleTypeDef hmemspi;
*/
void MEMSPI_Base_Init(MEMSPI_HandleTypeDef *hmemspi);
/**
* @brief Read external FLASH/EEPROM with interrupt.
* @param hmemspi - указатель на хендл внешней памяти.
* @param FLASH_Address - адресс откуда начинать считывание.
* @param pBuff - куда записывать данные из FLASH.
* @param Size - сколько байтов считывать.
* @param Timeout - время, за которое должно быть осуществлено чтение.
* @return HAL status.
*/
HAL_StatusTypeDef MEMSPI_Read_Memory_IT(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pBuff, uint16_t Size);
/**
* @brief Read external FLASH.
* @param hmemspi - указатель на хендл внешней памяти.
@@ -285,8 +326,36 @@ HAL_StatusTypeDef MEMSPI_WaitOnFlagsUntilTimeout(MEMSPI_HandleTypeDef *hmemspi,
void MEMSPI_Update_Timeout_Variables(uint32_t *Timeout, uint32_t *tickstart);
////////////////////////---SERVICE FUNCTIONS---//////////////////////
/////////////////////////////////////////////////////////////////////
///////////////////////---HANDLERS FUNCTIONS---//////////////////////
/**
* @brief Handler for SPI FLASH/EEPROM.
* @param hmemspi - указатель на хендл внешней памяти.
* @return HAL status.
* @note Включает в себя проверку на доступность памяти (флаг BUSY)
*/
void MEMSPI_Handler(MEMSPI_HandleTypeDef *hmemspi);
/**
* @brief Handler for transmit SPI command to EEPROM/FLASH.
* @param hmemspi - указатель на хендл внешней памяти.
* @return HAL status.
* @note После отправки комманды - инициализирует прием ответа если надо или завершает команду.
*/
void MEM_SPI_TransmitCommandCplt_Handler(MEMSPI_HandleTypeDef *hmemspi);
/**
* @brief Handler for receive SPI response from EEPROM/FLASH.
* @param hmemspi - указатель на хендл внешней памяти.
* @return HAL status.
* @note Завершает общение с памятью.
*/
void MEM_SPI_OperationCplt_Handler(MEMSPI_HandleTypeDef *hmemspi);
///////////////////////---HANDLERS FUNCTIONS---//////////////////////
/////////////////////////////////////////////////////////////////////
//////////////////////---FUNCTION FOR COMMAND---/////////////////////
////////////////////////////---BLOCKING---///////////////////////////
/**
* @brief Send command to read Status Register.
* @param hmemspi - указатель на хендл внешней памяти.
@@ -383,7 +452,100 @@ uint64_t MEMSPI_CMD_Read_Device_ID(MEMSPI_HandleTypeDef *hmemspi, uint32_t Timeo
* @note Данная функция предполагает отправку одного dummy байта после адресса, но у меня поч не работает пока :(
*/
HAL_StatusTypeDef MEMSPI_CMD_Fast_Read(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pBuff, uint16_t Size, uint32_t Timeout);
////////////////////////////---BLOCKING---///////////////////////////
//////////////////////---FUNCTION FOR COMMAND---/////////////////////
/////////////////////////////////////////////////////////////////////
//////////////////////---FUNCTION FOR COMMAND---/////////////////////
///////////////////////////---INTERRUPT---///////////////////////////
/**
* @brief Send command to read Status Register in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param RequestedBits - какие биты запросить.
* @param Timeout - время, за которое должно быть осуществлено чтение.
* @return Заполняет Status Register в hmemspi.
* @note Всего есть две комманды: на запрос верхнего или нижниго байта.
* Функция в соответствии с RequestedBits определяет какой байт запросить, или два байта сразу.
*/
HAL_StatusTypeDef MEMSPI_CMD_Read_Status_Register_IT(MEMSPI_HandleTypeDef *hmemspi, uint16_t RequestedBits, uint8_t EndCMD);
/**
* @brief Send command to write bits in Status Register in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param WrittenBits - какие биты запросить.
* @param Timeout - время, за которое должна быть осуществлена запись.
* @note Данная команда посылает биты, как сдвинутые на 2 вправо. Т.е. 0-й бит в комманде - 2-й бит BP0.
Но биты указываются в также как они расположены и регистре. Функция сама выполняет сдвиг.
*/
HAL_StatusTypeDef MEMSPI_CMD_Write_Status_Register_IT(MEMSPI_HandleTypeDef *hmemspi, uint16_t WrittenBits);
/**
* @brief Send command to set Write Enable Latch (WEL) in Status Register in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param Timeout - время, за которое должна быть осуществлена запись.
* @note Разрешает запись в FLASH, путем высталения WEL в Status Register
*/
HAL_StatusTypeDef MEMSPI_CMD_Write_Enable_IT(MEMSPI_HandleTypeDef *hmemspi);
/**
* @brief Send command to read data from FLASH/EEPROM in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param FLASH_Address - адресс откуда начинать считывание.
* @param pBuff - куда записывать данные из FLASH.
* @param Size - сколько байтов считывать.
* @param Timeout - время, за которое должно быть осуществлено чтение.
* @return pBuff.
*/
HAL_StatusTypeDef MEMSPI_CMD_Read_Data_IT(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pBuff, uint16_t Size);
/**
* @brief Send command to write eeprom in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param FLASH_Address - адресс куда начинать записывать.
* @param pData - откуда брать данные для записи в FLASH.
* @param Size - сколько байтов записать.
* @param Timeout - время, за которое должна быть осуществлена запись.
* @note Рзамер данных для записи в EEPROM без ограничений.
*/
HAL_StatusTypeDef MEMSPI_CMD_EEPROM_Write_IT(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pData, uint16_t Size);
/**
* @brief Send command to page program in FLASH in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param FLASH_Address - адресс куда начинать записывать.
* @param pData - откуда брать данные для записи в FLASH.
* @param Size - сколько байтов записать.
* @param Timeout - время, за которое должна быть осуществлена запись.
* @note Программирование FLASH только в пределах одной страницы.
* Т.е. если запись с 0x0, то не больше 256 байт. Если с 0ч40, то не больше 192 байт.
*/
HAL_StatusTypeDef MEMSPI_CMD_FLASH_Page_Program_IT(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address, uint8_t *pData, uint16_t Size);
/**
* @brief Send command to erase sector of FLASH in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param FLASH_Address - адресс где надо данные стереть.
* @param Timeout - время, за которое должна быть осуществлена очистка.
* @note Микросхема вроде сама высчитывает какой сектор ерейзнуть, в соответствии с заданным адресом.
*/
HAL_StatusTypeDef MEMSPI_CMD_FLASH_Erase_Sector_IT(MEMSPI_HandleTypeDef *hmemspi, uint32_t FLASH_Address);
/**
* @brief Send command to read JEDEC ID in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param Timeout - время, за которое должно быть осуществлено чтение.
* @return JEDEC ID микросхемы.
*/
HAL_StatusTypeDef MEMSPI_CMD_Read_JEDEC_ID_IT(MEMSPI_HandleTypeDef *hmemspi, uint32_t *JEDEC_ID_var);
/**
* @brief Send command to read JEDEC ID in interrupt mode.
* @param hmemspi - указатель на хендл внешней памяти.
* @param Timeout - время, за которое должно быть осуществлено чтение.
* @return Device ID микросхемы.
*/
HAL_StatusTypeDef MEMSPI_CMD_Read_Device_ID_IT(MEMSPI_HandleTypeDef *hmemspi, uint64_t *Device_ID_var);
///////////////////////////---INTERRUPT---///////////////////////////
//////////////////////---FUNCTION FOR COMMAND---/////////////////////
#endif // __SPI_MEMORY_H_