之前一直用ARM 系列的單片機,現在因為產品需要,用了一款合泰單片機(HT67F2360),整個開發過程中發現還是有很多差異。
一、開發環境中的一些差異#
arm 系列單片機,直接用keil 接 選用的芯片就可以編譯,調試,燒錄。而這款合泰單片機,ht-ide 是不能直接燒錄芯片的,ht-ide 只能將程序燒錄到專門的仿真開發板中,仿真開發板有兩個板子,母板加子板,不同系列的單片機,選用不同的子板仿真。悲劇>的是,我沒有開發仿真板。程序調通了,要通過官方的提供的燒錄工具hope3000 for e-link,將mtp文件燒錄到具體的芯片中。找了好久沒找到hope3000的命令行工具,每次燒錄,都要點擊好幾次鼠標:選擇文件,選擇電壓,下載,效率不太高。
二、編譯器,連接器的一些差異
- HIT-IDE 的編譯器有三個版本分別是V1,V2,V3。這三個版本的區別,不僅僅是性能上的差異,還有很多語言支持上的差異。
- 三個版本的編譯器,C語言的基本數據類型的Size(bit)互相之間會有不一致。並且無論哪個版本跟ANSI C都不完全一致。
- 對中斷函數的支持的差異。V1 不支持中斷處理函數調用函數。V2,V3支持中斷處理函數調用函數,但是被調用的函數必須定義為#pragma nolocal ,並且中斷調用的函數不能和main 中調用同一個函數,中斷之間也不能調用同一個函數(包括間接調用),否則會造成RAM 空間重疊使用。
- V1 V2不支持靜態變量,V3支持。
- 默認情況下,未初始化的全局變量不初始化為0。如果需要,要在工程編譯選項中勾選。
- 默認情況下,enum 類型的不是byte。
三、存儲器和間接尋址
- 這款單片機,沒有一個統一的虛擬地址空間用來表示所有的存儲器地址。
- 存儲器包括:Flash 程序存儲器,數據存儲器,特殊功能寄存器,EEPROM 數據存儲器。
- 數據存儲器被分為若干個Sector,操作不同的數據存儲器,要切換到不同的Sector。
- 例如LCD 存儲器地址位於Sector 4中,要操作LCD 存儲器,要先切換Sector,然后通過間接尋址方式操作存儲單元。
- EEPROM 數據存儲器獨立於程序存儲器和數據存儲器,不能像其他類型的存儲器一樣尋址。
- 地址寄存器EEA , 數據寄存器EED,控制寄存器EEC 三個寄存器用來控制內部EEPROM 數據存儲器的操作。
- EEA 和EED 位於Sector 中,可以直接訪問。而EEC位於Sector1中,要通過間接的方式訪問。
四、示例代碼#
LCD 存儲器寫操作 example
void lcd_write_mem(uint8_t addr,uint8_t val)
{
_mp1h = 0x04; //sector
_mp1l = addr;
_iar1 = val;
_mp1h = 0x00;
}
EEPROM 存儲器操作接口 example:
uint8_t eeprom_read_byte(uint8_t addr)
{
uint16_t i = 0;
//間接訪問_eec
_mp1l = 0x40;
_mp1h = 0x01;
_eea = addr;
_iar1 |= 0x02; // _rden = 1;
_iar1 |= 0x01; // _rd = 1
_emi = 1;
while ( (_iar1 & 0x01) && (i++ < 1000))
GCC_DELAY(100);
_iar1 &= 0xFD;
_mp1l = 0x00;
_mp1h = 0;
return _eed;
}
void eeprom_write_byte(uint8_t addr,uint8_t data)
{
uint16_t i = 0;
_emi = 0;
//間接訪問_eec
_mp1l = 0x40;
_mp1h = 0x01;
_eea = addr;
//_eea = addr;
_eed = data;
_iar1 |= 0x08; // _wren = 1;
_iar1 |= 0x04; // _wr = 1
_emi = 1;
// wait _wr
while ( (_iar1 & 0x04) && (i++ < 1000))
GCC_DELAY(100);
_mp1l = 0x00;
_mp1h = 0;
_iar1 &= 0x7; //_wren = 0
_emi = 1;
}