历史上的今天
返回首页

历史上的今天

今天是:2025年01月04日(星期六)

2019年01月04日 | 教你使用stm32接收串口的一帧数据

2019-01-04 来源:eefocus

stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据!若想发送一帧数据到串口请参照我博客中的另一篇文章——教你如何使用stm32发送一帧数据! 为了方便大家移植,提醒大家此次代码中的代码不需要任何修改,只需要复制粘贴即可!


第一步:首先配置串口中断!


(我配置的是串口3,可根据自己的使用情况更改配置。需要更改的地方:时 钟RCC,GPIO_PIN,中断入口,将所   有的USART3改为你配置的串口即可)



GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

USART_InitTypeDef  USART_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//TX

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);


GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//RX

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOB,&GPIO_InitStructure);

 

 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; 

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

NVIC_Init(&NVIC_InitStructure);

 

 

USART_InitStructure.USART_BaudRate=2400;   

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

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(USART3,&USART_InitStructure);

USART_Cmd(USART3, ENABLE);

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

重要提醒:这句话是打开串口接受中断。每收到一个字节进入一次中断!


USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);

重要提醒:这句话是打开串口接受一帧数据中断。每收到一帧数据进入一次中断!


至此,串口配置完成,下面进入中断入口函数中!


第二步:写中断处理函数



void USART3_IRQHandler(void)

{

u8 clear=clear;

USART_ClearFlag(USART3,USART_FLAG_TC);

 

if(USART_GetITStatus(USART3,USART_IT_RXNE)!=Bit_RESET)        

   {

 

           rece_buffer[RxCounter++]=USART3->DR;

   }

 

else if(USART_GetFlagStatus(USART3,USART_FLAG_IDLE)!=Bit_RESET)

        {

                clear=USART3->SR;

                clear=USART3->DR;

        RxCounter=0;

                }


}

至此串口配置完成,程序运行时,只需要将配置串口函数放到主函数中,当串口发来一帧数据后即可将所有数据存到接受缓冲数组中!

推荐阅读

史海拾趣

Gwconnect (Molex)公司的发展小趣事
超声波在医疗领域也有广泛应用,如超声波诊断仪利用超声波发射电路产生超声波并接收反射信号来形成图像,帮助医生进行疾病诊断。
Cedrat Technologies公司的发展小趣事

在电子行业中,振动控制是一个至关重要的领域。Cedrat Technologies凭借其在压电技术领域的深厚积累,成功开发了一套主动振动控制系统。该系统通过精确监测机械结构或设备的振动情况,利用压电执行器产生相位相反的振动信号,有效抵消原始振动。这一技术的问世,不仅大幅提升了设备的稳定性和精度,也为机械结构的振动控制开辟了新的途径。Cedrat Technologies因此在电子行业中树立了新的技术标杆。

Allen Avionics Inc公司的发展小趣事

在电子行业中,合作与共赢是企业发展的重要途径。Cedrat Technologies积极与产业链上下游企业建立紧密的合作关系,共同推动电子行业的发展。通过与合作伙伴的协同创新和技术交流,Cedrat Technologies不仅拓展了自身的业务范围,也提升了在行业内的影响力和竞争力。

Acutechnology公司的发展小趣事

在市场竞争日益激烈的背景下,Acutechnology公司深知品质是企业生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重品牌建设,通过广告宣传、参加展会等方式提升品牌知名度和美誉度。这些举措有效地提升了公司的市场竞争力,赢得了客户的广泛认可。

Aplus Integrated Circuits公司的发展小趣事

随着公司产品的不断优化和升级,Aplus Integrated Circuits开始寻求与国际市场的接轨。公司积极参与国际电子行业的交流与合作,与多家国际知名企业建立了稳定的合作关系。通过引进国外先进的技术和管理经验,公司的产品逐渐走向国际化,市场竞争力得到了进一步提升。

Gulf Semiconductor公司的发展小趣事

随着市场需求的不断增长,Aplus Integrated Circuits公司决定扩大生产规模。公司在原有生产线的基础上,增加了多条先进的生产线,并引进了自动化生产设备,提高了生产效率。同时,公司还加强了质量管理,确保产品质量的稳定性和可靠性。这些举措使得公司的产能得到了大幅提升,为公司的持续发展提供了有力保障。

这五个故事展示了Aplus Integrated Circuits公司在电子行业中的发展历程和成就,从创业初期的技术突破到与国际市场的接轨,再到应对行业变革的挑战、加强产学研合作以及扩大生产规模,每一步都体现了公司的努力和坚持。

问答坊 | AI 解惑

Flash FPGA十八般武艺于一身,打拼便携式

无疑,火热的便携式市场吸引了众多商家的目光。姑且不论新推出的iphone ,且看我们面前的手机:显示屏,GPS ,RF芯片,电源管理芯片,已经足以形成一个庞大完善的产业链。如果算上同样火热的军用、汽车、工业以及愈来愈炙手可热的医疗电子,怪不得能 ...…

查看全部问答>

中国已成世界第一光伏生产国

高交会开展以来,以光伏太阳能为代表的新能源参展项目受到不少追捧。记者在国家高新技术成果展区看到,力诺太阳 、天威保变等新能源公司展台十分热闹,昨日举行的中国太阳能光伏产学研合作联盟启动大会暨发展论坛也人满为患。   记者在现场看到 ...…

查看全部问答>

15075040

怎样学好单片机?…

查看全部问答>

关于AT89S52

我刚买了一个AY-USB-51F的机子,为什么会出现编程器不存在,,…

查看全部问答>

学习单片机汇编用什么编译器好!

最近这段时间正在学习单片机,看的是李光地老师的单片机基础,里面用到的都是汇编语言,但没用讲开发环境之类的东西,所以我想问问学习单片机汇编用什么编译器好…

查看全部问答>

ISD1760语音芯片SPI不能播放,独立模式可以播放

程序如下:(硬件应该没问题) SPI.H #ifndef _SPI_H_   #define _SPI_H_   #include   //#include \"typedef.h\"   #define uchar unsigned char #define uint unsigned int #define   ...…

查看全部问答>

公司一直采用8051F和ARM系列单片机,采用下TI的试试

       打算应用于低功耗的LED声光产品中,看了TI的介绍被TI的低功耗和节能吸引,在全球倡导绿色环保的大背景下,相信节能,减排,绿色,环保的产品更能深入人心。…

查看全部问答>

大家帮我看看串口接收中断的小麻烦。。。

各位高手,有2个大麻烦: 1、下好程序后,串口有接收到数据可以跳中断,但是,第二次下程序后,就不能跳到中断处理函数了,必须重新上电后才可以重新跳中断,这是为什么尼? 2、我想用串口接收中断来接收一个字符串,以目前来看只能接收到 ...…

查看全部问答>

TinyOS移植的问题

各位朋友,我今年的毕业设计中要用到TinyOS的移植问题,TinyOS是否能够移植到C8051F340单片机上呢?有人移植成功过吗?希望得到大家的帮助,谢谢啦!…

查看全部问答>

MSP430FR5739的32768HZ晶振不起振

MSP430FR5739的32768HZ晶振不起振,不知什么原因,求指导。 匹配电容用的两个18pf的电容(没找到12pf)的。 #include \"msp430fr5739.h\" /************************************************* **函数(模块)名称:  main(void) **功 ...…

查看全部问答>