打印
[技术问答]

HC32L072的FLASH读写问题

[复制链接]
939|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
/******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file main.c
**
** A detailed description is available at
** @link Sample Group Some description @endlink
**
**   - 2018-05-08  1.0  Lux First version for Device Driver Library of Module.
**
******************************************************************************/

/******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
#include "flash.h"
#include "gpio.h"

/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
//#define RUN_IN_RAM 1    //need to cfg *.icf

/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/

/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/

/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/

/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/

/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
#define FLASH_END_ADDR  (0x0001FFFFu)

#define CHECK_ADDRESS                0x0001E000
#define STOP_ADDRESS                0x0001E200                        //休止时间
#define RUN_ADDRESS                        0x0001E400                        //工作时间
#define ALM_STATUS_ADDR        0x0001E600                        //报警状态
#define LOCK_ADDR                                0x0001E800                        //
#define WORK_CONT_ADDR        0x0001EA00                        //工作次数   

#define RUN_STOP_ADDR                0x0001EC00                        //工作状态标志
#define WORK_ADDRESS                0x0001EE00                        //工作等待时间


struct TIME
{
        unsigned int Second;               
        unsigned int Minute;               
        unsigned int Hour;       
       
};

struct TIME StopTime;
struct TIME WorkTime;

unsigned int checksum;
unsigned int RUN_STOP_T;
unsigned int WorkTimeCnt;                //工作次数计数
unsigned int RunTime;                        //设定工作时间
unsigned int LockFlag;
unsigned int ErrorFlag=0;


/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
void LedBK_GPIO_init(void)
{
                stc_gpio_cfg_t stcGpioCfg;

    ///< 打开GPIO外设时钟门控
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);

    ///< 端口方向配置->输出(其它参数与以上(输入)配置参数一致)
    stcGpioCfg.enDir = GpioDirOut;
                //驱动能力->高驱动能力
                stcGpioCfg.enDrv = GpioDrvH;
    ///< 端口上下拉配置->下拉
    stcGpioCfg.enPu = GpioPuDisable;
                stcGpioCfg.enPd = GpioPdEnable;
                //开漏输出配置->开漏输出关闭
          stcGpioCfg.enOD = GpioOdDisable;
    stcGpioCfg.enCtrlMode = GpioAHB;     //总线控制模式配置->AHB
    ///< LED背光关闭
    Gpio_ClrIO(GpioPortA, GpioPin15);

    ///< GPIO IO LED背光端口初始化
    Gpio_Init(GpioPortA, GpioPin15, &stcGpioCfg);
}
void ReadPara(unsigned int Addr,unsigned int *pdata,unsigned char len)
{
        unsigned char i;
       

        *pdata=(*(( uint32_t*)Addr));
        for(i=1;i<=(len/4)-1;i++){
                pdata+=4;
                *pdata =(*(( uint32_t*)(Addr+i*4)));
        }

}

void WritePara(unsigned int Addr,unsigned int *pdata,unsigned char len)
{
        unsigned char i;
        ///< FLASH目标扇区擦除          
        while(Ok != Flash_SectorErase(Addr))
        {
                        ;
        }
        Flash_WriteWord        (Addr, *pdata);
        for(i=1;i<=(len/4)-1;i++){
                pdata+=4;
                Flash_WriteWord        (Addr+i*4, *pdata);
        }

}



/**
******************************************************************************
** \brief  Main function of project
**
** \return uint32_t return value, if needed
**
** This sample
**
******************************************************************************/

