/** ****************************************************************************** **说明:自主2.4G卡编程配置及写号软件 **功能:协议配置、写IC卡号 **作者:郑友鑫 **日期:2017.08 ****************************************************************************** **/ /* Includes ------------------------------------------------------------------*/ #include "flash.h" #include "printf.h" // BYTE thenticated = FALSE; u16 StoreBuffer[STORE_DATA_NUM]; u8 Save_Buffer[STORE_DATA_NUM*2]; /***************************************************************************************************** ** 函数名称: Startwritedata() ** 函数描述: 开始向flash里写数据 ** 接口参数: addr ** 全局变量: 无 ** 宏 定 义:ADDR_BASE ** 作 者: 刘良勇 ** 日 期: 2010.5.13 ------------------------------------------------------------------------------------------------------ ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能, 只能先擦除再写,而擦除时,只支持页擦除。 addr地址范围:ADDR_BASE ~ADDR_BASE+1022 *****************************************************************************************************/ void Startwritedata(DWORD addr) { FLASH_Unlock(); //每次擦除Flash中数据时得先解锁 FLASH_ErasePage(addr); //擦除页 } /***************************************************************************************************** ** 函数名称: Write_Complete() ** 函数描述: 上锁 ** 接口参数: ** 全局变量: 无 ** 宏 定 义:ADDR_BASE ** 作 者: 刘良勇 ** 日 期: 2010.5.13 ------------------------------------------------------------------------------------------------------ ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能, 只能先擦除再写,而擦除时,只支持页擦除。 addr地址范围:ADDR_BASE ~ADDR_BASE+1022 *****************************************************************************************************/ void Write_Complete(void) { FLASH_Lock(); //上锁 } /***************************************************************************************************** ** 函数名称: SavePara() ** 函数描述:保存一个参数 最大为16位 ** 接口参数: addr,data ** 全局变量: 无 ** 宏 定 义:ADDR_BASE ** 作 者: 刘良勇 ** 日 期: 2010.5.13 ------------------------------------------------------------------------------------------------------ ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能, 只能先擦除再写,而擦除时,只支持页擦除。 addr地址范围:ADDR_BASE ~ADDR_BASE+1022 *****************************************************************************************************/ void SavePara(DWORD addr,WORD data) { FLASH_ProgramHalfWord(addr,data);//写16位半字 } /***************************************************************************************************** ** 函数名称: GetPara() ** 函数描述: 读出参数 ** 接口参数: 读取 addr 地址里的数据 ** 全局变量: 无 ** 宏 定 义:ADDR_BASE ** 引用函数: ** 作 者: 刘良勇 ** 日 期: 2010.5.13 ------------------------------------------------------------------------------------------------------ ** 备注: addr地址范围:ADDR_BASE ~ADDR_BASE+1022 *****************************************************************************************************/ WORD GetPara(DWORD addr) { WORD data; data=(WORD)(*(DWORD*)addr); //读取相应地址中的16位数据 return data; } /***************************************************************************************************** ** 函数名称: Savestr_to_flash() ** 函数描述: 将一串数据存到指定的地址区间里 ** 接口参数: addr,data,len ** 全局变量: 无 ** 宏 定 义: ** 作 者: 刘良勇 ** 日 期: 2010.5.13 ------------------------------------------------------------------------------------------------------ ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能, 只能先擦除再写,而擦除时,只支持页擦除。 addr地址范围:ADDR_BASE ~ADDR_BASE+1022 *****************************************************************************************************/ void Savestr_to_flash(DWORD addr,WORD *str,WORD len) { BYTE i = 0; for(i = 0;i < len;i ++) { SavePara(addr,str[i]); addr += 2; } } /***************************************************************************************************** ** 函数名称: Readstr_of_flash() ** 函数描述: 从某个地址开始读取一个字符串 ** 接口参数: addr,data,len ** 全局变量: 无 ** 宏 定 义: ** 作 者: 刘良勇 ** 日 期: 2010.5.13 ------------------------------------------------------------------------------------------------------ ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能, 只能先擦除再写,而擦除时,只支持页擦除。 addr地址范围:ADDR_BASE ~ADDR_BASE+1022 *****************************************************************************************************/ void Readstr_of_flash(DWORD addr,WORD *str,WORD len) { BYTE i = 0; for(i = 0;i < len;i ++) { str[i] = GetPara(addr); addr += 2; } } /***************************************************************************************************** ** 函数名称: SavePara_to_flash() ** 函数描述: 将一些参数存到flash ** 接口参数: addr,data,len ** 全局变量: 无 ** 宏 定 义: ** 作 者: 刘良勇 ** 日 期: 2010.5.13 ------------------------------------------------------------------------------------------------------ ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能, 只能先擦除再写,而擦除时,只支持页擦除。 addr地址范围:ADDR_BASE ~ADDR_BASE+1022 *****************************************************************************************************/ void SavePara_to_flash(void) { BYTE i = 0; WORD flash_buf[STORE_DATA_NUM] = {0}; for(i = 0;i < STORE_DATA_NUM;i ++) { flash_buf[i] = (WORD)StoreBuffer[i];//转换要写入的数据 } Startwritedata(PC_NUM_ADDR); Savestr_to_flash(PC_NUM_ADDR,flash_buf,STORE_DATA_NUM); Write_Complete(); } /***************************************************************************************************** ** 函数名称: Readstr_of_flash() ** 函数描述: 从某个地址开始读取一个字符串 ** 接口参数: addr,data,len ** 全局变量: 无 ** 宏 定 义: ** 作 者: 刘良勇 ** 日 期: 2010.5.13 ------------------------------------------------------------------------------------------------------ ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能, 只能先擦除再写,而擦除时,只支持页擦除。 addr地址范围:ADDR_BASE ~ADDR_BASE+1022 *****************************************************************************************************/ void Readpara_from_flash(void) { BYTE i = 0; WORD flash_buf[STORE_DATA_NUM] = {0}; //16位数组向FLASH中写数据 // BYTE Save_Buffer[STORE_DATA_NUM*2]={0}; //8位数组,将16位数组中数据转换出来 Readstr_of_flash(PC_NUM_ADDR,flash_buf,STORE_DATA_NUM); for(i = 0;i < STORE_DATA_NUM;i ++) { Save_Buffer[2*i] = (WORD)flash_buf[i]; // printf("低八位 %d=%d \r\n",i,Save_Buffer[2*i]); //打印16位数据的低八位 // Save_Buffer[2*i + 1] = (WORD)(flash_buf[i] >>=8); // printf("高八位=%u \r\n",Save_Buffer[2*i+1]); //打印高八位 } // printf("设置频率 = %d \r\n",Save_Buffer[2*0]); //打印16位数据的低八位 // printf("设置功率 = %d \r\n",Save_Buffer[2*1]); //打印16位数据的低八位 // printf("设置速率 = %d \r\n",Save_Buffer[2*2]); //打印16位数据的低八位 }