2012-08-18 15:49:00 weixin_30436891 阅读数 4
  • 《计算机体系结构 硬件篇2》之 存储器

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    2676 人正在学习 去看看 张先凤

一、MSP430单片机FLASH存储器模块特点

1.8~3.6V工作电压,2.7~3.6V编程电压;
擦除/编程次数可达100000次:
数据保持时间从10年到100年不等:
60KB空间编程时间<5秒:
保密熔丝烧断后不可恢复,不能再对JTAG进行任何访问;
FLASH编程/擦除时间由内部硬件控制,无任何软件干预;

二、FLASH存储器的操作

由于FLASH存储器由很多相对独立的段组成,因此可在一个段中运行程序,而对另一个段进行擦除或写入操作。正在执行编程或擦除等操作的FLASH段是不能被访问的,因为这时该段是与片内地址总线暂时断开的。

对FLASH模块的操作可分为3类:擦除、写入及读出。而擦除又可分为单段擦除和整个模块擦除;写入可分为字写入、字节写入、字连续写入和字节连续写入

1.FLASH擦除操作:对FLASH要写入数据,必须先擦除相应的段,对FLASH存储器的擦除必须是整段地进行,可以一段一段地擦除,也可以多端一起擦除,但不能一个字节或一个字地擦除。擦除之后各位为1。擦除操作的顺序如下:

选择适当的时钟源和分频因子,为时序发生器提供正确时钟输入
如果Lock=1,则将它复位
****BUSY标志位,只有当BUSY=0时才可以执行下一步,否则一直****BUSY
如果擦除一段,则设置ERASE=1
如果擦除多段,则设置MERAS=1
如果擦除整个FLASH,则设置RASE=1,同时MERAS=1
对擦除的地址范围内的任意位置作一次空写入,用以启动擦除操作。
在擦除周期选择的时钟源始终有效
在擦除周期不修改分频因子
在BUSY=1期间不再访问所操作的段
电源电压应符合芯片的相应要求

对FLASH擦除要做4件事

对FLASH控制寄存器写入适当的控制位
****BUSY位
空写一次
等待

2.FLASH编程操作。对FLASH编程按如下顺序进行:

选择适当的时钟源和分频因子
如果Lock=1,则将它复位
****BUSY标志位,只有当BUSY=0时才可以执行下一步,否则一直****BUSY
如果写入单字或单字节,则将设置WRT=1
如果是块写或多字、多字节顺序写入,则将设置WRT=1,BLKWRT=1
将数据写入选定地址时启动时序发生器,在时序发生器的控制下完成整个过程

块写入可用于在FLASH段中的一个连续的存储区域写入一系列数据。一个块为64字节长度。块开始在0XX00H、0XX40H、0XX80H、0XXC0H等地址,块结束在0XX3FH、0XX7FH、0XXBFH、0XXFFH等地址。块操作在64字节分界处需要特殊的软件支持,操作如下:

等待WAIT位,直到WAIT=1,表明最后一个字或字节写操作结束
将控制位BLKWRT复位
保持BUSY位为1,直到编程电压撤离FLASH模块
在新块被编程前,等待trcv(编程电压恢复时间)时间

在写周期中,必须保证满足以下条件:

被选择的时钟源在写过程中保持有效
分频因子不变
在BUSY=1期间,不访问FLASH存储器模块

对FLASH写入要做4件事

对FLASH控制寄存器写入适当的控制位
****BUSY位
写一个数据
继续写一直到写完

3.FLASH错误操作的处理:在写入FLASH控制寄存器控制参数时,可引发以下错误:

如果写入高字节口令码错误,则引发PUC信号。小心操作可避免
在对FLASH操作期间读FLASH内容,会引发ACCVFIG状态位的设置。小心操作可避免
在对FLASH操作期间看门狗定时器溢出。建议用户程序在进行FLASH操作之前先停止看门狗定时器,等操作结束后再打开看门狗
所有的FLASH类型的MSP430器件0段都包含有中断向量等重要的程序代码,如果对其进行擦除操作,将会引起严重的后果
不要在FLASH操作期间允许中断的发生

4.FLASH操作小结

对FLASH的操作是通过对3个控制字中的相应位来完成的,只有控制位的唯一组合才能实现相应的功能。下表给出了正确的控制位组合:

功能

