全球主流8位MCU芯片詳細解剖No.1:飛思卡爾 MC9S08AC60
后臺/模式選擇(BKGD/MS)
在復位時,BKGD/MS 引腳充當模式選擇引腳。復位完成后,該引腳立即作為后臺引腳,可以用于后臺調(diào)試通信。當作為后臺/模式模式選擇引腳時, 該引腳包括一個內(nèi)部上拉器件,有輸入滯后,且無輸出斜率控制。當引腳作為后臺引腳時,它包括一個高電流輸出驅(qū)動。當該引腳作為模式選擇引腳時,它只有輸入,因此不包含標準的輸出驅(qū)動。
ADC 參考引腳(VREFH, VREFL)
VREFH和VREFL 引腳分別為ADC模塊的電壓參考高輸入和電壓參考低輸入。
外部中斷引腳 (IRQ)
IRQ 引腳是IRQ中斷的輸入源,也是BIH 和BIL指令的輸入。如果未使能IR功能,這個引腳仍配置為TPMCLK 。
通用I/O和外設端口
剩余的引腳被通用I/O和片上外設功能,如定時器和串行I/O系統(tǒng)共用。復位后,所有這些引腳立即配置為高阻抗通用輸入,且內(nèi)部上拉器件關閉。
重要模塊分析
存儲器
MC9S08AC60系列MCU中的片上存儲器包括RAM、非易失性數(shù)據(jù)存儲的Flash存儲器、I/O 和控制/ 狀態(tài)寄存器。這些寄存器可分為以下三類:
• 直接頁面寄存器
• 高位頁面寄存器
• 非易失性寄存器
復位、中斷和系統(tǒng)配置
復位和中斷特性包括:
• 多源復位,實現(xiàn)靈活的系統(tǒng)配置和可靠操作
• 加電檢測(POR)
• 低壓檢測(LVD),使能
• 外部RESET 引腳
• COP 看門狗使能,及兩個超時選擇
• 非法操作代碼
• 來自后臺調(diào)試主機的串行命令
• 復位狀態(tài)寄存器(SRS) ,指示最新復位的源
• 每個模塊的單獨中斷向量 (減少輪詢開銷)
并行輸入 / 輸出
通過端口數(shù)據(jù)寄存器讀/ 寫并行I/O。輸入輸出方向由端口數(shù)據(jù)方向寄存器控制。下面的結構圖舉例了一個引腳的并行I/O端口功能。
中央處理單元 (S08CPUV2)
HCS08 CPU具有以下特性:
• 目標代碼完全兼容M68HC05和M68HC08家族
• 所有寄存器和存儲器映射到一個獨立的64 KB的地址空間
• 16位堆棧指針 (64 K字節(jié)地址空間內(nèi)任意大小、任意地址的堆棧)
• 16位變址寄存器 (H:X)支持強大的索引地址模式
• 8位累加器 (A)
• 許多指令把X作為第二個通用8位寄存器
• 7種尋址模式:
• 固有尋址模式 — 操作數(shù)存于內(nèi)部寄存器
• 相對尋址模式 —8位有符號偏移量的分支地址
• 立即尋址模式 — 操作數(shù)位于下一個目標代碼
• 直接尋址模式 — 操作數(shù)位于0x0000到0x00FF之間
• 擴展尋址模式 — 操作數(shù)位于64K字節(jié)地址空間內(nèi)
• H:X相對變址尋址模式 — 提供包括自動增量在內(nèi)的5種子模式
• SP相對變址尋址模式 — 大大提高C語言編譯的效率
• 提供四種尋址模式組合的寄存器-寄存器數(shù)據(jù)轉(zhuǎn)移指令
• 溢出、半進位、負、零和進位狀況碼支持根據(jù)帶符號、無符號、BCD碼操作的結果進行條件轉(zhuǎn)移
• 高效率的位操作指令
• 快速8位乘8位和16位除8位指令
• STOP和WAIT指令調(diào)用低功耗運行模式
模數(shù)轉(zhuǎn)換器(S08ADC10V1)
10位模數(shù)轉(zhuǎn)換器 (ADC)是新一代的逼近模數(shù)轉(zhuǎn)換器,在集成的微處理器片上系統(tǒng)中運行。 這種ADC模塊設計支持最高28個獨立的模擬輸入 (AD0-AD27)。MC9S08AC60系列微處理器上只使用了其中18個(AD0-AD15、AD26和AD27)輸入。這些輸入通過ADCH位選擇。
ADC模塊特點包括:
• 線性逐次逼近算法,10位精度。
• 多達28個模擬輸入。
• 8位或10位右對齊格式輸出
• 單個或連續(xù)的轉(zhuǎn)換 (單個轉(zhuǎn)換后自動返回到空閑)
• 設置采樣時間和轉(zhuǎn)換速度 (功率)
• 轉(zhuǎn)換完成標志和中斷
• 輸入時鐘可以選擇高達四個時鐘源
• 在等待或stop3模式中操作為低噪音操作
• 異步時鐘源的低噪音操作
• 可選的異步硬件轉(zhuǎn)換觸發(fā)
• 自動比較小于,大于或等于編程值
• 溫度傳感器
時鐘顯示程序
使用MC9S08AC的Timer做一個時鐘,并在LCD1602上顯示
lcd1602.h
#ifndef _NICROSYSTEM_FREESCALE_S08_DEVKIT_LCD1602_H_
#define _NICROSYSTEM_FREESCALE_S08_DEVKIT_LCD1602_H_
unsigned char lcd_status(void);
void lcd_init(void);
void lcd_write_char(unsigned char x,unsigned char y, unsigned char ch);
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s);
void lcd_write_data(unsigned char data);
void lcd_write_cmd(unsigned char cmd);
#endif
lcd1602.c
#include "lcd1602.h"
#include "derivative.h"
#define LCD_DATA PTED
#define LCD_DATA_DIR PTEDD
#define LCD_DATA_DS PTEDS
#define LCDRS PTAD_PTAD0
#define LCDRW PTAD_PTAD1
#define LCDE PTBD_PTBD0
#define LCDRS_DIR PTADD_PTADD0
#define LCDRW_DIR PTADD_PTADD1
#define LCDE_DIR PTBDD_PTBDD0
#define LCDE_DS PTBDS_PTBDS0
#define LCDRS_DS PTADS_PTADS0
#define LCDRW_DS PTADS_PTADS1
void lcd_clear(void);
void lcd_write_cmd(unsigned char cmd);
void init_lcd() {
LCD_DATA_DIR=0xff;
LCDRS_DIR=1;
LCDRW_DIR=1;
LCDE_DIR=1;
LCDRS_DS=1;
LCDRW_DS=1;
LCDE_DS=1;
LCD_DATA_DS=0xff;
LCD_DATA=0;
LCDE=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
lcd_clear();
lcd_write_cmd(0x38);//設置lcd功能:8位總線,雙行顯示,5X7點陣字符
lcd_write_cmd(0x0f);//顯示開關控制:顯示ON,光標ON,閃爍ON
lcd_write_cmd(0x06);//光標輸入方式增量移位
lcd_write_cmd(0x80);
}
unsigned char lcd_status() {
byte lcdstatus;
LCD_DATA_DIR=0x00;
LCDRS=0;
LCDRW=1;
LCDE=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
LCDE=1;
lcdstatus=LCD_DATA;
LCD_DATA_DIR=0xff;
return lcdstatus;
}
void lcd_write_cmd(unsigned char cmd) {
byte status;
LCD_DATA=cmd;
LCDRS=0;
LCDRW=0;
LCDE=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
do{
status=lcd_status();
}
while(status&0x80);
LCDE=1;
}
void lcd_clear(void) {
lcd_write_cmd(0x01);
}
void lcd_write_data(unsigned char data) {
byte status;
LCD_DATA=data;
LCDRS=1;
LCDRW=0;
LCDE=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
do{
status=lcd_status();
}
while(status&0x80);
LCDE=1;
}
評論