历史上的今天
返回首页

历史上的今天

今天是:2025年01月07日(星期二)

正在发生

2019年01月07日 | STM32 USART DMA未知长度的数据接收转发

2019-01-07 来源:eefocus

今天终于实现了,未知长度的数据,串口1接收上位机的指令,串口2转发指令给模块,再接收模块数据通过串口2发送出去。整个串口的收发由DMA完成,运用串口总线空闲中断,这个真的是STM32的内部很好的一个东东,不消耗CPU资源。


  憋了我两天了,日思夜想,主要因为我对整个的逻辑开始没认真分析。


 程序参考部分http://www.amobbs.com/forum.php?mod=viewthread&tid=5486343&highlight=STM32%E5%AE%9E%E7%8E%B0USART%2BDMA%E6%8E%A5%E6%94%B6%E6%9C%AA%E7%9F%A5%E9%95%BF%E5%BA%A6%E7%9A%84%E6%95%B0%E6%8D%AE%E5%92%8C%E5%8F%91%E9%80%81


下面贴上部分我修改的程序,配置都是参考以上的,上面的写得非常详细,非常推荐看一下。


 在定义这一块修改了一下:


#define SENDBUFF_SIZE   10240


vu8 USART1_SEND_DATA[SENDBUFF_SIZE];     //512

vu8 USART2_SEND_DATA[SENDBUFF_SIZE]; //512

vu8 USART1_RECEIVE_DATA[SENDBUFF_SIZE]; //512

vu8 USART2_RECEIVE_DATA[SENDBUFF_SIZE]; //512

vu8 USART1_TX_Finish=1;// USART1发送完成标志量

vu8 USART2_TX_Finish=1; // USART2发送完成标志量


 


在DMA的配置里面


 DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;//512


 


中断里面:


串口1中断


void USART1_IRQHandler(void)

