STM8系列是意法半導體公司生產的8位的單片機。該型號單片機分為STM8A、STM8S、STM8L三個系列。
STM8芯片特點
內核
高級STM8內核,具有3級流水線的哈佛結構
擴展指令集
存儲器
程序存儲器:8K字節Flash;10K 次擦寫后在55°C環境下數據可保存20年
數據存儲器:640 字節真正的數據
EEPROM;可達30萬次擦寫
RAM:1K字節
中斷控制器功能:
● 硬件中斷的管理
─ 所有I/O引腳都具有外部中斷能力,每一個端口都有獨立的中斷向量以及獨立的標志。
─ 外設中斷能力
● 軟件中斷的管理(TRAP)
● 具有靈活的優先級和中斷等級管理,支持可嵌套的或同級中斷管理:
– 多達4個軟件可編程的嵌套等級
– 最多有32個中斷向量,其入口地址由硬件固定
– 2 不可屏蔽的事件: RESET, TRAP – 1個不可屏蔽的最高優先級的硬件中斷
串口接收中斷程序:
;串口接收一個字符,并將其返回上位機
BUF EQU 40H
BUZZER EQU P3.4
FLAGR EQU 20H.1
ORG 8000H ; 實驗板開始執行的第一條指令所處的地址
LJMP MAIN ; 跳轉到主程序
ORG 8023H ;中斷程序入口
LJMP SINT ORG 8100H ; 主程序開始的地址;避開中斷入口地址
MAIN: MOV SP, #0D0H ;設置堆棧起始地址
CLR FLAGR MOV BUF,#00H MOV SCON,#50H ;設置串口工作模式1,允許接受控制
MOV PCON,#00H ;SMOD=0
MOV TMOD,#20H ;設置定時器1工作模式2
MOV TH1,#0FDH ;置定時器初值,設定比特率9600bps
MOV TL1,#0FDH SETB ES ;允許串口中斷
SETB EA
SETB TR1 ;啟動定時器
LOOP1: JNB FLAGR,$ ;等待接收字符
LCALL RING ;接收到字符,響鈴提示
CLR FLAGR AJMP LOOP1
;========================================響鈴
RING: CLR BUZZER
LCALL TMS1
LCALL TMS1
SETB BUZZER
RET
;========================================延時100ms
TMS1: MOV R6, #0F0H ; 給R6和R7賦初值,在12Hz晶振時延時時間為200(R7循環次數)× 250(R6循環次數)×2×1(us)
MOV R7, #0C8H
DELAY02: DJNZ R6, $ ; R6單元減1,非0繼續執行當前指令,“$”指當前指令地址
DJNZ R7, DELAY02 ; R7減1,非0跳轉到標號DELAY01處執行
RET
STM8 UART接收中斷程序:
系統功能
使用STM8的USART進行自發自收(將發送引腳RXD短接到接收引腳TXD),發出數據:0,1,2。。。數據,能接收到自己發出的數據:0,1,2。。。使用LED作出簡單指示!
硬件設計
LED控制電路原理圖
UART電路原理圖
/*----------------------------------------------------------------------
實驗內容:
USART自發自收,使用PB口的LED指示接收到的數據,觀察是否與發送的數據一致。
----------------------------------------------------------------------
硬件連接:
將MCU.RXD與MCU.TXD使用短路帽短接,將PB口的LED指示燈使能開關切換到“ON”狀態。
----------------------------------------------------------------------*/
#include 《STM8S207S8.h》
#define LED_DDR PB_DDR
#define LED_PORT PB_ODR
#define LED_CR1 PB_CR1
#define LED_CR2 PB_CR2
void Init_UART3(void)
{
UART3_CR1=0x00;
UART3_CR2=0x00;
UART3_CR3=0x00;
// 設置波特率,必須注意以下幾點:
// (1) 必須先寫BRR2
// (2) BRR1存放的是分頻系數的第11位到第4位,
// (3) BRR2存放的是分頻系數的第15位到第12位,和第3位
// 到第0位
// 例如對于波特率位9600時,分頻系數=2000000/9600=208
// 對應的十六進制數為00D0,BBR1=0D,BBR2=00
UART3_BRR2=0x00;
UART3_BRR1=0x0d;
UART3_CR2=0x2c;//允許接收,發送,開接收中斷
}
void UART3_sendchar(unsigned char c)
{
while((UART3_SR & 0x80)==0x00);
UART3_DR=c;
}
@far @interrupt void UART3_Recv_IRQHandler (void)
{
unsigned char ch;
ch=UART3_DR;
LED_PORT=ch;
return;
}
void main(void)
{
unsigned char i=0;
LED_DDR=0XFF;
LED_CR1=0XFF;
LED_CR2=0X00;
Init_UART3();
_asm(“rim”);
while(1)
{
UART3_sendchar(i);
i++;
};
}
系統調試
短接RXD與TXD能接收到自己發送的數據,斷開短接沒有接收到數據。系統不斷發送數據:0,1,2。。。若正常接收,將收到0,1,2。。。。用LED作數據指示,LED往上加,說明系統程序正常執行。
評論
查看更多