精华内容
下载资源
问答
  • STM32串口IDLE中断

    2020-07-29 00:45:47
    后面我发现有个很好的东西,串口IDLE中断,能自动响应你从电脑(别的串口)接收到的不定长数据。而不是一直干等着。 先简单说说原理吧,大概是,你的stm32接收数据时,并不会马上把数据马上处理掉,而是写到你定义的缓冲区里...

    stm32串口的收发似乎不太一样,发只要你把数据送出去就行了,电脑会自动读取(电脑不知道你啥时候发,总不能一直等你的数据吧),而你的stm32要接受一个数据呢?一直在USART_ReceiveData吗?(当时这个问题也困扰了我,直到接触了ESP8266才用到接收)
    后面我发现有个很好的东西,串口IDLE中断,能自动响应你从电脑(别的串口)接收到的不定长数据。而不是一直干等着。
    先简单说说原理吧,大概是,你的stm32接收数据时,并不会马上把数据马上处理掉,而是写到你定义的缓冲区里,然后你串口线上一个BYTE长度的时间如果没接收到数据,就会产生了IDLE中断(只会产生一次,别担心一直会卡在里面,除非等下次再接收时)

    代码

    代码很简单,不多说,附上

    static void NVIC_Configuration(void)
    {
    	NVIC_InitTypeDef	NVIC_InitStructure;
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    	NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    	NVIC_Init(&NVIC_InitStructure);
    }	
    //在初始化串口的前提下,调用此函数初始化空闲接收中断
    void Uart_Idle_Receive_Config(void)
    {
    	NVIC_Configuration();
    	USART_ITConfig(DEBUG_USART,USART_IT_RXNE,ENABLE);
    	USART_ITConfig(DEBUG_USART,USART_IT_IDLE,ENABLE);
    }
    

    中断服务函数如下

    #ifdef	USE_IDLE_RECEIVE			//使用串口空闲中断,开启中断服务
    static u16 uart_rec_count = 0;
    uint8_t UART_RECEIVE_BUF[100];
    void USART1_IRQHandler(void)
    {
    	u16 times;
    	if(USART_GetITStatus(DEBUG_USART,USART_IT_RXNE) != RESET)
    	{
    		UART_RECEIVE_BUF[uart_rec_count] = USART_ReceiveData(DEBUG_USART);
    		uart_rec_count++;
    		//USART_ClearITPendingBit(DEBUG_USART,USART_IT_RXNE);//千万别加
    	}
    	if(USART_GetITStatus(DEBUG_USART,USART_IT_IDLE) != RESET)
    	{
    	UART_RECEIVE_BUF[uart_rec_count] = USART_ReceiveData(DEBUG_USART);//这里要读一下才能清空标志位,不然会卡在中断里
    		/*此处加入对接收缓冲区的操作*/
    		
    		
    		/***************************/		
    		uart_rec_count = 0;
    		//USART_ClearITPendingBit(DEBUG_USART,USART_IT_IDLE);//千万别加
    	}
    }
    
    #endif
    

    加个预编译头,避免你不用的时候,写了个中断服务函数程序卡在这里,要用就define一下就好了
    注意:千万别软件清除中断标志位,不然会一直进IDLE中断,不信自己试试。
    就是USART_ClearITPendingBit(),不然程序卡死在中断里了。你读出来,人家硬件会自动清除.

    展开全文
  • 由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。IDLE中断什么时候发生?IDLE就是串口收到一帧数据后,发生的中断。...

    今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。

    IDLE中断什么时候发生?

    IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。

    如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。

    看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。这个中断真是太TMD有用了。省去了好多判断的麻烦。

    如何配置好IDLE中断?

    下面我们就配置好串口IDLE中断吧。

    这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)

    (RXNE中断和IDLE中断的区别?

    当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)

    这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.

    需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。

    IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。(我怎么知道?手册上写的)

    下面以STM32F103为例给出源程序。

    我们先来看程序中的主要部分。

    串口初始化函数片段

    %E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD.png (17.99 KB, 下载次数: 45)

    下载附件 保存到相册

    2015-10-29 23:11 上传

    如果你原来的串口初始化函数具有打开串口接收中断的话,实际上就是在初始化函数中多了一条打开空闲中断的语句。

    串口中断函数

    串口中断函数里面,最重要的两条语句,就是上图中圈出来的两条语句。第一条语句用来判断是否接收到1个字节,第二条语句用来判断是否接收到1帧数据。(是不是感觉超级方便?妈妈再也不用担心我如何判断是否接收完1帧数据了。)

    主函数

    我写的这个主函数,是用来验证接收的正确性的。RxCounter表示的是这一帧数据有几个字节,接收完一帧数据,会在中断函数里面把ReceiveState置1,然后,通过串口把接收到的数据发送回串口。这样,既验证了接收了多少字节的正确性,又验证了接收到的数据是否正确。

     

    上图是结果验证。

    /**

    ******************************************************************************

    * @file    串口接收不定长字节数据

    * @author  瑞生

    * @version V1.0

    * @date    2015.10.23

    * @brief   Main program body

    ******************************************************************************

    ******************************************************************************

    */

    /* Includes ------------------------------------------------------------------*/

    #include "stm32f10x.h"

    #include "uart.h"

    volatile uint8_t aRxBuffer[100]={0x00};

    volatile uint8_t RxCounter=0;

    volatile uint8_t ReceiveState=0;

    /**

    * @brief  Main program.

    * @param  None

    * @retval None

    */

    int main(void)

    {

    uint8_t i=0;

    USART1_Init();

    while (1)

    {

    if(ReceiveState==1)//如果接收到1帧数据

    {

    ReceiveState=0;

    i=0;

    while(RxCounter--)// 把接收到数据发送回串口

    {

    USART_SendData(USART1, aRxBuffer[i++]);

    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

    }

    RxCounter=0;

    }

    }

    }

    本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

    展开全文
  • 中断原理讲解例程流程详解库函数分析详解对应寄存器介绍对应函数介绍对应注释详解本篇文章提供两种方法:一种是 :IDLE 接收空闲中断+DMA一种是: IDLE 接收空闲中断+RXNE接收数据中断都可完成串口数据的收发知识点...

    历程详解

    详解包括:

    中断原理讲解

    例程流程详解

    库函数分析详解

    对应寄存器介绍

    对应函数介绍

    对应注释详解

    本篇文章提供两种方法:

    一种是 :IDLE 接收空闲中断+DMA

    一种是: IDLE 接收空闲中断+RXNE接收数据中断

    都可完成串口数据的收发

    知识点介绍:

    STM32 IDLE 接收空闲中断

    功能:

    在使用串口接受字符串时,可以使用空闲中断(IDLEIE置1,即可使能空闲中断),这样在接收完一个字符串,进入空闲状态时(IDLE置1)便会激发一个空闲中断。在中断处理函数,我们可以解析这个字符串。

    接受完一帧数据,触发中断

    STM32的IDLE的中断产生条件:

    在串口无数据接收的情况下,不会产生,当清除IDLE标志位后,必须有接收到第一个数据后,才开始触发,一但接收的数据断流,没有接收到数据,即产生IDLE中断

    STM32 RXNE接收数据中断

    功能:

    当串口接收到一个bit的数据时,(读取到一个停止位) 便会触发 RXNE接收数据中断

    接受到一个字节的数据,触发中断

    比如给上位机给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。

    串口CR1寄存器

    75e1d29bcca5e574b98bedc479b684c8.png

    对bit4写1开启IDLE接受空闲中断

    ,对bit5写1开启RXNE接收数据中断。

    串口ISR寄存器

    33db0a274a94c1831a5cd56da5db7af9.png

    此寄存器为串口状态查询寄存器

    当串口接收到数据时,bit5 RXNE就会自动变成1,当接收完一帧数据后,bit4就会变成1.

    清除RXNE中断标志位的方法为:

    只要把接收到的一个字节读出来,就会清除这个中断

    在STM32F1 /STM32F4 系列中 清除IDLE中断标志位的方法为:

    先读SR寄存器,

    再读DR寄存器。

    79f9fba08297b6a535b243b585450e38.png

    memset()函数

    extern void *memset(void *buffer, int c, int count)

    buffer:为指针或是数组

    c:是赋给buffer的值

    count:是buffer的长度.

    USART采用DMA接收时,如何读取当前接收字节数?

    #define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNDTR);

    DMA接收时该宏将返回当前接收空间剩余字节

    实际接受的字节= 预先定义的接收总字节 - __HAL_DMA_GET_COUNTER()

    其本质就是读取NTDR寄存器,DMA通道结构体中定义了NDTR寄存器,读取该寄存器即可得到未传输的数据数呢,

    NTDR寄存器

    2738ebf7db9211d18f3e7903d0de0a80.png

    实现方法:

    两种利用串口IDLE空闲中断的方式接收一帧数据,方法如下:

    方法1:实现思路:采用STM32F103的串口1,并配置成空闲中断IDLE模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这次接受的数据长度是200个字节,那么在单片机接收到一个字节的时候并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区数组里面。当整帧数据发送完毕之后串口才会产生一次中断,此时可以利用__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);函数计算出当前DMA接收存储空间剩余字节

    本次的数据接受长度=预先定义的接收总字节-接收存储空间剩余字节

    比方说 本次串口接受200个字节,

    HAL_UART_Receive_DMA(&huart1,rx_buffer,200);//打开DMA接收

    然后我发送了 Zxiaoxuan 9个字节的数据长度

    那么此时 GET_COUNTER函数读出来 接收存储空间剩余字节 就是191个字节

    实际接受的字节(9) = 预先定义的接收总字节(200) - __HAL_DMA_GET_COUNTER()(191)

    9 = 200-191

    应用对象:适用于各种串口相关的通信协议,如:MODBUS,PPI ;还有类似于GPS数据接收解析,串口WIFI的数据接收等,都是很好的应用对象。

    方法2:实现思路:直接利用stm32的RXNE和IDLE中断进行接收不定字节数据。 每次接收到一个字节的数据,触发RXNE中断 将该字节数据存放到数组里,传输完成之后,触发一次IDLE中断,对已经获取到的数据进行处理

    例程1

    本例程功能:

    使用DMA+串口接受空闲中断 实现将接收的数据完整发送到上位机的功能

    2d7d79ad6c702f22847252c9ea52d3ac.png

    接收数据的流程:

    首先在初始化的时候打开DMA接收,当MCU通过USART接收外部发来的数据时,在进行第①②③步的时候,DMA直接将接收到的数据写入缓存rx_buffer[100] //接收数据缓存数组,程序此时也不会进入接收中断,在软件上无需做任何事情,要在初始化配置的时候设置好配置就可以了。

    数据接收完成的流程:

    当数据接收完成之后产生接收空闲中断④

    在中断服务函数中做这几件事:

    判断是否为IDLE接受空闲中断

    在中断服务函数中将接收完成标志位置1

    关闭DMA防止在处理数据时候接收数据,产生干扰。

    计算出接收缓存中的数据长度,清除中断位,

    while循环 主程序流程:

    主程序中检测到接收完成标志被置1

    进入数据处理程序,现将接收完成标志位置0,

    将接收到的数据重新发送到上位机

    重新设置DMA下次要接收的数据字节数,使能DMA进入接收数据状态。

    例程代码:

    uart.c

    volatile uint8_t rx_len = 0;  //接收一帧数据的长度

    volatile uint8_t recv_end_flag = 0; //一帧数据接收完成标志

    uint8_t rx_buffer[100]={0};  //接收数据缓存数组

    void MX_USART1_UART_Init(void)

    {

    huart1.Instance = USART1;

    huart1.Init.BaudRate = 115200;

    huart1.Init.WordLength = UART_WORDLENGTH_8B;

    huart1.Init.StopBits = UART_STOPBITS_1;

    huart1.Init.Parity = UART_PARITY_NONE;

    huart1.Init.Mode = UART_MODE_TX_RX;

    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

    huart1.Init.OverSampling = UART_OVERSAMPLING_16;

    if (HAL_UART_Init(&huart1) != HAL_OK)

    {

    Error_Handler();

    }

    //下方为自己添加的代码

    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //使能IDLE中断

    //DMA接收函数,此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度

    HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);

    }

    uart.h

    extern UART_HandleTypeDef huart1;

    extern DMA_HandleTypeDef hdma_usart1_rx;

    extern DMA_HandleTypeDef hdma_usart1_tx;

    /* USER CODE BEGIN Private defines */

    #define BUFFER_SIZE  100

    extern  volatile uint8_t rx_len ;  //接收一帧数据的长度

    extern volatile uint8_t recv_end_flag; //一帧数据接收完成标志

    extern uint8_t rx_buffer[100];  //接收数据缓存数组

    main.c

    /*

    *********************************************************************************************************

    * 函 数 名: DMA_Usart_Send

    * 功能说明: 串口发送功能函数

    * 形  参: buf,len

    * 返 回 值: 无

    *********************************************************************************************************

    */

    void DMA_Usart_Send(uint8_t *buf,uint8_t len)//串口发送封装

    {

    if(HAL_UART_Transmit_DMA(&huart1, buf,len)!= HAL_OK)   //判断是否发送正常,如果出现异常则进入异常中断函数

    {

    Error_Handler();

    }

    }

    /*

    *********************************************************************************************************

    * 函 数 名: DMA_Usart1_Read

    * 功能说明: 串口接收功能函数

    * 形  参: Data,len

    * 返 回 值: 无

    *********************************************************************************************************

    */

    void DMA_Usart1_Read(uint8_t *Data,uint8_t len)//串口接收封装

    {

    HAL_UART_Receive_DMA(&huart1,Data,len);//重新打开DMA接收

    }

    while循环

    while (1)

    {

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

    if(recv_end_flag == 1)  //接收完成标志

    {

    DMA_Usart_Send(rx_buffer, rx_len);

    rx_len = 0;//清除计数

    recv_end_flag = 0;//清除接收结束标志位

    //

    for(uint8_t i=0;i

    //

    {

    //

    rx_buffer[i]=0;//清接收缓存

    //

    }

    memset(rx_buffer,0,rx_len);

    }

    HAL_UART_Receive_DMA(&huart1,rx_buffer,BUFFER_SIZE);//重新打开DMA接收

    }

    stm32f1xx_it.c中

    #include "usart.h"

    void USART1_IRQHandler(void)

    {

    uint32_t tmp_flag = 0;

    uint32_t temp;

    tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位

    if((tmp_flag != RESET))//idle标志被置位

    {

    __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位

    //temp = huart1.Instance->SR;  //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能

    //temp = huart1.Instance->DR; //读取数据寄存器中的数据

    //这两句和上面那句等效

    HAL_UART_DMAStop(&huart1); //  停止DMA传输,防止

    temp  =  __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);// 获取DMA中未传输的数据个数

    //temp  = hdma_usart1_rx.Instance->NDTR;// 读取NDTR寄存器,获取DMA中未传输的数据个数,

    rx_len =  BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数

    recv_end_flag = 1;

    // 接受完成标志位置1

    }

    HAL_UART_IRQHandler(&huart1);

    }

    注释详解:

    注释1:

    temp = UartHandle.Instance->SR;  //清除状态寄存器SR,读取SR寄存器可以实现清除SR寄存器的功能

    temp = UartHandle.Instance->DR; //读取数据寄存器中的数据

    这两句被屏蔽的原因是它们实现的功能和这下面串口IDLE状态寄存器SR标志位清零的宏定义实现的功能是一样的:

    __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位

    我们可以点击这个宏定义进去看看,它实现的功能和上面两句是一样的:

    #define __HAL_UART_CLEAR_IDLEFLAG(HANDLE) __HAL_UART_CLEAR_PEFLAG(HANDLE)

    028446ba87b98747e1875964a7d4d2a0.png

    注释2:

    temp  = hdma_usart1_rx.Instance->NDTR;// 获取DMA中未传输的数据个数,NDTR寄存器分析见下面

    同理, 这句被屏蔽的原因是因为他和上面的__HAL_DMA_GET_COUNTER的作用也是一样的,都可以获取DMA中未传输的数据个数

    c64ceaf9018d1a74163baf184388358a.png

    测试正常:

    0f101433acfa1bee46af66bbde1925ca.png

    此程序可以进

    关键字:

    STM32

    HAL

    CubeMX

    串口

    IDLE接收

    空闲中断

    DMA

    编辑:什么鱼 引用地址:

    http://news.eeworld.com.cn/mcu/ic507322.html

    本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

    展开全文
  • 由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。 IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断。...

    原文来自

    http://www.51hei.com/bbs/dpj-39885-1.html

    今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。
    IDLE中断什么时候发生?
    IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。
    如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。
    看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。这个中断真是太TMD有用了。省去了好多判断的麻烦。
    如何配置好IDLE中断?
    下面我们就配置好串口IDLE中断吧。
    这里写图片描述
    这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)
    (RXNE中断和IDLE中断的区别?
    当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)
    这里写图片描述
    这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.
    需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。(我怎么知道?手册上写的)
    下面以STM32F103为例给出源程序。
    我们先来看程序中的主要部分。
    串口初始化函数片段
    这里写图片描述
    %E7%A9%BA%E9%97%B2%E4%B8%AD%E6%96%AD.png (17.99 KB, 下载次数: 45)
    下载附件 保存到相册
    2015-10-29 23:11 上传
    如果你原来的串口初始化函数具有打开串口接收中断的话,实际上就是在初始化函数中多了一条打开空闲中断的语句。
    串口中断函数
    这里写图片描述
    串口中断函数里面,最重要的两条语句,就是上图中圈出来的两条语句。第一条语句用来判断是否接收到1个字节,第二条语句用来判断是否接收到1帧数据。(是不是感觉超级方便?妈妈再也不用担心我如何判断是否接收完1帧数据了。)
    主函数
    这里写图片描述
    我写的这个主函数,是用来验证接收的正确性的。RxCounter表示的是这一帧数据有几个字节,接收完一帧数据,会在中断函数里面把ReceiveState置1,然后,通过串口把接收到的数据发送回串口。这样,既验证了接收了多少字节的正确性,又验证了接收到的数据是否正确。
    这里写图片描述
    上图是结果验证。
    点击下载源程序: STM32串口接收不定长数据程序.zip (2.25 MB, 下载次数: 112)

    我是瑞生,毫无保留的给大家透露电子设计经验,不定时分享实用的落地的电子设计技巧,希望能够帮助到大家。

    
    
    /**
      ******************************************************************************
      * @file    串口接收不定长字节数据
      * @author  瑞生
      * @version V1.0
      * @date    2015.10.23
      * @brief   Main program body
      ******************************************************************************
      ******************************************************************************
      */  
    
    /* Includes ------------------------------------------------------------------*/
    #include "stm32f10x.h"
    #include "uart.h"
    
    
    volatile uint8_t aRxBuffer[100]={0x00};
    volatile uint8_t RxCounter=0;
    volatile uint8_t ReceiveState=0;
    /**
      * @brief  Main program.
      * @param  None
      * @retval None
      */
    int main(void)
    {
            uint8_t i=0;
    
            USART1_Init();
    
      while (1)
      {
                    if(ReceiveState==1)//如果接收到1帧数据
                    {
                            ReceiveState=0;
                            i=0;
    
                            while(RxCounter--)// 把接收到数据发送回串口
                            {
                                    USART_SendData(USART1, aRxBuffer[i++]);        
                                    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
                            }
                            RxCounter=0;
                    }
      }
    }
    
    
    复制代码
    展开全文
  • STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA

    千次阅读 多人点赞 2020-03-22 11:01:56
    关于DMA原理部分讲解,及CubeMx配置部分,请参考该文章 【STM32】HAL库 STM32CubeMX...一种是: IDLE 接收空闲中断+RXNE接收数据中断 都可完成串口数据的收发 知识点介绍: STM32 IDLE 接收空闲中断 功能: 在使用...
  • 串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。STM32的串口资源相当丰富的,功能也相当强劲。ALIENTEK战舰STM32开发板所使用的STM32F103ZET6最多可提供5路串口,有分数波特率发生...
  • STM32 IDLE中断

    千次阅读 2018-02-03 22:59:46
    STM32串口使用IDLE中断接收不定长数据原理与源程序 转载 2016年07月16日 18:20:24 原文来自 http://www.51hei.com/bbs/dpj-39885-1.html 今天说一下STM32单片机的接收不定长度字节数据的方法。...
  • 本文开发环境: MCU型号:STM32F103ZET6 IDE环境: MDK 5.29 代码生成工具:STM32CubeMx 5.3.0 HAL库版本:STM32Cube_FW_F1_V1.8.0(STM32Cube MCU Package for STM...串口接收IDLE空闲中断的配置 串口收发DMA线的...
  • 由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。IDLE中断什么时候发生?IDLE就是串口收到一帧数据后,发生的中断。...
  • stm32F1的串口DMA和stm32F4的大同小异,使用时要区分通道和数据流区别。 直接上代码 usart.c #include "usart.h" uint8_t Uart1_Rx_Buff[DMA_UART1_RX_SIZE]; uint8_t Uart1_Tx_Buff[DMA_UART1_TX_SIZE]; ...
  • 由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。 IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断...
  • UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器,UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。是在应用程序开发过程中使用频率最高的数据总线。 ...
  • 由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。 IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断...
  • 由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。 IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断...
  • 因此利用IDLE中断进行串口不定长数据的接收。省去了用于检测传输是否完成的判断动作。 然而在HAL库中并未集成IDLE中断的处理,所以,我们可以在串口的中断处理中添加对IDLE总线状态的判断,以检测当前帧是否传输
  • 想做好通信,串口一定要非常熟,一个经典的问题。 很多时候,看问题多个角度看,串口容易出问题,可以多从固件库...1,方法3:实现思路:直接利用stm32的RXNE和IDLE中断进行接收不定字节数据。 RXNE中断和IDLE中...
  • 原理:利用串口的接收中断和空闲中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口空闲中断 使用了2种代码,原理一致,可以在...
  • 原理:利用串口的空闲中断和DMA搬运工 USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启串口空闲中断 单片机串口接收不定长数据时,必须面对的一个问题为:怎么判断这一包数据接收完成了呢? 常见的方法主要...
  • DSP281x模板及例程

    2009-07-24 10:45:49
    DSP281x模板及例程, sprc097_281x 例程程序介绍 主要特点 高性能价格比 更加完备的硬件功能,丰富的软件例程 芯片支持C语言编写,编译率高达90% 系统资源 ...参考资料与参考设计(原理图 PDF格式)
  • (1)修改中断禁止部分 # if defined(CONFIG_S3C2410) ldr r1, =0x7ff /*根据 2410 芯片手册,INTSUBMSK 有 11位可用 */ ldr r0, =INTSUBMSK Create PDF files without this message by purchasing novaPDF ...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

串口idle中断原理