BLKWRT WRT Meras Erase BUSY WAIT

Lock

字或字节写入 0 1 0 0 0 0 0
块写入 1 1 0 0 0 1 0
段擦除并写入 0 0 0 1 0 0 0
擦除A和B以外段 0 0 1 0 0 0 0
全部擦除并写入 0 0 1 1 0   0

三、FLASH寄存器说明

允许编程、擦除等操作首先要对3个控制寄存器(FCTL1、FCTL2、FCTL3)的各位进行定义。它们使用安全键值(口令码)来防止错误的编程和擦除周期,口令出错将产生非屏蔽中断请求。安全键值位于每个控制字的高字节,读时为96H,写时为5AH。

1.FCTL1 控制寄存器1(用于控制所有写/编程或者删除操作的有效位),各位定义如下:

15~8 7

6

5

4

3

2

1

0

安全键值,读时为96H,写时为5AH BLKWRT WRT 保留 MERAS ERASE  

BLKWRT——段编程位。如果有较多的连续数据要编程到某一段或某几段,则可选择这种方式,这样可缩短编程时间。在一段程序完毕,再编程其它段,需对该位先复位再置位,在下一条写指令执行前WAIT位应为1。

0:未选用段编程方式
1:选用段编程方式

WRT——编程位

0:不编程,如对FLASH写操作,发生非法访问,使ACCVIFG位置位;
1:编程

MERAS——主存控制擦除位

0:不擦除
1:主存全擦除,对主存空写时启动擦除操作,完成后MERAS自动复位

ERASE——擦除一段控制位

0:不擦除
1:擦除一段。由空写指令带入段号来指定擦除哪一段,操作完成后自动复位

2.FCTL2 控制寄存器2(对进入时序发生器的时钟进行定义),各位定义如下:

15~8 7

6

5

4

3

2

1

0

安全键值,读时为96H,写时为5AH SSEL1 SSEL0 FN5 FN4 FN3 FN2 FN1 FN0

SSEL1、SSEL0——选择时钟源

0:ACLK
1:MCLK
2:SMCLK
3:SMCLK

FN5~FN0——分频系数选择位

0:直通
1:2分频
2:3分频
......
63:64分频

3.FCTL3 控制寄存器3(用于控制FLASH存储器操作,保存相应的状态标志和错误条件),各位定义如下:

15~8 7

6

5

4

3

2

1

0

安全键值,读时为96H,写时为5AH     EMEX Lock WAIT ACCVIFG KEYV BUSY

EMEX——紧急退出位。对FLASH的操作失败时使用该位作紧急处理

0:无作用
1:立即停止对FLASH的操作

Lock——锁定位,给已经编程好的FLASH存储器加锁

0:不加锁,FLASH存储器可读、可写、可擦除
1:加锁,加锁的FLASH存储器可读、不可写、不可擦除

WAIT——等待指示信号,该位只读。

0:段编程操作已经开始,编程操作进行中
1:段编程操作有效,当前数据已经正确地写入FLASH存储器,后续编程数据被列入计划

ACCVIFG——非法访问中断标志。当对FLASH阵列进行编程或擦除操作时不能访问FLASH,否则将使得该位置位

0:没有对FLASH存储器的非法访问
1:有对FLASH存储器的非法访问

KEYV——安全键值(口令码)出错标志位

0:对3个控制寄存器的访问,写入时高字节是0A5H
1:对3个控制寄存器的访问,写入时高字节不是0A5H,同时引发PUC信号
KEYV不会自动复位,须用软件复位

BUSY——忙标志位。该位只读。每次编程或擦除之前都应该检查BUSY位。当编程或擦除启动后,时序发生器将自动设置该位为1,操作完成后BUSY位自动复位

0:FLASH存储器不忙
1:FLASH存储器忙

转载于:https://www.cnblogs.com/sky1991/archive/2012/08/18/2645529.html

