最近在做一个同时需要MCU与FPGA的项目,具体说是FPGA作为MCU的FSMC(Flexible Static Memory Controller)接口的一个外设,通过SRAM接口与MCU通信。MCU用的是STM32中有FSMC接口的100pins器件STM32F103VET6,FPGA用的是国产安路小精灵系列的EF2L15。使用时发现当两种用同一路电源时,上电后MCU无法正常启动工作。现将我对问题的分析以及解决办法分享如下,以下原创内容欢迎网友转载,但请注明出处:https://www.cnblogs.com/helesheng

1、寻找和分析原因

观察到一个现象:上电后FPGA开始稳定工作后,虽然MCU不能工作,但按下MCU的复位键后,MCU能够恢复工作。因此我推测是MCU在和FPGA连接后无法正常复位造成的。但FPGA的启动过程要经过比特流文件从Flash加载到查找表中的过程;而STM32的程序却是从Flash中一边不断取指,一边执行的。启动速度是STM32完胜,怎么会出现STM32反而被FPGA影响的情况呢?显然问题只能发生在FPGA比特流尚未加载完成,MCU发生复位的阶段。

两者相连的FSMC接口,大部分管脚是MCU作为主设备输出信号,FPGA作为从设备输入信号。但当我用示波器观察时却发现,在安路小精灵系列EF2L15进行比特流加载阶段,这些管脚居然在输出高电平!我将这些IO约束为禁止PULLUP的NONE模式,但发现没有什么卵用:比特流配置过程中它们仍然我行我素的输出高电平——想来也是,还没有完成比特流配置,FPGA怎么知道这些管脚的模式是什么。

既然无法在上电的最初阶段保证MCU的正确上电复位,我只能退而求其次:在FPGA完成比特流配置后,再对MCU进行复位。用示波器观察EF2L15的配置完成管脚DONE,我沮丧的发现:这么一个“小精灵”,它的配置时间居然达到了400ms以上,这是常见上电复位芯片无法达到的。(如:我自己比较喜欢的MAX809/810的复位时间都只有200ms左右)。

我又想,干脆让EF2L15加载完成后,再用FPGA管脚输出一个的复位信号给MCU好了(具体代码见下一小节)。令人意想不到的事情再次发生:采用这种方法后,JLINK无法下载和调试MCU了。仔细一考虑,这也有道理:上电过程完成后,FPGA的输出的复位信号钳置了MCU的复位管脚,让JLINK在调试时下载MCU程序后无法复位MCU,从而导致无法调试MCU了。

绕了个大弯子,似乎又回到了原点。在上面的尝试后,我得到了以下两种有效的解决方案:

2、两种解决办法

方法一:缩短FPGA上电后比特流加载时间 + 延长MCU复位时间

既然无法保证将MCU复位时间延迟到400ms以上,把FPGA上电后比特流加载时间缩短也是一个不错的办法,在安路的官网上找到了这篇技术文档《TR404_ELF2 FLASH启动加载时间测试》,它提到有两种方法加快“小精灵”系列上电后比特流加载时间:a、提高读取比特流文件读取时钟;2、采用2位或4位比特流( mspix2或x4)加载代替1位比特流加载。

配置方法如下:

在TD中打开FPGA工程,Process菜单中的属性对话框中进行Properties Configuration,对mclk_freq_div进行配置,将其时钟频率配置到2.5MHz~24MHz之间的更高数值。

图1 Properties Configuration界面配置读取时钟频率

在 TD 软件 Download 界面上,在识别到 EF2 系列芯片以后点击左边的“Attribute BlockEditor”,先点 Read,弹出的 boot_mode 属性中选择 mspix1/x2/x4,然后点击Program 按钮,如图2所示,然后在 TD 主界面重新生成 Bitstream。在 Download 界面中选择 bit 文件,下载模式选择PROGRAM FLASH 下载,如图 3 所示。

图2 boot_mode配置

图3 下载界面

经过上述两部配置后,我的比特流加载时间被从400ms压缩到了20ms左右!

惊喜的发现,将比特流加载时间压缩到50ms以内后,不需要改动PCB,只要把STM32的复位电路从10KΩ+0.1uF改成10KΩ+1uF即可使MCU正常上电复位进入正常工作状态了。

方法二:FPGA加载后复位MCU

前面说过有一种思路是用FPGA在加载完比特流,开始运行以后,在输出一个复位MCU的信号。但这个方法的问题是,FPGA输出复位信号的管脚牵制了MCU的复位管脚,导致其无法通过JLINK调试和下载程序。参考STM32内部WWDG、IWDG和软件复位等多种信号共同控制系统总复位信号的电路,可以采用线与(Wired-AND)的方式管理来自FPGA的复位信号。即在MCU的复位电路上对地并联一个NPN晶体管或N沟道MOS管。参考下图4。

图5 “线与”方式实现来自FPGA的复位信号接入

采用这个电路后,来自FPGA的复位信号不会将MCU的复位管脚钳置到高电平,只会在需要时(输出高电平)打开NMOS管,实现低电平复位MCU。其他时间来自按键或MCU内部的WWDG、IWDG和软件复位都可以将MCU的复位信号拉低,以实现复位。

2、两种解决办法优缺点比较

第一种方法最简单,无需改动电路,且能够降低系统上电到运行的延迟时间。但缺点是当FPGA的比特流较大时,比特流加载时间仍然有可能超过MCU上电复位延迟时间,导致MCU无法正常复位。第二种方法最可靠,但要增加电路或修改PCB。

