stm32串口中断优先级0XOD 0XOA结束怎么判断

STM32 串口中断接收数据
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
STM32 串口中断接收数据
#include &stm32f10x.h&
/***********************************************************************
***********************************************************************/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void delay(vu32 nCount)
&for(; nCount != 0; nCount--);
/***********************************************************************
************************************************************************/
&RCC_Configuration();//系统时钟配置
&NVIC_Configuration();//中断配置
&GPIO_Configuration();//GPIO口配置
&while(1)&&&&&&&&& //LED灯循环亮灭,串口循环发送ASCII&9&
& delay(5000000);
& GPIO_WriteBit(GPIOD,GPIO_Pin_2,Bit_RESET);&
& USART_SendData(USART1,'9');
&&&& while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
& delay(5000000);
& GPIO_WriteBit(GPIOD,GPIO_Pin_2,Bit_SET);&&&&&&&
/*****************************************************************************
*****************************************************************************/
//系统时钟配置
void RCC_Configuration(void)
&RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能串口1的GPIO时钟
&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE); //pa.9 pa.10 led0
/*****************************************************************************
*****************************************************************************/
//串口GPIO口配置
void GPIO_Configuration(void)
&GPIO_InitTypeDef GPIO_InitS
&USART_InitTypeDef USART_InitS
&/* LED0*/
&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
&GPIO_Init(GPIOD, &GPIO_InitStructure);
// GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE);&
&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;&&&& //复用推挽输出
&GPIO_Init(GPIOA, &GPIO_InitStructure);
&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;&& //悬浮输入
&GPIO_Init(GPIOA, &GPIO_InitStructure);
&USART_InitStructure.USART_BaudRate = 9600;&&&&& //设定波特率
&USART_InitStructure.USART_WordLength = USART_WordLength_8b;& //传输数据位数
&USART_InitStructure.USART_StopBits = USART_StopBits_1;&& //停止位1
&USART_InitStructure.USART_Parity = USART_Parity_No;&&& //不用校验位
&USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N//不用流量控制
&USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //使用接收和发送功能
&USART_Init(USART1, &USART_InitStructure);&&&&&& //初始化串口1
&USART_Cmd(USART1,ENABLE);&&&&&&&&&&& //串口1使能
&USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);&&&& //使能串口1 读中断
/*****************************************************************************
*****************************************************************************/
//中断配置
void NVIC_Configuration(void)
&NVIC_InitTypeDef NVIC_InitS
&NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);&&&& //先占优先权2,从优先级2位
&NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;&&& //开串口中断1
&NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;&& //指定抢占优先级别1
&NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;&&& //指定相应优先级别0
&NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
&NVIC_Init(&NVIC_InitStructure);
/*****************************************************************************
*****************************************************************************/
void USART1_IRQHandler(void)&&&&&& //串口接收中断,并将接收到得数据发送出
&u16 temp_
&if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//判断 是否 接收中断&
& temp_trx = USART_ReceiveData(USART1);
& USART_SendData(USART1,temp_trx);
&&&& while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);//判断 发送标志
/*****************************************************************************
*****************************************************************************/
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights ReservedSTM32串口发送中断 - CSDN博客
STM32串口发送中断
先说TC。即Transmission&Complete。发送一个字节后才进入中断,这里称为“发送后中断”。和原来8051的TI方式一样,都是发送后才进中断,需要在发送函数中先发送一个字节触发中断。发送函数如下
功能:中断方式发送字符串.采用判断TC的方式.即&判断&发送后中断&位.
输入:字符串的首地址
void&USART_SendDataString(&u8&*pData&)
&&&&pDataByte&=&pD
&&&&USART_ClearFlag(USART1,&USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.网友提供.
&&&&USART_SendData(USART1,&*(pDataByte++)&);&//必须要++,不然会把第一个字符t发送两次
中断处理函数如下
*&Function&Name&&:&USART1_IRQHandler
*&Description&&&&:&This&function&handles&USART1&global&interrupt&request.
*&Input&&&&&&&&&&:&None
*&Output&&&&&&&&&:&None
*&Return&&&&&&&&&:&None
*********/
void&USART1_IRQHandler(void)
&&&&if(&USART_GetITStatus(USART1,&USART_IT_TC)&==&SET&&)
&&&&&&&&if(&*pDataByte&==&'\0'&)//TC需要&读SR+写DR&方可清0,当发送到最后,到'\0'的时候用个if判断关掉
&&&&&&&&&&&&USART_ClearFlag(USART1,&USART_FLAG_TC);//不然TC一直是set,&TCIE也是打开的,导致会不停进入中断.&clear掉即可,不用关掉TCIE
&&&&&&&&else
&&&&&&&&&&&&USART_SendData(USART1,&*pDataByte++&);
其中u8&*pDataB是一个外部指针变量
在中断处理程序中,发送完该字符串后,不用关闭TC的中断使能TCIE,只需要清掉标志位TC;这样就能避免TC&==&SET&导致反复进入中断了。
串口初始化函数如下
/*********
名称:&&USART_Config
功能:&&设置串口参数
**********/
void&USART_Config()
&&USART_InitTypeDef&USART_InitS//定义一个包含串口参数的结构体
&&USART_InitStructure.USART_BaudRate&=&9600;&//波特率9600
&&USART_InitStructure.USART_WordLength&=&USART_WordLength_8b;//8位数据位
&&USART_InitStructure.USART_StopBits&=&USART_StopBits_1;//1位停止位
&&USART_InitStructure.USART_Parity&=&USART_Parity_No;//无校验
&&USART_InitStructure.USART_HardwareFlowControl&=&USART_HardwareFlowControl_N//无硬件流控制
&&USART_InitStructure.USART_Mode&=&USART_Mode_Rx&|&USART_Mode_Tx;//输入加输出模式
&&USART_InitStructure.USART_Clock&=&USART_Clock_D//时钟关闭
&&USART_InitStructure.USART_CPOL&=&USART_CPOL_L
&&USART_InitStructure.USART_CPHA&=&USART_CPHA_2E
&&USART_InitStructure.USART_LastBit&=&USART_LastBit_D
&&USART_Init(USART1,&&USART_InitStructure);//设置到USART1
&&USART_ITConfig(USART1,&USART_IT_TC,&ENABLE);//Tramsimssion&Complete后,才产生中断.&开TC中断必须放在这里,否则还是会丢失第一字节
&&USART_Cmd(USART1,&ENABLE);&//使能USART1
这里请问一个问题:开TC中断USART_ITConfig()如果放在我的USART_SendDataString()中再开,会丢失字符串的第一字节。必须放在串口初始化函数中才不会丢。不知道为什么??
这里笔者可以给出解释,你看下SECTION1&就可以知道为什么呢,你这样做的原理和SECTION1讲解的差不多,就相当于延时,而你后面没有丢失数据的主要原因就是你代码中有这么一句&USART_ClearFlag(USART1,&USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.网友提供.
再说判断TXE。即Tx&DR&Empty,发送寄存器空。当使能TXEIE后,只要Tx&DR空了,就会产生中断。所以,发送完字符串后必须关掉,否则会导致重复进入中断。这也是和TC不同之处。
发送函数如下:
功能:中断方式发送字符串.采用判断TC的方式.即&判断&发送后中断&位.
输入:字符串的首地址
void&USART_SendDataString(&u8&*pData&)
&&&&pDataByte&=&pD
&&&&USART_ITConfig(USART1,&USART_IT_TXE,&ENABLE);//只要发送寄存器为空,就会一直有中断,因此,要是不发送数据时,把发送中断关闭,只在开始发送时,才打开。&
中断处理函数如下:
*&Function&Name&&:&USART1_IRQHandler
*&Description&&&&:&This&function&handles&USART1&global&interrupt&request.
*&Input&&&&&&&&&&:&None
*&Output&&&&&&&&&:&None
*&Return&&&&&&&&&:&None
void&USART1_IRQHandler(void)
&&&&if(&USART_GetITStatus(USART1,&USART_IT_TXE)&==&SET&&)
&&&&&&&&if(&*pDataByte&==&'\0'&)//待发送的字节发到末尾NULL了
&&&&&&&&&&&&USART_ITConfig(USART1,&USART_IT_TXE,&DISABLE);//因为是&发送寄存器空&的中断,所以发完字符串后必须关掉,否则只要空了,就会进中断
&&&&&&&&else
&&&&&&&&&&&&USART_SendData(USART1,&*pDataByte++&);
在串口初始化函数中就不用打开TXE的中断了(是在发送函数中打开的)如下:
/************
名称:&&USART_Config
功能:&&设置串口参数
************/
void&USART_Config()
&&USART_InitTypeDef&USART_InitS//定义一个包含串口参数的结构体
&&USART_InitStructure.USART_BaudRate&=&9600;&//波特率9600
&&USART_InitStructure.USART_WordLength&=&USART_WordLength_8b;//8位数据位
&&USART_InitStructure.USART_StopBits&=&USART_StopBits_1;//1位停止位
&&USART_InitStructure.USART_Parity&=&USART_Parity_No;//无校验
&&USART_InitStructure.USART_HardwareFlowControl&=&USART_HardwareFlowControl_N//无硬件流控制
&&USART_InitStructure.USART_Mode&=&USART_Mode_Rx&|&USART_Mode_Tx;//输入加输出模式
&&USART_InitStructure.USART_Clock&=&USART_Clock_D//时钟关闭
&&USART_InitStructure.USART_CPOL&=&USART_CPOL_L
&&USART_InitStructure.USART_CPHA&=&USART_CPHA_2E
&&USART_InitStructure.USART_LastBit&=&USART_LastBit_D
&&USART_Init(USART1,&&USART_InitStructure);//设置到USART1
&&USART_Cmd(USART1,&ENABLE);&//使能USART1
在USART的发送端有2个寄存器,一个是程序可以看到的USART_DR寄存器(下图中阴影部分的TDR),另一个是程序看不到的移位寄存器(下图中阴影部分Transmit&Shift&Register)。
对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送结束;对照下图,当TDR中的数据传送到移位寄存器后,TXE被设置,此时移位寄存器开始向TX信号线按位传输数据,但因为TDR已经变空,程序可以把下一个要发送的字节(操作USART_DR)写入TDR中,而不必等到移位寄存器中所有位发送结束,所有位发送结束时(送出停止位后)硬件会设置TC标志。
另一方面,在刚刚初始化好USART还没有发送任何数据时,也会有TXE标志,因为这时发送数据寄存器是空的。
TXEIE和TCIE的意义很简单,TXEIE允许在TXE标志为'1'时产生中断,而TCIE允许在TC标志为'1'时产生中断。
至于什么时候使用哪个标志,需要根据你的需要自己决定。但我认为TXE允许程序有更充裕的时间填写TDR寄存器,保证发送的数据流不间断。TC可以让程序知道发送结束的确切时间,有利于程序控制外部数据流的时序。
&&&&&&&&总的来说,STM32单片机的串口还是很好理解的,编程也不算复杂。当然我更愿意希望其中断系统和51单片机一样的简单。
&&&&&&&&对于接收终端,就是RXNE了,这只在接收完成后才产生,在执行USART_ITConfig(USART1,&USART_IT_RXNE,&ENABLE)代码时不会进入ISR。但麻烦的就是发送有关的中断了:TXE或者TC,根据资料和测试的结果,TXE在复位后就是置1的,即在执行USART_ITConfig(USART1,&USART_IT_TXE,&&ENABLE)后会立即产生中断请求。因此这造成一个麻烦的问题:如果没有真正的发送数据,TXE中断都会发生,而且没有休止,这将占用很大部分的CPU时间,甚至影响其他程序的运行!
&&&&&&&&因此建议的是在初始化时不好启用TXE中断,只在要发送数据(尤其是字符串、数组这样的系列数据)时才启用TXE。在发送完成后立即将其关闭,以免引起不必要的麻烦。
&&&&&&&&对于发送,需要注意TXE和TC的差别——这里简单描述一下,假设串口数据寄存器是DR、串口移位寄存器是SR以及TXD引脚TXDpin,其关系是DR-&SR-&TXDpin。当DR中的数据转移到SR中时TXE置1,如果有数据写入DR时就能将TXE置0;如果SR中的数据全部通过TXDpin移出并且没有数据进入DR,则TC置1。并且需要注意TXE只能通过写DR来置0,不能直接将其清零,而TC可以直接将其写1清零。
&&&&&&&&对于发送单个字符可以考虑不用中断,直接以查询方式完成。
&&&&&&&&对于发送字符串/数组类的数据,唯一要考虑的是只在最后一个字符发送后关闭发送中断,这里可以分为两种情况:对于发送可显示的字符串,其用0x00作为结尾的,因此在ISR中就用0x00作为关闭发送中断(TXE或者TC)的条件;第二种情况就是发送二进制数据,那就是0x00~0xFF中间的任意数据,就不能用0x00来判断结束了,这时必须知道数据的具体长度。
&&&&&&&这里简单分析上面代码的执行过程:TXE中断产生于前一个字符从DR送入SR,执行效果是后一个字符送入DR。对于第一种情况,如果是可显示字符,就执行USART_SendData来写DR(也就清零了TXE),当最后一个可显示的字符从DR送入SR之后,产生的TXE中断发现要送入DR的是字符是0x00——这当然不行——此时就关闭TXE中断,字符串发送过程就算结束了。当然这时不能忽略一个隐含的结果:那就是最后一个可显示字符从DR转入SR后TXE是置1的,但关闭了TXE中断,因此只要下次再开启TXE中断就会立即进入ISR。对于第二种情况,其结果和第一种的相同。
&&&&&&&&&对于第一种情况,其程序可以这么写:其中TXS是保存了要发送数据的字符串,TxCounter1是索引值:
extern&__IO&uint8_t&TxCounter1;
extern&uint8_t&*TXS;
extern&__IO&uint8_t&TxL&
void&USART1_IRQHandler(void)
&&&&&&&&if(USART_GetITStatus(USART1,&USART_IT_TXE)&!=&RESET)
&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&if(TXS[TxCounter1])&//如果是可显示字符
&&&&&&&&&&&&&&&&&&&&{&USART_SendData(USART1,TXS[TxCounter1++]);}
&&&&&&&&&&&&&&&&else&&&//发送完成后关闭TXE中断,
&&&&&&&&&&&&&&&&&&&&{&USART_ITConfig(USART1,USART_IT_TXE,DISABLE);}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&
&&&&&&&&对于第二种情况,和上面的大同小异,其中TXLen表示要发送的二进制数据长度:
void&USART1_IRQHandler(void)
&&&&&&&&if(USART_GetITStatus(USART1,&USART_IT_TXE)&!=&RESET)&//对USART_DR的写操作,将该位清零。
&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&if(TxCounter1&TxLen)
&&&&&&&&&&&&&&&&&&&&{&USART_SendData(USART1,TXS[TxCounter1++]);}
&&&&&&&&&&&&&&&&else&&&//发送完成后关闭TXE中断
&&&&&&&&&&&&&&&&&&&&{&USART_ITConfig(USART1,USART_IT_TXE,DISABLE);}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&
&&&&&&&&事实上第一种情况是第二种的特殊形式,就是说可以用第二种情况去发送可显示的字符——当然没人有闲心去数一句话里有多少个字母空格和标点符号!
&&&&&&&&在使用时,只要将TXS指向要发送的字符串或者数组,设置TxLen为要发送的数据长度,然后执行USART_ITConfig(USART1,&USART_IT_TXE,ENABLE)就立即开始发送过程。用户可以检查TxCounter1来确定发送了多少字节。比如以第二种情况为例:
uint32_t&*TXS;
uint8_t&TxBuffer1[]=&ABCDEF&;
uint8_t&DST2[]=&ASDFGHJKL&;
__IO&uint8_t&TxLen&=&0x00;
&&&&&TxLen=8;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//发送8个字符,最终发送的是
&&&&TXS=(uint32_t&*)TxBuffer1;&&&//将TXS指向字符串TxBuffer1
&&&&TxCounter1=0;&&&&&&&&&&&&&&&&&&&&&//复位索引值
&&&&USART_ITConfig(USART1,&USART_IT_TXE,ENABLE);&&&//启用TXE中断,即开始发送过程
&&&&while(TxCounter1!=TxLen);&&&//等待发送完成
&&&&TXS=(uint32_t&*)TxBuffer2;&&&//同上,最终发送的是ASDFGHJK
&&&&TxCounter1=0;
&&&&USART_ITConfig(USART1,&USART_IT_TXE,ENABLE);
&&&&while(TxCounter1!=TxLen);
&&&&&&&&以上就是我认为的最佳方案,但串口中断方式数据有多长就中断多少次,我认为还是占用不少CPU时间,相比之下DMA方式就好多了,因为DMA发送字符串时最多中断两次(半传输完成,全传输完成),并且将串口变成类&#的器件。
本文已收录于以下专栏:
相关文章推荐
功能:通过PC机的串口调试助手发送数据给串口A,串口B接收到串口A发送的数据,再由串口B将接收到的数据返回给PC机的串口调试助手。
PC-&串口A-&串口B-&PC。
实验平台:stm32f...
main.c源码:
*PA0:KEY1;PA1:KEY2;
*PA2:LED1;PA3:LED2;
*PA9:USART1_TX;PA10:USART1_RX
#include...
main.c配置:
*PA0:KEY1;PA1:KEY2;
*PA2:LED1;PA3:LED2;
*PA9:USART1_TX;PA10:USART1_RX
#include...
main.c配置:
[cpp] view
plaincopyprint?
*说明: 
*PA0:KEY1;PA1:KEY2; 
说来惭愧,前日在调试stm32f10系列的单片机的时候,想做一个关于串口发送的状态机,每隔100毫秒发送一次命令。没有用DMA,就是想单纯的使用发送中断来数据,结果在调试的时候一直死在了串口中断那里,...
stm32串口占用时间、消耗CPU及最大中断时间的深度分析,探寻一种更有效的串口发送方式
参考链接.cn/s/blog_88534dff0102vtep.html
初始化后,用了自创的printf,结果串口助手软件显示不出字符来。但实际显示了...
串口通信一般有三种形式,即查询方式、中断方式和DMA方式。查询方式(也有人称为轮询法)效率不高,在需要查询时CPU的占用很高,在程序上的体现就是用循环不断
查询标志位状态,在查询时CPU不做其他事,因...
本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。
void USART1_IRQHandler(u8 GetData)
最近用到stm32的串口,中断一个字符一个字符接收好心累,网上度了一下发现了一篇好的帖子,和大家分享一下,原贴地址:/bbs/dpj-39885-1.html
...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)查看: 1169|回复: 3
串口实验必须要以0X0a和0X0d结尾嘛
主题帖子精华
中级会员, 积分 255, 距离下一级还需 245 积分
在线时间2 小时
& & &串口程序已经看过去很长时间了,今天翻出来重新看了一下发现,所有的串口中断服务函数里面都是用0X0d和0X0a作为结束判断的,在正常通讯的过程中,这是一个标准么?还是原子哥你自己定义的呢?
一般都会把回车键当作结尾,所以在串口程序中一旦判断到回车键以后就当作结束,你也可以自己做成其他的结尾方式,也可以不做
主题帖子精华
在线时间1164 小时
一般都会把回车键当作结尾,所以在串口程序中一旦判断到回车键以后就当作结束,你也可以自己做成其他的结尾方式,也可以不做
开往春天的手扶拖拉机
主题帖子精华
高级会员, 积分 643, 距离下一级还需 357 积分
在线时间27 小时
这个不是标准,主要看什么协议了,有些标准协议没有结束字节,有些有,比如:Modbus就没有结束字节,而DL/T645就已0x16作为结束符;这个主要看你怎么定义了
主题帖子精华
中级会员, 积分 324, 距离下一级还需 176 积分
在线时间37 小时
过来学习下下
Powered by查看: 4048|回复: 8
STM32用串口接收中断,为什么第一次的数据接收不到
如题,用串口中断接收,第一次数据始终接收不到,以后每次接收到的数据都是上次的数据(比如第二次接收的是第一次的数据)?
请问问题在哪?
附中断部分代码:
void USART2_IRQHandler(void)
& & & & if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
& & & & & & & & USART_ClearITPendingBit(USART2, USART_IT_RXNE);
& & & & & & & & RFReturn[Uart2_Rx_Num] = USART_ReceiveData(USART2);
& & & & & & & & Uart2_Rx_Num++;
& & & & & & & & if(RFReturn[0]!=0xaa)
& & & & & & & & {
& & & & & & & & Uart2_Rx_Num=0;
& & & & & & & & }
& & & & & & & & if(RFReturn[15]==0x01 && RFReturn[16]==0x01)
& & & & & & & & flag=1;//标志位(全局变量)
& & & & & & & & }
& & & & USART_ClearITPendingBit(USART2, USART_IT_RXNE);
本帖最后由 365mcu 于
11:03 编辑
清两次中断标志位干嘛?保留最后一个就好了吧。
还有中断里把数据存到buffer中就好了,其他操作可以查询完成吧。。。
<font color="#5mcu 发表于
清两次中断标志位干嘛?保留最后一个就好了吧。
还有中断里把数据存到buffer中就好了,其他操作可以查询完 ...
是的,清中断标志位是我没注意应该是注释掉的
还有就是中断里面只放
RFReturn[Uart2_Rx_Num] = USART_ReceiveData(USART2);
Uart2_Rx_Num++;
别的都放到查询里面,那跟放到中断处理里区别大吗
bysea 发表于
是的,清中断标志位是我没注意应该是注释掉的
还有就是中断里面只放
RFReturn = USART_ReceiveData(USART ...
只是建议,区别大小看情况的。
最好发个工程文件关于usart2的这部分,不一定就是中断出的问题吧。
<font color="#5mcu 发表于
只是建议,区别大小看情况的。
最好发个工程文件关于usart2的这部分,不一定就是中断出的问题吧。 ...
USART2部分代码为
void USART2_Config(void)
& & & & GPIO_InitTypeDef GPIO_InitS
& & & & USART_InitTypeDef USART_InitS
& & & & /* config USART2 clock */
& & & & RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
& & & & RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
& & & & /* USART2 GPIO config */
& && & & & /* Configure USART2 Tx (PA.02) as alternate function push-pull */
&&& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
&&& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
&&& & & & GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&& & & & GPIO_Init(GPIOA, &GPIO_InitStructure);
& & & && &&&
&&& & & & /* Configure USART2 Rx (PA.03) as input floating */
&&& & & & GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
&&& & & & GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
&&& & & & GPIO_Init(GPIOA, &GPIO_InitStructure);
& & & && &
& & & & /* USART2 mode config */
& & & & USART_InitStructure.USART_BaudRate = 38400;
& & & & USART_InitStructure.USART_WordLength = USART_WordLength_8b;
& & & & USART_InitStructure.USART_StopBits = USART_StopBits_1;
& & & & USART_InitStructure.USART_Parity = USART_Parity_N
& & & & USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_N
& & & & USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
& & & & USART_Init(USART2, &USART_InitStructure);
& & & & USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
& & & & USART_Cmd(USART2, ENABLE);
void USART2_NVIC_Configuration(void)
& & & & NVIC_InitTypeDef NVIC_InitS
& & & & /* Configure the NVIC Preemption Priority Bits */&&
& & & & NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
& & & & /* Enable the USARTy Interrupt */
& & & & NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;& & & &&&
& & & & NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
& & & & NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
& & & & NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
& & & & NVIC_Init(&NVIC_InitStructure);
就这两个函数,没别的了。
主函数里面也就是对这2个函数进行了初始化。
没人解答啊?
你可以在串口初始化的时候清一下标志位看看
1 、USART_ClearITPendingBit(USART2, USART_IT_RXNE);
---&& &两个都不要!
2、 Uart2_Rx_Num 初始化没?
Louis_Bright 发表于
1 、USART_ClearITPendingBit(USART2, USART_IT_RXNE);
---&& &两个都不要!
已经初始化设置为0了
阿莫电子论坛, 原"中国电子开发网"

我要回帖

更多关于 stm32串口空闲中断 的文章

 

随机推荐