int32_t main(void)
{

       
        LedBK_GPIO_init();
        ///< 确保初始化正确执行后方能进行FLASH编程操作,FLASH初始化(编程时间,休眠模式配置)
        while(Ok != Flash_Init(1, TRUE))
        {
                        ;
        }

        ReadPara(CHECK_ADDRESS,(unsigned int*)(&checksum),sizeof(checksum));               
       
        if(checksum != 0x55BB){
                checksum = 0x55BB;
                StopTime.Hour = 12;
                StopTime.Minute =3;
                StopTime.Second =4;
                WorkTime = StopTime;
                RUN_STOP_T =5;
                WorkTimeCnt =6;
                RunTime =1234;
                LockFlag =8;               
                ErrorFlag=9;
               
                Gpio_SetIO(GpioPortA, GpioPin15);
                delay1ms(200);
                Gpio_ClrIO(GpioPortA, GpioPin15);       
                delay1ms(200);       
                WritePara(CHECK_ADDRESS,(unsigned int*)(&checksum),sizeof(checksum));
                WritePara(LOCK_ADDR,(unsigned int*)(&RunTime),sizeof(RunTime));
                WritePara(STOP_ADDRESS,(unsigned int*)(&StopTime),sizeof(StopTime));       
                WritePara(WORK_ADDRESS,(unsigned int*)(&WorkTime),sizeof(WorkTime));
                WritePara(RUN_STOP_ADDR,(unsigned int*)(&RUN_STOP_T),sizeof(RUN_STOP_T));       
                WritePara(ALM_STATUS_ADDR,(unsigned int*)(&ErrorFlag),sizeof(ErrorFlag));
                WritePara(RUN_ADDRESS,(unsigned int*)(&LockFlag),sizeof(LockFlag));
                WritePara(WORK_CONT_ADDR,(unsigned int*)(&WorkTimeCnt),sizeof(WorkTimeCnt));       
               
        }
        else{
                ReadPara(LOCK_ADDR,(unsigned int*)(&RunTime),sizeof(RunTime));
                ReadPara(RUN_STOP_ADDR,(unsigned int*)(&RUN_STOP_T),sizeof(RUN_STOP_T));
                ReadPara(STOP_ADDRESS,(unsigned int*)(&StopTime),sizeof(StopTime));
                ReadPara(WORK_ADDRESS,(unsigned int*)(&WorkTime),sizeof(WorkTime));
                ReadPara(WORK_CONT_ADDR,(unsigned int*)(&WorkTimeCnt),sizeof(WorkTimeCnt));                               
                ReadPara(ALM_STATUS_ADDR,(unsigned int*)(&ErrorFlag),sizeof(ErrorFlag));
                ReadPara(RUN_ADDRESS,(unsigned int*)(&LockFlag),sizeof(LockFlag));
               
        }

       
        if( StopTime.Hour == 12)  ///< 如果写入的数据对
        {
                Gpio_ClrIO(GpioPortA, GpioPin15);
                delay1ms(1000);
                Gpio_SetIO(GpioPortA, GpioPin15);
                delay1ms(1000);
                Gpio_ClrIO(GpioPortA, GpioPin15);
        }       
        if( StopTime.Minute == 3)  ///< 如果写入的数据对
        {
                Gpio_ClrIO(GpioPortA, GpioPin15);
                delay1ms(200);
                Gpio_SetIO(GpioPortA, GpioPin15);
                delay1ms(200);
                Gpio_ClrIO(GpioPortA, GpioPin15);
        }       
        if( StopTime.Second == 4)  ///< 如果写入的数据对
        {
                Gpio_ClrIO(GpioPortA, GpioPin15);
                delay1ms(1000);
                Gpio_SetIO(GpioPortA, GpioPin15);
                delay1ms(1000);
                Gpio_ClrIO(GpioPortA, GpioPin15);
        }       
        if( ErrorFlag == 9)  ///< 如果写入的数据对
        {
                Gpio_ClrIO(GpioPortA, GpioPin15);
                delay1ms(200);
                Gpio_SetIO(GpioPortA, GpioPin15);
                delay1ms(200);
                Gpio_ClrIO(GpioPortA, GpioPin15);
        }       
//                ///< FLASH 字节写、校验
//                WritePara(u32Addr, (unsigned int *)(&u32TestData),sizeof(u32TestData));
//                delay1ms(100);
//                ReadPara(u32Addr,(unsigned int *)(&u32TestDataRead),sizeof(u32TestDataRead));
//                delay1ms(100);
//                       
//                if( u32TestDataRead == u32TestData)  ///< 如果写入的数据对
//                {
//                        Gpio_ClrIO(GpioPortA, GpioPin15);
//                        delay1ms(1000);
//                        Gpio_SetIO(GpioPortA, GpioPin15);
//                        delay1ms(1000);
//                        Gpio_ClrIO(GpioPortA, GpioPin15);
//                }
//                       
//                if( u8TestDataRead == u8TestData)  ///< 如果写入的数据对
//                {
//                        Gpio_ClrIO(GpioPortA, GpioPin15);
//                        delay1ms(1000);
//                        Gpio_SetIO(GpioPortA, GpioPin15);
//                        delay1ms(1000);
//                        Gpio_ClrIO(GpioPortA, GpioPin15);
//                }

    while (1);
}

