#include "main.h"
/**************************************************************************************************
* @fn FLASH_Write
*
* @brief This function writes 'num_bytes' bytes to the uint16_ternal flash.
*
* input parameters
*
* @param addr - Valid flash write address: actual addr / 4 and quad-aligned.
* @param data - Valid buffer space at least as big as 'cnt' X 4.
* @param num_bytes - Number of bytes to write, MUST be Divisible by 4.
*
* output parameters
*
* None.
*
* @return None.
**************************************************************************************************
*/
void FLASH_Write(uint16_t addr,uint8_t *data, uint16_t num_bytes)
{
//配置DMA通道每次传送一个字节
DMADesc_t dmaConfig0;//定义DMA通道
dmaConfig0.SRCADDRH = ((uint16_t)data >> 8) & 0x00FF; //XData - To Be Written to Flash - Gets Incremented;存储data的高8位;
dmaConfig0.SRCADDRL = (uint16_t)data & 0x00FF;//存储data地址的低8位;
dmaConfig0.DESTADDRH = (((uint16_t)&FWDATA) >> 8) & 0x00FF; //Flash Controller Data Address - Flash Controller Writes Data//存储写寄存器的地址的高8位
dmaConfig0.DESTADDRL = ((uint16_t)&FWDATA) & 0x00FF;//存储写寄存器的低8位;
dmaConfig0.VLEN = 0; //Variable num_bytes Transfer - 0=Fixed LEN Transfer//采用LEN作为传送长度
dmaConfig0.LENH = (num_bytes>>8) & 0x00FF; //Number of WORDSZIE in Transfer - Must be Divisible by 4 - NET_ADDR_SIZE=4//存储传送长度高5位
dmaConfig0.LENL = num_bytes & 0x00FF;//存储长度低8位;
dmaConfig0.WORDSIZE = 0; //Size of Each Transfer - 0=8 Bit;每个DMA传送采用8位传送
dmaConfig0.TMODE = 0; //Transfer Mode - 1=Block, 0=Single,传送模式为单一模式
dmaConfig0.TRIG = 18; //DMA Trigger - 0=Manual Via DMAREQ, 18=Flash;flash触发
dmaConfig0.SRCINC = 1; //Source Address Increment - 1=1 Byte//源地址增量模式为1字节/字
dmaConfig0.DESTINC = 0; //Destination Address Increment - 0=0 Bytes (Always Write to FWDATA, No Need to Increment)目标地址增量模式0字节/字
dmaConfig0.IRQMASK = 0; //uint16_terrupt Mask - 0=Disable uint16_terrupts//禁止通道完成中断产生
dmaConfig0.M8 = 0; //8th Bit Mode - 0=Use All 8 Bits使用全部8位作为传送长度
dmaConfig0.PRIORITY = 2; //Priority - 10(2)=High Priority优先级为DMA优先
//DMA模式写
while (FCTL & 0x80); //Wait Until DMA Controller is Available - Busy Bit 7//等待写或擦除状态被激活
/********* 存储写入flash页地址 ***********************************************/
FADDRH =(addr >> 10) & 0x00FF; // page size: 2048; select the flash page via FADDRH[7:1] bits//由于写入flash时是字(4字节)寻址的,所以存储高位需要右移2位;
FADDRL =(addr >> 2) & 0x00FF; //4字节寻址,存储要写入flash地址的低字节需要右移2位
//通道0配置地址
DMA0CFGH = (((uint16_t)&dmaConfig0) >> 8) & 0x00FF; //Pass DmaConfig0
DMA0CFGL = ((uint16_t)&dmaConfig0) & 0x00FF;
DMAARM |= 0x01; //Arm the DMA Channel//通道0进去工作状态
FCTL |= 0x02; //Start Write
//while (!(DMAIRQ & 0x01)); //Wait Until Write Complete
//DMAIRQ &= 0xFE; //Clear Any DMA IRQ on Channel 0 - Bit 0
while (FCTL & (0x80)); //Wait Until Flash Controller is Not Busy - Busy Bit 7//等待或者擦除状态激活
return;
}
/**************************************************************************************************
* @fn FLASH_PageErase
*
* @brief This function erases flash page of the 'pageNum'th page.
*
* input parameters
*
* @param pageNum - Valid flash page num.
*
* output parameters
*
* None.
*
* @return None.
**************************************************************************************************
*/
void FLASH_PageErase(uint8_t pageNum)
{
EA=0;
while(FCTL & 0x80);//等待闪存控制器整备好
FADDRH = pageNum << 1;//选择擦除页面的序号,共128页
FCTL |= 0x01;//启动页面擦除
while(FCTL & 0x80);//等待擦除完成
EA=1;
}
/**************************************************************************************************
* @fn FLASH_Read
*
* @brief This function reads 'num_bytes' bytes from flash address addr to array data.
*
* input parameters
*
* @param addr - Valid flash read address: .
* @param data - Valid buffer space to store the data.
* @param num_bytes - Number of bytes to read.
*
* output parameters
*
* None.
*
* @return None.
**************************************************************************************************
*/
void FLASH_Read(uint16_t addr,uint8_t* data,uint8_t num_bytes)
{
uint8_t old_map;
uint8_t bank_num;
uint16_t offset;
uint8_t old_ea;
old_ea = EA;
EA = 0; // close global interrupt
bank_num = (addr>>FLASH_BANK_SHIFT)&FLASH_BANK_MAP_MASK;
offset = (addr & (FLASH_BANK_SIZE-1))+FLASH_BASE_ADDR;
old_map = MEMCTR;
MEMCTR = (old_map&~0X7)|bank_num; //map the correct flash bank to XBANK
memcpy(data,(uint8_t*)offset,num_bytes);
MEMCTR = old_map;
EA = old_ea;
return;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
CC2530 Flash读写测试程序.zip (30个子文件)
测试CC2530 Flash读写程序
~$XL362学习笔记.docx 162B
CC2530UART2Test
CC2530UART2Test.c 894B
main.h 447B
settings
CC2530UART2Test.cspy.bat 1KB
CC2530UART2Test.dbgdt 8KB
CC2530UART2Test.wsdt 4KB
CC2530UART2Test.dni 975B
CC2530UART2Test.ewp 55KB
sys.c 662B
flash.c 5KB
CC2530UART2Test.eww 169B
sys.h 500B
flash.h 2KB
Backup of CC2530UART2Test.ewp 52KB
Debug
List
Obj
sys.r51 3KB
ADXL362.r51 103KB
spi.r51 13KB
exint.r51 9KB
CC2530UART2Test.pbd 269B
flash.r51 18KB
sleep.r51 20KB
uart.r51 24KB
CC2530UART2Test.r51 9KB
calc.r51 33KB
Exe
CC2530UART2Test.hex 3KB
CC2530UART2Test.d51 17KB
Backup of CC2530UART2Test.ewd 26KB
CC2530UART2Test.ewd 33KB
CC2530UART2Test.dep 8KB
~WRL3288.tmp 93KB
共 30 条
- 1
资源评论
- wenlong06012021-03-08很好的资料,希望多分享资源
- dailong5552019-12-25不错,还可以,配合博文有很大帮助
- 徐才林2019-05-19还不错,对于CC2530的内部flash使用很有帮助
你行你上天
- 粉丝: 233
- 资源: 14
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功