历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2019年03月06日 | STM32中485采用串口DMA发送,切换收发状态问题

2019-03-06 来源:eefocus

RS485使用DMA发送,切换收发状态,有以下几种实现方式:


开启DMA的“发送完成中断”,在DMA的发送完成中断中,切换收发的状态。但是,这会导致最后的2个字节发送不出去,这是因为:DMA的“发送完成中断”出现在刚发送倒数第二个字节的起始位置,这个时候切换485的收发,若接收端不是奇校验的话 将会误收到0xFF 最后第一肯定也出不去。

网上提供的解决办法是:①在DMA的TC中断里面 加大于两个字节的延时 这是OK的。 ②在DMA的TC中断里面 开启USART的“发送完成中断” 去USART的中断里面去处理 这是OK的。

看数据手册,可以利用串口的“发送完成中断TC”实现。开启USART的DMA,开启DMA传输通道,开启USART的“发送完成中断TC”


具体实现:

配置USART和DMA ,DMA中断不用开。

准备发送的时候,


切换为485发送 RS485EN_TX();-

配置好DMA。传输的数据,与长度。

开启USART的传输完成TC中断

使能DMA =======等串口TC中断就行。

中断服务函数中,失能TC 切换485接收。

开始传输:


//-----尝试不开启DMA TC中断  直接直观传输  

void USART2_SendMsg(INT8U *msg,INT8U len)

{

        SET_RS485_SEND;                //高发送

         DMA_ClearFlag(DMA1_FLAG_TC7);      //清DMA发送完成标志

         USART_ClearITPendingBit(USART2,USART_IT_TC);

         DMA_Cmd(DMA1_Channel7, DISABLE);   //停止DMA

        DMA1_Channel7->CMAR = (INT32U) msg;                        //源地址

         DMA1_Channel7->CNDTR = len;//重设传输长度

         USART_ITConfig(USART2,USART_IT_TC,ENABLE);

         DMA_Cmd(DMA1_Channel7, ENABLE);    //启动DMA

}


传输完成后:



void USART2_IRQHandler(void)

{

        /*

        ...................

        */

        if(0x00000040 & (USART2->SR))//(USART_GetITStatus(USART2,USART_IT_TC))

        {

                USART2->SR &= ~0x00000040;//USART_ClearITPendingBit(USART2,USART_IT_TC);

                OSSemPost(Sem_Usart2Send);                

                SET_RS485_RECV;                        //发送完毕 改成接收状态

                USART2->CR1 &= ~0x00000040;//USART_ITConfig(USART2,USART_IT_TC,DISABLE);

                //OSIntExit();

                return;

        }

        /*

        ...................

        */

}        


这里说一下,我由于使用的时候,在发送的时候没有“清除发送完成标志”,导致传输第一个字节后,就进入了TC中断,切换了485状态。

代码:


RS485EN_TX(); //485切换为发送模式

__HAL_UART_DISABLE_IT(&UART3_Handler,USART_IT_RXNE); /* 禁止接收中断 */

__HAL_UART_ENABLE_IT(&UART3_Handler,USART_IT_TC);  /* 使能发送完成中断 */


if(__HAL_DMA_GET_FLAG(&UART3TxDMA_Handler,DMA_FLAG_TCIF3_7))  //等待传输完成