{

 u16 DATA_LEN;

u16 i;


if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//如果为空闲总线中断

   {

DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据

//USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除

       //USART_RX_STA = USART1->DR;

  DATA_LEN=SENDBUFF_SIZE-DMA_GetCurrDataCounter(DMA1_Channel5); 

if(DATA_LEN > 0)

       {

while(USART2_TX_Finish==0)//等待数据传输完成才下一次

           {

               ;

           }  

//将数据送DMA存储地址

           for(i=0;i

           {

               USART2_SEND_DATA[i]=USART1_RECEIVE_DATA[i];

           }

           //USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。

           DMA_Cmd(DMA1_Channel7, DISABLE); //改变datasize前先要禁止通道工作

           DMA1_Channel7->CNDTR=DATA_LEN; //DMA1,传输数据量       

USART2_TX_Finish=0;

           DMA_Cmd(DMA1_Channel7, ENABLE);

}

//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据

DMA_ClearFlag(DMA1_FLAG_GL5 | DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5);//清标志

DMA1_Channel5->CNDTR = SENDBUFF_SIZE;//重装填  512

DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA

//读SR后读DR清除Idle

i = USART1->SR;

i = USART1->DR;

}

if(USART_GetITStatus(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错

{

USART_ClearITPendingBit(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE);

}

  USART_ClearITPendingBit(USART1, USART_IT_TC);

  USART_ClearITPendingBit(USART1, USART_IT_IDLE);


}


 


串口2中断


void USART2_IRQHandler(void)

{

u16 DATA_LEN;

u16 i;



if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) //如果为空闲总线中断

   {

    DMA_Cmd(DMA1_Channel6, DISABLE);//关闭DMA,防止处理其间有数据

//USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除

       //USART_RX_STA = USART1->DR;

  DATA_LEN=SENDBUFF_SIZE-DMA_GetCurrDataCounter(DMA1_Channel6); 

if(DATA_LEN > 0)

       {

while(USART1_TX_Finish==0)//等待数据完成才下一次

           {

               ;

           }

//将数据送DMA存储地址

           for(i=0;i

           {

               USART1_SEND_DATA[i]=USART2_RECEIVE_DATA[i];

           }   

           //USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。

           DMA_Cmd(DMA1_Channel4, DISABLE); //改变datasize前先要禁止通道工作

           DMA1_Channel4->CNDTR=DATA_LEN; //DMA1,传输数据量      

USART1_TX_Finish=0;

           DMA_Cmd(DMA1_Channel4, ENABLE);

}

//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据

DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//清标志

DMA1_Channel6->CNDTR = SENDBUFF_SIZE;//重装填   512

DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA

//读SR后读DR清除Idle

i = USART2->SR;

i = USART2->DR;

}

if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错

{

USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE);

}

  USART_ClearITPendingBit(USART2, USART_IT_TC);

  USART_ClearITPendingBit(USART2, USART_IT_IDLE);



}


最近在CUBE实现了此功能,比老版本的库方便了许多。

推荐阅读

史海拾趣

Agere System(LSI Logic)公司的发展小趣事

Agere Systems(后来被LSI Logic收购)是一家在半导体行业具有重要影响力的公司之一。以下是该公司发展的五个相关故事:

  1. 公司成立和发展:Agere Systems成立于2000年,是由Lucent Technologies的微电子部门分拆而成。公司总部位于美国新泽西州的默里斯敦市。Agere Systems专注于开发半导体解决方案,包括通信芯片、存储芯片和无线网络技术。通过不断的技术创新和市场拓展,Agere Systems在短时间内成为半导体行业的领军企业之一。

  2. 无线通信技术:Agere Systems在无线通信技术方面取得了重大突破,推动了移动通信产业的发展。该公司开发了一系列的基带处理器和射频芯片,用于手机和其他移动设备中的无线通信。这些技术的应用使得移动通信设备具有更高的性能、更低的功耗和更广泛的覆盖范围,促进了全球移动通信市场的快速增长。

  3. 存储解决方案:除了在通信领域取得成功外,Agere Systems还致力于开发先进的存储解决方案。该公司生产的存储芯片和控制器广泛应用于硬盘驱动器、固态硬盘和存储系统中,为数据存储和处理提供了关键的技术支持。Agere Systems的存储产品以其高速、高效和可靠性而闻名,成为许多数据中心和企业用户的首选。

  4. 公司并购与重组:在Agere Systems发展的过程中,该公司进行了多次并购和重组以加强自身实力和市场竞争力。2007年,LSI Logic公司宣布收购Agere Systems,将两家公司的技术和资源整合在一起,共同致力于推动半导体行业的发展。通过这一合并,LSI Logic扩大了其在存储和通信领域的市场份额,进一步巩固了在全球半导体市场的领导地位。

  5. 技术创新与发展:Agere Systems始终把技术创新作为公司发展的核心驱动力。该公司投入大量资源用于研发,并与全球各地的科研机构和合作伙伴进行紧密合作。Agere Systems持续推出高性能、低功耗的芯片产品,并不断改进现有产品的性能和功能,以满足客户不断增长的需求。通过持续的技术创新和产品优化,Agere Systems在半导体行业保持了竞争优势,并为客户提供了更加先进和可靠的解决方案。

BOSER公司的发展小趣事

BOSER公司始终关注企业社会责任和可持续发展。公司在生产过程中积极采用环保材料和技术,降低能耗和排放。同时,BOSER还积极参与公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

需要强调的是,以上五个故事是基于电子行业常见趋势和挑战虚构的BOSER公司的发展故事。虽然这些故事是虚构的,但它们反映了电子公司在发展过程中可能遇到的机遇和挑战,以及如何通过不断创新和适应市场变化来实现持续发展。如果您希望了解真实存在的电子公司的发展故事,建议查阅相关公司的官方资料或新闻报道。

Devar Inc公司的发展小趣事

智能家居是电子行业的一个重要发展方向,Devar Inc公司也积极拓展这一领域。公司推出了一系列智能家居产品,如智能音箱、智能照明、智能安防等。这些产品不仅具备远程控制、语音控制等便捷功能,还通过Devar的AI技术实现了智能学习和智能联动。例如,智能音箱可以根据用户的习惯和喜好,为用户推荐音乐、新闻等内容;智能照明则可以根据环境光线和用户需求自动调节亮度和色温。

川晶科技公司的发展小趣事

川晶科技注重团队建设和人才培养。公司建立了完善的培训体系和发展机制,为员工提供丰富的培训机会和广阔的发展空间。通过引进高素质的人才和内部培养相结合的方式,川晶科技打造了一支高素质、专业化的团队。团队成员之间团结协作、互相支持,共同推动公司的持续成长和发展。同时,公司还建立了良好的激励机制和企业文化氛围,激发员工的工作积极性和创造力。

珠海艾派克(APEXMIC)公司的发展小趣事

随着技术的不断进步,艾派克逐渐在打印机芯片领域取得了突破。公司成功研发出一系列从打印机主控SoC芯片到耗材加密芯片的全系列打印机芯片产品,不仅满足了国内市场的需求,还成功打入国际市场,成为全球打印机通用耗材芯片的重要供应商。这一成就标志着艾派克在打印机芯片领域的领先地位得到了进一步巩固。

HellermannTyton公司的发展小趣事

面对全球经济波动和行业竞争加剧的挑战,Heimann Optoelectronics Gmbh果断实施转型升级战略。公司加大在物联网、人工智能等新兴技术领域的研发投入,成功开发出了一系列智能光电传感器和解决方案。这些产品能够实时监测环境变化、智能控制设备运行,为智慧城市、智能家居等领域提供了强有力的支持。通过转型升级,公司不仅巩固了传统市场的领先地位,还成功开拓了新的增长点。

问答坊 | AI 解惑

电容降压的问题

在电路中电容降压要注意哪些问题?…

查看全部问答>

485总线稳定性解决方法

485总线稳定性解决方法 一、关于485 总线的几个概念: 1、485 总线的通讯距离可以达到1200 米。 根据485 总线结构理论,在理想环境的前提下,485 总线传输距离可以达到1200 米。其条件是通讯线材优质达标,波特率为9600,只负载一台485 设备,才 ...…

查看全部问答>

这个下了怎么打开

机械设计毕业设计-微耕机cad装配图 资源大小: 99.59KB 资源类型: application/octet-stream 发布人: fengyuwuzuzk 发布日期: 2009-05-10 18:10 资源分: 1 下载人数: 35 …

查看全部问答>

如何通过Tornado自带的TCL命令实现对当前工程的编译?

问题:如何通过Tornado自带的TCL命令实现对当前工程的编译,不借助Tornado界面中所提供的编译操作,生成.o和.out文件。 实际上Tornado界面功能好像也是通过TCL命令来实现的,关键本人对TCL命令这块不太熟悉,有请大侠们指教。 …

查看全部问答>

怎样使用PB目录下的例子程序

C:\\WINCE500\\PUBLIC\\SERVERS\\SDK\\SAMPLES 比如说 我该如何建工程来使用它呢? 谢谢!…

查看全部问答>

求天线匹配网络,怎样才能是功率衰减得最少...

本帖最后由 paulhyde 于 2014-9-15 09:20 编辑 求拉杠天线匹配网络,拉杠天线长约一米,直径70mm左右......  …

查看全部问答>

【TI建议】论坛是否可以出本关于Stellaris 的书了

      最近想接触一下Stellaris ,正好在汇总论坛的帖子,顺便看看以前的帖子,学习了很多。       突然想到以前学习一款单片机的时候,第一件事都是找这个单片机的书。然后我去各个网上商店, ...…

查看全部问答>

Msp430 LaunchPad 与LCD1602的接口问题

本人是初学者,我最近也得到了msp430 Launchpad 这块板子,请问怎样能实现这块板子与LCD1602的连接啊,我要把AD转换的结果从LCD1602来显示。请高手指点一下。谢谢…

查看全部问答>