今天我想向大家分享一些我学Arduino,51单片机,STM32的经验。啊,不对,谈不上经验,应该算是经历吧。笔者接触单片机时间也不长,所以这里也只是分享我对单片机的部分理解,如果该文中出现了一些错误还请大家谅解并告知我。
单片机作为一个微型控制器,配合一些特定的外围电路,就可以实现一些特定的功能,拿最简单的流水灯来说,就是单片机给若干个LED灯循环高(或低)电平(是高还是低由电路结构和以及程序决定),从而达到若干个LED灯循环闪烁的效果,这里的若干个LED就是外围电路。
现在来介绍一下我目前接触到的三款单片机:
一、Arduino,这是一款8位单片机,最大的优点就是非常容易上手,大概只需要两个小时,你只需要亲自敲一遍它的历程顺便自己搭一下极其简单的相应电路,就能初步了解它开发环境中一些语句的使用方法,但要将它玩得得心应手,也是需要一个漫长的积累过程的。如果要说缺点的话,大概就是封装地太好,这也正是它简单的原因,因此它更适合拿来当工具用。
二、51单片机,一款8位的单片机,是最流行的单片机之一,一块很好的学习板,相比较而言更中规中矩,但也有引脚数目较少,处理速度不够快,计算精度不够高等缺陷。
三、STM32,这是一款32位的功能极其强大的单片机,它有144个引脚,一个72M晶振并且配有丰富的定时器和中断等资源,但其强大功能背后有着强大的逻辑规则,并伴随较为复杂的操作如使能时钟,初始化IO口,配置相应模块等,并需要在多个函数,文件中完成。
下面我想分享一下我最近用STM32做的基于DMA的ADC多通道数据采集。
什么是ADC?
物理伤害输出类型英雄的简称
ADC,Analog-to-Digital Converter的缩写,指模/数转换器或者模数转换器
[1]
。是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。
什么是DMA?
DMA,全称为: Direct Memory Access,即直接存储器访问, DMA传输将数据从一个地址空间复制到另外一个地址空间。 当 CPU 初始化这个传输动作,传输动作本身是由DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。
在 8 位单片机中,很少有DMA这个概念。因此大家可能比较陌生。但网上有这样一个DMA的比喻,我觉得十分生动形象,拿来与大家分享:
一个MCU是个公司。老板就是主处理器员工是外设仓库就是内存从前 仓库的东西都是老板管的。员工需要原料工作,就一个个报给老板,老板去仓库里一个一个拿。员工作好的东西,一个个给老板,老板一个个放进仓库里。老板很累,虽然老板是超人,也受不了越来越多的员工和单子。最后老板雇了一个仓库保管员,它就是DMA他专门负责入库和出库,只需要把出库和入库计划给老板过目老板说 OK,就不管了。后面的入库和出库过程,
员工只需要和这个仓库保管员打交道就可以了。比喻完成。
我们要实现一个怎么样的过程?
我们要通过STM32的ADC模块,将烟雾传感器MQ2,PM2.5传感器
GP2Y1010AU0F
采集来的模拟量转换成数字量,将这些数字量通过DMA搬到内存,再经过相应的公式转换,将结果与标准值对比,从而得出当前室内的烟雾情况以及空气质量。
文章的最后我想就我找了不知道多少天的逻辑错误,谈一下自己感受。
因为STM32的代码流程比较复杂,自己写代码会担心漏掉一些步骤,自己写难度较大,并且我始终认为模仿别人的代码是最终写出自己代码的必经之路。因此就需要到网上去看一下别人是如何实现这些功能。而这也正是为什么会有逻辑错误的原因。别人想实现的功能和你的可能并不一样,别人的开发环境和你可能也不一样,甚至一些代码可能本身就编译无法通过的,因此考验你功底的是不断修改和完善别人的代码直到它成为你想要的。
最终能解决问题的还是在失败后广泛借鉴前人的经验并对自己代码逻辑的冷静分析,这几天的自己如此,羽良的每一个人也是如此,最后愿你在走向成功的道路上永不回头。