当前位置:首页 > 单片机 > 单片机
[导读]这次要讲讲怎么实现Nor Flash的升级。Nor Flash的DFU工程还是基于之前的flash DFU的工程上修改而来。工程的目录如下:我使用的Nor Flash芯片是M29W128F,该芯片共有128Mb的空间,通过FSMC挂接在BANK0。正好在UBS的官

这次要讲讲怎么实现Nor Flash的升级。

Nor Flash的DFU工程还是基于之前的flash DFU的工程上修改而来。工程的目录如下:

我使用的Nor Flash芯片是M29W128F,该芯片共有128Mb的空间,通过FSMC挂接在BANK0。正好在UBS的官方程序里也有使用芯片的例子,所以也就是说管方的Nor Flash的驱动代码是使用M29W128F这款芯片的。所以我们需要从拷贝fsmc_nor.c和fsmc_nor,h这两个文件添加到我们的USB_User这个组中。还要讲我们之前的flash_if文件修改为nor_if名。这样工程的文件就算齐了,下面就讲讲怎么修改个文件。

首先hw_config、usb_istr、usb_prop、usb_pwr这些个文件不需要修改。最新需要修该的文件是usb_desc.c这个文件的接口描述符,上面说过了,我们使用的Nor Flash芯片是M29W128,总空间为128Mb,即16MB。我设置这些空间都可读可写可擦除,并以64K为单位,所以接口描述符如下:



/*接口字符串描述符*/

uint8_t DFU_StringInterface0[DFU_SIZ_STRING_INTERFACE0] =

{

DFU_SIZ_STRING_INTERFACE0,

0x03,

//Interface 0: "@ NOR Flash: M29W128F /0x64000000/256*064Kg"

'@', 0, 'N', 0, 'O', 0, 'R', 0, ' ', 0, 'F', 0, 'l', 0, 'a', 0, 's', 0,/*18*/

'h', 0, ' ', 0,':', 0, ' ',0,'M',0,'2',0,'9',0,'W',0,'1',0,'2',0,'8',0,'F',0,/*24*/

'/',0,'0',0,'x',0,'6',0,'4',0,'0',0,'0',0,'0',0,'0',0,'0',0,'0',0,/*22*/

'/', 0, '0', 0, '2', 0, '5', 0, '6', 0, '*', 0, '6', 0, '4', 0, 'K', 0, 'g', 0/*20*/

};


接下去需要修改的是nor_if.c这个文件,这个文件是介于驱动和MAL层之间的桥梁。这个文件主要是进一步封装一下nor flash的底层驱动程序。这款需要定义NOR_If_Init()、NOR_If_Erase()、NOR_If_Write()、NOR_If_Read()这4个函数,都是调用驱动代码的相关函数:

/*******************************************************************************

* Function Name : NOR_If_Init

* Description : Initializes the Media on the STM32

* Input : None

* Output : None

* Return : None

*******************************************************************************/

uint16_t NOR_If_Init(void)

{

FSMC_NOR_Init();

return MAL_OK;

}


/*******************************************************************************

* Function Name : NOR_If_Erase

* Description : Erase sector

* Input : None

* Output : None

* Return : None

*******************************************************************************/

uint16_t NOR_If_Erase(uint32_t Address)

{

printf("正在擦除Nor Flashrn");

/* Erase the destination memory */

FSMC_NOR_EraseBlock(Address & 0x00FFFFFF);

printf("擦除成功rn");

return MAL_OK;

}


/*******************************************************************************

* Function Name : NOR_If_Write

* Description : Write sectors

* Input : None

* Output : None

* Return : None

*******************************************************************************/

uint16_t NOR_If_Write(uint32_t Address, uint32_t DataLength)

{

if ((DataLength & 1) == 1) /* Not an aligned data */

{

DataLength += 1;

MAL_Buffer[DataLength-1] = 0xFF;

}

printf("向0x%x地址处写入%d个字节rn",Address,DataLength);

FSMC_NOR_WriteBuffer((uint16_t *)MAL_Buffer, (Address&0x00FFFFFF), DataLength >> 1);

return MAL_OK;

}


/*******************************************************************************

* Function Name : NOR_If_Read

* Description : Read sectors

* Input : None

* Output : None

* Return : buffer address pointer

*******************************************************************************/

uint8_t *NOR_If_Read(uint32_t Address, uint32_t DataLength)

{

printf("在0x%x地址处读出%d个字节数据rn",Address,DataLength);

return (uint8_t*)(Address);

}


再接下去就是dfu_mal.c媒体接入层的函数了。这个文件也只定义了5个函数:MAL_Init()、MAL_Erase()、MAL_Write()、MAL_Read()、MAL_GetStatus(),这些函数基本上是调用nor_if.c中定义的相关函数:

uint16_t (*pMAL_Init) (void);

uint16_t (*pMAL_Erase) (uint32_t SectorAddress);

uint16_t (*pMAL_Write) (uint32_t SectorAddress, uint32_t DataLength);

uint8_t *(*pMAL_Read) (uint32_t SectorAddress, uint32_t DataLength);

uint8_t MAL_Buffer[wTransferSize]; /* RAM Buffer for Downloaded Data */


NOR_IDTypeDef NOR_ID;


extern ONE_DESCRIPTOR DFU_String_Descriptor[7];



static const uint16_t TimingTable[3][2] =

