STM32串行通讯采用中断方式发送,接收

发布者:Huixin8888最新更新时间:2018-12-03 来源: eefocus关键字:STM32  串行通讯  中断方式 手机看文章 扫描二维码
随时随地手机看文章

近期发现很多人都不愿意用中断方式,来使用STM32的串口。说是问题多。但自己测试了,中断没有任何问题。无论接收和发送。

我贴出源程序。

注意一点是:USART_ITConfig(USART3, USART_IT_TXE, ENABLE); 这个函数一旦执行,就会启动一次中断,正是这个原因,许多人想尽方法去避免空发送,但实际上这是设计者的智慧所在。用空中断启动发送!无需在执行:SART_SendData(USART3, UART3_Buf.SendBuf[UART3_Buf.sPoint++]); //启动发送!

一旦启动了中断,就在中断程序里继续发送。

发送初始化程序:将要发送的数据准备好,放在一个BUF里:


                COM3_EN(SEND_EN);//485的EN脚
                UART3_Buf.sPoint=0;
                UART3_Buf.sOK=SEND_NOW;  //状态机
                UART3_Buf.sLong=Long;        //数据长度                        
                memcpy(UART3_Buf.SendBuf,p,Long);        //数据转移!
                USART_ITConfig(USART3, USART_IT_TXE, ENABLE); 
中断程序:
void Uart3_Do(void){

        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){
                //*********************************************************
                UART3_Buf.rOK=RECE_NOW;                        //接收....
                //*********************************************************
                UART3_Buf.RsDelay=3;                        //RS_DELAYK;                //复位计时器!
                //*********************************************************
                UART3_Buf.ReceBuf[UART3_Buf.rPoint++]=(unsigned char)USART_ReceiveData(USART3);
                //*********************************************************
                if(UART3_Buf.rPoint >= sizeof(UART3_Buf.ReceBuf)){
                        UART3_Buf.rPoint=0;
                        UART3_Buf.rOK=RECE_OVER;                        //接收完毕
                        //USART_ITConfig(USART3, USART_IT_RXNE, DISABLE); 
                }
        }
        //*******************************************************************
        if ( USART_GetITStatus(USART3, USART_IT_TXE ) != RESET){
                if (UART3_Buf.sPoint >= UART3_Buf.sLong){         //采用1个字节一个页发送!
                        USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
                        UART3_Buf.sOK=SEND_OVER;                                        //发送完毕        
                        UART_ReceStart(COM3_PC,sizeof(UART3_Buf.ReceBuf));                //停止发送,允许接收中断!
                }else{
                        USART_SendData(USART3, UART3_Buf.SendBuf[UART3_Buf.sPoint++]); //启动发送!
                }        
        }        
}
。。。。
数据结构:
typedef struct{
        volatile unsigned short rPoint;                //接收指针个数
        volatile unsigned short sPoint;                //发送指针个数
        volatile unsigned short rLong;                //接收长度
        volatile unsigned short sLong;                //发送长度
        volatile unsigned short RsDelay;                //通讯采用延时接收!
        unsigned char SendBuf[250];         
        unsigned char ReceBuf[250];                
        volatile unsigned char rOK;                        //接收标志!
        volatile unsigned char sOK;                        //发送标志!
}UART_DATA;

关键字:STM32  串行通讯  中断方式 引用地址:STM32串行通讯采用中断方式发送,接收

上一篇:STM32 PVD中断问题
下一篇:STM32基础实验4(按键中断)

推荐阅读最新更新时间:2024-03-16 16:19

STM32 KEIL 串口打印printf使用详解
常规打印方法 在STM32的应用中,我们常常对printf进行重定向的方式来把打印信息printf到我们的串口助手。 在MDK环境中,我们常常使用MicroLIB+fputc的方式实现串口打印功能,即: 要实现fputc函数的原因是:printf函数依赖于fputc函数,重新实现fputc内部从串口发送数据即可间接地实现printf打印输出数据到串口。 不知道大家有没有看过正点原子裸机串口相关的例程,他们的串口例程里不使用MicroLIB,而是使用标准库+fputc的方式。相关代码如: #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __F
[单片机]
<font color='red'>STM32</font> KEIL 串口打印printf使用详解
STM32 的优先级NVIC配置
1、NVIC优先级介绍 2、NVIC优先级比较 提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):*强调内容***NVIC_PriorityGroup_0 NVIC_PriorityGroup_1 NVIC_PriorityGroup_2 NVIC_PriorityGroup_3 NVIC_PriorityGroup_4 前提条件2:“组”优先级别 “抢”占优先级别 “副”优先级别 前提条件3:同一组优先级别中,不同的抢占级别之间,其中一抢占级别正在做事,另外抢占级别不能打断他;(即”同一组优先级下的中断源间,没有中断嵌套“) 前提条件4:不同组优先级别间,依据优先级强弱,优先级别高的组的中断源可以打
[单片机]
<font color='red'>STM32</font> 的优先级NVIC配置
STM32FSMC机制FlaSh存储器扩展
  STM32是ST(意法半导体)公司推出的基于ARM内核Cortex-M3的32位微控制器系列。Cortex-M3内核是为低功耗和价格敏感的应用而专门设计的,具有突出的能效比和处理速度。通过采用Thumb-2高密度指令集,Cortex-M3内核降低了系统存储要求,同时快速的中断处理能够满足控制领域的高实时性要求,使基于该内核设计的STM32系列微控制器能够以更优越的性价比,面向更广泛的应用领域。   STM32系列微控制器为用户提供了丰富的选择,可适用于工业控制、智能家电、建筑安防、医疗设备以及消费类电子产品等多方位嵌入式系统设计。STM32系列采用一种新型的存储器扩展技术——FSMC,在外部存储器扩展方面具有独特的优势,可根据
[单片机]
STM32FSMC机制FlaSh存储器扩展
STM32直接驱动RGB接口的TFT数字彩屏设计
引言     随着工业技术的不断发展,人机界面的开发及应用空前火热,为了具有比较友好的人机界面,TFT数字彩屏被广泛的应用,但是TFT彩屏通常都不带有控制器,所以现在驱动彩屏的方案大致有2种:     ①采用ARM9或者更高级别的平台,芯片上带有TFT控制器,可以直接挂接TFT数字屏。     ②采用低端CPU处理器平台,外加TFT控制器模块,再挂接TFT数字屏。     对于方案①来说,系统的复杂度会莫名地增加,再加上该类的平台中主MCU多为BGA封装,对于需求很多小量多样化产品的客户来说,较难以接受这样的方案;而 ②方案平白无故添加了一个LCD控制器。这两种方案无论哪一种都增加了硬件成本,本文提出了一种由STM32的FSM
[电源管理]
<font color='red'>STM32</font>直接驱动RGB接口的TFT数字彩屏设计
STM32串口通讯 UART
三种方式:查询,中断,DMA 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。 主要特性: 全双工的,异步通信 NR 标准格式 分数波特率发生器系统 -发送和接收共用的可编程波特率,最高到4.5Mbits/s 可编程数据字长度(8位或9位) 可配
[单片机]
ch32和stm32的区别
Ch32单片机是龙芯微电子推出的一种高性能、低功耗的32位嵌入式处理器。它集成了ARM Cortex-M4内核,配备了丰富的接口和外设,可满足不同领域、不同应用场景的需求。在性能、功耗和功能方面,Ch32单片机比部分同级别的单片机还会优秀。 Ch32和其他单片机相比,其最大的优势在于其先进的处理器核心。在安全性、性能、低功耗等方面有着极高的表现。Ch32单片机采用了ARM Cortex-M4核心,而该核心是具有全面DSP功能的ARM Cortex-M系列中的一种。ARM Cortex-M4核心集成了DSP指令集和浮点计算,可满足高性能、高精度的数字信号处理的需求。同时,该核心还支持多线程,方便开发人员实现复杂应用程的并行执行,提高
[单片机]
STM32寄存器操作端口模式SDA_OUT()/SDA_IN()
#define SDA_IN() {GPIOB- CRL&=0X0FFFFFFF;GPIOB- CRL|=(u32)8 28;} #define SDA_OUT() {GPIOB- CRL&=0X0FFFFFFF;GPIOB- CRL|=(u32)3 28;} 是不是看到懵了,其实不难,相信用寄存器写过stm8s的就明白了,其实这是利用寄存器配置端口模式,只是32为的寄存器太多! 首先得明白CRL、CRH是2个控制端口模式的寄存器。他们的位数数据为: CRL(引脚的0-7脚) CRH(引脚的8-16脚) 然后一个端口分4位来控制模式,这4为的组合为: 我们来分析一下: GPIOB- CRL&=
[单片机]
STM32如何收发float类型数据?
在之前文章里提到了共用体用来传输浮点数的用法,但那篇笔记中没有详细介绍,这篇笔记我们一起来看一看具体实例。 实际应用中,我们可能需要两个设备通过串口传输浮点数据: 本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下: 我们创建一个用于管理float类型数据的共用体: unionfloat_data { floatf_data; uint8_tbyte ; }; 数据的流向如: 本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。 创建两个共用体变量,用于发送与接收: unionfloat_datarx_float_data,tx_float_data; 收发相关代码: 左
[单片机]
<font color='red'>STM32</font>如何收发float类型数据?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • Linux内核移植
    实验步骤:(1)准备工作(2)修改顶层Makefile(3)修改falsh 分区(4)配置编译内核下面以Linux2 6 30 4内核移植到gec2440为例:一、准备 ...
  • S5PV210 PWM定时器
    第一节 S5PV210的PWM定时器S5PV210共有5个32bit的PWM定时器,其中定时器0、1、2、3有PWM功能,定时器4没有输出引脚。PWM定时器使用PCLK_PS ...
  • S5PV210 NAND Flash
    NAND Flash关于NAND FlashS5PV210的NAND Flash控制器有如下特点:1) 支持512byte,2k,4k,8k的页大小2) 通过各种软件模式来进行NAND Fl ...
  • S5PV210串口
    串口设置之输入输出字符S5PV210 UART相关说明 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER,它用来 ...
  • S5PV210按键控制LED
    原理图如图所示:查询用户手册得到:程序例子:(完整代码见“代码下载链接”)1、轮询的方式查询按键事件 *main c* 核心代码如下:while(1 ...
  • S5PV210控制蜂鸣器
  • S5PV210的启动过程
  • S5PV210点亮LED
  • S5PV210启动过程详解
何立民专栏 单片机及嵌入式宝典

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

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