好了,给大家看看保存后的boot.dat文件,
除了第一行,每行都是一个4字节长度的数。下面要做得是,分别把boot.dat中这些数和text.dat中的这些数放到boot[]和text[]的数组中,并将数组保存在头文件中。
首先删除头行
vim命令添加逗号:%s/$/,/g
添加数组名
搞定后的结果,如boot.h文件和text.h文件如下:
好了,到这就差不多了,表示机器码的二进制如今保存在我们的C语言头文件中了,下面就是要把头文件数组中的机器码烧写到Flash的对应的地址空间。
4 烧写Flash
本文操作环境下使用的Flash型号是AM29LV800BT。
为了烧写,首先你要做的是重新新建一个用于Flash烧写的工程。
烧写Flash的程序网上也有很多讲解,今天把烧写Flash调了出来,就当给大家福利,把我的Flash驱动程序给出来,
/* * FileName : FLASH.h * Author : xiahouzuoxin * Date : 2013.09.28 * Version : v1.0 * Brief : */ #ifndef _FLASH_H #define _FLASH_H #include "Config.h" #define FLASH_UL1 0xAA #define FLASH_UL2 0x55 #define FLASH_UL3 0x80 #define FLASH_UL4 0xAA #define FLASH_UL5 0x55 #define FLASH_SECTOR_UL6 0x30 #define FLASH_CHIP_UL6 0x10 #define FLASH_PROGRAM 0xA0 #define SECTOR_SIZE 0x0800 #define BLOCK_SIZE 0x8000 #define CHIP_SIZE 0x40000 #define FLASH_FIRST_ADDR 0x90000000 #define FLASH_OFFSET(addr) (FLASH_FIRST_ADDR+(addr)<<1) // 16 bit boot mode /* External functions propotype */ extern uint32_t Flash_Erase(uint32_t addr,uint16_t type); extern void Flash_Readm(uint32_t addr,uint16_t *ptr,uint32_t length); extern uint32_t Flash_Reads(uint32_t addr); extern void Flash_Writem(uint32_t addr,uint16_t *ptr,uint32_t length); extern void Flash_Writes(uint32_t addr,uint16_t data); #endif
/*
* FileName : FLASH.c
* Author : xiahouzuoxin
* Date : 2013.09.28
* Version : v1.0
* Brief :
*/
#include "FLASH.h"
#include "stdio.h"
/* Global vaiables */
volatile uint16_t *FLASH_5555 = (volatile uint16_t *) (0x90000000+(0x5555<<1));
volatile uint16_t *FLASH_2AAA = (volatile uint16_t *) (0x90000000+(0x2AAA<<1));
/*
* @brief Flash erase function.
* @param addr:
* type:
* @retval
*/
uint32_t Flash_Erase(uint32_t addr, uint16_t type)
{
uint32_t i,j;
*FLASH_5555 = FLASH_UL1; //first
*FLASH_2AAA = FLASH_UL2; //second
*FLASH_5555 = FLASH_UL3; //third
*FLASH_5555 = FLASH_UL4;
*FLASH_2AAA = FLASH_UL5;
switch(type)
{
case 0x50: //block erase
*(uint16_t *)addr = type;
while((*(uint16_t *)addr & 0x80) != 0x80);
for(i = 0; i < BLOCK_SIZE; i++)
{
if(*(uint16_t *)(addr + i) != 0xffff)
{
j = 0;
break;
}
}
j = 1;
break;
case 0x30: //sector erase
*(uint16_t *)addr = type;
while((*(uint16_t *)addr & 0x80) != 0x80);
break;
case 0x10: //chip erase
*FLASH_5555 = type;
while((*FLASH_5555 & 0x80) != 0x80);
break;
default:
break;
}
return (j);
}
/*
* @brief Write a single data.
* @param addr:
* data:
* @retval
*/
void Flash_Writes(uint32_t addr,uint16_t data)
{
uint32_t j = 0;
*FLASH_5555 = FLASH_UL1;
*FLASH_2AAA = FLASH_UL2;
*FLASH_5555 = FLASH_PROGRAM;
*(uint16_t *)addr = data;
j = 0;
while (j<255) j++; // with delay
while(*(uint16_t *)addr != data); // 校验
}
/*
* @brief Write the certain length data.
* @param addr:
* ptr:
* length:
* @retval
*/
void Flash_Writem(uint32_t addr,uint16_t *ptr,uint32_t length)
{
uint32_t i;
for(i = 0; i < length; i++)
{
Flash_Writes(addr+(i<<1),*(ptr+i));
if (i % 0xFF == 0) {
printf("\nWrite %d bytes...", i<<1);
}
}
}
/*
* @brief Read a single data.
* @param addr:
* @retval
*/
uint32_t Flash_Reads(uint32_t addr)
{
return (*(uint16_t *)addr);
}
/*
* @brief Read the certain length data.
* @param addr:
* ptr:
* length:
* @retval
*/
void Flash_Readm(uint32_t addr,uint16_t *ptr,uint32_t length)
{
uint32_t i;
for(i = 0; i < length; i++)
{
*(ptr + i) = Flash_Reads(addr+2*i);
}
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-34190-5.html
一箭双雕
小船撞击
很棒