2008-08-21 21:20:00 fightsqlee 阅读数 829
  • 《计算机体系结构 硬件篇2》之 存储器

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    2676 人正在学习 去看看 张先凤
AVR 系列单片机内部有三种类型的被独立编址的存储器,它们分别为:Flash 程序存储器、内部SRAM 数据存储器和EEPROM 数据存储器。
    Flash 存储器为1K~128K 字节,支持并行编程和串行下载,下载寿命通常可达10,000 次。由于AVR 指令都为16 位或32 位,程序计数器对它按字进行寻址,因此FLASH 存储器按字组织的,但在程序中访问 FLASH 存储区时专用指令LPM 可分别读取指定地址的高低字节。
    寄存器堆(R0~R31)、I/O 寄存器和SRAM 被统一编址。所以对寄存器和I/O 口的操作使用与访问内部SRAM 同样的指令。32 个通用寄存器被编址到最前,I/O 寄存器占用接下来的64 个地址。从0X0060 开始为内部SRAM。外部SRAM 被编址到内部SRAM 后。
    AVR 单片机的内部有64~4K 的EEPROM 数据存储器,它们被独立编址,按字节组织。擦写寿命可达100,000 次。

1. I/O 寄存器操作
    I/O 专用寄存器(SFR)被编址到与内部SRAM 同一个地址空间,为此对它的操作和SRAM 变量操作类似。
    SFR 定义文件的包含:
    #include <avr/io.h>
    io.h 文件在编译器包含路径下的avr 目录下,由于AVR 各器件间存在同名寄存器地址有不同的问题,io.h 文件不直接定义SFR 寄存器宏,它根据在命令行给出的 –mmcu 选项再包含合适的 ioxxxx.h 文件。在器件对应的ioxxxx.h 文件中定义了器件SFR 的预处理宏,在程序中直接对它赋值或引用的方式读写SFR,如:
    PORTB=0XFF;
    Val=PINB;
    从io.h 和其总包含的头文件sfr_defs.h 可以追溯宏PORTB 的原型在io2313.h 中定义:
    #define PORTB _SFR_IO8(0x18)
    在sfr_defs.h 中定义:
    #define _SFR_IO8(io_addr) _MMIO_BYTE((io_addr) + 0x20)
    #define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
    这样PORTB=0XFF; 就等同于 *(volatile unsigned char *)(0x38)=0xff;
0x38 在器件AT90S2313 中PORTB 的地址对SFR 的定义宏进一步说明了SFR 与SRAM 操作的相同点。
    关键字volatile 确保本条指令不会因C 编译器的优化而被省略。

2. SRAM 内变量的使用
    一个没有其它属性修饰的 C 变量定义将被指定到内部SRAM,avr-libc 提供一个整数类型定义文件inttype.h,其中定义了常用的整数类型如下表:
    定义值长度(字节) 值范围
    int8_t 1 -128~127
    uint8_t 1 0~255
    int16_t 2 -32768~32767
    uint16_t 2 0~65535
    int32_t 4 -2147483648~2147483647
    uint32_t 4 0~4294967295
    int64_t 8 -9.22*10^18~-9.22*10^18
    uint64_t 8 0~1.844*10^19
    根据习惯,在程序中可使用以上的整数定义。定义、初始化和引用
如下示例:
    uint8_t val=8; 定义了一个SRAM 变量并初始化成8
    val=10; 改变变量值
    const uint8_t val=8; 定义SRAM 区常量
    register uint8_t val=10; 定义寄存器变量
3. 在程序中访问FLASH 程序存储器
    avr-libc 支持头文件:pgmspace.h
    #include < avr/pgmspace.h >
    在程序存储器内的数据定义使用关键字 __attribute__((__progmem__))。在pgmspace.h
中它被定义成符号 PROGMEM。
(1). FLASH 区整数常量应用
定义格式:
数据类型 常量名 PROGMEM = 值 ;
如:
char val8 PROGMEM = 1 ;
int val16 PROGMEM = 1 ;
long val32 PROGMEM =1 ;
对于不同长度的整数类型 avr-libc 提供对应的读取函数:
pgm_read_byte(prog_void * addr)
pgm_read-word(prg_void *addr)
pgm_read_dword(prg_void* addr)
    另外在pgmspace.h 中定义的8 位整数类型 prog_char prog_uchar 分别指定在FLASH 内的8 位有符号整数和8 位无符号整数。应用方式如下:
char ram_val; //ram 内的变量
const prog_char flash_val = 1; //flash 内常量
ram_val=pgm_read_byte(&flash_val); //读flash 常量值到RAM 变量
    对于应用程序FLASH 常量是不可改变的,因此定义时加关键字const 是个好的习惯。
