发帖数

53

原创数

53

关注者

11

阅读数

9261

点赞数

1

黄忠

  • 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
  • 不要再找啦,关于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 浏览 179
  • 讲解ADC模数转白话

    首先我们来简单介绍一下ADCADCAnalogToDigitalConverter简单来讲就是它可以把模拟量转化为数字量方便程序去处理

    下面我们来看一下ADC的框图,我们从框图上来介绍ADC采样的原理

    图片19.png 

    1. 外部被采样信号从单片机特定的引脚输入ADC模块,具体信号从哪个采样引脚输入,取决于‘通道选择’配置。

    2. 当正常开始采样后,被采样信号在规定的时间(即采样时间)内对图中的电容(即采样保持电容,简称采保电容)充电,当充完电之后会控制图中的开关断开,这个过程就像科学家提取了一份标本,拿回实验室研究一样。

    3. 当开关断开之后,图中的转换模块会花费一定的时间(即转换时间)对电容中的存的电压进行转换,并把转换的结果存入缓冲器,供程序员读取使用,同理,就像科学家对提取的标本花时间研究,得出一个结果。

    以上就是整个的ADC工作过程,虽然草草几段话了解,但是其中不乏很多关键的细节问题,什么细节问题呢,很多老铁会想,这不都是自动的嘛,有嘛要注意的,那么我们先来看一下这样几个问题。

    1. 采样时间设置多久?

    2. 采样时间是越短越好还是越长越好?

    3. 采样时间设置的大小和被采样信号的源内阻有什么关系?

    4. 如何从有干扰的信号中提取有用的采样信号,实现正确采样?

    5. 采样的结果和参考电压有什么关系?

    现在我们就上面几个问题,展开说明:

    上面的描述可以得到:从采样到转换完成中间2个时间采样时间+转换时间转换时间是固定的,采样时间可以设置),这两个时间决定了ADC采样的速度问题当需要高速AD采样的时候,这两个时间尤为重要因为它决定了采样速度

    我们再回头来想这里是被采样信号先对采保电容充电因为转换时间是固定的我们能配置的就只有采样时间了是不是说采样时间我们配置的越小越好呢答案是:不是的,最起码得保证采保电容电压和被采样信号的电压非常接近吧如果一味的小,追求速度快,采保电容充不满,转换出来的数据也不对

    那就带来了一个问题这个被采样信号源内阻的问题说白了就是对这个采保电容充电的电流够不够大只有充电的电流大了,才能在最短的时间内充满如果充电的电流非常小,恰恰配置的采样时间很小,结果只有一个,采样不准确我们经常看到,有的设计方案,做电压采样,分压电阻设计的阻值非常大当这样的大阻抗遇到高速采样,那就有可能会不准确了

    图片20.png 

    大家看上面的R1R2设置大了,那么充电电流就小了那么R1R2的阻值设计小了,充电电流大了,那么带来的问题功耗就大了当需要高速采样的时候,就需要注意这个阻值分配的问题对功耗要求比较高的产品,如可穿戴产品,蓝牙耳机,智能手表等,这个就需要大的阻值了一般情况下功耗要求不高的场合,我们基本上设计在1-2mA所以从此可以得出一个结论,采样时间不是越快越好,也不是越慢越好,恰到好处即可,需要你去实际调试。

    如何从带有干扰杂波的信号中提取到有用的信号呢,一般情况下,我们会根据系统的特性进行定点采样,即避开干扰区来采样提取有用的信号,再配软件或者硬件滤波手段来提取有用信号。

    采保电容得到了准确的采样信号,就一定意味着转换结果准确吗?答案肯定

    NO,这个和参考电压也有关系,参考电压就像一标准样品一样,举例来讲:老板说照着这个样品给我做100个,那首先前提是你的样品得准确,如果样品都不准确,那做出来的东西也必然会有偏差。

    想必通过上面的描述我们已经对ADC采样有了一定的理解认知,上面的描述只是ADC的一部分要点,介于篇幅原因,这里就不再赘述了,文末留个大家几个问题:大家看图中绿色地方电容这个电容加了好还是不加好?加多大好?在布板的时候这个电容应该摆放在哪里比较好?

    图片21.png 



    收藏 0 回复 0 浏览 119
  • STM32中断如此简单

    大家好,我是张飞实战电子黄忠老师,下面我们先来了解一些基本概念:

    中断:中断是什么?举个例子来说,当我们正在工作时,突然电话响了,这时你会把手里的工作先停下来,然后去接电话,当接完电话后,电话里的人安排你马上做一件事,这时你需要立刻去做这件事,当把这件事做完后你会继续之前被打断的工作,这个过程为一次中断。

    异常:一个系统本应该正常的运行,但由于某些条件使系统产生了错误,就会使系统运行不正常,我们称之为异常。就好比一个健康的人,如果身体某个器官出现了问题,那他将会生病,不能像以前那样健康生活,称他的身体出现了异常。系统出现异常,我们必须对异常做出处理,才能让系统正常运行。

    事件:比如一个老师在教室里给学生上课,下面的学生会做出各种不同的动作,如有认真记笔记的,有讲小话的,有翻自己书包的等等,我们把学生的这些行为称为事件。但老师对这些事件有些是不会有动作的,有些事件是需要老师干预的,比如两个学生讲话,影响了老师上课,老师需要警告讲话的学生,然后再继续上课。

    优先级:当我们接到了两个电话,两个电话都安排你去做别的事,这时你需要先完成比较急的事,然后再完成不是太急的事,这就是优先级的问题。当有多个中断时,我们需要根据中断优先级判断先响应优先级高的中断,然后再响应优先级低的中断。

    中断与事件的联系与区别:有些事件需要响应,称这个事件为可中断事件,但有些事件不需要做出响应称这些事件为不可中断事件。当硬件正常连接时,对应事件会自动产生,但中断则需软件配置相应的中断使能位。

    抢占式优先级和响应优先级:所谓抢占式优先级和响应优先级,具有高抢占式优先级的中断可以在低抢占式优先级中断处理过程中被响应,即中断嵌套。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后 才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。每一个中断源都必须定义2个优先级。

     

    STM32的中断管理利用了NVIC(Nested Vectored Interrupt Controller)嵌套向量中断控制器,它把所有的外设中断和系统异常用一张向量表来管理,每个系统异常和外设中断都被分配相应的地址,除了一些系统异常的优先级不能改变外,其余的系统异常和中断的优先级都可变化。具体向量表部分截图如下图所示:

     图片27.png图片28.png        

    29.png                  

    其中包含10个系统异常,有82个外部中断地址,其中有11个被保留,没有使用,从上表可查出对应的默认优先级和地址分配情况。

    NVIC是嵌套向量中断控制器,它控制芯片所有中断功能,是Cortex-Mx内核里的一个外设下图为Cortex-M4内核NVIC寄存器的分布图:

    30.png 

    从上图可以看出,Cortex-M4内核NVIC嵌套向量中断控制器总的有7个类型的寄存器,其中有1个控制器类型的寄存器,8个中断使能寄存器,8个中断失能寄存器,8个中断挂起设定/清除寄存器,8个中断有效位寄存器,60个中断优先级寄存器。而STCM4内核NVIC控制器寄存器做了一定缩减,其寄存器分布图如下:

    31.png 

        在中断编程时,我们一般使用ST提供的固件库,对中断配置在程序编写时我们一般就使用中断使能、中断失能、中断优先级设定三个寄存器。

    NVIC嵌套向量中断控制器里有一个用于管理中断优先级的寄存器NVIC_IPRx(x=0,1,20),其数据位宽度为8bit,如果8位全使用,则可配置的优先级为0-255,数值小的优先级越高,但在STM32F373中,只是使用了高4位,可配置的优先级为0-15

    4位又被分为抢占优先级和响应优先级。对这4位又有5种搭配方式,定义抢占优先级和响应优先级的位数,其分组由内核外设SCB模块的应用程序中断及复位控制寄存器AIRCRbit8-bit10(PRIGROUP[0:2])三位决定,分组可用下图所示:

    32.png 

    ST官方已经把设定优先级分组封装成了一个库函数,我们设置优先级分组时,可直接调用相关库函数即可,中断库函数可在官方库文件misc.cmisc.h中找到,其优先级分组设定函数如下图所示:

    33.png 

    如我们想设置0位响应优先级、4位抢占优先级即优先级分组0,其函数可写为:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    那我们仅仅是配置了优先级就够了吗?我们还需要配置通道,即配置中断源,按照前面中断向量表中的Position中断编号来查询即可配置即可。配置了中断源后,我们还需对中断源使能中断,ST官方把通道配置、优先级设定、通道使能定义为了一个结构体,其定义如下:

    34.png 

    下面我们以USART1为例,配置中断优先级分组为3,即3位响应优先级,1位抢占优先级,抢占优先级级数为0,响应优先级级数为1,对其编写程序如下:

    Void NVIC_Init(void)

    {

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);         //配置优先级分组

    NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;      //USART1中断通道

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为最高 0

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //响应优先级为 1

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //使能中断通道

    NVIC_Init(&NVIC_InitStructure);    //将结构体成员的值写入对应的寄存器

    }

     

    至此,中断篇讲解完毕,更多详细的NVIC的介绍,可查阅官方技术手册NVIC部分。


    收藏 0 回复 0 浏览 107
  • 单片机学习之GPIO

    大家好,我是张飞实战电子黄忠老师,今天分享如何通过手册理解单片机IO知识点

    含义解释:

    1. GPIO:同我们常说的IO口一样, General Purpose Input Output (通用输入/输出)简称为GPIO,每个GPIO端口可通过软件分别配置成输入或输出模式。

    2. 外设:指的是除CPU以外的外围功能模块,只不过这部分电路依旧被封装在单片机内部,比如IOADCDACTIM等。

    3. 复位:把MCU恢复到最开始的状态,比如说我们把电脑重启了一次,就相当于复位了一次,在这里我们把MCU恢复到初始的状态称为复位。

    4. 往某一位写1,在硬件上就相当于把把它设置成高电平,清0则与之相反。

    芯片的缩略封装图:

    图片1.png 

    STM32F373CCT6 总共有48个引脚(图中左上角红色圈起来的1代表芯片的1号引脚,后面的以此类推,我们这里把1脚简称1Pin),分以下几个类别

    1.可以编程控制的引脚PAx(x表示012)PBx(x表示012)等以相同类似方式命名的。STM32F373CCT6分多组 IO口,分别用大写字母表示,即

    x=A/B/C/D/E/F,例如GPIOA,表示AIO口,这组IO口下面又有很多引脚,那么我们就用PA0PA1PA2等方式来表示,每组下面最多16IO口。通俗点来讲:GPIOA就相当于八年级五班这个班级,PA0PA1相当于班里的学生,有叫李刚的,有叫张的等等,每个班最多16个学生。

    我们看到有的可编程控制的引脚,例如PC14-OSC32-IN那么说明这个引脚有多种功能,可以当IO口用,也可以当做OSC32-IN用,在下面我们会具体解释这样的引脚。

    2. 不可编程控制的引脚1Pin(备用电源正脚),7 Pin(复位脚), 8 Pin(模拟电源负脚), 9 Pin(模拟电源/参考电压正脚), 17 Pin(数字电源正脚),23 PinSDADC1, SDADC2, SDADC3 地),24 PinSDADC1, SDADC2, SDADC3 电源)25 PinSDADC1, SDADC2, SDADC3的外部参考电压正),44 Pin(启动内存选择引脚),47 Pin(数字电源负脚),48 Pin(数字电源正脚)。

    1. 后备区域供电脚 VBAT 脚的供电采用 CR1220 纽扣电池和 VCC3.3 混合供电的方式,在有外部电源 (VCC3.3) 的时候, CR1220 不给 VBAT 供电, 而在外部电源断开的时候, 则由 CR1220给其供电。这样,VBAT 总是有电的,以保证 RTC 的走时以及后备寄存器的内容不丢失。

    2. BOOT0

    图片2.png 

    关于详细的引脚功能定义可以查阅《STM32F373xx》数据手册第33页,这里我们解释下关于引脚的功能问题:

    1. 默认功能:也就是引脚的普通功能。

    2. 复用功能:即将IO口用作普通输入输出以外的功能,通过配置相关寄存器后选择的功能,例如串口输入输出,使用时需要配置复用模式。

    想要配置成复用功能,首先需要查看引脚定义看看这个IO口可不可以被配成复用功能,这个是由IO的内部电路决定的。如果有才可以被配置,配置成复用功能不仅仅是要通过寄存器GPIOx_MODER配制成复用功能模式,而且还要通过GPIOx_AFRLGPIOx_AFRH寄存器选择IO复用功能。这样IO口才能真正被配成复用功能

    3. 附加功能:配置相关外设寄存器来选择的功能,比方配置ADC使能某些通道等来使能相应管脚的附加功能同样想要配置成附加功能,首先需要查看引脚定义看看这个IO口可不可以被配成附加功能,这个也是由IO的内部电路决定的。如果有,那么通过寄存器GPIOx_MODER配制成模拟功能模式

    每组通用 I/O 端口包括 4 32 位配置寄存器 (MODEROTYPEROSPEEDRPUPDR) 、2 32 位数据寄存器(IDR ODR) 、1 32 位置位/复位寄存器 (BSRR)1 32 位锁定寄存器 (LCKR) 2 32 位复用功能选择寄存器(AFRH AFRL)等,可以被配置成一下几种不同的模式:

    输入上拉IO口上拉就是在IO口通过接一个电阻到电源(注意这个电压要和单片机供电电压相同,否则过高会烧毁IO),电阻的大小决定了电源到IO口电流的不同,这就是我们常说的弱上拉等。下面附图一张。

    图片3.png 

     输入下拉:下拉就是在IO口通过接一个电阻到地,电阻的大小决定了IO口到地电流的不同,这就是我们常说的弱下拉等。下面附图一张。

    图片4.png 

    输入浮空/模拟输入:浮空(floating)就是逻辑器件的输入引脚即不接高电平,也不接低电平。浮空最大的特点就是电压的不确定性,它可能是0V,也可能是VCC,还可能是介于两者之间的某个值浮空一般用来做ADC输入用,可能有的芯片把浮空模式和模拟输入模式分开了,在此解释一下,在浮空模式下使能了IO模拟功能就相当于是模拟输入

    图片5.png 

    开漏输出:开漏输出就是我们所说的OC输出,不输出电压,相当于N型三极管的集电极作为单片机的IO,需要在外部加一个上拉电阻配合使用。如图:

    图片6.png 

    推挽输出:可以输出高,低电平,但相对于普通的输出而言,这种输出方式增加了输出能力。如图:

     

    图片7.png 

    复用开漏输出、复用推挽输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用)。

    图片8.png 

    上图为引脚的内部电路框图(红圈内或旁边数字代表序号,下面简称1号等)

    输出部分解析:输出分三路

    第一路,1(/写动作-由片内外设控制)——>3号(经过一个逻辑门->输出控制电路)

    第二路,15号(写动作)——>14号(Bit Set/Reset register 位设置/清零寄存器),——>13号(Output data register数据输出寄存器)——>3号(经过一个逻辑门->输出控制电路)

    第三路,2号(复用功能输出)——>3号(经过一个逻辑门->输出控制电路)。

    三路都通过控制4号(MOS管电路,根据配置的不同模式,驱动P-MOS或者N-MOS或者两个一起驱动)——>5/7号的下拉/上拉电阻(我们可以看到上/下拉电阻有开关控制,意思就是可以通过外部的某些东西去控制使能或者失能上/下拉)——>6号的保护二极管(这里利用了二极管钳位的功能,可以在一部分程度上起到保护引脚的作用)——>IO口。

    输入操作解析:同样分三路

    第一路,IO——>6号的保护二极管输出到——>9号(模拟输入)——> 片上外设

    第二路,IO——>6号的保护二极管输出到——>8号(开关,可靠外部控制)——>10号(复用功能输入)——> 片上外设

    第三路,IO——>6号的保护二极管输出到——>8号(开关,可靠外部控制)——>12号(Input data register输入数据寄存器)——> 11号(可供读取数据)。

    如何结合寄存器以及硬件电路来实现具体输入输出请看下篇分析~


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