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

嵌入式操作系统

56人已加入

描述

  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往上加,说明系统程序正常执行。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分