(2). FLASH 区数组应用:
定义:
const prog_uchar flash_array[] = {0,1,2,3,4,5,6,7,8,9}; //定义
另外一种形式
const unsigned char flash_array[] RROGMEM = {0,1,2,3,4,5,6,7,8,9};
读取示例:
unsigend char I, ram_val;
for(I=0 ; I<10 ;I ++) // 循环读取每一字节
{
ram_val = pgm_read_byte(flash_array + I);
… … //处理
}
(3).FLASH 区字符串常量的应用
全局定义形式:
const char flash_str[] PROGMEM = “Hello, world!”;
函数内定义形式:
const char *flash_str = PSTR(“Hello, world!”);
以下为一个FLASH 字符串应用示例
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdio.h>
const char flash_str1[] PROGMEM = “全局定义字符串”;
int main(void)
int I;
char *flash_str2=PSTR(“函数内定义字符串”);
while(1)
{
scanf(“%d”,&I);
printf_P(flash_str1);
printf(“/n”);
printf_P(flash_str2);
printf(“/n”);
}
}
4. EEPROM 数据存储器操作
    #include <avr/eeprom.h>
    头文件声明了avr-libc 提供的操作EEPROM 存储器的API 函数。
    这些函数有:
eeprom_is_ready() //EEPROM 忙检测(返回EEWE 位)
eeprom_busy_wait() //查询等待EEPROM 准备就绪
uint8_t eeprom_read_byte (const uint8_t *addr) //从指定地址读一字节
uint16_t eeprom_read_word (const uint16_t *addr) //从指定地址一字
void eeprom_read_block (void *buf, const void *addr, size_t n) //读块
void eeprom_write_byte (uint8_t *addr, uint8_t val) //写一字节至指定地址
void eeprom_write_word (uint16_t *addr, uint16_t val) //写一字到指定地址
void eeprom_write_block (const void *buf, void *addr, size_t n)//写块
在程序中对EEPROM 操作有两种方式
方式一:直接指定EERPOM 地址
示例:

#include <avr/io.h>
#include <avr/eeprom.h>
int main(void)
{
unsigned char val;
eeprom_busy_wait(); //等待EEPROM 读写就绪
eeprom_write_byte(0,0xaa); //将0xaa 写入到EEPORM 0 地址处
eeprom_busy_wait();
val=eeprom_read_byte(0); //从EEPROM 0 地址处读取一字节赋给RAM 变量val
while(1);
}
方式二:先定义EEPROM 区变量法
示例:
#include <avr/io.h>
#include <avr/eeprom.h>
unsigned char val1 __attribute__((section(".eeprom")));//EEPROM 变量定义方式
int main(void)
{
unsigned char val2;
eeprom_busy_wait();
eeprom_write_byte (&val1, 0xAA);
eeprom_busy_wait();
val2 = eeprom_read_byte(&val1);
while(1);
}
    在这种方式下变量在EEPROM 存储器内的具体地址由编译器自动分配。相对方式一,数据在EEPROM 中的具体位置是不透明的。为EEPROM 变量赋的初始值,编译时被分配到.eeprom 段中,可用avr-objcopy 工具从.elf 文件中提取并产生ihex 或binary 等格式的文件。
