发帖数

50

原创数

50

关注者

12

阅读数

9573

点赞数

4

蔡琰

  • STM32的几种开发方式,你都知道吗?

    经常有人会问,你们STM32编程是用库函数 还是用寄存器的...会说库函数方便,容易,都用库函数...等等这样的问题,今天我们就来dis一下这几种编程方式,STM32编程目前常见的几种形式如下:


    1. 使用标准外设库开发  

    2.使用寄存器开  

    3.使用CubeMax生成代码工具开发

    下面我们先来说一下目前这几种形式的区别:

    1.使用标准外设库开发

    Stm32标准外设库是stm32官方提供给用户的全系列芯片的外设驱动,官方把单片机外设的功能进行包装,提供给用户一个现成的接口函数,用户不用去管寄存器到底是如何操作的,直接调用接口函数,即可使用这些外设。在这个基础上你直接开发你的应用层程序即可。

    这个驱动包名字一般是STM32Fxxx_StdPeriph_Lib_Vx.x.x有了它可以大大加速我们开发stm32我们以STM32F10x_StdPeriph_Lib_V3.5.0驱动包为例,解压该zip文件,得到如下文件夹和文件
       _htmresc
       Libraries
       Project
       Utilities
       Release_Notes.html
       stm32f10x_stdperiph_lib_um.chm

    其中Libraries包含库的源代码,Project包含stm32各个外设的使用范例和一个工程模板,Utilities是使用st公司评估板的例子,stm32f10x_stdperiph_lib_um.chm教我们怎么用标准外设库。


    2. 使用寄存器开发

    使用寄存器开发,用户需要自己去操作底层外设寄存器,实现想要的外设功能,这个过程是需要自己对照手册,一行一行把代码敲出来的。


    3. 使用CubeMax开发

    这个是官方提供的图形化的一键生产代码的工具,在这个IDE中我们只要根据你想要的功能,点点鼠标就可以生成你想要的功能,但是注意这个功能只是你想要的单片机外设配置功能,并不是你的应用程序功能,比如你想要以一个什么样的方式通讯,还是需要你自己去完善的。如下图是图形化开发的界面:

    图片1.jpg 

    上面我们以简洁明了的描述了三种编程方式的使用方式和编程过程,接下来我们来分析一下这三种方式的优缺点:

    第一种方法,官方提供了现成的驱动库,用户可以直接使用,使用起来方便,快捷,开发速度快,相对起来也容易上手一点,但是对底层的寄存器操作原理了解不深,只知其一,不知其二,出了问题,解决起来比较麻烦。且官方的驱动库为了容错性高一些等原因,会引入一些判断机制,相对复杂一些,但是实际上有的东西是我们用不到的,这就会造成代码执行效率会相对低一些。


    第二种方法,虽然开发起来相对来说比较慢一些,比较繁琐一些,但是接触的都是真正的底层内容,出了问题,我们也能从源头来快速分析解决问题,而且写的代码中省去了一些不必要的判断过程,执行效率会相对高一些,代码看起来也会清爽一些。


    第三种方法,使用IDE开发,这个相比较来讲入门是最快的,不用接触那些库函数接口,也不用去理会那些寄存器操作,只要在图形化的界面上勾选一些选项就可以了,这简直是懒人必备神器啊,但是话说回来,这种开发方式,基本上接触单片机底层内容为0%,只要写应用程序就可以了,出了问题更难解决。如果换了个平台,没有这种方便的IDE,怎么办呢?


    上面我们全面分析了STM32的几种编程方式,我认为大家在学习STM32单片机时,应该先从寄存器入手,知其所以然,理解了原理,底层知识之后,可以再拐回头使用标准库,或者IDE,这样效果会更好,你认为呢?


    收藏 0 回复 0 浏览 97
  • MCU低功耗设计注意要点

    随着便携式移动设备,各种穿戴设备的兴起,我们不得不关注设备的功耗问题,因为这些设备都具有一个特征:使用电池系统供电,一块线路板上跟功耗相关的单元电路可能有很多,今天我们来谈谈关于MCU的低功耗问题。


    谈到这个问题,首先得选用一款低功耗的MCU,一般MCU的功耗,在其对应参考手册的电器属性章节都会有说明,其次我们在使用MCU低功耗时经常会出现实际功耗理论功耗偏差较大,遇到这样的情况,需要仔细检查以下几点


     
      1、关闭外设时钟
      时钟就相当于是人的心脏一样,外设模块的正常工作不能脱离时钟。对于大多数的MCU,外设模块都一个时钟控制开关,只要打开外设时钟,就可以正常使用该外设了,当然,该外设也就会产生相应的功耗;如果用不到这个外设一定要记得把这个外设时钟关闭,降低功耗


      2、调整时钟频率
      一般我们使用单片机的时候,都喜欢上来就把时钟频率调到最高这样的优点是程序的执行速度快了,因为周期T = 1/F,一般我们进行频率调整都使用的是单片机内部的PLL倍频模块,把一个输入很低的频率倍频到很高的频率,一方面倍频的模块会增加功耗,另一方面时钟线上的对应的外设模块工作频率增加了,功耗也会相应的变大。你会看到,一般低功耗模式下,单片机的工作频率很低很低,所以考虑功耗一定不要忘记考虑时钟频率


      3、注意IO口的电平状态

    注意你没有使用的IO口部分的状态,以及IO口内部的上拉或者下拉的情况,这个也会积少成多,增加功耗的浪费。另外从本质上讲,我们不仅仅是只关注空闲的IO状态就罢了,对于使用的IO口,我们也需要考虑它们在正常工作时的一个状态,联合外围电路一起考虑,效果会更好一些。比如说我们需要点一个LED灯,如果单片机IO口一直输出一个高电平对应点亮LED,那我们是不是可以换一种思路,单片机输出低的时候对应LED亮呢?这样积少成多就能省下一部分功耗。


     4、断开仿真器等测试工具

    我们在测试的时候,通常会连接一些测试的工具,来辅助调试,有可能这些辅助的调试工具都是由线路板供电的,可能你会误认为把这部分功耗当成MCU的功耗,当然这里不仅仅是要关注测试的工具带来的功耗,而且你还需要关注你的测试方法,很有可能你的测试方法不对或者测试工具的本身也会有功耗。


      
        MCU的低功耗设计是一个细致活,要养成良好的习惯,每加一个外设功能模块,对应的外设带来的功耗我们可以测试,当前增加功能带来的功耗增加量,包括静态下的模块功耗,正常融入系统后工作时的功耗,随时掌握模块动态我们不仅要考虑内部的时钟状态、时钟频率,还需要考虑IO与外围电路的配合状况等等,通过调整电路的工作方式来减小一部分功耗。当然关于功耗可不止文中的几点,你还知道有其它什么原因影响MCU自身功耗吗?可以留言来跟大家一起分享哦!

    收藏 0 回复 0 浏览 89
  • 8脚51单片机DIY时间显示+闹钟技术分享(三)

    PCB设计

    延续前篇,感谢大家能关注我的实现过程,废话不多说,接下来就是跟大家分享我的PCB设计过程了,PCB设计首先就是先把板框做好了,因为这个小玩意是自己想来做的,所以板框也自定义就好。然后把原理图导入到PCB,就开始实现PCB设计过程了,在这里我主要分享我的设计思路,布局以及走线需要避开的坑。


    具体实现如果大家感兴趣的话也可以试一下的,会有很多收获的。后面我会分享出我的实现过程的视频部分,如果大家感兴趣可以关注下呢,可以跟自己做的对比下,到时候欢迎大家跟我多交流学习哈~


    那我就继续了,首先呢导入了就是开始设置规则了,我们知道做任何事情都要有规则,有了规则才不会乱套,大城市之所以好,是因为规则性好,人人守规则才会有更好的发展。我们接着回来说下布局前的规则设置,我一般的设置都有哪些,大家都有自己的习惯,我先分享出我的习惯,如果有更好的建议随时欢迎沟通,

    接下来我就开始规则设置了:

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



    1.jpg


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

    2.jpg


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

    3.jpg

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

    4.jpg


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

    主要规则设置就上面这些,其他我会在过程中需要的情况下再进行设置,但是主要设置就是这些,规则设置好更方便布局以及走线,否则过程中一直出现绿色报错还要去看规则会影响工作进度还会影响心情的吧,所以为了工作效率还是先把规则设置好,至少我是这样认为的。


    那么规则设置好了,就开始布局之旅了,布局也是有讲究的,当设计一个产品时,器件放哪里更合理,器件间的特性关系都是需要有考量的。

    一般我设计过程都是左边输入,右边输出原则。

    首先需要完成四个孔,安装用的,分别在四个脚的位置,M3孔,具体画图方法可以参考后续这个小闹钟的视频设计过程,这里就不详细说了,如下面所示:

    5.png

     

    继续看下布局方面,由于这个是小闹钟,又是选用USB供电,所以左端是USB口,需要外接的是供电端和程序下载端口,所以程序下载端口选择放在右边。DIY的闹钟,所以显示(所有LED)放在顶层,其他元件全部放在底层。这样看起来也清爽多了。

    按照模块化布局,再移入板框中,首先从左边开始看,

    USB供电进来,我把电池和时钟芯片放在这里,跟供电相关的部分,由于把下载端口放在右边了,所以单片机放在右边。看下图布局,电池,时钟芯片,晶振,三极管,还有电阻,电容。滤波电容放在管脚端,效果更好。这是正面布局哦。

     

    6.png


    接下来看下数码管驱动芯片,因为我把按键放在板子上端了,所以这个芯片放在中间比较合理,周边就是一些限流电阻、滤波和储能电容,先摆好吧,参考下呢

    7.png


    接下来看下就剩下单片机和蜂鸣器了,单片机管脚有跟数码管芯片连接,如果把蜂鸣器放在中间会比较难走线,所以单片机放在数码管驱动芯片旁边,接着是蜂鸣器和下载端口了,依次这样排开就可以方便走线了。

    8.jpg

    布局的大体过程就是这样的,具体还要根据走线再做调整。

    接下来我跟大家分享下我的走线过程,走线需要注意的,其实走线是需要细致的过程,真的是需要一直调整器件,调整线,最终目的就是合理,正确。


    首先走线大家可能都知道不能走直线,然后电源和地我选择粗线(0.4mm),其他线都是推荐值就可以了。地的部分是通过敷铜共地的,所以需要大过孔来共地,有的地方需要打过孔是为了铜皮电位平等。线尽量走的有规则些,所以在走线的过程先考虑好哪些在顶层,哪些在底层,否则过程中走的越来越乱,并且这个小闹钟看似简单,实际还是很需要下功夫的,具体的实现后面会有详细视频,因为走线还是需要实践的,我只能说下我的思路和一些需要注意的地方,具体的每条线的走向描述还是看视频来的直接点。当然后面要是出产品还有敷铜,DRC检测,出图等很多呢,再有提醒一点需要加的就是泪滴,这个是手动焊接对焊盘连接线的保护。这里我只分享设计过程,那些流程化的东西就可以省掉了,但是做事一定要认真,每个细节都要认真对待,每次你的认真都会得到回报的,我们的付出都在慢慢得到印证的。

    最终的效果图大家看下呢,


    9.png

    做到这里所有布局和走线的思路都讲完了,其实纵观看下只要有条理,还需要细心,然后就都可以实现。PCB设计就这样完成了,大家看下我的设计有没有值得借鉴的地方或者有需要改进的,随时欢迎沟通交流。实现方法有很多,或者大家有更多更好的方法呢,欢迎来交流啊。后面会陆续更新,下面一篇会展现我的程序设计过程,感兴趣的持续关注

    收藏 0 回复 0 浏览 86
  • STM32中SystTick是个啥?咋用?

    Cortex-Mx内核内部包含了一个SysTick定时器, SysTick 是一个24 位的倒计数定时器, 当计到0 时, 将从RELOAD寄存器中自动重装载定时初值。只要不把它在 SysTick 控制及状态寄存器中的使能位清除,就永不停息。SysTick 在《STM32xx 中文参考手册》里面基本没有介绍,其详细介绍,内核编程手册中 在工程中我们将STM32F373为例,为SysTick配置1ms,利用1ms中断处理系统任务。下面我们介绍下寄存器:

    下图是SysTick定时器的4个寄存器概括,我们介绍部分使用的寄存器:

    1.jpg 

    SysTick控制和状态寄存器

     

    2.jpg 

    这个寄存器的EBNALE(0)SysTick的使能位,TICKINT(1)为设置是否产生中断,CLKSOURCE(2)为时钟选择,当为1 AHB时钟不分频,为0AHB时钟8分频。当然我们选择使能定时器,产生中断,并选择AHB 8分频假如系统时钟为72M,即可获得 72/8 = 9MSysTick时钟频率。使能SysTick并产生中断,8分频时钟,代码如下:

                     SysTick->CTRL = (0<<2) | (1<<1) | (1<<0);

    SysTick重装载值寄存器

     3.jpg


     

                         该图来自数据手册中断和事件章节

    5SysTick重载计数值寄存器RELOAD([23:0]),从该介绍我们可以得出结论,SysTick的计数方式为向下计数,也就是从RELOAD([23:0])值向下递减,当减到0的时候产生标志位,这个时候会重新装载该寄存器值,循环执行上面的步骤。那麽我们可以利用这个功能做一个1ms的定时器,我们已经配置系统时钟为72M,使用系统时钟的8分频(9M)作为SysTick定时器的时钟,也就是说时钟周期T = 1/9M(ns),SysTick1需要1/9M(ns),我们定时1ms那麽重载寄存器的值为 1ms/(1/9M(ns))-1 = 8999(注意这里要进行单位换算),这也就是我们的重装载值,下面给出具体代码配置,其中使能等操作包含在SysTick_Config();函数里面。配置代码如下:

                             SysTick->LOAD = 8999;

    单个寄存器讲完了我们总结一下综合起来让SysTick工作起来,我们把SySTick的配置单独做成一个函数如下:

     

    Void SysTick_Init(void)

    {

       /*

       第一步:装载值

       第二步:使能SysTick并允许中断,8分频时钟

    第三步:设置SysTick优先级

    */

    SysTick->LOAD = 8999;

    SysTick->CTRL = (0<<2) | (1<<1)  | (1<<0);

    NVIC_SetPriority (SysTick_IRQn, (1<<4) - 1);

    }

    我们用库函数表示为:

    4.jpg 

        对于官方库函数的查找我们可以使用《stm32f37x_dsp_stdperiph_lib_um.chm》这文档,想要找某一方面的函数在里面直接搜索就可以,具体的使用方法我们下面仔细介绍。

    收藏 0 回复 0 浏览 85
  • 8脚51单片机DIY时间显示+闹钟技术分享(一)


    最近因为家里闹钟被小朋友摔坏了,所以想着买来买去还是没什么新意,不如自己做一个,这样不是更有意义吗?那就开始吧,想着自己做就可以用最小资源来实现最大功能了,然后开始查找需要的芯片资料,平时时间显示我们最起码要有小时和分钟吧,那么最起码要四位数码管了,还要有按键来调整时间吧,那么对IO口的管脚就开始有要求了,虽然是时钟显示,但是想来还是觉得不想因为节约管脚来把按键变少再去处理组合按键或者长按的按键。然后就开始各种查资料,后来找到一款很好的芯片,I2C通讯,直接可以实现4位数码管和四个按键的处理(当然这我只用到四个按键,其实这款芯片可以实现同时进行28键的键盘扫描),哇,这也太好了吧,迫不及待上图分享给大家了,就是下面这款:

    图片9.jpg


    功能好到真的跪了太好用了,好用到没朋友啊。因为这款芯片我太喜欢了,我会把这个芯片的数据手册放在附件,有兴趣的可以下载看看,真的好用还省去很多IO口。

    选到这款芯片,那单片机选型就自由了太多了,幸福感瞬间提升了,自己做时钟,要有个DIY的感觉,所以我选择把数码管全部换成LED(主要还有成本低哦),还有跟别人的东西不一样的感觉吧。然后既然我要做时间显示那么我就要选个时钟芯片的,既然显示和按键的选择了一个芯片实现,并且还是一个I2C接口,那同样时钟芯片我也选择了一款I2C通信的,那这样两个芯片用单片机的两个管脚就够了,是不是很省呢。既然要时间显示,如果单纯的时钟是不是很单调呢,最起码还要有个小闹钟吧,所以选择了一款带闹钟的时钟芯片,并且是I2C通信的,那这样时钟芯片也选好了,既然有闹钟,我就要加个蜂鸣器让它时间到了叫出来啊,不然怎么叫闹钟呢,这里我除了想到让闹钟报时滴滴的叫,还想到可以通过给蜂鸣器不同的频率让它唱歌呢,这里蜂鸣器我选择了一款无源蜂鸣器,这样蜂鸣器就只占用单片机的一个管脚也够了啊。现在的产品大多都是USB供电的,我也选择USB供电就可以了。到现在就只用了单片机的三个管脚,这样我就可以选择51STC8G1K08A)单片机中8脚的就够了。那么想到这些觉得有些意思了,那我就可以慢慢来实现了。

    其实别看我选的这些比较常用,还是挺简单的,这个看起来还是很容易实现的,起初我也这样想的,然而过程中并不是想象的那么顺利,还是踩了很多坑的。因为每个芯片都是有不同的特点,技术资料难免一次就能读透,还有就是会有点盲目的自信导致过程会有点曲折,所以还是要脚踏实地点好吧,我的曲折过程都会分享给大家,大体的器件选型好了,怎么实现呢,怎么做成我想要的东西呢,这个过程莫急,慢慢看我展示,主要会给大家分享避坑。

    后面就开始设计原理图和PCB了,最后产品出来才开始程序的实现,每个过程都好玩又有收获的,如果大家也感兴趣的话就持续关注我这个DIY的实现过程吧。随时欢迎大家跟我来探讨,也让我可以开阔下思路,或许下个小玩意更有意思呢。


    收藏 0 回复 0 浏览 79
×
蔡琰