打印
[综合信息]

HC 32F003 flash 驱动

[复制链接]
926|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoke231|  楼主 | 2020-3-26 19:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Flash 操作控制数据类型重定义
typedef enum en_flash_op
{
    Read        = 0u,           ///<读配置值
    Program     = 1u,           ///<编程配置值
    SectorErase = 2u,           ///<扇区擦除配置值
    ChipErase   = 3u,           ///<全片擦除配置值
} en_flash_op_t;

使用特权

评论回复
沙发
gaoke231|  楼主 | 2020-3-26 19:38 | 只看该作者
加解锁数据类型重定义
typedef enum en_flash_lock
{
    LockAll   = 0x0000u,      ///<全片加锁  
    UnlockAll = 0xFFFFu,      ///<全片解锁
} en_flash_lock_t;

使用特权

评论回复
板凳
gaoke231|  楼主 | 2020-3-26 19:38 | 只看该作者
FLASH编程时间参数配置数据类型重定义
typedef enum en_flash_prgtimer
{
    Tnvs      = 32u,
    Tpgs      = 23u,
    Tprog     = 27u,
    Tserase   = 18000u,
    Tmerase   = 140000u,
    Tprcv     = 24u,
    Tsrcv     = 240u,
    Tmrcv     = 1000u,
} en_flash_prgtimer_t;

使用特权

评论回复
地板
gaoke231|  楼主 | 2020-3-26 19:39 | 只看该作者
Flash中断标志获取
boolean_t Flash_GetIntFlag(en_flash_int_type_t enFlashIntType)
{
    boolean_t bRetVal = FALSE;
   
    switch (enFlashIntType)
    {
        case flash_int0:
            bRetVal = M0P_FLASH->IFR_f.IF0 ? TRUE : FALSE;
            break;
        case flash_int1:
            bRetVal = M0P_FLASH->IFR_f.IF1 ? TRUE : FALSE;
            break;
        default:
            bRetVal = FALSE;
            break;
    }
   
    return bRetVal;
}

使用特权

评论回复
5
gaoke231|  楼主 | 2020-3-26 19:40 | 只看该作者
Flash中断标志清除
en_result_t Flash_ClearIntFlag(en_flash_int_type_t enFlashIntType)
{
    en_result_t enResult = Error;

    switch (enFlashIntType)
    {
        case flash_int0:
            FLASH_BYPASS();
            M0P_FLASH->ICLR_f.ICLR0 = FALSE;
            enResult = Ok;
            break;
        case flash_int1:
            FLASH_BYPASS();
            M0P_FLASH->ICLR_f.ICLR1 = FALSE;
            enResult = Ok;
            break;
        default:
            enResult = Error;
            break;
    }

    return enResult;
}

使用特权

评论回复
6
gaoke231|  楼主 | 2020-3-26 19:46 | 只看该作者
Flash中断服务函数
void EfRam_IRQHandler(uint8_t u8Param)
{   
    pfnFlashCallback();
}

使用特权

评论回复
7
gaoke231|  楼主 | 2020-3-26 19:48 | 只看该作者
Flash中断使能
en_result_t Flash_EnableIrq (en_flash_int_type_t enFlashIntType)
{
    en_result_t enResult = Error;

    switch (enFlashIntType)
    {
        case flash_int0:
            FLASH_BYPASS();
            M0P_FLASH->CR_f.IE |= 0x01;
            enResult = Ok;
            break;
        case flash_int1:
            FLASH_BYPASS();
            M0P_FLASH->CR_f.IE |= 0x02;
            enResult = Ok;
            break;
        default:
            enResult = Error;
            break;
    }

    return enResult;
}

使用特权

评论回复
8
gaoke231|  楼主 | 2020-3-26 19:49 | 只看该作者
Flash中断禁止
en_result_t Flash_DisableIrq(en_flash_int_type_t enFlashIntType)
{
    en_result_t enResult = Error;

    switch (enFlashIntType)
    {
        case flash_int0:
            FLASH_BYPASS();
            M0P_FLASH->CR_f.IE &= ~0x02u;
            enResult = Ok;
            break;
        case flash_int1:
            FLASH_BYPASS();
            M0P_FLASH->CR_f.IE &= ~0x01u;
            enResult = Ok;
            break;
        default:
            enResult = Error;
            break;
    }

    return enResult;
}

使用特权

