草庐IT

STM32程序下载电路分析

朱嘉鼎 2023-07-12 原文

一、STM32程序下载有哪些方式

(1)STM32程序的下载一般通过JLINK这样的调试器;

(2)STM32程序的下载还可以通过ISP方式下载。

(3)这里只介绍ISP方式下载电路。

二、ISP下载原理

第1步:先设置BOOT1和BOOT0从系统区启动,执行系统中预设的程序

第2步:主机通过串口发送要下载的hex文件给STM32

第3步:系统预设的程序接收到hex后将其烧录到用户区flash中

第4步:设置BOOT1和BOOT0为从用户区启动,然后复位重启(复位)执行刚才下载的hex即可。

三、STM32的BOOT1和BOOT0与启动区的关系

 以上表格显得过于复杂,了解就行。只需要知道2个BOOT引脚设置如下:

(1)BOOT1始终为0

(2)BOOT0在ISP时要先为1,就是从系统存储区启动,也就是程序下载。

然后BOOT0为0,就是从主闪存存储器运行,也就是程序运行。

四、CH340下载电路的分析

1、综上分析,要实现一键下载,需要BOOT0先等于1,然后等于0。

2、主要通过CH340芯片的RTS和DTR引脚来改变BOOT0。而RTS和DTR引脚又是由PC端程序下载软件来实现。

3、实现BOOT0等于1。(这里最好把上述原理图和文章分频显示阅读更为方便)

3.1、首先要实现Q11三极管导通,由于R59是1K欧姆,R62是10KΩ。根据串联分压可知,Q11三极管导通时BOOT0引脚为高电平。(需要Q11三级管导通)

3.2、Q11三级管是PNP 三极管,1号引脚是基极,2号引脚是发射极,3号引脚是集电极。

PNP基极电压很高。集电极对发射极开路,也就是说,它不起作用。如果将基极施加到低电位,则集电极和发射极会短路。总结:Q11的1号引脚为低电平时,BOOT0引脚为高电平。(Q11的1号引脚为低电平)

3.3、继续往前推到,有两条路,一条是走RTS,一条是走Q10。 一看走RTS这条路比较好分析,所以先分析这条路。

走RST这条时,RTS为低电平便可使BOOT0为1。

3.4、当走Q10这条路时,Q10是NPN三极管,1号引脚是基极,2号引脚是发射极,3号引脚是集电极。因为RTS为低电平,所以Q10的发射极为低。

NPN基极电压高,集电极与发射极短路。低压,集电极和发射极开路。

(1)当Q10基极为高电平,即DTR为高电平时,Q10的集电极和发射极导通。所以D9这个二极管的阴极为低电平。当RESET引脚原先为高电平,此时RESET引脚电平就被拉低。

(2)当Q10基极为低电平时,Q10的发射极和集电集和发射极不会导通。D9这个二极管的阴极为高电平。(串联分压的话,R51为10KΩ,D9为无穷,所以二极管阴极相当于高)。当RESET引脚原先为高电平平,此时RESET引脚电平还是高电平,没有变化。

4、当使用FlayMcu工具的ISP方式下载软件时,需要注意以下几点:

(1)回顾程序自动下载运行的方式,先让BOOT0为1,然后BOOT0为0(或者让程序复位)

(2)所以选择首先要保证RTS为低电平,这使BOOT0为1,下载进程序。(但选择了也下不了)

(3)然后使DTR为高电平,产生一个复位。

(4)这里有一个非常需要注意的问题:你需要RTS为低电平,在FlayMcu软件中就需要选择RTS为高电平。DTR同理。这是因为FlayMcu软件输出的是RS232电平,而CH340这边是TTL电平。这两种电平刚好是相反的,所以这里需要选择RTS高电平。

(4)这就实现了程序的一键下载且自动运行。

五、一些零碎问题的补充

1、程序下载软件FlyMcu软件下载的官网:www.mcuisp.com

2、有些时候勾选了编程后执行,但由于选择下载的方式不同(RTS和DTR的方式),会导致有些情况程序可以下载但不能自动运行。

3、TTL高电平为逻辑“1”,低电平为逻辑符“0”;RS232高电平为逻辑“0”,低电平为逻辑“1”。

4、在下载STM32芯片的程序时不能勾选“编程到Flash时写选项字节”;下载GD时需要勾选。

有关STM32程序下载电路分析的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  7. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  10. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

随机推荐