发帖数

53

原创数

53

关注者

11

阅读数

9159

点赞数

1

黄忠

  • 不要再找啦,关于Cortex-Mx芯片的启动没有比这里更清楚啦!

    Cortex-Mx启动流程步骤详解

    单片机在上电的时候会经历一个启动的流程,不管是你从手册描述上看得见的,还是看不见的,亦或者你不知道还有这种操作的,这个启动都是客观事实存在的,今天我们就用白话文来唠一唠Cortex-Mx系列的启动流程(此文章知识广泛适用于CPUCortex-Mx系列的MCU)。

    图片16.png 

    1

    如上图为STM32F0系列单片机系统存储器的映射图(其他系列型号,映射图会有区别,但流程还是一样的),通常,当处理器从复位中启动时,它首先会访问位于0x0000 0000地址的向量表这个向量表是什么?从哪里来?跟程序员又有什么关系?明确的讲这几个问题跟我们的启动文件是紧密相关的。启动文件就是对启动流程的“展现”,启动文件中包含了向量表(向量表中包含了堆栈指针地址、复位向量程序地址、以及系统中各类中断函数的入口地址,简单点讲就是单片机启动的时候得经过这个向量表,执行复位程序得经过这个向量表,执行中断还得经过向量表,从向量表中找中断函数的入口地址)。当然启动文件也是由程序员写的(只不过大多数由厂家的Coder代劳了)。下面我们一起来弄清楚吧!

    图片17.png 

    2VectorTable部分截图)

    上图为厂家参考手册上给出的向量表的部分截图,启动文件中程序员编写的向量表就是根据这个表格来编写的,每一行为向量表的一个组成成员,第一行为表示堆栈指针初始值,第二个字为复位向量地址,后面的行是各种类型的中断向量地址,也就是中断函数的入口地址(在图中第一个字被描述为保留,第二个字描述为复位,这两行内容非常重要!)。

    前面我们说了一个关键点当处理器从复位中启动时,它首先会访问0x0000 0000地址处的向量表,并读取向量表的前2个字,第一个字为堆栈指针MSP初始值堆栈是一个临时的空间,用来临时存储一些信息,就像电影里面的“龙门客栈”一样,供过往客人临时歇脚。;第二个字为复位向量,它表示程序执行的起始地址。当读取到地址之后,会自动到复位向量处开始执行程序2红框处,最右边的一列地址栏,第一行地址空间从0x0000 0000开始 - 0x0000 0003结束,第二行从0x0000 0004开始-0x0000 0007结束,后面以此类推,每行占4个字节,即1个字)。

    但是比较晕的是:图1中大家可以看到,地址0x0000 0000已经存在内容了,是系统BOOT的配置,这段内容是厂家固化的一段代码,我们的代码是存储在从0x0800 0000开始往后的地方Main Flash Memory存储区见图1)。

    大家想我们写的代码启动文件也算写的代码的一部分),是放在FLASH存储区的单片机上电的时候是从0x0000 0000处开始执行,那么系统是怎么访问到我们自己写的这个向量表呢

    这个设计者考虑了,系统会自动把我们代码启动文件中的向量表映射到0x0000 0000地址处,也就是说在0x0800 0000开始存放代码的地方我们有一张自己写的向量表,系统会找到这张向量表,把这张向量表映射到0x0000 0000处这样就相当于在0x0000 0000开始的这个地方也有了一张向量表了。

    图片18.png 

    3

    如图3,系统一旦读取到向量表的第二个字复位向量的地址,那么就跳到复位向量的地址开始执行程序我们可以在复位向量地址处写上自己的用户代码,执行完这段代码之后,指挥程序跳到主函数main程序运行那么这样连贯起来,程序正常跑起来了这就是一个完整的启动

     


    收藏 0 回复 0 浏览 176
  • 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 浏览 74
  • TTL通往RS232神奇之黑盒(一)

        大家好!我是张飞实战电子黄忠老师。

        做单片机通信的,这些不同通信接口转换的模块是必不可少的,都说这些模块那么多,又不贵,那我索性也来做一个,全隔离的TTL转RS232模块,在这里就跟大家分享下我的实现过程,还有需要注意的地方。如果大家有不同的看法随时欢迎交流哈~

    首先呢先来说下需要实现什么,就是TTL转RS232,那么就可以来选择芯片,有信号隔离芯片、电源隔离芯片、转换芯片,主要就是这些。

        那么接下来我就来详细分享下我的实现过程。

        1、输入端电压我设计的是5V供电,因为后端我选取的DCDC隔离电源需要5V供电,所以这里需要提示下的。输入进来加个保险丝(9V/100mA),起到保护作用。还有输入端我一般会选择加个LED灯,提示用的。

    图片1.png 

        2、信号输入后开始进行全隔离,信号通过隔离芯片实现,电源信号通过隔离电源,实现全隔离;信号线一般需要加个小电阻(10R够了)增强鲁棒性,对于隔离部分处理相对简单,看图吧

    图片2.png图片3.png 

        3、接下来就是转换芯片(SP3232EIM/TR)部分了,对于RS232的信号,我做了功课,这里简单说明下,RS232信号0和1与TTL不一样,TTL工作电压是0~3.3V,RS232逻辑1电平是低于-3V的(保证电平在-3~-15V);逻辑0电平是高于3V的(保证电平在3~15V)接通状态呢有效电平高于3V,断开状态电平低于-3V,也就是当传输电平绝对值大于3V时,电路可以有效的检查出来。

    通过阅读RS232转换芯片的数据手册,看下对于电荷泵电容的说法,

     

    图片4.png 

    图片5.png图片6.png 

    那么我的设计就参照手册的推荐设计,另外我选用的芯片可以实现两路转换,我只用了一路。对于有芯片的设计还是要多看手册。

    4、最后就是输出部分的端口了,DB9接口,这个也要查询下相关资料,这里我跟大家分享下我查询的结果还有我的端口设计。

    图片7.png 

    图片8.png图片9.png 

    图片10.png 

        最后需要注意的是:主控目标和隔离模块通讯才用 杜邦线连接,隔离模块和从控目标通讯采用带有DB9接口的线材连接,这里需要注意带有DB9接口的线分TX和RX交叉、不交叉两个版本,采购时切记分清楚。

        那么这个小模块的设计就完成了,是不是觉得其他我们平时买的黑盒内容也没想象中那么复杂,技术需要沉淀,不管做软件设计也好,硬件设计也好,真的都要去实际完成才会有不一样的收获。或者在我的设计基础上也可以有不同的见解,还可以有更好的升华。思路需要开阔,当有了丰富的经验,设计什么都会变得容易的多。更多的积累才会换来更大的财富。

        后面就开始设计PCB过程了,最后产品出来就可以通信使用了,如果大家感兴趣的话就持续关注我吧。后面会陆续分享出我的设计视频过程,随时欢迎大家跟我来探讨,也让我可以开阔下思路,或许还有其他实现方式。


    收藏 0 回复 0 浏览 98
  • 51单片机DIY抽奖-技术分享(四)

    软件设计

    延续前篇,继续分享我的DIY抽奖设计之软件部分,上一篇我介绍了我做这个小产品的PCB设计过程,然后现在就到了实物板调试的阶段了,只有把相应的程序实现了,这个产品才能真正实现自己的价值,实现的过程可能会比较曲折,但没有过程哪来的结果,没有实践哪来的经验,话说真的一点没错吧。

    这里我只能描述实现过程和碰到的一些小问题,具体实现过程以及程序源码细节我也会陆续更新出视频,感兴趣的可以关注下~自己实践下更好了。

    我们要完成一个程序设计的话需要先设计算法,然后再实现算法,实现就要用到计算机语言来表述了,不然单片机也不认不是。这里我说一个概念就是结构化程序的设计强调程序设计风格和程序结构的规范化,那么就提倡用清晰的结构,我们不管是新手还是老手,规范化还是很有必要的,对自己程序的逻辑关系的考验,或者是对阅读者都是很好的,以至于到后期的调试或者扩展和修改算法都会变得容易了。

    我要实现抽奖功能,首先不能只有大的想法就够了,既然要实现就要把每个细节的逻辑关系都要落实才行,否则就不会出现你想要的结果。

    那么接下来我从大的方向到细化的过程以及设计要点都分享下哈~

    1、程序主要实现的功能:

    image01.pngimage02.png


    简单清晰,主要的调试点在内部实现的逻辑关系上。后续精彩着呢,待更完~


    2、顺序往下吧,对于单片机设计,首先就是要初始化,对IO口和定时器等进行配置才能使得单片机正常工作,每款单片机对外设的配置都是不一样的,那么就要研读数据手册了,这是避不开的。先来看下我的初始化部分。

    image03.png


    既然前面提到了分模块,从初始化到实际处理都要分模块进行,这样思路清晰。比如第一个函数是对单片机的初始化,主要就是I2C通信的IO口部分,蜂鸣器的IO口部分,定时器的部分,那么初始化就是直接对外设寄存器的配置;后面的模块主要就是对当前模块的全局变量的初值配置了。全局变量我一般都是用结构体来实现,每个模块定义一个结构体,名称和用法一目了然,想扩展也方便。


    3、初始化了,只能说单片机可以用了,具体还要看需要的应用模块,这样单片机才能顺利完成你需要的使命。继续看下抽奖大的模块,就是显示和按键了,再有一个就是蜂鸣器模块。

    有了大的模块就可以细分,把具体功能先确定好,再去实现就方便多了,我觉得做程序一定要把模块做好,然后模块间的全局变量尽量通过结构体来实现,这样结构清晰,逻辑性好。

    这是我个人经验,当能把习惯养好的时候,一定不要随意,否则浪费时间不说,程序结果也会不稳定。



    4、那这里我就分享下我的小DIY的模块的逻辑实现,先说显示部分吧,首先我做的这个有两个按键,一个开始,一个停止。按键开始后我会把对应显示模式的变量配置好,对应不同的模式再去进行处理。

    image04.png


    接下来细化了,就是在不同模式下做些什么,先来看下我的流程图,然后我再针对设计细节把想法说一下。

    image05.png


    对于获取当前获奖者,我的处理方法是通过指针获取当前序号对应数组的值,同时把当前值从数组中删除,直到数组中数据全部被抽完为止。

    流水灯以及显示数值由慢变快是怎么做的呢,主要就是定义一个全局变量,作为时间参数配置一个大一点的初始值,定时时间到时间参数减值,直到减到一个很小的值,这就是一个渐变的过程。

    image06.png


    具体的实现过程可以关注我的视频,所有代码都会分享到。

    5、那么按键模块的话就是扫描和处理了,按键部分我当时选取数码管驱动芯片就很明确了,具体可以看下我第一篇给大家推荐的那款芯片,很实用啊。那么对于扫描不需要做过多的处理,只需要直接读取就可以了,这个就没什么好说的了。只是I2C相关的读写函数要仔细研读手册了。

    接下来看下我的处理,也是状态机模式,整个网络之间的关系通过结构体全局变量实现。逻辑关系清晰。

    image07.pngimage08.png

        框架出来了,就是具体逻辑关系了,有短按和长按,这个长按只针对停止键,短按就是常规抽奖模式的开始和停止了,那么停止键在短按情况下,要判断当前模式是转盘转动模式还是设置模式,如果是转动模式就是进入停止模式(显示当前号码,蜂鸣器唱歌),如果是设置模式(配置抽奖号码总数),号码加1;启动键短按的处理,也是要判断当前模式是停止模式还是设置模式,如果是停止模式则进入转动模式,如果是设置模式,号码减1;还有一个长按停止键了,当前模式是停止模式,长按则进入设置模式,如果当前是设置模式那么就进入停止模式。长按的处理就是进入和退出设置模式。按键处理就这些需要实现的功能。

    最后就是一个蜂鸣器的模块处理,由于蜂鸣器我做了唱歌的功能,涉及到频率问题,所以我放在中断中完成(也是经过多次调试)。蜂鸣器唱歌要分析谱子,调调,真的有点音乐人的感觉了,通过计算低音,中音,高音的频率先计算配置好,然后要有曲子的分析,查表配置周期(可以用定时器的时钟分频模式)实现唱歌。这里学问太深,有兴趣的可以深挖一下,还是通过蜂鸣器模式来进入相应的状态,比如一声响,两声响,唱歌。这个都是可以自由分配的。

       到这里抽奖程序设计主体思路就这样实现了,整个DIY的产品就完成了。下面就是成品啦。

    image09.png

           纵观看下,功能不难,其实实现起来真的没你想的那么简单,逻辑关系要确定好,手册要研读好。有兴趣的话可以自己动手实践下,每个实践过程都会有很大收获的,后续会分享我的程序实现的视频过程,会更细致些。每个项目不论大小都会经历不同的坎坷啊。当你遇到不同的问题的时候慢慢解决了才是经验的积累过程。这个抽奖DIY小产品就完成了,大家可以看下我的实现有没有需要改进的地方呢?随时欢迎交流啊,或者有更好玩的产品一起探讨实现啊,每个都有每个的特点,都能学到不一样的知识点。后面我会陆续做出更多的小产品,每一个都会有侧重点,或者可以给我启发或建议一起完成你的想法啊,感谢大家对我的持续关注,还希望能给出更多的意见和建议















    收藏 0 回复 0 浏览 99
  • 51单片机DIY抽奖-技术分享(三)

    PCB设计

    前情提要:上一篇我介绍了我做这个小产品的原理图设计思路,通过对原理图部分的设计说明,大家可能觉得没什么东西,当你动手实现了整个过程,再回过头去看,其实收货还是比想象的多,每一次的历练都不是徒劳的,当你收获多个小产品的经验后,有一天你接手一个大项目就不会感觉束手无措,会感觉自己平时的经验都能用的上了,话不多说,下面就分享我的PCB设计过程,PCB设计首先就是定义板框,我这里想到抽奖的小产品,那么模样也不能差太多了吧,话说我从网上搜了下抽奖转盘图片,常规我们看到的都是类似下面这种吧?

    image.png


    那设计开始吧,板框设计,由于这是一个实验品,不需要做成像平时我们见到的那么大吧,所以我只需要自定义一个能把所有元器件放下的就可以了。


    image02.png


    板框实现了,就是把原理图导入到PCB了,接下来就是实现PCB的设计实现过程了。在这里呢,我主要分享我的实现过程,还有过程中我碰到的一些小问题,我会给大家分享出来,做个提示,如果碰到同样问题,那就可以少走弯路了。

    具体实现细节大家可以持续关注下,后续我会把实现的过程视频分享给大家,互相学习嘛,有需要借鉴的就可以少走弯路,有我需要改进的欢迎大家来跟我交流哈。

    那继续看下PCB设计前应该做的事情吧,首先就是规则设置了,无规矩不成方圆,这个也同理了,所以在布局前先把规则设置好,后面所有的事情做起来就只要守规矩就好了,否则会做出警示了。那么设置规则有没有讲究呢,就请跟着我的设置来看下我常规的经验,这个只是我个人常规使用,也可以根据自己实际情况调整的。



    接下来一起看下规则设置:

    先是间距设置,常规我设置线的间距(线和线,线和过孔等的距离)是0.2mm,这是经验值;然后我会设置敷铜间距,单独添加间距规则设置敷铜的间距,这个我设置的0.3mm,根据实际情况来定,这个也是我的经验值。

    image03.pngimage04.png


    2、接下来就是线宽了,线宽推荐值我不变,最小线宽设置为0.2mm,最大设置为2mm,一般情况下布线常规线宽就是推荐值,电源和地线会用大点,所以这里规则要先设置好。

    image05.png


    3、接着就是设置过孔,对于过孔来说,有内径大小和外径大小,都有相应的最小值、推荐值和最大值,在这里我只改变内径最小值(0.3mm)和外径的最小值(0.6mm),其他就是默认就可以了。

    image06.png


    4、接下来就是我会设置下敷铜连接方式,单独新建规则来设置过孔的连接方式,常规默认是十字连接,这里我设置为直连就可以了。

    image07.png


    5、后面的设置就是孔到孔的间距、最小阻焊的间距、丝印到阻焊的间距、丝印到丝印的间距、元件的间距,这些我一般都会全部设置为0,主要靠自己布局把握了。

    主要的规则设置就上面这些了,具体的可以在实际过程中根据需求再设置就好了,规则设置好方便布局和走线的规范性,做事还是规范点好,不然真的好麻烦啊。

    规则设置好了,就可以开始布局了,布局的讲究除了看起来合理,产品出来用起来顺手,还要考虑走线等等,真的不是随便摆摆就好了,我只是分享我的思路,还是那句,方法很多,可以借鉴感觉别人优势的地方。

    既然像转盘转起来的感觉,我做的是个电子产品,有转起来的感觉就可以了,那么就把这个圆盘做了一圈的LED,然后通过程序来实现循环点亮,逐渐加快速度,同时把两位数码管(LED组成)数据循环显示(速度快无法分辨当前实际数值),两位数码管就放在上面正中间了。

    image08.png


    由于是USB供电,所以要在端口处(最下面),既然上面显示,那么USB供电上面就可以放置两个按键,一个开始,一个停止。是不是简单多了。也可以通过按键的长按或者组合实现调整数据等操作,所以这里两个按键就够用了。

    image09.png


    因为这个产品元器件不多,所以除了蜂鸣器我放在底层,其他都放在顶层,这样对于走线也方便。

    针对模块化,我们先来看下,

    第一部分就是单片机部分了,单片机连接了数码管驱动芯片以及蜂鸣器部分。

    那么先把单片机涉及的部分放在中间,模块化布局可以把原理图放置在平行界面,当选中模块后,对应的PCB模块部分就可以选中来组合了,下图中所示:

    image10.png


    那么针对前面说到的数码管显示放在上面,按键放在下面,自然就是数码管驱动芯片放在显示和按键中间合理了吧,又有和单片机的连接,所以看下图:

    image11.png


    那么剩下的就是蜂鸣器部分了,一起看下显然就是放在单片机左侧了,然而我说了选择放在底层,所以合理放置就可以了。

    image12.png

    布局就这样实现了,是不是挺简单的,接下来就是走线了,走线根据实际情况要不断的调整,顶层无法走了需要打过孔来走底层。这是最繁琐的一个过程了,也是考验细致和耐心的过程。具体走线细节可以关注后面的视频,这个看的过程中如果感兴趣还是需要实践下的,不实际操作看了真的没什么效果。

    那么走线就不具体说了,走线完成还有敷铜,DRC检测,出图等很多流程,这里就不详细说了,主要在于设计过程的分享,还有注意事项,最后还有一项需要提醒的是泪滴,这个是对焊接时焊盘连接线的保护,还是要注意下的。

    最终效果图看下吧:

    image13.png


    对于抽奖DIY的PCB设计部分就这些,是不是看起来也不难呢。其实实现起来真的没你想的那么简单,每个实践过程都会有很大收获的,后续会分享我的程序实现过程以及效果。都会经历不同的坎坷啊。当你遇到不同的问题的时候慢慢解决了才是经验的积累过程。这个抽奖DIY小产品PCB设计就完成了,大家可以看下我的实现有没有需要改进的地方呢?随时欢迎交流啊,或者有更好玩的产品一起探讨实现啊,每个都有每个的特点,都能学到不一样的知识点。如果你能在我这有所启发是最好了,分享和交流的过程就是成长的过程。后面我会陆续更新,下面一篇就是对程序的实现了,感谢大家对我的持续关注,还希望能给出更多的意见和建议啊。


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