⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flashdriver.c

📁 Freescale的HCS12处理器上面的flash驱动。支持块擦除、扇区存储、单字读取、单字烧写等操作。在CodeWarrior中开发。
💻 C
📖 第 1 页 / 共 2 页
字号:
        // read the 16bit word and change it
        data16 = *(volatile INT16U *)addrEnd ;
        // note that HCS12 is big endian!
        data16 = (data16 & 0x00ff) | (pbuf[0] << 8) ;  // keep the higher addr part, and combine the last input byte  
        // write the last 1 byte
        if (flash_write_word(page, addrStart, data16) != E_FLASH_OK)
            return E_FLASH_FAIL ;
  
    }
    

    // congratulations, write ok
    return E_FLASH_OK ;
    
}


void test1(void)
{
    
    INT8U i, byte ;
    INT8U testlen = 36 ;
    INT8U testbuf[50] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
    INT16U addr = test_addr_start ;
    INT16U data16 ;
    INT8U page = 0x3b ;
    
    flash_init() ;

//    OSEKPrintString("\ngonna earase and verify\n") ;
//    if (flash_erase_verify_block(page, addr) != E_FLASH_OK) OSEKPrintString("erase failed!!\n") ;
    
    OSEKPrintString("before write :\r\n") ;
    for (i=0; i<testlen; i++)
    {
        data16 = flash_read_word(page, addr+i) ;
        
        OSEKPrintInt((INT32U)(data16 & 0xff00)>>8) ;
        //testbuf[i] = data16 + 1 ;
        //OSEKPrintInt(testbuf[i] - 1) ;
        OSEKPrintChar(' ') ;
    
    }
    
    
    OSEKPrintString("\ngonna earase and verify\n") ;
    if (flash_erase_sector(page, addr) != E_FLASH_OK) OSEKPrintString("erase failed!!\n") ;

    OSEKPrintString("\nnow gonna write\n") ;
    if (flash_write(page, addr, testbuf, testlen) != E_FLASH_OK) OSEKPrintString("write failed!!\n") ;
    OSEKPrintString("after write :\r\n") ;
    for (i=0; i<testlen; i++)
    {
        data16 = flash_read_word(page, addr+i) ;
        OSEKPrintInt((INT32U)(data16 & 0xff00)>>8) ;
        //testbuf[i] = data16 ;
        //OSEKPrintInt(testbuf[i]) ;
        OSEKPrintChar(' ') ;
    
    }

  
}

void test2(void)
{				   // clear all available pages, and write all 
				   // seems mass_erase not so successful!!
    
    INT16U i, byte ;
    INT16U testlen = 512 ;
    INT8U testbuf[512] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
    INT16U addr = test_addr_start ;
    INT16U tempaddr = addr ;
    INT16U data16 ;
    INT8U page = 0x3b ;
    
    flash_init() ;

    // generate testdata
    for (i=0;i<512; i++)
        testbuf[i] = 512-i ;
    
    
    OSEKPrintString("\ngonna earase and verify block1 to block3\n") ;
    
    for (i=1; i<4; i++) 
    {
        
        if (flash_mass_erase(i) != E_FLASH_OK) 
            OSEKPrintString("erase failed!!\n") ;
        else
            OSEKPrintString("erase ok\r\n") ;
        if (flash_erase_verify_block(i) != E_FLASH_OK)
                OSEKPrintString("erase verify failed!\n") ;
        else
                OSEKPrintString("verify block OK\n") ;
    }
    

    OSEKPrintString("\nnow gonna write\n") ;
    
    for (i = FLASH_PAGE_START; i<=FLASH_PAGE_END; i++)
    {
        flash_delay_bus_cycle(5000) ;
        tempaddr = addr ;
        
        while(tempaddr < FLASH_ADDR_END) 
        {
            OSEKPrintString("page = ") ;OSEKPrintInt(i) ;
            OSEKPrintString("write addr = ") ;OSEKPrintInt(tempaddr) ;
            
            
            if (flash_write(i, tempaddr, testbuf, testlen) != E_FLASH_OK) 
                OSEKPrintString("write failed!!\n") ;
            else
                OSEKPrintString("page written\r\n") ;
            tempaddr += testlen ;
        }
            
    }
        
    OSEKPrintString("after write :\r\n") ;
    OSEKPrintString("test2 finished\r\n") ;

  
}