2006-10-23 16:52:20 tuyerv 阅读数 5
  • 《计算机体系结构 硬件篇2》之 存储器

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    2676 人正在学习 去看看 张先凤
摘要:介绍了AM29F010B的编程要求,结合M68HC11上电自动引导功能,针对发动机控制单元设计中编程的问题,提供了一种Flash存储器在系统编程的方案,并给出了相应环节的程序流程图和部分操作的程序示例。笔者将该方法应用于发动机控制系统中,实现了将程序代码在线写入Flash存储器的功能。

      关键词:在系统编程;Flash存储器;M68HC11;上电引导

      随着排放法规的加严,发动机电子控制单元(ECU)成为了现代汽车中一个必备部分。在发动机控制单元这种单片机系统中,Flash存储器已成为其一个基本配置,主要用来存放控制程序代码。
 
      将程序代码装入Flash存储器的方法有3种:第1种方法是要求供应商在存储器发货前将数据写入,但无法满足产品开发阶段修改程序的要求;第2种方法是使用编程器编程,但由于Flash存储器正在向小型化、贴片式发展,从而使Flash存储器难以利用编程器编程;第3种方法是将存储器安装到电路板上进行编程,即在系统编程(In System Programming,ISP),这种编程方式是通过系统的微处理器实现对Flash存储器的编程,不需要其他编程设备和附加编程电源,具有灵活、方便的优点。 因此,在设计发动机控制单元时,结合M68HC11上电引导程序设计实现了存储器AM29F010B的在系统编程。

      1 Flash存储器的在系统编程技术
 
      AM29F010B是AMD公司生产的Flash存储器,这种Flash存储器编程简单。此芯片仅需5V单电源供电便可使内部产生高电压进行编程和擦除操作。用户只需向其命令寄存器写入标准的微处理器指令,具体编程、擦除操作便由内部电路实现。

      在编写程序时需要注意,由于只有擦除指令能使“0”变为“1”,擦除结果为“1”;而编程指令不能使“0”写为“l”,所以用户在进行Flash存储器编程时,应先擦除,再进行编程。

      2 M68HC11与上电引导模式(Bootstrap Mode)

      M68HC11是由Motorola公司推出的微处理芯片(Microcontroller Unit,MCU),由于其优越的性能,目前在发动机控制领域有着广泛地使用。M68HC11具有一种上电引导模式,使得用户程序可以通过串行接口(SCI)下载到内部的RAM区中,然后将M68HC11转到用户程序中执行。下载的程序可以像任何普通用户程序一样运行。虽然上电引导模式是一种单芯片模式,但是在这种模式下可以改变模式控制字,因此同样可以访问外部资源。

      硬件的模式选择通过MCU复位时MODA和MODB管脚进行控制,MODA和MODB的逻辑状态在RESET管脚电平变高之前被锁存。当RE2SET管脚变高后,模式选择管脚对MCU的运行模式不再起作用。复位时如果MODA和MODB管脚全为低电平,则MCU进入上电引导模式。

      3 在系统编程的实现

      3.1 硬件方案

      为了通过M68HC11对AM29F010B进行在系统编程,除了基本组件的设计之外,本系统在硬件方面做了以下准备:

      1)为了能够从计算机上下载程序代码,即与计算机进行通讯,本系统设计了MAX232进行TTL电平和RS232电平的转换;

      2)为了使MCU开机或者复位能够进入上电引导模式,需要在MODA和MODB管脚处设计跳线,使复位时为低电平。硬件方案简图见图1。

061023165148.jpg


 

图1 硬件方案

      3.2 在系统编程的软件方案

      当单片机复位进入上电引导模式后,会自动进行串口的初始化等操作,然后通过串口接收程序,放到RAM内,并自动跳到此程序执行。设计中依靠这个程序实现对外部Flash存储器的编程。

      3.2.1 单片机程序

      此程序需要下载到M68HC11内部RAM中,在引导程序完成后开始执行。在本系统中用于实现与计算机继续通讯接收程序代码,并且用接收的代码对外部Flash存储器AM29F010B进行编程。
 
      程序的执行过程为1)进行初始化操作;2)等待开始字节“W”;3)等待编程开始地址;4)擦除Flash EPROM,并发送擦除后的地址FFFE和FFFF处数据;5)接收二进制数据,执行编程操作;6)发送AA表明编程成功,并开始执行外部程序。由于M68HC11的RAM只有256个字节,因此程序用汇编语言进行编写,下面是其中几个子程序。

      /3初始化,程序在RAM地址中存放,将单片切换到扩展模式,并设置波特率96003/ 
      ORG$0 
      START LDS #$FF 
      LDX #$1000 
      BSET hprio,X,#00100000B 
      BCLR hprio,X,#00010000B 
      BCLR hprio,X,#01000000B 
      LDAA #00110000B 
      STAA BAUD 
      /3片擦除子程序3/ 
      ERASE_FLASH  ldab   #$AA 
      stab  $555 
      ldab  #$55 
      stab  $2AA 
      ldab  #$80 
      stab  $555 
      ldab  #$AA 
      stab  $555 
      ldab  #$55 
      stab  $2AA 
      ldab  #$10 
      stab  $555 
      rts 
      /3编程子程序3/ 
      FlashProgByte  ldab  #$AA 
      stab  $555 
      ldab  #$55 
      stab  $2AA 
      ldab  #$A0 
      stab  $555 
      staa  X

      这是根据AM29F010B编程的时序要求编写的程序,其时序见表1、表2。

 

      3.2.2 计算机程序

      计算机程序的任务是负责与单片机系统进行通讯,把要在单片机RAM内运行的用户程序代码和需要装入Flash存储器内的代码传给单片机系统,并监视单片编程过程的执行,及时反馈编程信息。

      在本系统中采用C语言进行计算机编程,由于单片机上电引导程序需要的数据信息是二进制格式,因此根据上面的汇编程序编译后的结果制作一个数据数组,每1个单元存放1个字节的数据。
 
      关于监视单片机的编程过程,本系统没有采用复杂的状态位检查机制,而是采用了一种简单的方法。当单片机对1个地址写入数据后再读出其中内容,如果与原来数据不同,则在此处反复执行读操作。计算机程序发出数据后便监视串口,如果一定时间内在串口处没有返回数据,则视为超时,编程失败。计算机程序流程见图2。

 

      图2 计算机程序流程图

      4 结束语
 
      本文结合M68HC11上电引导功能,介绍了利用在系统编程技术将程序代码编写到Flash存储器中的方法,给出了相应环节的程序流程图和部分操作的程序示例。将这种方法应用在发动机控制系统的开发中,使得编程非常方便,加快了项目的进度,缩短了开发的周期。相信这种方法在其他领域也可以得到广泛地应用。

