×
嵌入式 > 技术百科 > 详情

stm8串口接收中断程序理解及应用

发布时间:2021-12-14 发布时间:
|

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循环次数)&TImes; 250(R6循环次数)&TImes;2&TImes;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往上加,说明系统程序正常执行。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
起重变频调速系统中制动电阻功率的计算