SYD8821 內部flash使用說明[[4K數據空間的操作]【大於4K數據空間的操作】

SYD8821是具有全球領先低功耗(RX 2.4mA @-94.5dBm靈敏度,TX 4.3mA @0dBm輸出功率)的藍牙低功耗SOC芯片,在極低電流下實現了優異的射頻性能,搭配176kB SRAM,512kB flash,非常適合中高階可穿戴、智能家居、物聯網等低功耗應用。具體可諮詢:http://www.sydtek.com/

SYD8821 內部flash使用說明

4K數據空間的操作

SYD8821的內部flash留有4K的空間給用戶代碼使用,使用規則有點像SYD8801芯片內部的3Kflash空間,SYD8801的操作請看https://blog.csdn.net/chengdong1314/article/details/60957122

SYD8821操作內部的4K flash空間函數如下:
/*************************************************************************************************
*函數名:gap_s_profile_data_read
*輸入參數:uint16_t addr 偏移地址,有效範圍是0x0-0xfff
uint16_t len 讀取數據的長度,有效範圍是0x0-0xfff
uint8_t *p_buf 返回數據的指針,SYD8821的flash要求該指針指向的內存必須是4字節對其的
*輸出參數:uint8_t 指示讀取數據的結果
0 -->失敗
1 -->成功
*說明:SYD8821內部的flash除了存儲代碼和配置文件外還單獨留出4K的區域給app存儲重要數據,因爲這些數據是存儲在
flash中的,所以掉電後也不會丟失
當傳入的參數非法時,該函數返回錯誤,這裏重點注意數據指針必須是四字節對其,否則會出錯
**************************************************************************************************/
extern uint8_t gap_s_profile_data_read(uint16_t addr , uint16_t len, uint8_t *p_buf);

/*************************************************************************************************
*函數名:gap_s_profile_data_write
*輸入參數:uint16_t addr 偏移地址,有效範圍是0x0-0xfff
uint16_t len 寫數據的長度,有效範圍是0x0-0xfff
uint8_t *p_buf 寫入數據的指針,SYD8821的flash要求該指針指向的內存必須是4字節對其的
*輸出參數:uint8_t 指示寫入數據的結果
0 -->失敗
1 -->成功
*說明:SYD8821內部的flash除了存儲代碼和配置文件外還單獨留出4K的區域給app存儲重要數據,因爲這些數據是存儲在
flash中的,所以掉電後也不會丟失
當傳入的參數非法時,該函數返回錯誤,這裏重點注意數據指針必須是四字節對其,否則會出錯
因爲該函數在寫flash之前還有擦除flash扇區,所以建議不要頻繁調用該函數,以免造成flash出錯
該函數只是把數據放到底層緩衝區中,正在執行flash的操作的是在ble_sched_execute函數中
**************************************************************************************************/
extern uint8_t gap_s_profile_data_write(uint16_t addr , uint16_t len, uint8_t *p_buf);
這兩個函數可以操作用戶3k空間,也就是上面那個圖中最後的Profile Paratemers,操作這個空間不需要調用擦除函數,只需要讀寫就行。
注意:gap_s_profile_data_write函數交由底層代碼負責寫操作,調用gap_s_profile_data_write函數的時候底層代碼會先把數據放在緩衝區,只用調用了ble_sched_execute函數的時候真正的寫flash操作纔會起效,因爲寫flash的時間比較長,所以ble_sched_execute函數一般在主函數的主循環調用,ble_sched_execute函數相關內容具體請看:http://blog.csdn.net/chengdong1314/article/details/76169279
打開《\Source Code\SYD8821_other\flash_internal_4K\Keil》工程可看到主函數如下:
int main()
{
uint16_t i=0;
uint16_t addr=0;
uint8_t tx_buff[32],rx_buff[32],base_data=0;
__disable_irq();
。。。。。。。。。。。。。。。。。。。。
//uart 0
pad_mux_write(20, 7);
pad_mux_write(21, 7);
dbg_init();

gap_s_ble_init();

__enable_irq();

DBG("SYD8821 flash internal TEST\r\n");

while(1)
{
	gpo_toggle(LED4);
    for(i=0;i<WRITE_READ_LEN;i++)
	{
		tx_buff[i]=base_data+i;
	}
	gap_s_profile_data_write(addr,WRITE_READ_LEN,tx_buff);
	DBG("write addr:%04x len:%04x\r\n",addr,WRITE_READ_LEN);
	DBGHEXDUMP("",tx_buff,WRITE_READ_LEN);
	
	ble_sched_execute();
    
	gap_s_profile_data_read(addr,WRITE_READ_LEN,rx_buff);
	DBG("read addr:%04x len:%04x\r\n",addr,WRITE_READ_LEN);
	DBGHEXDUMP("",rx_buff,WRITE_READ_LEN);
	
	base_data++;
	addr+=256;
	delay_ms(3000);
}		

}
具體代碼比較容易,這裏不做解釋!
測試結果如下:
這裏寫圖片描述
具體可看:https://download.csdn.net/download/chengdong1314/10595400
下面上傳本節博客源碼:https://download.csdn.net/download/chengdong1314/10595403

大於4K數據空間的操作##

上面只是介紹了關於4K以內的數據空間的使用,如果要操作的空間大於4K的時候就比較麻煩了!
具體的步驟多了配置芯片的一步:
首先要做的是先配置一下芯片的底層,讓芯片底層空出64KB的數據空間給用戶使用,同時代碼空間就減少了64KB:
這裏寫圖片描述
這裏上傳支持該功能的tool:https://download.csdn.net/download/chengdong1314/10665074
接下來打開代碼看到main.c如下:
/*
UART例程main.c

作者:北京盛源達科技有限公司
日期:2018/3/19
*/
#include “ARMCM0.h”
#include “gpio.h”
#include “pad_mux_ctrl.h”
#include “delay.h”
#include “led_key.h”
#include “uart.h”
#include “queue.h”
#include “debug.h”
#include “ble_slave.h”

#define WRITE_READ_LEN 32

#define FLASH_INTERNAL_DATA_ADDR 0x70000

int main()
{
uint16_t i=0;
uint16_t addr=0;
uint8_t tx_buff[32],rx_buff[32],base_data=0;
__disable_irq();

gap_s_ble_init();
// RC bumping
sys_mcu_rc_calibration();
sys_mcu_clock_set(MCU_CLOCK_64_MHZ);

//GPO
pad_mux_write(LED1, 0);
pad_mux_write(LED2, 0);
pad_mux_write(LED3, 0);
pad_mux_write(LED4, 0);
gpo_config(LED1,1);
gpo_config(LED2,1);
gpo_config(LED3,1);

gpo_config(LED4,1);

//GPI
pad_mux_write(KEY1, 0);
pad_mux_write(KEY2, 0);
pad_mux_write(KEY3, 0);
pad_mux_write(KEY4, 0);
gpi_config(KEY1, PULL_UP);
gpi_config(KEY2, PULL_UP);
gpi_config(KEY3, PULL_UP);
gpi_config(KEY4, PULL_UP);

//uart 0
pad_mux_write(20, 7);
pad_mux_write(21, 7);
dbg_init();

gap_s_ble_init();

__enable_irq();

DBG("SYD8821 flash internal TEST\r\n");

while(1)
{
	gpo_toggle(LED4);
	
	if(!gpi_get_val(KEY1)){
		for(i=0;i<WRITE_READ_LEN;i++)
		{
			tx_buff[i]=base_data+i;
		}
		//注意ble_flash_erase函數會進行擦除操作,所以必須要保證地址是正確的
		ble_flash_erase(FLASH_INTERNAL_DATA_ADDR+addr,1);   //注意這裏是標準的flash操作,在寫數據之前必須要擦除,除非要寫的地址區域已經被擦除過
		ble_flash_write(FLASH_INTERNAL_DATA_ADDR+addr,WRITE_READ_LEN, tx_buff);
		DBG("write addr:%04x len:%04x\r\n",FLASH_INTERNAL_DATA_ADDR+addr,WRITE_READ_LEN);
		DBGHEXDUMP("",tx_buff,WRITE_READ_LEN);
		
		base_data++;
	    gpo_toggle(LED1);
		delay_ms(600);
	}
	if(!gpi_get_val(KEY2)){
	    gpo_toggle(LED2);
		ble_flash_read(FLASH_INTERNAL_DATA_ADDR+addr,WRITE_READ_LEN, rx_buff);
		DBG("read addr:%04x len:%04x\r\n",FLASH_INTERNAL_DATA_ADDR+addr,WRITE_READ_LEN);
		
		DBGHEXDUMP("",rx_buff,WRITE_READ_LEN);
		delay_ms(600);
	}
	
	if(!gpi_get_val(KEY3)){
		addr+=256;
		DBG("write read addr:%04x\r\n",FLASH_INTERNAL_DATA_ADDR+addr);
	}
	
	delay_ms(100);
}		

}
按下按鍵1是把數據進入flash中,按下按鍵2時讀出flash中的數據,這裏測試結果如下:
這裏寫圖片描述

這裏上傳本博客源代碼:https://download.csdn.net/download/chengdong1314/10665096

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章