精华内容
下载资源
问答
  • 串口发送中断

    2013-07-26 10:04:41
    51单片机上的串口发送代码,简单的入门代码,发送完数据后会自动中断
  • STM32串口发送中断

    2018-03-01 21:18:00
    今日进行串口数据通信时,使用DMA串口485发送完成中断进行485发送至接收的状态转换时发现,当DMA传输完成时,串口发送寄存器中的数据还未通过发送端口传输完成,在中断中需等待查询串口发送的状态,while((USART_...

    今日进行串口数据通信时,使用DMA串口485发送完成中断进行485发送至接收的状态转换时发现,当DMA传输完成时,串口发送寄存器中的数据还未通过发送端口传输完成,在中断中需等待查询串口发送的状态,while((USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET)); 造成中断程序程序的阻塞,以5Mbit/s的波特率的计算的话阻塞约3us。 对控制程序仍有很大影响,以简化中断处理时间的原则,

    采用以下改正方法:

    1、使用485自动收发电路,(存在的问题是:成本较高,波特率可能达不到,接收状态时同样需要信号输出引脚端置为低电平,若切换时有中断进来,延长发送状态会对总线的数据造成影响。 (电路参考485通讯电路总结http://www.cnblogs.com/my-trees/p/8028960.html))所以不可取。

    2、改用发送完成中断进行485发收状态的切换,(用DMA串口空闲中断进行收据的接收)。这样在串口传输完成后即可进行485接收状态的切换,避免程序阻塞,减少了中断的执行时间,降低了对控制程序的影响。

    在采用方法2进行处理时,在程序中对中断类型进行判断,发现在使用串口1中断后,程序会频繁进入串口中断,断开通讯、关闭接受空闲中断同样也会进入,

    原因是在发送完成中断使能后,使能串口USART_Cmd(USART1, ENABLE)时触发串口中断;通过仿真看到。CR寄存器发送中断标志第6位发送完成中断位置位,触发发送完成中断。 所以在使能发送完成中断状态时,当使能串口时USART_Cmd(USART1, ENABLE);程序会进入一次发送完成中断程序(这与MODBUS发数据协议中介绍的相同,当使能串口发送中断时STM32会自动发送一个空闲帧触发中断描述相同 )。

    循环进入中断是因为在发送完成中断中转换485为接受状态后,重新配置了串口接收DMA,重新使能了串口,造成串口发送完成中断循环进入。

     

    转载于:https://www.cnblogs.com/my-trees/p/8490617.html

    展开全文
  • 2440的串口发送中断的总结

    千次阅读 2014-02-24 15:11:16
    最近在调试2440的串口发送中断,遇到了不少的问题,现根据调试的结果总结一下: 不知道是2440的硬件设计问题,还是我没有弄明白它这么设计的根据或者使用方法,总之遇到了不少问题。 根据遇到的问题得出三个结论...

    最近在调试2440的串口发送中断,遇到了不少的问题,现根据调试的结果总结一下:


    不知道是2440的硬件设计问题,还是我没有弄明白它这么设计的根据或者使用方法,总之遇到了不少问题。

    根据遇到的问题得出三个结论(我认为的结论),如果你使用了串口的发送中断,并开启了FIFO功能,那么在配置上需要注意


    1、UCON的Transmit Mode必须一开始就打开,而且后面不需要关闭,除非你最后确定不再使用串口发送了。

    原因是这个位不打开,你没法发送数据,它不仅是个中断标志位,还是发送模式的选择位。如果你打开了串口发送中断

    INTSUBMSK &= ~(BIT_SUB_RXD0 | BIT_SUB_TXD0);

    又设置了发送中断函数siors_tx_isr()

    那么不设置这一位,你中断没法进去,这个很明显,关键是你直接写s3c_utxh也没用。可能有人觉得这是废话,但是一开始我就没有打开,然后直接写s3c_utxh一组数据,

    然后再打开这一位,中断打开后,FIFO里面的数据就直接发出去了,不过我发现没有进入中断函数,不知道什么原因,难道跟Triggle Level有关?


    2、还是UCON寄存器,是Tx Interrupt Type这一位,关于选择Pulse或者Level的问题,开始我选择了Pulse位,然后单步执行,程序就无休止一直循环于发送中断函数,

    就是它一直会进中断,这也可以理解,就是FIFO开始一直为空,而你打开了中断位,所以它一直进入中断。所以选择Level这一位。


    3、还有就是UFCON寄存器的Tx FIFO Triggle Level这一位,开始我选择了32byte,每次填32byte,但是每次都发不全。这一位的含义是讲发送FIFO里面剩余32个byte后就会触发中断,

    后来根据网上的文章,改成了16byte,它的工作原理是这样的,比如你有100个byte需要发送,你的FIFO是64byte,你一次性写入48个数据,然后FIFO移出了32byte,还剩余16byte,这时触发中断,中断里面再去填48位,然后再移出48byte,还剩16byte再次产生中断。最后还有4byte,直接写入s3c_utxh,这样所以的数据就全部发出去了。我搞不明白的是32byte为什么不行,难道设置成32byte时,需要每次写入的数据要大于这个32吗?我没有去验证。


    遇到同样问题的同学请参考以下文章

    http://blog.csdn.net/stephen_yu/article/details/19199399



    展开全文
  • STM8S105 串口中断发送

    2014-08-02 10:03:09
    STM8S105串口中断发送串口中断发送数据。STM8单片机以中断方式发送数据。在发送过程中,不阻塞CPU的运行。
  • STM8 UART串口发送完成中断程序 测试可用。用于高效收发数据,收发均不阻塞CPU运行。
  • 什么不能使用串口发送中断

    千次阅读 2011-04-16 23:18:00
       最近我设计了一块板子,选用的主芯片是C8051F020,外围的USB芯片是PDIUSBD12,在调试的时候需要用串口打印调试信息。由于UART0被分配和GPS通讯,因此只能UART1来打印调试信息。  调试UART0...

     

         最近我设计了一块板子,选用的主芯片是C8051F020,外围的USB芯片是PDIUSBD12,在调试的时候需要用串口打印调试信息。由于UART0被分配和GPS通讯,因此只能用UART1来打印调试信息。

          调试UART0倒是很顺利,利用中断来发送和接收数据;而在调试UART1的时候却发现不能用中断来发送数据。虽说代码是用汇编写的,可是不应该一个能行,一个不能行的。这些代码以前也用过,而且证明了是OK的(当时的板卡是别人设计的,不过用的也是C8051F020),为什么呢?

          该设置的都已经设置了,虽说用查询的方式也能完成工作,可是我还是有些不明白。

          希望有高人指点一二!

    展开全文
  • 这样做,串口发送中断程序里必须判断是否发送完一串数据,如已发送完则不处理,未完继续发送。 现在置位TI,使单片机进入串口发送中断,而且未发送完,当然程序就会继续发送,其实是开始发送。 至于判断条件,主程序...
  • STM32使用FIFO实现USART串口发送中断

    千次阅读 多人点赞 2019-05-28 10:08:57
    fifo就不要造轮子了,现成的就行了。linux内核中目前人类写出的基于c语言的最强FIFO,请自行搜索学习《巧夺天工的kfifo》,或者我的另一篇博文《整数的环回特性》。 直接把最常用的几个函数拷贝到STM32工程...

    fifo就不要造轮子了,用现成的就行了。linux内核中有目前人类写出的基于c语言的最强FIFO,请自行搜索学习《巧夺天工的kfifo》,kfifo精妙无比,实在是高,其中用到的环回特性,不仅可以用在FIFO中,我还想到了另一个用途,参加另一篇博文《整数的环回特性》。

     

    直接把最常用的几个函数拷贝到STM32工程文件里,顺便把kfifo结构体中的自旋锁成员给屏蔽掉,这玩意只在多核才有用,在单核的32上没有作用,直接注释掉就行。然后把源码中自旋上锁、自旋解锁分别改成STM32的开中断、关中断(或者改成进入临界段、退出临界段,参考我的另一篇博文:《STM32使用中断屏蔽寄存器BASEPRI保护临界段+中断分组+抢占/响应优先级概念》),用以保护FIFO的读写索引。还要一个至关重要的min宏需要移植,此宏很有讲究,请一定要参考我的另一篇博文进行min宏的移植《求最小值的宏:#define min(x,y) x > y? y: x 中的陷阱》,否则在fifo写索引溢出时会触发bug。

    typedef struct kfifo {
        uint8_t *buffer;     /* the buffer holding the data */
        uint16_t size;         /* the size of the allocated buffer */
        uint16_t in;           /* data is added at offset (in % size) */
        uint16_t out;          /* data is extracted from off. (out % size) */
        //spinlock_t *lock;          /* protects concurrent modifications 自旋锁*/
    }gfifo_t;

    uint16_t __kfifo_put(struct kfifo *fifo,
                const uint8_t *buffer, uint16_t len);
    uint16_t __kfifo_get(struct kfifo *fifo,
                 uint8_t *buffer, uint16_t len);

    要理解STM32的USART发送中断,首先要了解两个概念:发送数据寄存器DR、移位寄存器,我们发送数据时就是把数据写入DR就不管了,硬件一旦发现DR中有数据,就会自动把DR中的数据放到移位寄存器中,然后硬件逻辑才一位一位地把数据发出去。也就是说:DR空并不意味着发送已完成,移位寄存器空才是真正的发送完成。

    STM32的USART发送中断有两个:

    (1)“发送完成TC”中断,意思是移位寄存器已发送完成
    (2)"数据寄存器空TXE"中断,要注意这个中断!一上电数据寄存器DR中是没有数据的,所以,一旦开启TXE中断(当然,开全局中断也得是开着的),就会立即进入中断服务函数。这就指示我们:不要在初始化中开启TXE中断,而是要在打算发数据时才开。

    以下是F103C8T6的USART1初始化

    //串口1初始化
    void USART1_Init(u32 bound)
    {
    	//GPIO端口设置
    	GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
    
    	//USART1_TX   GPIOA.9
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
    
    	//USART1_RX	  GPIOA.10初始化
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
    
    	//Usart1 NVIC 配置
    	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//指出中断通道为UASRT1
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
    	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
    
    	//USART 初始化设置
    	USART_InitStructure.USART_BaudRate = bound;//串口波特率
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    
    	USART_Init(USART1, &USART_InitStructure); //初始化串口1
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接收寄存器非空中断
    	//USART_ITConfig(USART1, USART_IT_TC, ENABLE);//开启串口发送完成中断(移位寄存器发送完成)
    	//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//开启串口发送寄存器空中断(只要DR空就中断,实际上,这句话会导致立马中断,因为此时DR确实是空的,所以一般只在发送时才enable它,而不会在初始化时就enable它)
    	
    	USART_Cmd(USART1, ENABLE);                    //使能串口1 
    
    }

     

    使用FIFO进行中断式发送的步骤如下:

    ①把想发的n个字节数据填入FIFO
    ②开启TXE中断

    /*
    通过中断发送数据
    返回:1成功,0失败
    */
    int16_t uart1_send_by_int(const uint8_t *data, uint16_t len)
    {
    	if(get_fifo_unused_size(&uart1TxFifo) >= len)//只有空闲区>len,才执行发送程序
    	{
    		gfifo_put(&uart1TxFifo, data, len);
    	}
    	else
    	{
    		rtt_printf("uart1 SendFifo has no space\r\n");//程序走到这里,意味着FIFO缓冲不足,会出现发送丢失
    		return 0;
    	}
    	
    	USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
    	
    	return 1;
    }

    执行完上述发送函数后,硬件发现DR寄存器中没有数据,会立即进入TXE中断,接下来我们写TXE中断的服务函数:

    //串口1的所有中断服务
    void USART1_IRQHandler(void)                	//串口1中断服务程序
    {
    	if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)  //数据寄存器DR空中断TXE
    	{
    		if(get_fifo_used_size(&uart1TxFifo) > 0)//main调用链中操作uart1TxFifo的地方必须禁掉本中断(或全局中断)
    		{
    			uint8_t sendCh;
    			//从FIFO中取出一个字节并发送,这个字节一旦被从DR移入移位寄存器,就会再次进入本中断
                gfifo_get(&uart1TxFifo, &sendCh, 1);
    			USART1->DR = sendCh;
    		}
    		else
    		{
    			USART_ITConfig(USART1, USART_IT_TXE, DISABLE);//FIFO中的所有数据都已发完,关中断
    		}
    	}	
    }

     

    展开全文
  • 一般单片机发送中断有两种出发方式(STM8为例): Tansmit Data Register empty interrupt Transmission complete interrupt 而单片机的发送用到两个寄存器:发送数据寄存器和移位器 When a ...
  • ATMEGA16串口发送中断接收CVAVR程序
  • MC9S12HY64串口中断发送 接收例程 采用中断方式发送串口数据。
  • STM32串口中断接收和中断发送

    万次阅读 多人点赞 2016-03-12 15:12:14
    STM32串口USART1中断接收和中断发送 先贴出中断函数: void USART1_IRQHandler(void){  if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {  USART_ClearITPendingBit(USART1, USART_IT_RX
  • 这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 ,和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 。
  • 使用stm32接受外部中断,通过串口发送信息到上位机,程序经过验证,需要可联系我。
  • 搞定串口中断发送

    2011-04-25 22:18:00
    原来也很简单啊! 关键的一步是要触发串口发送中断(即强制给一个中断标志),否则就永远进不了。
  • 中断方式串口发送实现思路

    千次阅读 2014-04-24 19:24:38
    中断方式串口发送实现思路  |举报|字号 订阅 如题,我项目里的中断方式串口发送工作得很好。尤其是对实时性要求较高且数据量较大且发送频繁时,优势较循环查询式不言而喻。 具体思路是...
  • msp430串口发送中断操作之简单三步

    千次阅读 2018-01-09 19:46:57
    预备知识:本人的msp430fr6989(msp430系列大同小异),datasheet中句非常关键的一段话: 30.3.15.1 UART Transmit Interrupt Operation The UCTXIFG interrupt flag is set by the transmitter to indicate ...
  • STM32串口DMA发送中断配置

    千次阅读 2019-06-15 14:20:19
    本文以STM32F1xx的串口1为例,简单呈现下使用DMA中断连续发送的代码 串口DMA配置通常可以分为2个部分: 1.串口配置 2.DMA配置 串口配置 void UART1_Init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure; USART_...
  • 电子-串口中断发送.zip,单片机/嵌入式STM32-F0/F1/F2
  • c51串口中断发送

    2020-09-21 15:56:36
    我发现基本上代码都是查询发送,很少见中断发送的,从某种意义上来说查询发送中断发送开销是差不多的,但是优先级应该是区别的,查询是直接送数据sbuf,然后查询标志位,判断是否发送完成,那中断发送
  • STM32串口中断测试, 已通过串口调试助手测试,可按照规定格式接收数据
  • 1、配置GPIO4为中断输入,GPIO5为输出。 2、中断接收代码: #define RECVSIZE 50 #define SET_GPIO5_HIGH GPIO_SetPins(GPIO_PIN_5); #define SET_GPIO5_LOW GPIO_ResetPins(GPIO_PIN_5); unsigned char receive...
  • 该程序编写了STM32F103三个串口初始化程序,可快速调用,同时支持接收和发送单个字符和多个字符,并存储数据,方便接收数据后的通信协议校验,支持自定义接收数据最大长度,重写printf函数。
  • 关于串口发送的C语言程序,上层直接将数据装入缓冲区,若手工发送标记(auto_uart0_tx_flg )为1,则置位串口中断标志TI0,启动发送,直至缓冲区为空(读写指针相等,此时将auto_uart0_tx_flg置0),否则,说明此时...
  • 用中断来实现串口通信//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样
  • CubeMX,HAL库使用串口发送中断接收一、CubeMX界面配置二、MDK代码 不得不说HAL库和标准库相比确实简单多了。。。 一、CubeMX界面配置 选择完 异步通讯模式 后,其余默认即可。 打开串口中断 二、MDK代码 在/* ...
  • 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来; 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,“A”把LED灯点亮,“B”把LED灯熄灭。 led_key.c...
  • labview采用MSCOMM控件完成串口通信,发送中断接收。 自己正使用的这种方法,确实是有效的,自己再添加协议什么的,丰富内容。-LabVIEW uses the MSCOMM control to complete serial communication, send, receive...
  • STM32串口中断的方式发送

    万次阅读 多人点赞 2018-12-06 10:38:30
    我将其改为真正的中断发送。 步骤一:初始化GPIO GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //LED1-PC10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,217
精华内容 13,686
关键字:

串口发送中断有什么用