Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

214 linhas
7.3KB

  1. /**
  2. ******************************************************************************
  3. **说明:自主2.4G卡编程配置及写号软件
  4. **功能:协议配置、写IC卡号
  5. **作者:郑友鑫
  6. **日期:2017.08
  7. ******************************************************************************
  8. **/
  9. /* Includes ------------------------------------------------------------------*/
  10. #include "flash.h"
  11. #include "printf.h"
  12. // BYTE thenticated = FALSE;
  13. u16 StoreBuffer[STORE_DATA_NUM];
  14. u8 Save_Buffer[STORE_DATA_NUM*2];
  15. /*****************************************************************************************************
  16. ** 函数名称: Startwritedata()
  17. ** 函数描述: 开始向flash里写数据
  18. ** 接口参数: addr
  19. ** 全局变量: 无
  20. ** 宏 定 义:ADDR_BASE
  21. ** 作 者: 刘良勇
  22. ** 日 期: 2010.5.13
  23. ------------------------------------------------------------------------------------------------------
  24. ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能,
  25. 只能先擦除再写,而擦除时,只支持页擦除。
  26. addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  27. *****************************************************************************************************/
  28. void Startwritedata(DWORD addr)
  29. {
  30. FLASH_Unlock(); //每次擦除Flash中数据时得先解锁
  31. FLASH_ErasePage(addr); //擦除页
  32. }
  33. /*****************************************************************************************************
  34. ** 函数名称: Write_Complete()
  35. ** 函数描述: 上锁
  36. ** 接口参数:
  37. ** 全局变量: 无
  38. ** 宏 定 义:ADDR_BASE
  39. ** 作 者: 刘良勇
  40. ** 日 期: 2010.5.13
  41. ------------------------------------------------------------------------------------------------------
  42. ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能,
  43. 只能先擦除再写,而擦除时,只支持页擦除。
  44. addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  45. *****************************************************************************************************/
  46. void Write_Complete(void)
  47. {
  48. FLASH_Lock(); //上锁
  49. }
  50. /*****************************************************************************************************
  51. ** 函数名称: SavePara()
  52. ** 函数描述:保存一个参数 最大为16位
  53. ** 接口参数: addr,data
  54. ** 全局变量: 无
  55. ** 宏 定 义:ADDR_BASE
  56. ** 作 者: 刘良勇
  57. ** 日 期: 2010.5.13
  58. ------------------------------------------------------------------------------------------------------
  59. ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能,
  60. 只能先擦除再写,而擦除时,只支持页擦除。
  61. addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  62. *****************************************************************************************************/
  63. void SavePara(DWORD addr,WORD data)
  64. {
  65. FLASH_ProgramHalfWord(addr,data);//写16位半字
  66. }
  67. /*****************************************************************************************************
  68. ** 函数名称: GetPara()
  69. ** 函数描述: 读出参数
  70. ** 接口参数: 读取 addr 地址里的数据
  71. ** 全局变量: 无
  72. ** 宏 定 义:ADDR_BASE
  73. ** 引用函数:
  74. ** 作 者: 刘良勇
  75. ** 日 期: 2010.5.13
  76. ------------------------------------------------------------------------------------------------------
  77. ** 备注: addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  78. *****************************************************************************************************/
  79. WORD GetPara(DWORD addr)
  80. {
  81. WORD data;
  82. data=(WORD)(*(DWORD*)addr); //读取相应地址中的16位数据
  83. return data;
  84. }
  85. /*****************************************************************************************************
  86. ** 函数名称: Savestr_to_flash()
  87. ** 函数描述: 将一串数据存到指定的地址区间里
  88. ** 接口参数: addr,data,len
  89. ** 全局变量: 无
  90. ** 宏 定 义:
  91. ** 作 者: 刘良勇
  92. ** 日 期: 2010.5.13
  93. ------------------------------------------------------------------------------------------------------
  94. ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能,
  95. 只能先擦除再写,而擦除时,只支持页擦除。
  96. addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  97. *****************************************************************************************************/
  98. void Savestr_to_flash(DWORD addr,WORD *str,WORD len)
  99. {
  100. BYTE i = 0;
  101. for(i = 0;i < len;i ++)
  102. {
  103. SavePara(addr,str[i]);
  104. addr += 2;
  105. }
  106. }
  107. /*****************************************************************************************************
  108. ** 函数名称: Readstr_of_flash()
  109. ** 函数描述: 从某个地址开始读取一个字符串
  110. ** 接口参数: addr,data,len
  111. ** 全局变量: 无
  112. ** 宏 定 义:
  113. ** 作 者: 刘良勇
  114. ** 日 期: 2010.5.13
  115. ------------------------------------------------------------------------------------------------------
  116. ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能,
  117. 只能先擦除再写,而擦除时,只支持页擦除。
  118. addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  119. *****************************************************************************************************/
  120. void Readstr_of_flash(DWORD addr,WORD *str,WORD len)
  121. {
  122. BYTE i = 0;
  123. for(i = 0;i < len;i ++)
  124. {
  125. str[i] = GetPara(addr);
  126. addr += 2;
  127. }
  128. }
  129. /*****************************************************************************************************
  130. ** 函数名称: SavePara_to_flash()
  131. ** 函数描述: 将一些参数存到flash
  132. ** 接口参数: addr,data,len
  133. ** 全局变量: 无
  134. ** 宏 定 义:
  135. ** 作 者: 刘良勇
  136. ** 日 期: 2010.5.13
  137. ------------------------------------------------------------------------------------------------------
  138. ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能,
  139. 只能先擦除再写,而擦除时,只支持页擦除。
  140. addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  141. *****************************************************************************************************/
  142. void SavePara_to_flash(void)
  143. {
  144. BYTE i = 0;
  145. WORD flash_buf[STORE_DATA_NUM] = {0};
  146. for(i = 0;i < STORE_DATA_NUM;i ++)
  147. {
  148. flash_buf[i] = (WORD)StoreBuffer[i];//转换要写入的数据
  149. }
  150. Startwritedata(PC_NUM_ADDR);
  151. Savestr_to_flash(PC_NUM_ADDR,flash_buf,STORE_DATA_NUM);
  152. Write_Complete();
  153. }
  154. /*****************************************************************************************************
  155. ** 函数名称: Readstr_of_flash()
  156. ** 函数描述: 从某个地址开始读取一个字符串
  157. ** 接口参数: addr,data,len
  158. ** 全局变量: 无
  159. ** 宏 定 义:
  160. ** 作 者: 刘良勇
  161. ** 日 期: 2010.5.13
  162. ------------------------------------------------------------------------------------------------------
  163. ** 备注:每次写数据前得先擦除所要存储位置所在的整个页,这是和EEPROM的不同之处。Flash不具备修改功能,
  164. 只能先擦除再写,而擦除时,只支持页擦除。
  165. addr地址范围:ADDR_BASE ~ADDR_BASE+1022
  166. *****************************************************************************************************/
  167. void Readpara_from_flash(void)
  168. {
  169. BYTE i = 0;
  170. WORD flash_buf[STORE_DATA_NUM] = {0}; //16位数组向FLASH中写数据
  171. // BYTE Save_Buffer[STORE_DATA_NUM*2]={0}; //8位数组,将16位数组中数据转换出来
  172. Readstr_of_flash(PC_NUM_ADDR,flash_buf,STORE_DATA_NUM);
  173. for(i = 0;i < STORE_DATA_NUM;i ++)
  174. {
  175. Save_Buffer[2*i] = (WORD)flash_buf[i];
  176. // printf("低八位 %d=%d \r\n",i,Save_Buffer[2*i]); //打印16位数据的低八位
  177. // Save_Buffer[2*i + 1] = (WORD)(flash_buf[i] >>=8);
  178. // printf("高八位=%u \r\n",Save_Buffer[2*i+1]); //打印高八位
  179. }
  180. // printf("设置频率 = %d \r\n",Save_Buffer[2*0]); //打印16位数据的低八位
  181. // printf("设置功率 = %d \r\n",Save_Buffer[2*1]); //打印16位数据的低八位
  182. // printf("设置速率 = %d \r\n",Save_Buffer[2*2]); //打印16位数据的低八位
  183. }