{

__HAL_DMA_CLEAR_FLAG(&UART3TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA1_Steam3传输完成标志

HAL_UART_DMAStop(&UART3_Handler);                          //传输完成以后关闭串口DMA 

}


时序:

在这里插入图片描述

修改后,在前面添加清除发送完成标志TC”后,既可以。

代码:


RS485EN_TX(); //485切换为发送模式


    __HAL_UART_CLEAR_FLAG(&UART3_Handler,UART_FLAG_TC);

    

if(__HAL_DMA_GET_FLAG(&UART3TxDMA_Handler,DMA_FLAG_TCIF3_7))  //等待传输完成

{

__HAL_DMA_CLEAR_FLAG(&UART3TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA1_Steam3传输完成标志

HAL_UART_DMAStop(&UART3_Handler);                          //传输完成以后关闭串口DMA 

}

    

    __HAL_UART_DISABLE_IT(&UART3_Handler,USART_IT_RXNE); /* 禁止接收中断 */

__HAL_UART_ENABLE_IT(&UART3_Handler,USART_IT_TC);  /* 使能发送完成中断 */

    

MYDMA_USART_Transmit(&UART3_Handler,(u8*)USART3_TX_BUF,DRIVER_FRAME_LENGTH); //启动传输


传输完成后:


//串口3中断服务程序

void USART3_IRQHandler(void)               

{

    uint8_t Res=0;

    uint16_t u16CheckCrcTemp = 0;

    if((__HAL_UART_GET_FLAG(&UART3_Handler,UART_FLAG_TC)!=RESET))

{

__HAL_UART_CLEAR_FLAG(&UART3_Handler,UART_FLAG_TC);

        

RS485EN_RX(); 

__HAL_UART_ENABLE_IT(&UART3_Handler,USART_IT_RXNE);  

__HAL_UART_DISABLE_IT(&UART3_Handler,USART_IT_TC);

        

    }

    if((__HAL_UART_GET_FLAG(&UART3_Handler,UART_FLAG_RXNE)!=RESET))

{

__HAL_UART_CLEAR_FLAG(&UART3_Handler,UART_FLAG_RXNE);

        

        Res = USART3->DR; 

        g_us485AlarmCnt=0;                  //485通信5s报警检测        

        if(USART3_RX_STA & 0x4000)

        {

            ++USART3_RX_STA;

            USART3_RX_BUF[USART3_RX_STA & 0xfff] = Res;

            if((USART3_RX_STA & 0xfff) == DRIVER_FRAME_LENGTH-1)  //接收帧尾

            {

                u16CheckCrcTemp = *(uint16_t*)(USART3_RX_BUF + DRIVER_FRAME_LENGTH - 2);

                if(u16CheckCrcTemp == crc_16((unsigned char *)USART3_RX_BUF,DRIVER_FRAME_LENGTH-2))

                {

                    if(USART3_RX_BUF[2]==0xff || USART3_RX_BUF[2]==g_ulaGdBuf[INDEX_ID]) //是否是正确的ID

                    {

                        run_driver_cmd();

                    }

                }

                USART3_RX_STA = 0;

            }

        }

        else if(USART3_RX_STA & 0x8000) //接收一帧数据的第二个数据 ---0xef 2017.1.13

        {

            if(Res != 0xfb)

            USART3_RX_STA = 0;

            else

            {

                USART3_RX_BUF[(++USART3_RX_STA)&0xfff] = Res;

                USART3_RX_STA |= 0x4000;

            }

        }

        else if(Res == 0xbf)  //接收一帧数据的第一个数据 ---0xfb 2017.1.13

        {

            USART3_RX_BUF[USART3_RX_STA & 0xfff] = Res;

            USART3_RX_STA |= 0x8000;            

        }

    }


时序为:

在这里插入图片描述


推荐阅读

史海拾趣

光磊(GL)公司的发展小趣事

关于晶体管水位自动控制电路,网友们可能会提出多种问题,这些问题可能涉及电路的工作原理、设计细节、实际应用中的挑战以及故障排除等方面。以下是一些可能的问题及相应的回答:

问题1: 晶体管水位自动控制电路的基本工作原理是什么?

回答: 晶体管水位自动控制电路通常利用浮子开关(或水位传感器)来检测水位的变化,当水位达到预设的上下限时,浮子开关会闭合或断开,从而改变晶体管的导通状态。晶体管作为开关元件,控制着继电器(或其他负载)的通断,进而控制水泵(或其他执行机构)的启停,以实现水位的自动调节。

问题2: 如何设计电路以确保准确性和稳定性?

回答: 设计时需要考虑多个因素,包括选择合适的晶体管类型(如NPN或PNP型)、合适的电阻值以限制电流并保护晶体管、使用稳定可靠的水位传感器、以及设计合理的防抖动电路来避免误操作。此外,还需进行充分的测试和调整,确保电路在不同水位和工况下都能准确、稳定地工作。

问题3: 在实际应用中,如何避免误报警或误动作?

回答: 误报警或误动作通常是由于水位传感器的误判或电路的干扰引起的。为了避免这种情况,可以采取以下措施:一是选用高质量、高灵敏度的水位传感器;二是增加滤波电路,减少电路中的噪声和干扰;三是设置合理的延时电路,避免由于水位短暂波动而引起的误动作;四是定期对电路进行检查和维护,确保各部件工作正常。

问题4: 如何调整电路的灵敏度以适应不同的水位控制需求?

回答: 电路的灵敏度可以通过调整电阻值、改变晶体管的型号或选择不同特性的水位传感器来实现。例如,增大电阻值可以减小电路的灵敏度,使得电路对水位变化的响应更加迟缓;反之,减小电阻值则可以提高电路的灵敏度。此外,也可以根据实际需求选择不同精度的水位传感器,以满足不同的控制精度要求。

问题5: 如果电路出现故障,应该如何进行排查和修复?

回答: 当电路出现故障时,首先应检查电源是否正常供电;然后检查水位传感器是否损坏或接触不良;接着检查晶体管、电阻等元件是否损坏或焊接不良;最后检查电路连线是否正确无误。在排查过程中,可以使用万用表等工具进行电压、电流等参数的测量和分析。一旦找到故障点,就可以根据具体情况进行修复或更换元件。

Fine Products Microelectronics Corp公司的发展小趣事

Fine Products Microelectronics Corp公司发展故事(虚构)

故事一:技术创新引领市场

Fine Products Microelectronics Corp(简称FPMC)自创立之初便致力于半导体技术的创新。在上世纪90年代,当半导体行业还普遍使用传统光刻技术时,FPMC的研发团队率先提出了步进式光刻机(Wafer Stepper)的概念。这一创新极大地提高了芯片制造的精度和效率,使得芯片特征尺寸得以大幅缩小。尽管初期面临技术难度大、市场接受度低等挑战,但FPMC凭借坚持不懈的努力,最终成功研发出并量产了步进式光刻机,迅速在半导体制造领域占据了领先地位。

故事二:与巨头的合作与竞争

在FPMC的成长过程中,与行业内巨头的合作与竞争是不可或缺的一部分。特别是在21世纪初,FPMC与IBM、TI等知名企业建立了合作关系,共同推进半导体技术的研发和应用。然而,这种合作并非一帆风顺,FPMC在某些关键技术上坚持自主研发,与IBM的电子束光刻(e-beam)技术产生了竞争。尽管这种竞争给FPMC带来了一定的压力,但也促使公司不断加大研发投入,提升技术实力,最终形成了自己独特的竞争优势。

故事三:石墨烯电极技术的突破

近年来,随着二维材料研究的兴起,FPMC紧跟科技前沿,成功研发出了石墨烯辅助金属电极转印技术。这一技术利用石墨烯与金属间较弱的范德华作用力,实现了金属电极阵列在二维沟道材料上的无损转移。该技术不仅提高了电极的制备精度和效率,还降低了制造成本,为二维芯片的应用开辟了新的路径。FPMC的这一创新成果迅速获得了业界的关注和认可,进一步巩固了公司在半导体材料领域的领先地位。

故事四:物联网时代的布局

随着物联网技术的快速发展,FPMC敏锐地捕捉到了这一市场机遇。公司及时调整战略方向,加大了对物联网相关产品的研发力度。通过与多家物联网企业和研究机构的合作,FPMC成功推出了一系列高性能、低功耗的物联网芯片和解决方案。这些产品广泛应用于智能家居、智慧城市、工业控制等领域,为物联网的普及和发展提供了强有力的支持。

故事五:绿色可持续发展

在追求技术创新和市场拓展的同时,FPMC始终不忘企业的社会责任。公司积极响应全球绿色可持续发展的号召,致力于研发环保型半导体产品和制造工艺。通过采用先进的节能减排技术和循环利用材料等手段,FPMC不仅降低了自身的生产成本和能耗水平,还为推动半导体行业的绿色可持续发展做出了积极贡献。此外,公司还积极参与社会公益活动,为构建和谐社会贡献自己的一份力量。

Freeport Resources Enterprises Corp公司的发展小趣事

在21世纪初,Freeport Resources作为一家历史悠久的矿业公司,开始意识到电子材料市场的巨大潜力。公司决定利用其丰富的矿产资源和勘探经验,转向对电子级金属材料的探索与开发。通过深入研究和市场调研,Freeport Resources成功定位了高纯度铜、钴等金属在半导体、电路板等电子领域的应用,并逐步建立了从矿产开采到电子材料加工的完整产业链。这一转型不仅为公司带来了新的增长点,也使其在电子行业中崭露头角。

川土(Chipanalog)公司的发展小趣事

2022年,川土微电子的CA-IS3062W产品荣获了中国IC设计成就奖之“年度最佳隔离器”。这一荣誉的获得不仅是对川土微电子技术实力的肯定,也进一步提升了公司在行业内的知名度。同时,这也为川土微电子未来的发展奠定了坚实的基础。

Gems Sensors & Controls公司的发展小趣事

随着技术的不断积累和市场的不断拓展,Gems Sensors & Controls公司成功加盟了全球知名的世界500强企业丹纳赫集团。这一举措不仅为公司带来了更多的资源和支持,也加速了Gems的全球化布局。如今,Gems的生产基地遍布北美、欧洲和亚洲,并在全球范围内设立了销售、设计和服务办事处,能够为客户提供更加全面和便捷的服务。

Fastron公司的发展小趣事

在电感器领域取得成功后,Fastron并没有止步不前。相反,公司积极拓展业务领域,实现了多元化发展。除了电感器业务外,Fastron还成功运营了大型钣金生产业务,专门生产精密金属外壳和机电组件。此外,Fastron集团还拥有位于德国的Rapid Biomedical公司,为MRI扫描仪定制MR线圈,进一步拓宽了公司的业务范围。

问答坊 | AI 解惑

漏电保护器的作用

低压配电系统中设漏电保护器是防止人身触电事故的有效措施之一,也是防止因漏电引起电气火灾和电气设备损坏事故的技术措施。但安装漏电保护器后并不等于绝对安全,运行中仍应以预防为主,并应同时采取其他防止触电和电气设备损坏事故的技术措施。 ...…

查看全部问答>

ce6.0 rc3有人试过了吗??

看到不少感兴趣的东西,原有的rc2下的bsp应该不需要修改就可以了吧? 有人试过ie和flash,手势识别怎么样吗…

查看全部问答>

LM3S8962串口问题解决了

前段时间比较忙,没来得及分析LM3S8962串口问题。今天花了一上午时间搞定了,原来是232片子坏了,换了个新的,串口能调通了。顺便发点LM3S8962串口的资料,大家共同学习进步。 [ 本帖最后由 beyondvv 于 2010-9-25 22:27 编辑 ]…

查看全部问答>

请各位模拟电路高手指教!

图中是一个产生500V左右高压的稳幅振荡电路,其中振荡电路点部分有一个磁罐,其中绕线如下图所示,磁罐输出端是100匝绕线,500V高压,和三极管 连接的是1匝和4匝绕线,电感分别是0.2uH和1.1uH左右,分别接在三极管的发射级和集电极,发射极的2个电 ...…

查看全部问答>

stm32的flash有几种加密方法?望各个大大不吝赐教

                                 就是防止程序被读出来,看手册上有一种是通过设置flash寄存器加密。但是有看见别人提到利用96位的stm32芯片ID号加 ...…

查看全部问答>

Q:LM3S控制电路与主电路隔离

一般都采用什么方法啊,亲。。。。…

查看全部问答>

传感器的参数怎么理解呢?求助,我是个初学者

传感器的参数怎么理解呢?求助,我是个初学者…

查看全部问答>

用TB捕获脉宽

想用TBCCRO捕获脉冲低电平宽度,思路是:tbccr0捕获到下降沿中断,则记下tbccro的值,并改为上升沿触发;捕获到上升沿中断,则记下tbccro的值,改为下降沿触发。 硬件:单片机:MSP430F149       晶振:32K,8M 输入信号:通过无 ...…

查看全部问答>

HT1621B稳定性

使用msp430f5418+HT1621B驱动段式液晶 先调试了两块样机 一切正常 但是后来把样机发给客户之后 客户再回发给我后 我想再做一些相关测试 供电一段时间后发现显示忽然不正常了 灰度很暗很暗 随后又焊接两块板子进行调试 都是一样的症状 最后进行相关 ...…

查看全部问答>

求个黑白信号,要做一个平板电视机的ERP,要用到黑白信号输入,有个发下,谢谢

求个黑白信号,要做一个平板电视机的ERP,要用到黑白信号输入,有个发下,谢谢…

查看全部问答>