一个MCU与FPGA混合电路上电启动的问题及其解决办法探索[原创www.cnblogs.com/helesheng]的更多相关文章

  1. 在win7系统下安装把Ubuntu17.04安装在另一个硬盘开机无法进入Ubuntu问题的一种解决办法。【转】

    本文转载自:http://blog.csdn.net/u012879090/article/details/74937762 在win7系统下安装把Ubuntu17.04安装在另一个硬盘开机无法进入U ...

  2. dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法

    dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法 grub 启动菜单后加入 rootdelay=90, 如下:/boot/vmlinuz-2.6.3 ...

  3. installshield制作的安装包卸载时提示重启动的原因以及解决办法

    原文:installshield制作的安装包卸载时提示重启动的原因以及解决办法 有时候卸载installshield制作的安装包程序,卸载完会提示是否重启电脑以完成所有卸载,产生这个提示的常见原因有如 ...

  4. mac: vmware fusion中cent os启动假死的解决办法

    环境: mac os X 10.9.2 + vmware 6.0.2 + cent OS 6.5 minimal 现象: Booting CentOS (2.6.32-358.e.l6.i686) i ...

  5. Hbasewindows系统下启动报错及解决办法

    今天在本地windows电脑上,装pinpoint时,需要先安装一个Hbase数据库,按照教程下载启动Hbase数据库时,却启动报错:java.io.IOException: Could not lo ...

  6. python3中启动 uiautomator2viewer时报错解决办法

    事先说明:我电脑里同时了安装了 python2和python3,启动对应版本时分别带上版本号,如何设置共存请参考:python2与python3共存 打开命令窗口,启动weditor : python ...

  7. U盘安装Ubuntu 12.04成功后系统无法启动的原因及解决办法

    想搭建一个Linux开发环境,选择了ubuntu12.04长期支持版,采用u盘安装(Universal-USB-Installer做的启动),发现安装完成之后,拔掉u盘无法启动,插上u盘之后,可以重启 ...

  8. Tomcat几种启动报错及解决办法

    今天真跪了,tomcat的错想到想不到的都遇到了.不记录一下都愧对今天愁掉的hair 在此之前分享一个集错网站,应该是程序员必备的网站之一,不过纯英文,小酸爽 Tags - Stack Overflo ...

  9. Windows Installer 服务启动错误 14007 的解决办法

    问题: 在 本地计算机 无法启动 Windows Installer 服务. 错误代码 14007: 在活动的激活上下文中没有找到任何查找密钥. 这个问题似乎涉及到 Windows Installer ...

  10. ubuntu12.04下root启动wireshark报错解决办法

    在ubuntu11.10以后版本中发现,安装wireshark后用root权限启动,弹出如下错误: Running as user “root” and group “root”. This coul ...

随机推荐

  1. nodejs起一个http2

    静态页面 其实就是复制官网的代码 其中证书 是我自己申请的可以用证书 dingshaohua.com import fs from "fs"; import http2 from ...

  2. iga 入门之 有限元方法计算机解题概述

    简介 摘自 流体力学数值解法 step 数学准备 建立Ritz-Galerkin积分表达式,选择合适的单元类型和单元基函数,推导和建立单元有限元方程. 数据准备:区域剖分 将求解区域划分成合适的单元网 ...

  3. 解决EasyExcel读取日期为1905年

    问题 用EasyExcel导入Excel的时候读取日期出现问题,部分日期读取变成1905年 Excel中的日期格式比较特别,是yyyy.MM格式的,和数字类型的小数非常相似 和Excel中的日期对不上 ...

  4. SciTech-Mathmatics-Probability+Statistics-Population Vs. Sampling: Representative Samples + How to obtain Samples

    Difference: Population vs. Sample BY ZACH BOBBITTPOSTED ON NOVEMBER 27, 2020 Often in statistics we' ...

  5. SciTech-Logics逻辑学-Formal Logic-Stanford University 的 Reasoning(推理)的两大种类{ 归纳 和 演绎 }

    Stanford Introduction to Logic http://intrologic.stanford.edu/chapters/ An Online Course on Symbolic ...

  6. Unity随机地图之多边形生态圈地图生成(含源码)

    Minecraft地图生成原理剖析 https://zhuanlan.zhihu.com/p/43566129 https://zhuanlan.zhihu.com/p/43579344 https: ...

  7. Unity快速测试代码

    1.可以使用Unity自带的 ContextMenu 属性 小齿轮进行代码测试 2.使用插件 EasyButton https://github.com/madsbangh/EasyButtons 3 ...

  8. 免费的个人网站托管-Cloudflare

    前情 对于前端开发来说,拥有一个自己的个人网站是一种执着也是一种排面,但是大部分前端也都对服务端这一块的东西都停留在了解阶段,但是如果正儿八经的上线一个网站或多或少需要懂一些服务端知识,需要购买服务器 ...

  9. git 快速上手

    1.克隆仓库 git clone <地址> 例如: 我要克隆github这个仓库 通过复制HTTPS那里的指令 git clone https://github.com/datawhale ...

  10. WebRTC实现简单音视频通话功能

    1 WebRTC音视频通话功能简介 本文介绍如何基于WebRTC快速实现一个简单的实时音视频通话. 在开始之前,您可以先了解一些实时音视频推拉流相关的基础概念: 流:一组按指定编码格式封装的音视频数据 ...