STM8S103F3实现串口中断接,中断发功能

发布者:心若清泉最新更新时间:2020-02-17 来源: eefocus关键字:STM8S103F3  串口  中断接  中断发功能 手机看文章 扫描二维码
随时随地手机看文章

一、首先进行UART1初始化


/*USART1 config*/

void USART1_Init(void)

{

   /*Uart1*/

      UART1_CR1=0x00;

      UART1_CR2=0x00;

      UART1_CR3=0x00;

      // 设置波特率,必须注意以下几点:

      // (1) 必须先写BRR2

      // (2) BRR1存放的是分频系数的第11位到第4位,

      // (3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位

      // 例如对于波特率位9600时,分频系数=2000000/9600=208

      // 对应的十六进制数为00D0,BBR1=0D,BBR2=00

      //例如对于波特率位9600时,没有分频 = 16000000/9600 = 1666

      //对应的十六进制数为0682,BBR1=68,BBR2=02

 

      UART1_BRR2=0x02;

      UART1_BRR1=0x68;

      

      UART1_CR2 = 0x2c;  //接收,发送使能,开接收中断

}

注意的事项:波特率的设置方式,在UART1初始化中打开了接收,发送使能,但是只打开了接收中断,而发送中断打开在哪里呢?接下来往下看。


二、接收中断服务函数中的操作过程


//将收到的数据再发送出去

#pragma vector= UART1_R_RXNE_vector           //0x14

__interrupt void UART1_R_RXNE_IRQHandler(void)

{

  u8 data;

  if(UART1_SR & 0x20)  //收到数据该位置位

  {

    UART1_SR &= ~0x20; //清接收中断标志位

    

    rs485_data = UART1_DR;

    

    Rev_Slaver_PrePare(data);    

  }

}

这里采用的接收中断方式不是采用while()去等待接受标志位完成,而是采用接收一个数据就传递一个数据到需要处理的函数,有人可能会说在接收中断中不要去做太多的事情,其实不然,在对接收数据处理函数中其实是对接收到的数据进行存储并不像复杂的逻辑运算而担心中断触发太久。处理函数这边就不贴出来,本文主要的目的是将接收,发送中断的处理方式。


三、发送中断处理方式


void USART1_SendArray(uint8_t *data,uint8_t len)