/******************************************************************************
* EOF (not truncated)
******************************************************************************/


使用特权

评论回复
沙发
酱油、有点甜|  楼主 | 2022-4-13 09:25 | 只看该作者
现在遇到我由于没有仿真器 是电量1个LED进行验证测试,,好像checksum这个int型式读到的包括ErrorFlag == 9也能判断进去,,结构体好像有点问题,只能读到1个数据,,有华大的高手能帮我看一下代码么,感谢!大家一起顺便讨论交流一下flash的读写

使用特权

评论回复
板凳
酱油、有点甜|  楼主 | 2022-4-13 16:49 | 只看该作者
已解决 结贴

使用特权

评论回复
评论
酱油、有点甜 2022-4-13 16:50 回复TA
void ReadPara(unsigned int Addr,unsigned int *pdata,unsigned char len) { unsigned char i; *pdata=(*(( uint32_t*)Addr)); for(i=1;i<=(len/4)-1;i++){ pdata++; Addr=Addr+i*4; *pdata =(*(( uint32_t*)Addr)); } } void WritePara(unsigned int Addr,unsigned int *pdata,unsigned char len) { unsigned char i; ///< FLASH目标扇区擦除 while(Ok != Flash_SectorErase(Addr)) { ; } Flash_WriteWord (Addr, *pdata); for(i=1;i<=(len/4)-1;i++){ pdata++; Addr=Addr+i*4; Flash_Write...  
地板
酱油、有点甜|  楼主 | 2022-4-13 16:51 | 只看该作者
void ReadPara(unsigned int Addr,unsigned int *pdata,unsigned char len)
{
        unsigned char i;
       

        *pdata=(*(( uint32_t*)Addr));
        for(i=1;i<=(len/4)-1;i++){
                pdata++;
                Addr=Addr+i*4;
                *pdata =(*(( uint32_t*)Addr));
        }

}

void WritePara(unsigned int Addr,unsigned int *pdata,unsigned char len)
{
        unsigned char i;
        ///< FLASH目标扇区擦除          
        while(Ok != Flash_SectorErase(Addr))
        {
                        ;
        }
        Flash_WriteWord        (Addr, *pdata);
        for(i=1;i<=(len/4)-1;i++){
                pdata++;
                Addr=Addr+i*4;
                Flash_WriteWord        (Addr, *pdata);
        }

}

使用特权

评论回复
5
binoo7| | 2022-4-14 08:22 | 只看该作者
问了个寂寞

使用特权

评论回复
6
huquanz711| | 2022-4-14 08:38 | 只看该作者
想表达个啥?

使用特权

评论回复
7
酱油、有点甜|  楼主 | 2022-4-15 08:07 | 只看该作者

读写函数的问题

使用特权

评论回复
8
酱油、有点甜|  楼主 | 2022-4-15 08:10 | 只看该作者

读写函数的问题

使用特权

评论回复
9
foxsbig| | 2022-5-3 08:41 | 只看该作者
一般读写时序弄好了,就一劳永逸了

使用特权

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

本版积分规则

3

主题

117

帖子

1

粉丝