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

2020-02-13来源: 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  串口中断接  中断发功能 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic488090.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:OSAL移植到STM8
下一篇:STM8 UART中断发,中断收

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8s103F3p 16位定时器 STM2
/************************************************************************************/* MAIN.C file *  * Copyright (c) 2002-2005 STMicroelectronics *///16位定时器2的中断方式//周期为50ms#include "stm8s103f.h"main(){ //端口初始化 PD_DDR=0x0f; PD_CR1=0x0f; PD_CR2=0x00; PD_ODR=0x0f
发表于 2020-02-13
电路设计_STM8S003F3P6 AWU&ADC使用小结
序言现象:当ADC初始化之后,再进休眠,那么AWU唤醒会出现异常,表现为唤醒不成功。解决办法:在睡眠唤醒之后初始化ADC,在进休眠之前关闭ADC功能。工作模式Run mode    正常运行模式,功耗最大。Wait mode    在运行模式下执行WFI(等待中断)指令,可进入等待模式。此时CPU停止运行,但外设与中断控制器仍保持运行,因此功耗会有所降低。等待模式可与PCG(外设时钟门控),降低CPU时钟频率,以及选择低功耗时钟源(LSI,HSI)相结合使用,以进一步降低系统功耗。参见时钟控制(CLK)的说明。    在等待模式下,所有寄存器与RAM的内容保持不变,之前所定
发表于 2020-02-11
电路设计_STM8S003F3P6 AWU&ADC使用小结
STM8S003F3 使用ADC:固件库版本与寄存器版本
STM8S003F3这款小型MCU,只有1K RAM与8K Flash,应用比较简单,AD采样,GPIO控制,PWM控制,还是不错的嵌入式的应用。最近一个项目用到了几路AD采样,我平时一般喜欢下载最新的官方标准固件库,只是,这次遇到的问题是,在使用PWM与ADC采样后,代码大小竟然大于8K,编译失败!!!后来,看了下Debug下的map文件,发现,使用ADC的固件库,大小竟然有1K的代码空间。后来改为寄存器的,发现代码还不到100字节。(1)固件库AD采样的代码如下,代码易懂,但编译后代码较大:单通道采样,多个的话,只需要一个一个采集。#include "adc.h"#include "
发表于 2020-02-11
关于STM8S003F3P6开发的笔记
5.STM8各功能模块的寄存器编程6.IAR开发环境和STVP烧写软件STM8S103F3P6 性能对比:看到了吧,关键是只有100次,不过我估计一次也用不了了,,,
发表于 2020-02-07
关于STM8S003F3P6开发的笔记
STM8S003F3 使用TIM1_CH1与TIM1_CH2配置PWM输出
最近一个项目,用的是STM8S003F3这款小型的MCU,使用TIM1_CH1 TIM_CH2作为PWM输出时,遇到了问题,代码下载后,PWM是没有任何输出的。用示波器看,应该是PWM没有任何输出。首先在网上找了下资料,又看了官方的例程,感觉代码没有问题。后来仔细查看问题,终于找到解决的方案。原来根据STM8S003F3的数据手册,需要配置一个选项字节才能使能TIM1_CH1与TIM1_CH2。配置的方法有两种:(1)使用STVP(STM32与STM8)烧写的软件,在烧写固件时,配置一下,下载到芯片,其实这个保存在DataFlash中,理论上配置一次,再使用ST-LINK下载,就一直生效。(2)方法二,STM8S的固件库里,是有
发表于 2020-02-06
STM8S003F3 使用TIM1_CH1与TIM1_CH2配置PWM输出
STM8S103F3实现串口中断接,中断发功能
;      UART1_BRR1=0x68;            UART1_CR2 = 0x2c;  //接收,发送使能,开接收中断}注意的事项:波特率的设置方式,在UART1初始化中打开了接收,发送使能,但是只打开了接收中断,而发送中断打开在哪里呢?接下来往下看。二、接收中断服务函数中的操作过程//将收到的数据再发送出去#pragma vector= UART1_R_RXNE_vector           //0x14__interrupt void
发表于 2020-02-17
小广播
何立民专栏 单片机及嵌入式宝典

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

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