{

  for(uint8_t i = 0;i < len;i++)

  {

    Tx1Buffer[count1++] = *(data + i);

  }

#pragma vector= UART1_T_TC_vector    //0x13

__interrupt void SYS_UART1_TX_IRQHandler(void)

{

  if(UART1_SR & 0x80)

  {

    UART1_DR = Tx1Buffer[Tx1Counter++];

    

    if(Tx1Counter == count1)

    {

      UART1_CR2 &= ~0x80;       //关闭发送中断

    }

  }

}


UART1_CR2 |= 0x80; //直接开启发送中断}

需要发送的数据串,调用此发送函数,将会触发中断发送服务函数,在这里说明一点,stm8s103f3这款芯片的发送中断服务函数与接收中断服务函数不是同一个,这与stm32系列的芯片不太一样,后者是发送和接收中断共用同一个服务函数,在中断向量表中可观察到不同。


#pragma vector= UART1_T_TC_vector    //0x13

__interrupt void SYS_UART1_TX_IRQHandler(void)

{

  if(UART1_SR & 0x80)

  {

    UART1_DR = Tx1Buffer[Tx1Counter++];

    

    if(Tx1Counter == count1)

    {

      UART1_CR2 &= ~0x80;       //关闭发送中断

    }

  }

}

在进入中断发送服务函数中后,将要发送的数据串依次装入UART1_DR,这里就不需要想接受中断服务函数中需要清标志位,这边是硬件自动清除,

关键字:STM8S103F3  串口  中断接  中断发功能 引用地址:STM8S103F3实现串口中断接,中断发功能

上一篇:用 IAR 开发 STM8 时,简单软件延时不起作用的原因
下一篇:stm8s003中串口中断问题

推荐阅读最新更新时间:2024-11-03 15:02

LabVIEW串口通讯问题解决方案
我通过串口从下位机采集了四个数据,但这四个数据通过指示控件显示出来的却出现连续的 数据 0 数据 0 的闪动,也就是说读数很不稳定。请问高手如何解决指示控件的频闪问题。谢谢 我的想法是,整个串口读数过程是在一个循环中完成的,一次循环的时间相对我100ms从串口读一次数的时间很短,就出现了指示控件显示的两次读数之间有0夹杂的频闪问题,不知这个分析对否正确,如何解决,请给与指点,谢谢 解答: 这个是因为读完数据后 又读出了0 只要 在循环结构 添加一个反馈结构就可以了 问题2 我自己做了个测试的小例子 开始第一个能写能读 到了后面的就不行了 没反映 解答:是Timeout的错误,应该是串口上没有你所要的数据,或者你要求
[测试测量]
基于STM32F103——SIM900A发送短信+串口打印
最近用STM32F103做一个智能门锁小玩意,密码输入错误次数多进行验证码解锁,这里我采用SIM900A来通过发送短信输入验证码进行解锁。就是简单的了解了一下在这里也单独的写写这个SIM900A的一写笔记。 基本介绍 。。。。。。还是直接进入主题吧 一:单独测试 SIM900A是可以AT指令操作的,所以一般我拿到这种模块就是先单独的测试一下这个模块是否正常。通过一个USB-TTL 和 SIM900A连接 进行调试。用我们的电脑串口助手测试即可。没必要上来就用单片机,现单独测试了先。没问题再转成代码也不迟。 1.准备工作 USB-TTL一个 还有杜邦线就不用说啦 2.接线 3.指令操作 打开你的串口助手 注意
[单片机]
基于STM32F103——SIM900A发送短信+<font color='red'>串口</font>打印
中标麒麟操作系统串口调试方法研究
目前,由于国产的中标麒麟操作系统有着高安全性,以及其功能、稳定性、效率方面都达到国外同类产品水平,部分指标还要优于国外同类产品,极大地降低了采购成本及维护成本等特点,中标麒麟操作系统逐步地应用到了部队、国家大型的建设项目、企事业单位中,如国家电网D5000项目等。串口作为一种广泛应用的计算机接口,计算机对设备进行通信控制几乎都是通过串口进行的。在中标麒麟操作系统下进行串口调试与Windows不同,本文将介绍两种中标麒麟操作系统下的串口调试方法。 1串口编程 在任何操作系统下,串口调试程序的编写都是按照打开串口设备、初始化串口和串口读写操作的步骤进行。 1.1打开串口 中标麒麟操作系统与Linux系统类似都是基于文件
[嵌入式]
μC/OS—II的嵌入式串口通信模块设计
在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口。在μC/OS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成。串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的中断驱动外设。本文以单片机中的串口为例,介绍μC/OS—II下编写中断服务程序以及外设驅动程序的一般思路。   1 μC/OS-I
[应用]
C8051F340串口通信程序(UART0)
UART0 是一个异步、全双工串口,它提供标准 8051 串行口的方式 1 和方式 3。UART0 具有增强的波特率发生器电路,有多个时钟源可用于产生标准波特率(详见 18.1 增强波特 率发生器 )。接收数据缓冲机制允许 UART0 在软件尚未读取前一个数据字节的情况下开始接 收第二个输入数据字节。 UART0 有两个相关的特殊功能寄存器:串行控制寄存器(SCON0)和串行数据缓冲器 (SBUF0)。用同一个 SBUF0 地址可以访问发送寄存器和接收寄存器。写 SBUF0时自动访问 发送寄存器;读 SBUF0时自动访问接收寄存器,不可能从发送数据寄存器中读数据。 如果 UART0 中断被允许,则每次发送完成(SCON0
[单片机]
C8051F340<font color='red'>串口</font>通信程序(UART0)
《初学者C51自学笔记》之串口
并行通信: 通常是将数据字节的各位用多条数据线同时进行传送 。 控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难。 串行通信: 将数据字节分成一位一位的形式在 一条传输线上逐个地传送。 传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。 异步通信: 指通信的发送与接收设备使用各自的时钟控制 数据的发送和接收过程。为使双方的收发协调,要求发送和接 收设备的时钟尽可能一致。 特点:不要求收发双方时钟的严格一 致,实现容易,设备开销较小,但每个字符要附加2~ 3位用于起止位,各帧之间还有间隔,因此传输效率不高。 异步通信是以字符(构成的帧)为单位
[单片机]
《初学者C51自学笔记》之<font color='red'>串口</font>
UART0串口编程系列(三)
一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂。尤其是接收状态为被动状态时,只能靠串行口中断来接收数据。 2.在进行串行通信时,双方遵循相同的通信协议。由于波特率不变,因此相邻两次串口中断的间隔时间基本固定。 3.在以下两种情况时会使接收过程出现错误: Ø 第一种情况是系统关中断的最长时间大于相邻两次串行接收中断的间隔时间,这时将可能导致遗漏一次中断,造成数据丢失。 ² 实时操作系统内核的关中断的最长时间是已知的,通常很短,它不是问题关键。 ² 系统关中断的最长时间往往是由用户软件造成的,例如:我们编写的中断服务函数过于复杂,导致系统为了处理中断服务函数而导致关中断时间过长。
[单片机]
基于ARM微处理器及嵌入试Linux的串口网桥软硬件设计
l、引言 在电力系统自动化控制及其他工业控制、民用设备如商场销售系统等领域,众多设备的对外通讯接口仍然是低速串口。串口由于其易用性、可靠性及相对于工控设备来说足够高的通信能力而长盛不衰。然而,串口有一个重大弱点就是传输距离短且无法与网络直接相连,造成设备无法实现远程控制及数据共享,而这些恰恰是实现工业控制高度自动化的必须条件。因此,要求设计一种使串口设备快捷方便地实现联网功能的装置,而且要求其成本低廉,我们称之为串口网桥或串口设备联网服务器。 2、串口网桥简介 我们设计的串口网桥是一个可以为RS-232串口设备提供联网能力的设备联网服务器。装置主要完成主机与串口设备间交流数据的过滤与转发功能,将RS-232信号转换成T
[单片机]
基于ARM微处理器及嵌入试Linux的<font color='red'>串口</font>网桥软硬件设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved