历史上的今天
返回首页

历史上的今天

今天是:2025年01月17日(星期五)

正在发生

2021年01月17日 | MSP430单片机实践篇---内部FALSH的操作

2021-01-17 来源:eefocus

//******************************************************************************
// 测试MSP430单片机向FLASH中写入操作
//
// 描述; 每次掉电或复位后都能看到数码管上显示的数值增1,说明对flash的写入与读取成功
//
// 注意:修改flash中的内容必须首先执行擦除操作,
// 因为对FLASH的操作只能将1写成0,而不能将0写成1只有擦除才能将0写回1
// 擦除操作至少将擦除1个段
//
// 如果使用其它型号的单片机,只需将头文件改为相应的;
// 并在Option的Target中的device改为相应的cpu即可。
//
// 硬件连接:如下图
// MSP430F13x
// -----------------
// /|| XIN|-
// | | |
// --|RST XOUT|-
// | |
// | P5.0|-->LED_DOUT
// | P5.2|-->LED_CLK
// | P5.4|-->LED_LATCH
//
// 时间:2007年12月
// www.goodmcu.cn
//
// 硬件电路:MSP430F135核心实验板-I型 + TY-DIS1(8位数码管显示模块)
// 硬件连接:
//
// 调试器:MSP430FET全系列JTAG仿真器
// 调试软件: IAR Embedded Workbench Version: 3.41A 编译
//******************************************************************************

#include 

预定义函数//
void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//4位LED数码管显示子程序
void Led_out(unsigned char X);//74HC595串行输出子程序
void A16(unsigned int dd);// 16进制到4位10进制转换
const unsigned char LED_0_F[];//LED数码管段码转换表

void Flash_clr( int *Data_ptr );
void Flash_ww( int *Data_ptr, int word );
void Flash_wb( char *Data_ptr, char byte );

变量定义
unsigned char Buffer[4];

void main(void)
{
char *point,*readaa; // 定义2个指针,分别指向flash和变量aa
char aa;

//初始化IO口用于显示
P5DIR =0; //P5口全部设为输入口
P5SEL =0; //将P5口所有的管脚设置为一般I/O口
P5DIR |= BIT0; //将P5.0 P5.2 P5.4设置为输出方向
P5DIR |= BIT2;
P5DIR |= BIT4;

WDTCTL = WDTPW + WDTHOLD; //停止watchdog
_DINT(); //对FLASH操作之前必须关闭中断

readaa=&aa; //读取变量aa的地址;
//在watch观察窗中可以通过readaa看到aa所在的地址及内容
point=(char*)0xcb10; //设置要读取的flash地址为“0xcb10”
//在watch观察窗中可以通过point看到0xcb10所在地址的内容
*readaa=*point; //将flash数据读入aa
aa=*point; //另一种将flash数据读入aa的方法

aa++;

Flash_clr((int*)0xcb00); //擦除0xcb00所在段,只有擦除才能将0写回1
Flash_wb((char*)0xcb10,aa); //向0xcb10写入新的aa(字节)


while(1)
{
A16(aa);
LED_595(Buffer[0],Buffer[1],Buffer[2],Buffer[3]);
}
}

//***FLASH操作类函数集**********************************************************
//-----------------------------------------------------------------
// Flash_wb
//-----------------------------------------------------------------
// 将1个字节(8 bit)写入到flash memory中
void Flash_wb( char *Data_ptr, char byte )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540; /* WRT = 1 */
*Data_ptr=byte; /* program Flash word */
FCTL1 = 0x0A500; /* WRT = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}
//-----------------------------------------------------------------
// Flash_ww
//-----------------------------------------------------------------
// 将1个字节(16 bits)写入到flash memory中

void Flash_ww( int *Data_ptr, int word )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A540; /* WRT = 1 */
*Data_ptr=word; /* program Flash word */
FCTL1 = 0x0A500; /* WRT = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}
//-----------------------------------------------------------------
// Flash_clr
//-----------------------------------------------------------------
// 擦除1个段的flash memory
void Flash_clr( int *Data_ptr )
{
FCTL3 = 0x0A500; /* Lock = 0 */
FCTL1 = 0x0A502; /* ERASE = 1 */
*Data_ptr=0; /* erase Flash segment */
FCTL1 = 0x0A500; /* ERASE = 0 */
FCTL3 = 0x0A510; /* Lock = 1 */
}

