SN32: update flash driver for 240b (#8)

* sn32 hal: update flash from latest CMSIS

* sn32: build flash

* sn32: fix compilation

* sn32 flash: add half word flashing

* sn32 flash: adaptation time
This commit is contained in:
dexter93 2021-09-04 22:46:33 +03:00 committed by Dimitris Mantzouranis
parent 34f2c22327
commit 36d503985f
4 changed files with 190 additions and 134 deletions

View File

@ -1,90 +1,137 @@
/******************** (C) COPYRIGHT 2013 SONiX ******************************* /******************** (C) COPYRIGHT 2017 SONiX *******************************
* COMPANY: SONiX * COMPANY: SONiX
* DATE: 2013/12 * DATE: 2017/07
* AUTHOR: SA1 * AUTHOR: SA1
* IC: SN32F240/230/220 * IC: SN32F240B
* DESCRIPTION: Flash related functions. * DESCRIPTION: Flash related functions.
*____________________________________________________________________________ *____________________________________________________________________________
* REVISION Date User Description * REVISION Date User Description
* 1.0 2013/12/17 SA1 First release * 1.0 2017/07/07 SA1 First release
* *
*____________________________________________________________________________ *____________________________________________________________________________
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS TIME TO MARKET. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS TIME TO MARKET.
* SONiX SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL * SONiX SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL
* DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF SUCH SOFTWARE * DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF SUCH SOFTWARE
* AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN * AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN
* IN CONNECTION WITH THEIR PRODUCTS. * IN CONNECTION WITH THEIR PRODUCTS.
*****************************************************************************/ *****************************************************************************/
/*_____ I N C L U D E S ____________________________________________________*/ /*_____ I N C L U D E S ____________________________________________________*/
#include "Flash.h" #include "Flash.h"
/*_____ D E C L A R A T I O N S ____________________________________________*/ /*_____ D E C L A R A T I O N S ____________________________________________*/
uint32_t wFLASH_PGRAM[2]; uint32_t wFLASH_PGRAM[2];
/*_____ D E F I N I T I O N S ______________________________________________*/ /*_____ D E F I N I T I O N S ______________________________________________*/
/*_____ M A C R O S ________________________________________________________*/ /*_____ M A C R O S ________________________________________________________*/
/*_____ F U N C T I O N S __________________________________________________*/ /*_____ F U N C T I O N S __________________________________________________*/
/*****************************************************************************
/***************************************************************************** * Function : FLASH_EraseSector
* Function : FLASH_EraseSector * Description : Erase assigned sector address in Flash ROM
* Description : Erase assigned sector address in Flash ROM * Input : adr - Sector start address
* Input : adr - Sector start address * Output : None
* Output : None * Return : None
* Return : None * Note : None
* Note : None *****************************************************************************/
*****************************************************************************/ FLASH_Status FLASH_EraseSector (uint32_t adr)
void FLASH_EraseSector (uint32_t adr) {
{ SN_FLASH->CTRL = FLASH_PER; // Page Erase Enabled
SN_FLASH->CTRL = FLASH_PER; // Page Erase Enabled SN_FLASH->ADDR = adr; // Page Address
SN_FLASH->ADDR = adr; // Page Address
SN_FLASH->CTRL |= FLASH_STARTE; // Start Erase FLASH_WAIT_FOR_DONE
while ((SN_FLASH->STATUS & FLASH_BUSY) == FLASH_BUSY); SN_FLASH->CTRL |= FLASH_START; // Start Erase
}
FLASH_WAIT_FOR_DONE
/***************************************************************************** return (FLASH_OKAY);
* Function : Flash_ProgramPage }
* Description : Program assigned page in Flash ROM
* Input : adr - Page start address (word-alignment) of Flash
* sz - Content size to be programmed (Bytes) /*****************************************************************************
* pBuf - pointer to the Source data * Function : Flash_ProgramPage
* Output : None * Description : Program assigned page in Flash ROM
* Return : OK or FAIL * Input : adr - Page start address (word-alignment) of Flash
* Note : None * sz - Content size to be programmed (Bytes)
*****************************************************************************/ * Data - the Source data
uint32_t FLASH_ProgramPage (uint32_t adr, uint32_t sz, uint8_t *pBuf) * Output : None
{ * Return : FLASH_OKAY or FLASH_FAIL
while (sz){ * Note : None
*****************************************************************************/
SN_FLASH->CTRL = FLASH_PG; // Programming Enabled FLASH_Status FLASH_ProgramPage (uint32_t adr, uint32_t sz, uint16_t Data)
SN_FLASH->ADDR = adr; {
SN_FLASH->DATA = *((uint32_t *)pBuf); SN_FLASH->CTRL = FLASH_PG; // Programming Enabled
SN_FLASH->ADDR = adr;
__nop();__nop();__nop();__nop();__nop();__nop(); //Must add to avoid Hard Fault!!!!!!
FLASH_WAIT_FOR_DONE
while ((SN_FLASH->STATUS & FLASH_BUSY) == FLASH_BUSY);
*(uint32_t*)adr = Data;
// Check for Errors
if ((SN_FLASH->STATUS & FLASH_PGERR) == FLASH_PGERR) { while (sz){
SN_FLASH->STATUS &= ~FLASH_PGERR;
return (FAIL); SN_FLASH->DATA = *((uint32_t *)adr);
}
FLASH_WAIT_FOR_DONE
// Go to next Word
adr += 4; // Go to next Word
pBuf += 4; adr += 4;
sz -= 4; sz -= 4;
} }
return (OK); // Check for Errors
} if ((SN_FLASH->STATUS & FLASH_ERR) == FLASH_ERR) {
SN_FLASH->STATUS = 0;
return (FLASH_FAIL);
}
SN_FLASH->CTRL |= FLASH_START; // Start Program
FLASH_WAIT_FOR_DONE
// Check for Errors
if ((SN_FLASH->STATUS & FLASH_ERR) == FLASH_ERR) {
SN_FLASH->STATUS = 0;
return (FLASH_FAIL);
}
return (FLASH_OKAY);
}
/*****************************************************************************
* Function : FLASH_ProgramHalfWord
* Description : Program a half word at a specified address
* Input : adr - Page start address (word-alignment) of Flash
* Data - the Source data
* Output : None
* Return : FLASH_OKAY or FLASH_ERR
* Note : None
*****************************************************************************/
FLASH_Status FLASH_ProgramHalfWord(uint32_t adr, uint16_t Data) {
FLASH_Status status = FLASH_ProgramPage(adr, 2, Data);
return status;
}
/*****************************************************************************
* Function : FLASH_Checksum
* Description : Calculate Checksum in Flash ROM
* Input : None
* Output : Checksum of User ROM
* Return : None
* Note : None
*****************************************************************************/
uint16_t FLASH_Checksum (void)
{
SN_FLASH->CTRL = FLASH_CHK;
FLASH_WAIT_FOR_DONE
return (uint16_t) (SN_FLASH->CHKSUM);
}

View File

@ -1,44 +1,49 @@
#ifndef __SN32F240_FLASH_H #ifndef __SN32F240B_FLASH_H
#define __SN32F240_FLASH_H #define __SN32F240B_FLASH_H
/*_____ I N C L U D E S ____________________________________________________*/ /*_____ I N C L U D E S ____________________________________________________*/
#include "SN32F240.h" #include <SN32F240B.h>
#include "SN32F200_Def.h" #include <SN32F200_Def.h>
/*_____ D E F I N I T I O N S ______________________________________________*/ /*_____ D E F I N I T I O N S ______________________________________________*/
//FLASH HW //FLASH HW
#define FLASH_PAGE_SIZE 1024 #define FLASH_PAGE_SIZE 64
#define FLASH_F240_MAX_ROM_SIZE 0xFFFF #define FLASH_F240B_MAX_ROM_SIZE 0xFFFF
#define FLASH_F230_MAX_ROM_SIZE 0x7FFF
#define FLASH_F220_MAX_ROM_SIZE 0x3FFF
// Flash Control Register definitions
#define FLASH_PG 0x00000001
// Flash Control Register definitions #define FLASH_PER 0x00000002
#define FLASH_PG 0x00000001 #define FLASH_MER 0x00000004
#define FLASH_PER 0x00000002 #define FLASH_START 0x00000040
#define FLASH_STARTE 0x00000040 #define FLASH_CHK 0x00000080
// Flash Status Register definitions // Flash Status Register definitions
#define FLASH_BUSY 0x00000001 #define FLASH_BUSY 0x00000001
#define FLASH_PGERR 0x00000004 #define FLASH_ERR 0x00000004
#define FLASH_WAIT_FOR_DONE while (SN_FLASH->STATUS & FLASH_BUSY) {__asm__("NOP");}
/*_____ M A C R O S ________________________________________________________*/
//Flash Low Power Mode /*_____ M A C R O S ________________________________________________________*/
#define __FLASH_LPM_DISABLE SN_FLASH->LPCTRL = 0x5AFA0000
#define __FLASH_LPM_SLOW_MODE SN_FLASH->LPCTRL = 0x5AFA0002 //Flash Low Power Mode
#define __FLASH_LPM_DISABLE SN_FLASH->LPCTRL = 0x5AFA0000; //HCLK<=12MHz
//Flash Status #define __FLASH_LPM_MEDIUM_MODE SN_FLASH->LPCTRL = 0x5AFA0003; //12MHz<HCLK<=24MHz
#define __FLASH_CLEAR_ERROR_STATUS SN_FLASH->STATUS &= ~FLASH_PGERR #define __FLASH_LPM_FAST_MODE SN_FLASH->LPCTRL = 0x5AFA0004;SN_FLASH->LPCTRL = 0x5AFA0005;SN_FLASH->LPCTRL = 0x5AFA000D; //HCLK>24MHz
//Flash Status
/*_____ D E C L A R A T I O N S ____________________________________________*/ #define __FLASH_CLEAR_ERROR_STATUS SN_FLASH->STATUS &= ~FLASH_PGERR
extern uint32_t wFLASH_PGRAM[2];
/*_____ D E C L A R A T I O N S ____________________________________________*/
void FLASH_EraseSector (uint32_t); extern uint32_t wFLASH_PGRAM[2];
uint32_t FLASH_ProgramPage (uint32_t, uint32_t, uint8_t *); typedef enum { FLASH_FAIL, FLASH_OKAY} FLASH_Status;
void FLASH_MassErase (void);
#endif /* __SN32F240_FLASH_H */ FLASH_Status FLASH_EraseSector (uint32_t);
FLASH_Status FLASH_ProgramPage (uint32_t, uint32_t, uint16_t);
FLASH_Status FLASH_ProgramHalfWord(uint32_t, uint16_t);
uint16_t FLASH_Checksum(void);
#endif /* __SN32F240B_FLASH_H */

View File

@ -0,0 +1,3 @@
PLATFORMSRC += $(CHIBIOS_CONTRIB)/os/hal/ports/SN32/LLD/SN32F24xB/FLASH/Flash.c
PLATFORMINC += $(CHIBIOS_CONTRIB)/os/hal/ports/SN32/LLD/SN32F24xB/FLASH

View File

@ -27,6 +27,7 @@ endif
include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/GPIO/driver.mk include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/GPIO/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/USB/driver.mk include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/USB/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/CT/driver.mk include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/CT/driver.mk
include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/FLASH/driver.mk
# include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/TIM/driver.mk # include ${CHIBIOS_CONTRIB}/os/hal/ports/SN32/LLD/SN32F24xB/TIM/driver.mk