2015-12-24 21:52:19 ls667 阅读数 3039
  • 《计算机体系结构 硬件篇2》之 存储器

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    2676 人正在学习 去看看 张先凤

存储器分为程序存储器(ROM)和数据存储器(RAM),两种又都可以分为片内和片外,片外即需要自己在单片机外部扩展。

8051单片机的片内程序存储器有4K,片内数据存储器有256个字节,其中又分为高128字节位特殊功能寄存器区,真正用户能用的RAM只有低128字节。

8052单片机有8K片内程序存储器,而数据存储器除了低128字节外还有扩展的高128字节,地址上跟特殊功能寄存器一样,但物理上是独立的,寻址方式不一样,扩展的高128字节只能间接寻址。


Keil中变量的存储类型:

存储类型

说明

code

程序空间(无需改变的变量)

data

直接访问的内部数据存储器(速度最快)

idata

间接访问的内部数据存储器(可以访问全部256字节RAM)

bdata

可位寻址的内部数据存储器

xdata

外部数据寄存器(最大64K)

pdata

分页的外部数据寄存器(最大256字节,少用)

【如无使用关键字,系统则按默认处理(根据存储模式)】

Keil中的存储模式:

存储模式

说明

Small

变量默认为data型,最大128字节

Compare

变量默认为pdata型,最大256字节

Large

变量默认为xdata型,最大64K

Keil中设置如下图:



我们平常使用的STC单片机,有很多型号,具体存储器大小都要看型号:


【89/90系列的机器周期需要12个或6个时钟周期】


【12/15系列的机器周期只需要1个时钟周期】


51单片机上的FFT算法

最近用增强型51单片机做了一个简易的点阵音乐频谱显示器,最主要是自己刚学完信号处理课程,想自己写一个FFT算法。现将已经能够在51单片机上运行的FFT算法供需要的伙伴们参考。

在51单片机上运行FFT算法,需要注意一下几点:

由于51单片机的内存RAM很小,只有128字节,52有256字节,而16点的浮点数输入,就需要2*4*16=128字节的内存开销,所以只有256字节的做多只能做16点的FFT运算。而且必须要用idata定义才能将其定义在高128字节。所以要做16点以上的FFT运算,必须选用有内部扩展RAM的51系列单片机,然后用xdata定义,并且要将存储模式设为LARGE模式。


2018-01-19 14:17:20 a1172483384 阅读数 625
  • 《计算机体系结构 硬件篇2》之 存储器

    第一阶段:《计算机体系结构》课程 分成4篇:分别是硬件篇,软件篇,网络篇,行业篇 第二阶段:《嵌入式技术》课程 分成5部分:Linux基础,C语言基础,C语言,Linux系统编程/网络编程,8051单片机,单片机,linux嵌入式,安卓,项目

    2676 人正在学习 去看看 张先凤

存储器分类如下:

单片机变量存储如下:


单片机,存储器,RAM,ROM,FLASH

博文 来自: ggggfjeicfh

[转]MSP430之FLASH

阅读数 676

没有更多推荐了,返回首页