//***显示类函数集***************************************************************
//------------------------------------------------------
// 4位LED数码管显示子程序
//
// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据
//
void LED_595(char SMG1,char SMG2,char SMG3,char SMG4)
{
char z;
//最高位(最左侧)LED数码管显示---------------------
z = LED_0_F[SMG1];
Led_out(z); //段码输出
z = 0xFE; //位码
Led_out(z); //位码输出

P5OUT &=~(BIT4); //显示输出
P5OUT |=BIT4;

//次高位(左数第2个)LED数码管显示---------------------
z = LED_0_F[SMG2];
Led_out(z); //段码输出
z = 0xFD; //位码
Led_out(z); //位码输出

P5OUT &=~(BIT4); //显示输出
P5OUT |=BIT4;

//次低位(左数第3位)LED数码管显示---------------------
z = LED_0_F[SMG3];
Led_out(z); //段码输出
z = 0xFB; //位码
Led_out(z); //位码输出

P5OUT &=~(BIT4); //显示输出
P5OUT |=BIT4;

//最低位(左数第4位)LED数码管显示---------------------
z = LED_0_F[SMG4];
Led_out(z); //段码输出
z = 0xF7; //位码
Led_out(z); //位码输出

P5OUT &=~(BIT4); //显示输出
P5OUT |=BIT4;
}

//------------------------------------------------------
// 用于74HC595的LED串行移位子程序
//
// 人口参数:X——待输出的数据
//
void Led_out(unsigned char X)
{
unsigned char i;
for(i=8;i>0;i--)
{
if (X&0x80) P5OUT |=BIT0; else P5OUT &=~(BIT0);
X<<=1;
P5OUT &= ~(BIT2); //P5.2管脚输出低电平
P5OUT |= BIT2; //P5.2管脚输出高电平
}
}

//------------------------------------------------------ // LED段码转换表0——F //------------------------------------------------------ const unsigned char LED_0_F[] = {// 0 1 2 3 4 5 6 7 8 9 A b c d E F 不显示 - o(18)H(19)h(20)C(21)0(22)n(23) 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8e,0xFF,0xbf,0xa3,0x89,0x8b,0xc6,0xc0,0xab }; 


推荐阅读

史海拾趣

Advanced Interconnections Corp公司的发展小趣事

为了进一步提升国际竞争力,AIC公司开始实施全球化布局战略。公司先后在多个国家设立了研发中心和生产基地,以便更好地服务全球客户。同时,AIC公司还积极参加国际展览和交流活动,与海外企业建立合作关系,推动产品的全球化销售。这些举措使AIC公司的国际影响力不断提升,市场份额也进一步扩大。

统宇电研(Coilmaster)公司的发展小趣事

面对日益激烈的市场竞争,统宇电研不断拓展市场领域,寻求新的增长点。公司积极参与国内外行业展会和论坛,加强与客户的沟通与交流,深入了解市场需求。同时,统宇电研还针对不同地区的市场特点,制定了灵活多样的销售策略和方案。这些努力使得统宇电研的市场份额不断扩大,品牌知名度也逐渐提升。

Carroll & Meynell Transformers Ltd公司的发展小趣事

在电子行业快速发展的背景下,Carroll & Meynell Transformers Ltd公司始终坚持质量第一的原则。公司建立了严格的质量管理体系,从原材料采购到生产加工,再到产品出厂,每一个环节都经过严格的把控。这种对质量的执着追求使得公司的产品在市场上享有很高的声誉。许多客户因为信赖公司的产品质量,而与公司建立了长期稳定的合作关系。

HAHN - Elektrobau GmbH & Co KG公司的发展小趣事

在高通的发展历程中,公司多次面临来自竞争对手的专利纠纷。面对这些挑战,高通积极应诉,通过长达数年的法律斗争,最终捍卫了自己的CDMA创新成果。这些胜利不仅彰显了高通在通信技术领域的深厚积累,也进一步巩固了其在行业中的技术领导地位。高通持续投入大量资源进行研发创新,确保了公司在全球蜂窝通信技术领域的领先地位。

BOWEI公司的发展小趣事

在高通的发展历程中,公司多次面临来自竞争对手的专利纠纷。面对这些挑战,高通积极应诉,通过长达数年的法律斗争,最终捍卫了自己的CDMA创新成果。这些胜利不仅彰显了高通在通信技术领域的深厚积累,也进一步巩固了其在行业中的技术领导地位。高通持续投入大量资源进行研发创新,确保了公司在全球蜂窝通信技术领域的领先地位。

Adaptive Interconnect Electronics, Inc. [AIE]公司的发展小趣事

AIE公司始终将品质管理作为企业发展的核心。公司建立了严格的质量管理体系,从原材料采购到产品生产、销售等各个环节都进行严格的监控和管理。同时,AIE还注重与客户的沟通和反馈,及时了解客户的需求和意见,不断改进产品和服务。这种对品质的执着追求和对客户的尊重赢得了客户的广泛信任和支持。

问答坊 | AI 解惑

新建楼宇防雷电设计

根据5月16日颁布实施的《厦门市建设项目防雷工程设计审核规定(试行)》(以下简称《规定》(试行)),今后所有新建、改建、扩建建设项目在设计审核和竣工验收时,建设方都必须向审核、验收部门提供单独列出的防雷设计专篇。昨日上午,市气象局召 ...…

查看全部问答>

成批量的买件,你习惯去哪里

设计好一套电路板,需要购买器件,大家一般都去哪里买啊,网上还是当地电子市场。派睿,艾睿还是其他的,大家说说啊…

查看全部问答>

nrf905在凌阳61上的问题!!大家帮帮忙!急啊

#include \"SPCE061A.H\" #include \"math.h\" #include \"bit.h\"   //位操作            1.8.4版 #define  uchar  unsigned char #define LED     & ...…

查看全部问答>

SMbus 总线与 I2C总线有什么区别?

同一个设备EEPROM,接在I2C总线上,和连在SM bus上,写驱动时有什么差别吗? 以前写过I2C主控制器的驱动, 现在要写一个SM bus控制器的驱动,二者有什么差别啊? …

查看全部问答>

MMU地址映射问题

各位大侠好! 小弟最近在调试wince5.0的bootloader时遇到了问题,是这样的:cpu是ATMEL9261(926ej-s),在startup.s中没有启用MMU之前程序运行很好!但是当执行完mcr      p15, 0, r1, c1, c0, 0 后,灯也没亮,程序就飞了,请大家赐教 ...…

查看全部问答>

晶振的问题

我用了一个有源的晶阵 是5v电压供电的那一种 输出是ttl电平 可是我下面接了一个非门 可是没有输出啊 是不是驱动能力不构 如何提高呢 感谢啊…

查看全部问答>

关于CCS的限制问题

我的仿真器附带光盘上有一个CCSv4,上面说是32K限制版,这个32K指的是存储器的大小吗?假如我想使用TMS320F28035中的128K的Flash,能用吗?…

查看全部问答>

单电源边双电源?

单电源变双电源的原理是什么?能给个电路吗 6v电池到正负5v的? 谢谢…

查看全部问答>

用51单片机进行控制射进简易计算器

通过Proteus与keil C的方针联调设计一个简易计算器,计算器可实现6位整数的四则运算,由LED数码显示运算数据以及结果,其中出发运算无需实现小数部分。   QQ 261246707欢迎交流 现在编程方面有一些问题 希望大家给点帮助…

查看全部问答>

日企PCB专业LAYOUT工作经验6年,求兼职

本人日企PCB专业LAYOUT工作经验6年,有2-10层基板级设计经验,有丰富EMC、SI,EMI,ESD,PI设计经验,现求兼职PCB LAYOUT,有意请:ximigac@163.com…

查看全部问答>