定義SRAM區常量與變數的定義基本相同,在前面加上const
const uint_t s_val = 0x01;
Falsh區的整數變數的定義如下: 資料類型 變數名 PROGMEM = 值
由於FLASH的變數是不能改變的,因此最好在定義時加上const,其實FLASH區變數應叫FALSH區常量可能更合適, 我喜歡叫FLASH常數.
const uint8_t f_val PROGMEM = 0x01;
應用(讀取)方面,SRAM常量直接使用即可: 例: PORTB = s_val;
對於Flash區的常數的讀取,用avr_libc的<avr/pgmspace.h>提供的讀取函數:
#define pgm_read_byte(address_short) pgm_read_byte_near(address_short)
#define pgm_read_word(address_short) pgm_read_word_near(address_short)
#define pgm_read_dword(address_short) pgm_read_dword_near(address_short
定義及讀取測試代碼如下:
//M48,晶振11.0692M
//程式運行後,PD0及PD7交替閃亮
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
const uint8_t s_val = 0x01; //定義SRAM區常量
const uint8_t f_val PROGMEM = 0x80; //定義FLASH區常量
int main(void)
{
int i;
DDRD = 0xFF;
while(1)
{
PORTD = s_val;
for (i=0; i<50; i++)
_delay_ms(10);
PORTD = pgm_read_byte(&f_val);
for (i=0; i<50; i++)
_delay_ms(10);
}
}
從編譯後得到的LSS檔可知,SRAM區常量,也是存放在FALSE中,但程式啟動代碼段複製到SRAM中,在程式運行時讀取的是SRAM中的資料
而FLASH區常量,自始至終一直都在FLASH區中,由於AVR單片機是屬於哈佛結構,定義在FLASH中的常量也就不能用SRAM中的常量資料的
讀取方法了,也就是說FLASH中的常量與SRAM中的常量,在讀取時應當注意之間的區別.
沒有留言:
張貼留言
注意:只有此網誌的成員可以留言。