请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F 205RX 串口问题

[复制链接]
ziye-364331 提问时间:2019-1-25 15:25 /
条件:STM32F205RC , 主频: 120MHz ,3路串口(USART1,USART2,USART3), 内部FLASH模拟EEPROM         USART1收发 (中断接收,DMA2_Stream7发送)  USART2  (中断接收, DMA1_Stream6发送)   USART3(中断接收, DMA1_Stream3发送)。
1. 各个串口状态如下:
     串口1  用于和PC交互,1秒一次对外输出信息字节在(50-100字节),接收指令.
     串口2  1秒对外输出一串14字节数据,并且接收外设输入的数据(外部设备上电后自动对外输出数据)。
     串口3  2秒对外输出一串13字节数据,并且接收外设输入的数据(外部设备为问答式,只有MCU发指令,才会应答17字节数据)
2.  DMA发送中断中 清中断标志,关闭DMA,清除缓冲区(各自管理各自的DMA和缓冲区)。
3.  分时去调度和处理 三路串口的数据。

问题: PC每20秒发一次控制指令写EEPROM(97字节)。串口1,串口2均可以保持正常收发, 唯独串口3经常性的发生 DMA_Streamx->CR中发送被使能,但是 DMA_Streamx->NDTR为0的情况,DMA配置如下。
    DMA_InitStructure.DMA_Channel                  = DMA_Channelx;                          //指定DMA的通道
    DMA_InitStructure.DMA_PeripheralBaseAddr  = (uint32_t)( &(USARTx->DR));       //设置外设接口地址
    DMA_InitStructure.DMA_Memory0BaseAddr   = 0;                                              //设置内存地址
    DMA_InitStructure.DMA_DIR                        = DMA_DIR_MemoryToPeripheral;   //DMA方向为 内存->外设
    DMA_InitStructure.DMA_BufferSize               = 0;                                             //发送数据长度0
    DMA_InitStructure.DMA_PeripheralInc          = DMA_PeripheralInc_Disable;        //外设地址不变
    DMA_InitStructure.DMA_MemoryInc             = DMA_MemoryInc_Enable;            //内存地址自动增加
    DMA_InitStructure.DMA_PeripheralDataSize   = DMA_PeripheralDataSize_Byte;    //外设数据基础单元: 字节
    DMA_InitStructure.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;        //内存数据基础单元:字节
    DMA_InitStructure.DMA_Mode                     = DMA_Mode_Normal;                   //DMA使用默认方式,不使用 循环模式 DMA_Mode_Circular
    DMA_InitStructure.DMA_Priority                  = DMA_Priority_High;                     //DMA发送优先级
    DMA_InitStructure.DMA_FIFOMode              = DMA_FIFOMode_Disable;            //不使用内部FIFO
    DMA_InitStructure.DMA_FIFOThreshold       = DMA_FIFOThreshold_Full;
    DMA_InitStructure.DMA_MemoryBurst         = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst     = DMA_PeripheralBurst_Single;

有过如下实验:
1.  FLASH操作导致无法及时响应DMA的发送中断(中断中有关闭操作),导致DMA无法关闭。于是把串口3 DMA发送中断的抢占优先级降到最低,异常依然在串口3 DMA发送上。
2.  考虑调度时间问题,把周期拉长,问题依然在串口3 DMA发送上。
3.  交互的串口1对外波特率越高,串口3出现此问题的概率越低,串口1波特率降低,串口3出现此现象频率变高。
4.  交互指令只会对内部flash操作,没有任何指令发送到串口3上。

目前对串口3 加补丁可以处理这个异常,但是还没找到为什么异常总是在串口3的DMA上,还请大家帮忙一起分析下有什么地方值得怀疑的,谢谢!












收藏 评论3 发布时间:2019-1-25 15:25

举报

3个回答
butterflyspring 回答时间:2019-2-12 16:19:23
目前没有这方面的经验。但是可以尝试分别或一同停掉串口1,串口2,FLASH 擦除的动作。看看与哪一段代码相关。至少可以找到影响的方向。
曾经有过手误,把中断1的字符写到中断2里面去,花了很多功夫才纠正过来

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

xmshao 回答时间:2019-2-12 17:37:28
你说的异常可否再描述详细点?主要在什么情况下发生?你的几个中断优先级是如何安排的?

你说你加了补丁就解决了,具体怎么操作的?也给大家一些提示或提醒。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

ziye-364331 回答时间:2019-9-28 17:23:37
xmshao 发表于 2019-2-12 17:37
你说的异常可否再描述详细点?主要在什么情况下发生?你的几个中断优先级是如何安排的?

你说你加了补丁就 ...

    在mcu内部模拟eeprom的时候,比较频繁时擦写(自己写的算法只有flash写满才会擦除),会导致MCU丢中断的响应(这点可以理解)。   中断优先级就是默认
   主要问题是:串口1,串口2 ,串口3 同样在工作,DMA进不了中断的现象总出在串口3上,其他两个串口却没有这个情况,很不理解。
   打的补丁操作: 查询DMA   CNDTR 和  CR寄存器,如果CR使能,但是 CNDTR =0 的情况,就把DMA关闭(中断中会关,由于中断丢失导致无法关闭,所以只能查询到符合条件主动关闭,不完全依赖于中断去关闭)
  

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版