{ /* 扇区擦写时间, 扇区编程时间*/

{ SPI_FLASH_SECTOR_ERASE_TIME, SPI_FLASH_SECTOR_WRITE_TIME }, /* SPI Flash */

{ M29W128F_SECTOR_ERASE_TIME, M29W128F_SECTOR_WRITE_TIME }, /* NOR Flash M29W128F */

{ INTERN_FLASH_SECTOR_ERASE_TIME, INTERN_FLASH_SECTOR_WRITE_TIME }, /* Internal Flash */

};

/*******************************************************************************

* Function Name : MAL_Init

* Description : STM32初始化的媒体初始化

* Input : None

* Output : None

* Return : None

*******************************************************************************/

uint16_t MAL_Init(void)

{

FSMC_NOR_Init();

NOR_If_Init();

FSMC_NOR_ReadID(&NOR_ID);

printf(" Nor Flash ID:0x%x 0x%xrn",NOR_ID.Manufacturer_Code,NOR_ID.Device_Code1);

FSMC_NOR_ReturnToReadMode();

return MAL_OK;

}


/*******************************************************************************

* Function Name : MAL_Erase

* Description : 擦除扇区

* Input : None

* Output : None

* Return : None

*******************************************************************************/

uint16_t MAL_Erase(uint32_t SectorAddress)

{


switch (SectorAddress & MAL_MASK)//参看地址

{

case NOR_FLASH_BASE:

pMAL_Erase = NOR_If_Erase;

break;

default:

return MAL_FAIL;

}

return pMAL_Erase(SectorAddress);//指向擦除函数

}


/*******************************************************************************

* Function Name : MAL_Write

* Description : 写扇区

* Input : None

* Output : None

* Return : None

*******************************************************************************/

uint16_t MAL_Write (uint32_t SectorAddress, uint32_t DataLength)

{


switch (SectorAddress & MAL_MASK)//查看地址

{

case NOR_FLASH_BASE:

pMAL_Write = NOR_If_Write;

break;

default:

return MAL_FAIL;

}

return pMAL_Write(SectorAddress, DataLength);//调用写扇区函数

}


/*******************************************************************************

* Function Name : MAL_Read

* Description : 度扇区

* Input : None

* Output : None

* Return : Buffer pointer

*******************************************************************************/

uint8_t *MAL_Read (uint32_t SectorAddress, uint32_t DataLength)

{

switch (SectorAddress & MAL_MASK)//查看地址

{

case NOR_FLASH_BASE:

pMAL_Read = NOR_If_Read;

break;

default:

return 0;

}

return pMAL_Read (SectorAddress, DataLength);//调用如扇区函数

}


/*******************************************************************************

* Function Name : MAL_GetStatus

* Description : 获取状态

* Input : None

* Output : None

* Return : MAL_OK

*******************************************************************************/

uint16_t MAL_GetStatus(uint32_t SectorAddress , uint8_t Cmd, uint8_t *buffer)

{ //更具地址查找定时表的对应的选项

uint8_t x = (SectorAddress >> 26) & 0x03 ;

/* 0x000000000 --> 0 SPI Flash*/

/* 0x640000000 --> 1 Nor Flash*/

/* 0x080000000 --> 2 Internal Flash*/


uint8_t y = Cmd & 0x01;


SET_POLLING_TIMING(TimingTable[x][y]); /* x: 擦除/写 定时 */

/* y: Media */

return MAL_OK;

}


最后,我们在main中定义一些测试Nor Flash的一些代码,按键1按下擦写0x64000000地址开始的那个扇区数据;按键2按下表示向spi flash的0地址写入一组数据;按键3按下表示表示向spi flash的0地址写入另一组数据

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

STM32与51单片机之间有什么差异呢?两者可以说是一场科技与性能的较量了。在科技飞速发展的今天,微控制器(MCU)已广泛应用于各类电子设备和系统中,发挥着举足轻重的作用。其中,STM32和51单片机作为两种常见的微控制...

关键字: STM32 51单片机 MCU

西班牙塞维利亚,2024年3月12日 — Teledyne Technologies旗下公司、全球成像解决方案创新者Teledyne e2v宣布扩展其Flash™ CMOS图像传感器系列,推出Flash 2K LSA,该...

关键字: 图像传感器 Flash 摄像机

电磁铁是一种利用电流产生磁场的装置,具有快速响应、易于控制等特点,在工业自动化、电子设备、科学实验等领域有着广泛的应用。STM32是一款功能强大的微控制器,具有高性能、低功耗、易于编程等优点,是控制电磁铁的理想选择。本文...

关键字: 电磁铁 微控制器 STM32

边缘人工智能的实现涉及到三个基本 要素:安全性,连接性、自主性,而其中自主性是AI能力的体现,也是边缘AI有别于其他传统的物联网的关键。而通过ST Edge AI套件,就可以帮助各种不同类型的开发者实现覆盖全硬件平台的全...

关键字: 边缘人工智能 AI STM32

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

STM32是一款由STMicroelectronics生产的微控制器系列,具有高性能、低功耗和丰富的外设资源。其中,串口通信是一种常用的通信方式,可以实现与其他设备之间的数据传输。

关键字: STM32 串口通信 微控制器

在这篇文章中,小编将为大家带来JTAG接口与Flash的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: JTAG Flash

STM32是一种广泛使用的微控制器,具有丰富的通信接口。其中,串口通信是STM32与其他设备或系统进行数据交换的重要方式之一。本文将详细介绍STM32串口通信的原理、应用及常见故障。

关键字: STM32 串口通信
关闭
关闭