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往上加,说明系统程序正常执行。
评论
查看更多