评论回复
9
gaoke231|  楼主 | 2020-3-26 20:08 | 只看该作者
FLASH 中断服务程序及编程时间配置
en_result_t Flash_Init(func_ptr_t pfnFlashCb, uint8_t u8FreqCfg)
{
    en_result_t             enResult = Ok;
   
    if (u8FreqCfg > 3)
    {
        enResult = ErrorInvalidParameter;
        return (enResult);
    }

    //flash时间参数寄存器配置
    FLASH_BYPASS();
    M0P_FLASH->TNVS_f.TNVS       = Tnvs    << u8FreqCfg;
    FLASH_BYPASS();
    M0P_FLASH->TPGS_f.TPGS       = Tpgs    << u8FreqCfg;
    FLASH_BYPASS();
    M0P_FLASH->TPROG_f.TPROG     = Tprog   << u8FreqCfg;
    FLASH_BYPASS();
    M0P_FLASH->TSERASE_f.TSERASE = Tserase << u8FreqCfg;
    FLASH_BYPASS();
    M0P_FLASH->TMERASE_f.TMERASE = Tmerase << u8FreqCfg;
    FLASH_BYPASS();
    M0P_FLASH->TPRCV_f.TPRCV     = Tprcv   << u8FreqCfg;
    FLASH_BYPASS();
    M0P_FLASH->TSRCV_f.TSRCV     = Tsrcv   << u8FreqCfg;
    FLASH_BYPASS();
    M0P_FLASH->TMRCV_f.TMRCV     = Tmrcv   << u8FreqCfg;
   
    //开启读FLASH等待周期
    if (3 == u8FreqCfg)
    {
        FLASH_BYPASS();
        M0P_FLASH->CR_f.WAIT = TRUE;
    }
    else
    {
        FLASH_BYPASS();   
        M0P_FLASH->CR_f.WAIT = FALSE;
    }
      
    pfnFlashCallback = pfnFlashCb;
   
    return (enResult);
}

使用特权

评论回复
10
gaoke231|  楼主 | 2020-3-26 20:54 | 只看该作者
FLASH 字节写
en_result_t Flash_WriteByte(uint32_t u32Addr, uint8_t u8Data)
{
    en_result_t             enResult = Ok;   
   
    if (FLASH_END_ADDR < u32Addr)
    {
        enResult = ErrorInvalidParameter;
        return (enResult);
    }
   
    //unlock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = UnlockAll;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //set OP
    FLASH_BYPASS();
    M0P_FLASH->CR_f.OP = Program;
   
    //write data
    *((volatile uint8_t*)u32Addr) = u8Data;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //lock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = LockAll;
   
    return (enResult);
}

使用特权

评论回复
11
gaoke231|  楼主 | 2020-3-26 20:57 | 只看该作者
用于向FLASH写入半字(2字节)数据.
en_result_t Flash_WriteHalfWord(uint32_t u32Addr, uint16_t u16Data)
{
    en_result_t             enResult = Ok;   
   
    if ((FLASH_END_ADDR < u32Addr) || (u32Addr % 2))
    {
        enResult = ErrorInvalidParameter;
        return (enResult);
    }
   
    //unlock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = UnlockAll;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //set OP
    FLASH_BYPASS();
    M0P_FLASH->CR_f.OP = Program;
   
    //write data
    *((volatile uint16_t*)u32Addr) = u16Data;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //lock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = LockAll;
   
    return (enResult);
}

使用特权

评论回复
12
gaoke231|  楼主 | 2020-3-26 20:58 | 只看该作者
用于向FLASH写入1个字的数据
en_result_t Flash_WriteWord(uint32_t u32Addr, uint32_t u32Data)
{
    en_result_t             enResult = Ok;   
   
    if ((FLASH_END_ADDR < u32Addr) || (u32Addr % 4))
    {
        enResult = ErrorInvalidParameter;
        return (enResult);
    }
   
    //unlock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = UnlockAll;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //set OP
    FLASH_BYPASS();
    M0P_FLASH->CR_f.OP = Program;
   
    //write data
    *((volatile uint32_t*)u32Addr) = u32Data;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //lock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = LockAll;
   
    return (enResult);
}

使用特权

评论回复
13
gaoke231|  楼主 | 2020-3-26 20:58 | 只看该作者
FLASH 扇区擦除
en_result_t Flash_SectorErase(uint32_t u32SectorAddr)
{

    en_result_t             enResult = Ok;   
   
    if (FLASH_END_ADDR < u32SectorAddr)
    {
        enResult = ErrorInvalidParameter;
        return (enResult);
    }
   
    //unlock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = UnlockAll;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //set OP
    FLASH_BYPASS();
    M0P_FLASH->CR_f.OP = SectorErase;
   
    //write data
    *((volatile uint8_t*)u32SectorAddr) = 0;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //lock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = LockAll;
   
    return (enResult);
}

使用特权

评论回复
14
gaoke231|  楼主 | 2020-3-26 20:59 | 只看该作者
FLASH 全片擦除
en_result_t Flash_ChipErase(void)
{

    en_result_t             enResult = Ok;   
   
    //unlock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = UnlockAll;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //set OP
    FLASH_BYPASS();
    M0P_FLASH->CR_f.OP = ChipErase;
   
    //write data
    *((volatile uint8_t*)0) = 0;
   
    //busy?
    while (TRUE == M0P_FLASH->CR_f.BUSY)
    {
        ;
    }
   
    //lock flash
    FLASH_BYPASS();
    M0P_FLASH->SLOCK_f.SLOCK = LockAll;
   
    return (enResult);
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

1310

帖子

5

粉丝