void test3(void)
{				   // do not clear pages, and just write to see if write succeed without erase
    				// write failed! need to erase sectors before program
    				
    INT16U i, byte ;
    INT16U testlen = 512 ;
    INT8U testbuf[512] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
    INT16U addr = test_addr_start ;
    INT16U tempaddr = addr ;
    INT16U data16 ;
    INT8U page = 0x3b ;
    
    flash_init() ;

    // generate testdata
    for (i=0;i<512; i++)
        testbuf[i] = i ;
    
    
    OSEKPrintString("\ndo not earase or verify\n") ;
    
    OSEKPrintString("\nnow gonna write\n") ;
    
    for (i = FLASH_PAGE_START; i<=FLASH_PAGE_END; i++)
    {
        flash_delay_bus_cycle(5000) ;
        tempaddr = addr ;
        
        while(tempaddr < FLASH_ADDR_END) 
        {
            OSEKPrintString("page = ") ;OSEKPrintInt(i) ;
            OSEKPrintString("write addr = ") ;OSEKPrintInt(tempaddr) ;
            
            if (flash_write(i, tempaddr, testbuf, testlen) != E_FLASH_OK) 
                OSEKPrintString("write failed!!\n") ;
            else
                OSEKPrintString("page written\r\n") ;
            tempaddr += testlen ;
        }
            
    }
        
    OSEKPrintString("after write :\r\n") ;
    OSEKPrintString("test3 finished\r\n") ;

  
}

void test4(void)
{				   // erase sector and write sector to see if erase sector and write is Ok
                    // this way goes well, so use this one
    				
    INT16U i, byte ;
    INT16U testlen = 512 ;
    INT8U testbuf[512] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
    INT16U addr = test_addr_start ;
    INT16U tempaddr = addr ;
    INT16U data16 ;
    INT8U page = 0x3b ;
    
    flash_init() ;

    // generate testdata
    for (i=0;i<512; i++)
        testbuf[i] = i*2 + 1 ;
    
    
    OSEKPrintString("\ntest 4: erase sector first, then write sector\n") ;
    
    
    for (i = FLASH_PAGE_START; i<=FLASH_PAGE_END; i++)
    {
        tempaddr = addr ;
        
        while(tempaddr < FLASH_ADDR_END) 
        {
            OSEKPrintString("page = ") ;OSEKPrintInt(i) ;
            OSEKPrintString("write addr = ") ;OSEKPrintInt(tempaddr) ;
            if (flash_erase_sector(i, tempaddr) != E_FLASH_OK)
                OSEKPrintString("erase sector failed!\n") ;
            else
                OSEKPrintString("erase sector OK, gonna write\n") ;
            
            
            if (flash_write(i, tempaddr, testbuf, testlen) != E_FLASH_OK) 
                OSEKPrintString("write failed!!\n") ;
            else
                OSEKPrintString("page written\r\n") ;
            tempaddr += testlen ;
        }
            
    }
        
    OSEKPrintString("after write :\r\n") ;
    OSEKPrintString("test4 finished\r\n") ;

  
}


void test5(void)
{				   // test mass_erase 
    
    INT16U i, byte ;
    INT16U testlen = 512 ;
    INT8U testbuf[512] = "abcdefghijklmnopqrstuvwxyz0123456789" ;
    INT16U addr = test_addr_start ;
    INT16U tempaddr = addr ;
    INT16U data16 ;
    INT8U page = 0x3b ;
    
    flash_init() ;

    // generate testdata
    for (i=0;i<512; i++)
        testbuf[i] = 512-i ;
    
    
    OSEKPrintString("\ntest 5: gonna earase and verify block1 to block3\n") ;
    
    for (i=2; i<=3; i++) 
    {
        
        if (flash_mass_erase(i) != E_FLASH_OK) 
            OSEKPrintString("erase failed!!\n") ;
        else
            OSEKPrintString("erase ok\r\n") ;
        
        flash_delay_bus_cycle(50000) ;
        if (flash_erase_verify_block(i) != E_FLASH_OK) 
        {
            
                OSEKPrintString("erase verify failed!\n") ;
                //i-- ;
                //continue ;
        }
        else
                OSEKPrintString("verify block OK\n") ;
    
         
        tempaddr = addr ;
        page = 0x3f - i*4 ;
        while(tempaddr < FLASH_ADDR_END) 
        {
            OSEKPrintString("page = ") ;OSEKPrintInt(page) ;
            OSEKPrintString("write addr = ") ;OSEKPrintInt(tempaddr) ;
            
            
            if (flash_write(page, tempaddr, testbuf, testlen) != E_FLASH_OK) 
                OSEKPrintString("write failed!!\n") ;
            else
                OSEKPrintString("page written\r\n") ;
            tempaddr += testlen ;
        }

        
    }
    
    OSEKPrintString("after write :\r\n") ;
    OSEKPrintString("test5 finished\r\n") ;

  
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -