精华内容
下载资源
问答
  • 串口接收中断不起作用的问题

    千次阅读 2020-01-08 00:14:30
    这两天重新开始学STM32, 调试串口,配置好了串口接收中断,却怎么也不起作用,后来经过检查师main函数结束了, 程序已经停止来, 在main函数的结尾加while(1)循环,串口中断正常了。 ...

         这两天重新开始学STM32, 调试串口,配置好了串口接收中断,却怎么也不起作用,后来经过检查师main函数结束了, 程序已经停止来, 在main函数的结尾加while(1)循环,串口中断正常了。

     

    展开全文
  • 了解使用STM32串口中断相关官方库函数简介完整代码串口初始化、使能串口、开启接收中断初始化NVLC接收、发送函数 简介 下面两张图红框的内容,在上几篇有总结过,分别是GPIO的和中断的,直接去那里看就行,这一篇...

    简介

    下面两张图红框的内容,在上几篇有总结过,分别是GPIO的和中断的,直接去那里看就行,这一篇主要总结没有被框起来的,总结官方给的库函数的功能作用,还有哪个文件可以找到哪个函数(理清逻辑)

    完整代码

    主程序
    在这里插入图片描述
    串口中断配置程序
    在这里插入图片描述

    串口初始化、使能串口、开启串口接收中断

    函数:USART_Init(USART1,&USART_InitStruct); //串口初始化
    USART_Cmd(USART1,ENABLE); //使能串口
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启串口接收中断

    在下面这个usrat文件下可以找到
    在这里插入图片描述
    进入这个文件后,对应3个红框框就是
    在这里插入图片描述

    接收、发送函数

    同样在这个usrat文件下可以找到
    在这里插入图片描述
    这两个函数就是接收和发送函数
    在这里插入图片描述

    展开全文
  • 昨天我用stm32f103做IAP升级,APP程序是一个LED闪烁和一个串口1收发数据。结果IAP升级后,发现APP程序只有LED闪烁但是串口1不行甚至引起死机.这种半死不活的现象是最莫名其妙的,它一半在暗示你APP好像移植成功了...

    昨天我用stm32f103做IAP升级,APP程序是一个LED闪烁和一个串口1收发数据。结果IAP升级后,发现APP程序只有LED闪烁但是串口1不行甚至引起死机.这种半死不活的现象是最莫名其妙的,它一半在暗示你APP好像移植成功了一半失败了一半。这种现象是最不好找原因的。后来,发现,是有三个窍门的,我决定把这三个窍门分享给大家。

    第一个:在从boot程序跳转到app程序之前,必须先单独关闭外设的串口中断(不仅仅是关闭总中断)。



    第二个:在APP程序里,要修改库函数的偏移量, 注意,这里我强调的是“修改库函数的偏移量”,而不是“直接在main函数上面插入修改偏移量的代码”。因为我实验证明,前者是可以,后者是不行,会影响串口中断。



    第三点:在从boot跳转到app前要关闭全局中断,在app程序的main函数前面也要同时添加开启全局中断的语句(在app的main函数前开启总中断这个是关键!)

    展开全文
  • STM32使用FIFO实现USART串口发送中断

    千次阅读 2019-05-28 10:08:57
    直接把最常用的几个函数拷贝到STM32工程文件里,顺便把kfifo结构体中的自旋锁成员给屏蔽掉,这玩意只在多核才有用,在单核的32上没有作用,直接注释掉就行。然后把源码中自旋上锁、自旋解锁分别改成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中的所有数据都已发完,关中断
    		}
    	}	
    }

     

    展开全文
  • fifo就不要造轮子了,用现成的就行了。linux内核中有目前人类写出的基于c语言的最强FIFO,请自行搜索学习《巧夺天工的kfifo》,或者我的另一篇博文...然后把源码中自旋上锁、自旋解锁分别改成STM32的开中断、关中断(...
  • 串口中fifo的作用

    千次阅读 2014-12-09 17:32:48
    FIFO是先进先出缓冲区的意思,即串口接收到的数据可以先进入FIFO,不必马上进入中断服务程序接收,这样可节省CPU时间。对于发送数据也一样,可以把要发送的数据一起写入FIFO,串口控制器可按写入顺序依次发送出去。
  • //*******************************************************************//作用:RS485初始化//参数:BPS-波特率//StopBit-停止位,1为1位,2为2位//Parity-校验方式,0为无校验,1为寄校验,2为偶校验//返回:无//...
  • 在前两篇文章中我们介绍了IO口模拟串口发送数据和接收数据,前两种方法都是使用定时器来进行发送和接收,没有用到中断,优点是逻辑简单,但是缺点很明显,只能进行单个字节的发送和接收,而且不能同时工作。...
  • 1、基于trubo c rs232的串口通信程序源代码.。 2、包括教材[Visual.C.Turbo.C串口通讯编程实践]....3、有详细的代码注释(包括寄存器作用)。 4、包括中断函数、主函数程序的流程图,可全面吃透程序运行流程。
  • /*******************************************************************内容:串口配置,给出中断串口通信,详细的寄存器作用解析作者:Justice_Gao日期:2017年7月29日问题描述:参考源代码中串口通信程序初始化...
  • //说明:当线路控制寄存器(LCR)的bit7=0 : DLAB=0,允许访问接收/发送及中断允许寄存器 // 当线路控制寄存器(LCR)的bit7=1 : DLAB=1,允许访问波特率因子寄存器 //-------------------------------------...
  • 4、 串口空闲前面一直提到串口空闲,也大概明白串口作用,但是一些细节问题还是需要好好说一下的。第一个问题,如何清除串口空闲中断标志位?很多人会使用 USART_ClearFlag 标准库函数进行清除,但是当你跳转到该...
  • mini2440中断测试

    2012-04-19 11:31:17
    mini2440中断测试,定时器中断和串口中断一起使用,对于初学arm中断的人有帮助作用
  • 串口命令解析

    千次阅读 2018-02-09 16:34:13
    作用前面已经介绍了,这里说一下本文件的使用。文件:http://download.csdn.net/download/hes_c/10247532本文件直接使用在...使用方式也简单:添加我上面的库文件到你的工程串口中断中调用以下函数.h文件添加想要查...
  • 4、 串口空闲前面一直提到串口空闲,也大概明白串口作用,但是一些细节问题还是需要好好说一下的。第一个问题,如何清除串口空闲中断标志位?很多人会使用 USART_ClearFlag 标准库函数进行清除,但是当你跳转到该...
  • 原来不论是 IIC/TWI, 或是 SPI, 以及硬串口、软串口甚至 Serial.print 都是要靠中断来帮忙处理, 如果你把中断禁止了, 那 IIC/TWI, SPI 都无法动作了 ! 啥? 你说你没有禁止中断?  Arduino 一旦进入
  • 在普通51单片机中,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断。但在STM32中,中断的数量大大增加,同时配置和使用也相对复杂。此篇文章主要讲解STM32外部中断的配置和使用。一、STM中断...
  • 在普通51单片机中,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断。但在STM32中,中断的数量大大增加,同时配置和使用也相对复杂。此篇文章主要讲解STM32外部中断的配置和使用。一、STM中断...
  • Zigbee串口通信

    千次阅读 2015-05-22 08:45:39
    串口是开发板和用户电脑交互的一种工具,正确地使用串口对于ZigBee无线网络的学习具有较大的促进作用,使用串口的基本步骤: ①初始化串口,包括设置波特率、中断等; ②向发送缓冲区发送数据或者从接收缓冲区读取...
  • 4、 串口空闲前面一直提到串口空闲,也大概明白串口作用,但是一些细节问题还是需要好好说一下的。第一个问题,如何清除串口空闲中断标志位?很多人会使用 USART_ClearFlag 标准库函数进行清除,但是当你跳转到该...
  • STM32F10x 学习笔记6(USART实现串口通讯 2)

    万次阅读 热门讨论 2013-05-05 12:00:37
    这次讲讲利用串口收发中断来进行串口通讯。STM32 上为每个串口分配了一个中断。也就是说无论是发送完成还是收到...图中也给出了如何控制每一个单独的中断源是否起作用。 另外,Cortex-M3 内核中还有个NVIC,可以
  • 4、 串口空闲前面一直提到串口空闲,也大概明白串口作用,但是一些细节问题还是需要好好说一下的。第一个问题,如何清除串口空闲中断标志位?很多人会使用 USART_ClearFlag 标准库函数进行清除,但是当你跳转到该...
  • DELPHI串口编程

    2015-12-10 21:39:48
    DELPHI串口编程剖析 1 第一章 背景知识 3 1. 概述 3 ...在IDE和EIDE设备之间传输数据时,CPU必须介入,而SCSI设备在数据传输过程中起主动作用,并能在SCSI总线内部具体执行,直至完成再通知CPU。  
  • STM32外部中断

    千次阅读 2015-06-13 22:00:34
    在普通51单片机中,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断。但在STM32中,中断的数量大大增加,同时配置和使用也相对复杂。此篇文章主要讲解STM32外部中断的配置和使用。 一、STM中断...
  • 这次讲讲利用串口收发中断来进行串口通讯。STM32 上为每个串口分配了一个中断。也就是说无论是发送完成...图中也给出了如何控制每一个单独的中断源是否起作用。另外,Cortex-M3 内核中还有个NVIC,可以控制这里的中...
  • 目录问题背景问题解决 问题背景   u16 USART_RX_STA=0; //接收状态标记   USART_RX_STA的作用...  在串口中断函数里的一个全句变量USART_RX_STA,阅读串口中断函数里的程序时在想:USART_RX_STA里的数据是如何存
  • 串口打印及其他

    2010-01-22 23:49:00
    一般来说,串口打印会有延时的作用,所以为了保证程序正确执行,可以适当的添加延时。另外,在一些情况下需要注意变量的定义。今天LF在调试BOOT中的中断时发现,中断处理函数中变量的变化,并不能触发“中断处理线.....
  • 这次讲讲利用串口收发中断来进行串口通讯。STM32 上为每个串口分配了一个中断。也就是说无论是发送完成还是收到数据或是...图中也给出了如何控制每一个单独的中断源是否起作用。 另外,Cortex-M3 内核中还有个N
  • 偶尔能读到串口数据,只能证明读函数起作用了。 在多年的开发经历中,我曾经开发过各种MCU的串口代码,也在DOS和Legacy BIOS下开发过。读取串口,基本都是使用中断(或者配合DMA)方式。Windows下的串...

空空如也

空空如也

1 2 3 4 5 6
收藏数 102
精华内容 40
关键字:

串口中断作用