发帖数

53

原创数

53

关注者

11

阅读数

9260

点赞数

1

黄忠

  • 啥?烧录器连不上STM32单片机了,别慌,自举模式来帮忙!

    大家好,我是张飞实战黄忠老师,今天我们来分享STM32单片机的自举BOOT模式。

    当你拿到项目的线路板,打开电脑,噼里啪啦一阵子,撸了一段代码出来,往单片机里面一下载,纳尼?突然发现烧录器掉线了,怎么整都连接不上了,这个时候整个人心情都不好了,别慌,恢复心情,你需要用到下面这个高端大气上档次的技术,首先说明一下我们本次文章参考芯片以SMT32F103C8T6来做说明,其他芯片同理,话不多说,我们开整。

     

    首先我来简单阐述一下这种方法的原理,这种方法是利用了STM32单片机的“自举BOOT模式”,首先使单片机处于系统BOOT模式,也就是让单片机启动的时候从System memory启动,然后在PC机操作上位机软件通过串口发送控制命令擦除芯片中存储的程序。

     

    1.首先我们要知道第一个信息,有的单片机有很多个串口,那到底是从哪一个串口来发送这个命令呢?我们从数据手册的“存储器和总线架构”章节(2.4启动配置小节)获取如下信息,可以得出可以使用USART1接口启动自举程序。具体要发送什么命令,可以参考AN2606手册,我已经通过这个手册提炼出指令信息,编写成一个上位机小工具。

    图片13.png                           

    2. 那么如何进入系统自举模式呢?从下图画红线处可以得出信息,想要进入系统自举模式,需配置BOOT0引脚为1(高电平),BOOT1引脚为0(低电平),然后复位单片机,那么在SYSCLK的第4个时钟上升沿会锁定BOOT引脚状态,并选择启动模式为系统存储器,即系统自举模式。

        图片14.png

                                    

    3. 接下来我们看看接线图,我画出了简单的示意图如下,各位看官,请结合下图看具体操作方法:

    图片15.png 

                                3

    1).USB转换工具按照图示方法连接(注意全过程不需要使用烧录器且此步操作后目标板已经带电,如果目标板3.3V功耗很大,需要给目标板用外部电源供电)。

    2).在设备管理器中查看此转换工具对应的串口号(注意如果没有识别到串口,需要安       装驱动。)识别到的结果如下图4所示:

    3).设置BOOT0引脚为高电平,BOOT1引脚为低电平(如果有的MCU没有BOOT1引脚可以忽略),并复位单片机(可以通过单片机复位引脚来复位单片机),使单片机处于自举BOOT模式。

     图片16.png  图片17.png

      

    4).在上位机小工具中选择对应的COM串口号,点击打开串口

    5).点击擦除按钮

    6).在小工具的中间窗口处会显示擦除成功

    经过上面的6步擦除成功后,把目标板恢复至初始状态,即可继续正常使用了。(注意在连接不上之前,需先检查烧录器和MCU的接线是否接好)。

    如果需要上述小工具的,可以在公众号中添加客服二维码,备注领取串口小工具,来索取。


    收藏 0 回复 0 浏览 97
  • 抛开CRC校验的“神秘面纱”

    大家好!我是张飞实战电子黄忠老师!今天给大家抛开CRC校验的“神秘面纱”!

    模2运算是一种二进制算法,CRC校验技术中的核心部分。与四则运算相同,模2运算也包括模2加法、模2减法、模2乘法、模2除法四种运算。


    与四则运算不同的是模2运算不考虑进位和借位,模2运算是编码理论中多项式运算的基础。下面我们就来看一看什么是模2运算。


    模2运算使用与四则运算相同的运算符,即“+”表示模2加,“-”表示模2减,“×”或“·”表示模2乘,“÷”或“/”表示模2除。与四则运算不同的是模2运算不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。


    “模2加法”就是0和1之间的加法,其中0+0 =0,1+0 =0+1 =1,1+1=0。这种运算是比较常用的,并不神秘。对于任意多个数a1,a2,…,an(每个都是0或1),可以把它们做模2加法a1+a2+…+an。当这n个数中有奇数个1时,结果为1,否则结果为0。例如0101+0011=0110,列竖式计算:

    image.png

    模2减法是一种不考虑借位的减法,其定义如下:0-0=0,1-1=0,1-0=1,0-1=1。同样,第四式代表了模2减法的特征。在多位模减法中,每位都按上述定义进行运算,不考虑借位问题。根据上面减法可以得出一个结论:奇数个1相减得1,偶数个1相减得0。例如0110-0011=0101,列竖式计算:

    image.png

    一位数的模2乘法定义如下:0*0=0,0*1=0,1*0=0,1*1=1,多位数的模2乘法与普通乘法一样演算,区别是,部分积相加时按模2加,即奇数个1相加得1,偶数个1相加得0。例如1011×101=100111,列竖式计算:

    image.png

    模2除法是模2乘法的逆运算,定义如下:0÷1=0,1÷1=1,类似于普通的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。普通多位二进制除法按带借位的二进制减法,根据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够不够减除数是没有意义的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。例如1011÷101=110101...001,列竖式计算:

    image.png

    模2算术是编码理论中多项式运算的基础。大家一定要掌握哦,下篇文章我们就一起看看它到底在CRC中是如何发挥作用的。

    收藏 0 回复 0 浏览 96
  • 你知道“链接”吗

    在最开始人们编写程序时,都将所有的代码都写在同一个源文件中,经过长期的积累,程序可能包含了N多行的代码,程序员维护起来非常困难。迫切地希望将程序源代码分散到多个文件中,一个文件一个模块,能够更好地阅读和维护程序,这个时候,链接器就闪亮登场了。

    我们知道,数据是保存在存储器中的,对于单片机来说,必须知道这些数据的地址才能使用。变量名、函数名等仅仅是地址的一种代名词儿,旨在编程时更加方便地使用数据,当源文件被编译成可执行文件后,这些标识符都不存在了,它们都被替换成了数据的地址。

    任何程序的执行,最终都要依靠计算机硬件来完成,单片机是大规模集成电路,它只认识高低两个电平(电压),假设高电平为 3.3V,用1表示,低电平为 0V,用0表示。也就是说,在单片机底层,只有 0 和 1 两个二进制数字,这就是机器语言。

    使用机器语言编程,十分繁琐又耗时,并且很容易出错。如果程序包含了多个源文件,就很可能会有跨文件的跳转、在程序拥有多个模块时会导致更加严重的问题。于是大神们发明了汇编语言,这相比机器语言来说是个很大的进步。汇编语言使用接近人类的各种标号来帮助记忆,比如用jmp表示跳转指令,用func表示一个子程序(C语言中的函数就是一个子程序)的起始地址,标号的方法使得人们从具体的机器指令和二进制地址中解放出来。标号这个概念随着汇编语言的普及被广泛接受,它用来表示一个地址,这个地址可能是一段子程序的起始地址,也可以是一个变量的地址。

    随着软件规模的日渐庞大,代码量开始疯长,汇编语言的缺点逐渐暴露出来。汇编虽然提供了多种标号,但它依然非常接近计算机硬件,程序员要考虑很多细节问题和边界问题,而且不利于模块化开发,所以后来人们发明了C语言。C语言是比汇编更加高级的编程语言,极大地提高了开发效率,以加法为例,C语言只需要一条语句,汇编却需要四五条。

    单片机编程中,程序员通过会把很多功能分散到成许多个模块中。这些模块之间相互依赖又相互独立,原则上每个模块都可以单独开发、编译、测试,改变一个模块中的代码不需要编译整个程序。在程序被分隔成多个模块后,需要解决的一个重要问题是如何将这些模块组合成一个单一的可执行程序。在C语言中,模块之间的依赖关系主要有两种:一种是模块间的函数调用,另外一种是模块间的变量访问。函数调用需要知道函数的首地址,变量访问需要知道变量的地址,所以这两种方式可以归结为一种,那就是模块间的符号引用。这种通过符号将多个模块拼接为一个独立的可执行程序的过程就叫做链接(Linking)。
        在一个STM32项目中,代码被分为多个文件时,链接器可以链接ARM代码、Thumb代码、Thumb-2 代码,并自动生成交互操作中间代码,以便在需要时切换处理器状态。链接器还可以在需要时自动生成内联中间代码或长跳转中间代码,以扩展跳转指令的范围。

    链接器还可以生成关于链接文件的调试和引用信息、生成静态调用图并列出堆栈的使用情况、控制输出映像中符号表的内容、显示输出中代码和数据的大小。链接器针对下一次文件编译提供反馈信息,提示编译器有关未使用函数的情况。 可以根据提示在后续编译中将未使用的函数放置在各自的节中,以便链接器将来删除这些函数。

    图片38.png 

    使用链接器构建可执行映像时,链接器将解析输入对象文件之间的符号引用,从库中提取对象模块来满足还未满足的符号引用的需要,根据属性和名称排序输入节,并将属性和名称相似的节合并为相邻块,删除未使用节,删除重复的公共组和公共代码、数据及调试节,根据提供的分组和布局信息将对象片段组织为内存区,给可重定位值分配地址,最终生成可执行映像。


    收藏 0 回复 0 浏览 95
  • 什么是USB的描述符?


    USB只是一个总线,只提供一个数据通路而已。USB总线驱动程序并不知道一个设备具体如何操作,有哪些行为。具体的一个设备实现什么功能,要由设备自己来决定。那么,USB主机是如何知道一个设备的功能以及行为呢?这就要通过描述符来实现了。那么什么是USB的描述符呢?其实就是一些传递的协议信息,比如设备的类型、厂商ID、产品ID、端点情况、版本号等信息。

    既然描述符是协议信息,那么不同的版本也会有所不同,比如USB1.1协议定义的标准描述符有设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符、类特殊描述符以及厂商自定义的描述符。那么USB2.0协议中又增加了两个新的标准描述符有设备限定符描述符和其他速度配置描述符。随着USB协议版本的提升,大家知道都是为了提升速度和可靠度,让用户有更快更高效的体验。那么USB1.1是全速设备,现在我们一起看下USB1.1协议定义的描述符吧。

    一个USB设备只有一个设备描述符。设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符;而在每个配置描述符中又决定了该配置里有多少个接口,每个接口都有一个接口描述符;在接口描述符里又定义了该接口有多少个端点,每个端点都有一个端点描述符;端点描述符定义了端点的大小、类型等。如果有类特殊描述符,它跟在相应的接口描述符之后。由此可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,接下来是配置描述符,再下来是接口描述符,最下面是端点描述符。在主机获取描述符时,首先获取设备描述符,接着再获取配置描述符,然后根据配置描述符中的配置集合的总长度,一次将配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符一次读回。对于字符串描述符,是单独获取的。主机通过发送获取字符串描述符的请求以及描述符的索引号、语言ID来获取对应的字符串描述符。

    设备描述符主要记录的信息有:设备所使用的USB协议版本号、设备类型、端点0的最大包大小、厂商IDVID)和产品IDPID)、设备版本号、厂商字符串索引、产品字符串索引、设备序列号索引、可能的配置数等。

    配置描述符主要记录的信息有:配置所包含的接口数、配置的编号、供电方式、是否支持远程唤醒、电流需求量等。

    接口描述符主要记录的信息有:接口的编号、接口的端点数、接口所使用的类、子类、协议等。

    端点描述符主要记录的信息有:端点号及方向、端点的传输类型、最大包长度、查寻时间间隔等。

    字符串描述符主要是提供一些方便人们阅读的信息,它不是必需的。

    说了半天,也许你还没搞清楚到底设备、配置、接口、端点等这些是什么东西。不要急,这些东西的确是有点晕人。特别是刚接触时,这么多的内容很容易让人搞混,或者似乎是懂了,然后再想想,似乎又没懂……这些所说的设备,就是一个实实在在的USB设备,例如一个USB鼠标。设备有一个设备地址,USB主机依靠这个设备地址来访问设备。而在设备内部还会分的更细。它会分出一些端点出来,例如端点0、端点1等。就是说,如果USB主机要和USB设备通信,光有设备地址是不够的,还需要一个端点地址。有了设备地址和端点地址,就能准确地对端点发送和读取数据了。好比你要去找8号教学楼的605教室,8号楼就是设备地址,而605教室就是端点地址。而配置和接口,是为了更方便地管理端点而抽象出来的概念。一个设备可以有多个配置,但是同一时刻只能有一个配置有效。每个配置下又可以有多个接口。当我们需要不同的功能时,只要选择不同的配置即可。拿刚才的教学楼来说,我们可以把它分成两个配置:平时上课用和考试用。考试用时,全部的教室都拿来作考场(即该配置下只有一个接口,接口下有很多端点---教室);而平时上课用时,分成两类(即该配置下有两个接口,每个接口下有一些端点---教室):教师休息室和上课的课室。教师休息室和课室是不能共用的(这在USB中也是如此,同一个端点号不能出现在同一个配置下的两个或者更多个不同的接口中)。但是平时用来做课室或者休息室的教室,考试时都可以拿来作考场(这在USB中也是如此,同一个端点号可用在不同的配置中)。具有多个接口并由接口来实现功能的设备把它叫做USB复合设备,例如一个USB音频设备,它具有一个音频控制接口,另外还可能具有一到多个音频流或MIDI流接口。在主机端会把USB复合设备的每个接口当作一个功能设备来看待。像常见的USB鼠标、U盘等,通常是单一的设备,即一个设备下只有一个配置描述符、一个接口描述符。

    总结一下:由端点构成一个接口(或者反过来说,接口是端点的集合),由接口又构成一个配置(反过来说,配置是接口的集合),再由配置构成一个设备(设备是配置的集合)。学习USB,一定要把这些关系理清楚了,才能按照需要构造出一个合格的USB设备。如果一个设备的各种描述符成功返回了,那么可以说已经成功了大半。相反,只要描述符出现一点问题,哪怕只是一个bit的错误,都可能造成设备无法识别或者无法正常工作。


    收藏 0 回复 0 浏览 76
  • TTL通往RS232神奇之黑盒(二)

         延续前篇,跟大家分享了全隔离模块的通信接口转换原理设计过程,那么接下来就分享下我的PCB设计路程,有些过程看似简单,自己真正动手才发现自己可能会出错的点在哪里,这就是积累经验的过程。

    PCB实现也是一样的,需要细致,需要根据实际情况做出调整。

    首先是左进右出原则,根据实际需求,这个不是固定的。

    在布局前还是要先把规则设置好,有了规则自然事情就会变得有了约束,做事就不会没条理了。那么规则设置是需要注意什么呢。

        1、电气特性是必要配置的,间距设置,常规设置为0.2mm,敷铜间距可以稍微大点,我会设置为0.5mm。(这个间距要根据实际项目需求)

        2、线宽需要设置,首先我常规走线都是用推荐值,但是电源和地的线宽我用的大点,所以这里需要把范围配置一下,主要还是规避错误嘛。

    图片11.png 

        3、过孔的孔径常规我用0.3mm/0.6mm,那么对于限制就要设置好,否则也会报错的吧。

    图片12.png 

        4、还有一些间距为了自己去把控,我一般会设置为0,比如孔到孔的间距,最小阻焊的间距,丝印到阻焊的间距,丝印到丝印的间距等。

        规则设置好,就可以开始布局了。

        有信号隔离,那么隔离电源和隔离芯片也是要考虑敷铜的问题,所以布局需要考虑摆放问题。

     

    图片13.png 

        由于RS232接口尺寸问题,需要考虑最大,那么右端整个部分就是要放RS232,所以考虑合理化,那么隔离芯片部分就放在上端了,先模块化说完,后面贴整个效果图,那么大家就可以理解了。

    接下来看转换芯片和后端部分模块。

    图片14.png 

        这个布局除了要考虑放置问题,敷铜问题,还有就是走线。

        那么布局就实现了,接下来走线就不多说了,主要走线要先走信号线,最后走电源和地线,地常规都是通过敷铜方式实现,那么最终效果看下:

    图片15.png 

        最后需要提醒一点是泪滴效果。丝印调整以及版本号等信息的添加。

        到这里基本功能实现了,就是打板了,最后产品出来就可以通信使用了,如果大家感兴趣的话就持续关注我吧。后面会陆续分享出我的设计视频过程,随时欢迎大家跟我来探讨,或许还有其他实现方式。


    收藏 0 回复 0 浏览 75
×
黄忠