技术
stm32中断的讲解我分为两部分,即两篇文章,上半部分做一个总结性的概览,有一个初步认识,下半部分会通过一个实例来讲解中断的应用。本文即为上半部分的总结性概览。
所谓“中断”,通俗地讲,就是CPU在遇到一个需要即时处理的情况时,暂时中止当前程序的执行,转而处理新情况。
在stm32参考手册中的中断和异常向量表里可查阅到,其内核的异常响应系统里有10个系统异常(含Reset和HardFault),60个外部中断。具体的定义可在库文件stm32f10x.h头文件的IRQn_Type枚举里查到。如图5-1。
单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。
取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。
计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。
一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。
下面我们将举个实例来说明指令的执行过程:
本51项目基于STC89C52MCU,温度传感器为DS18B20,显示模块用的是LCD1602,无线模块用的是Nodemcu。
项目用到的编程语言:C,C++,Lua。
实现思路是这样,DS18B20测温,然后数据串行传送给51单片机,然后51通过串口将数据传送给Nodemcu,Nodemcu通过其WIFI模块将数据发送给上位机,上位机上的程序是用Qt编写的GUI。(这里无线传输采用的是无连接的UDP协议)
<strong>1. DS18B20温度测量模块</strong>
DS18B20是单总线器件,所以时序要求非常严格,程序编写时注意时序,否则读不出温度。DS18B20有寄生供电和单独供电,这里采用单独供电方式。它的驱动程序如下:
由于单片机的性能同电脑的性能是天渊之别的,无论从空间资源上、内存资源、工作频率,都是无法与之比较的。PC 机编程基本上不用考虑空间的占用、内存的占用的问题,最终目的就是实现功能就可以了。对于单片机来说就截然不同了,一般的单片机的Flash 和Ram 的资源是以KB 来衡量的,可想而知,单片机的资源是少得可怜,为此我们必须想法设法榨尽其所有资源,将它的性能发挥到最佳,程序设计时必须遵循以下几点进行优化:
1. 使用尽量小的数据类型
导读:CAN总线的设计经常遇到错误定位等问题,但是CAN总线测试工程师主要关注的问题不过是这几个!解决这几个问题,CAN通讯问题80%得以解决。
<font color="#33b1c8"><strong>一、定位干扰原因</strong></font>
对程序进行优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一。一般是优化了代码的尺寸,就会带来执行时间的增加;如果优化了程序的执行速度,通常会带来代码增加的副作用。很难鱼与熊掌兼得,只能在设计时掌握一个平衡点。
<strong>一、程序结构的优化</strong>
1、程序的书写结构
虽然书写格式并不会影响生成的代码质量,但是在实际编写程序时还是应该尊循一定的书写规则,一个书写清晰、明了的程序,有利于以后的维护。在书写程序时,特别是对于While、for、do…while、if…else、switch…case 等语句或这些语句嵌套组合时,应采用“缩格”的书写形式。
2、标识符
单片机和嵌入式,其实没有什么标准的定义来区分他们,对于进行过单片机和嵌入式开发的开发者来说,都有他们自己的定义,接下来,就谈谈本人对这两个概念的理解和感悟。
首先明确概念,什么是单片机,单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
随着科技时代的发展,模块电源越来越受市场青睐,在使用模块电源的时候,应该如何提高模块电源的稳定性和可靠性呢?下面通过几个方向,介绍如何选取外接输入、输出电容,来提高模块电源的使用寿命和整个供电系统的稳定性、可靠性。
在模块电源的实际应用中,外接输入、输出电容的选取往往会从几个方面入手:
• 电容额定耐压值。
• 电容的容值。
• 电容的使用寿命。
下面重点介绍1~2点是如何去选取输入、输出电容的。
<strong>一、从电容的额定耐压值去选取 </strong>
<strong>一、总线概述</strong>
计算机系统是以微处理器为核心的,各器件要与微处理器相连,且必须协调工作,所以在微处理机中引入了总线的概念,各器件共同享用总线,任何时候只能有一个器件发送数据(可以有多个器件同时接收数据) 。
计算机的总线分为控制总线、地址总线和数据总线等三种。而数据总线用于传送数据,控制总线用于传送控制信号, 地址总线则用于选择存储单元或外设。
<strong>二、单片机的三总线结构</strong>
51系列单片机具有完善的总线接口时序,可以扩展控制对象,其直接寻址能力达到64k( 2的16次方) 。在总线模式下,不同的对象共享总线,独立编址、分时复用总线,CPU 通过地址选择访问的对象,完成与各对象之间的信息传递。
<strong>1、如何降低功耗?</strong>
(1) 优化方向:
组合逻辑+时序逻辑+存储
(2) 组合逻辑:
(a)通过算法优化的方式减少门电路
(b)模块复用、资源共享
(3) 时序逻辑:
(a)尽量减少无用的register:算法优化、模块复用
(b)非功能性的register不使用带复位reg:数据打拍
(4) 存储:RAM
电容让交流电通过的同时对交流电流存在着阻碍作用,就同电阻阻碍电流一样,所以在大多数的电路分析中,可以将电容在电路中的作用当作一个“特殊”电阻来等效理解,称为容抗。
在交流电的频率不同和电容器容量大小不同的情况下,电容器对交流电的阻碍作用——容抗也不同。
<strong>1、容抗计算公式</strong>
data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。
bit:是指0x20-0x2f的可位寻址区
idata:固定指前面0x00-0xff的256个RAM,其中前128和dATa的128完全相同,只是因为访问的方式不同。
idata是用类似C中的指针方式访问的。
汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idATa做指针式的访问效果很好)
xdATa:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
<font size="3"><strong>一、作用</strong></font>
定时器/计数器以定时器的作用最为突出。一般来说涉及到定时器,都可以算作定时器算法。简单的如秒表等。复杂的如果系统内核的定时算法等。在学习单片机的路上,必学会定时器。
<font size="3"><strong>二、工作原理</strong></font>
定时器/计数器的原理其实没那么难。
定时器也就是一个计数器。而每计一个数的时间是一定的,于是就等价了定时器。51的定时器是从你设置的初值开始计数,直到他所能达到的最高数值为止。即:
定时时间 =(最大值 – 初值)X 每计一个数的时间
信号完整性是指信号在传输路径上的质量,即信号在电路中能以正确的时序和电压电平作出响应的能力。如果电路设计能够达到把信号以规定的时序、持续时间和电压幅值在互连系统中传输,就表明该电路具有良好的信号完整性。
信号完整性问题体现在很多方面,当信号上升时间减小到一定的程度,电路板上的寄生电容和寄生电感开始导致一些可能影响电路性能的噪声信号和瞬态信号时,就需要考虑信号的完整性问题,它可能会造成以下问题的发生。
RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识。但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的基础之一,可以说是M3芯片的心脏。初学者理解是比较困难,但是掌握清晰对于嵌入式操作系统特别是Timer定时器以及通讯领域具有重大意义。
SWP和SWPB是ARM指令集中对存储单元的原子操作。即对存储单元的一次读和一次不可被切割。
SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8bit)的数据交换。
SWP指令主要是完毕ARM体系架构处理器的同步操作。在Linux操作系统中实现信号量的操作。可是此指令在ARMv6架构后就没有採用了,而是通过扩展的LDREX和STREX实现。本片文章主要介绍SWP的功能,对于LDREX和STREX以后再介绍。
SWP的指令格式例如以下:
SWP {}{B} Rd, Rm, [Rn]
当中Rd是目的寄存器,从存储器中读到的值存放于此寄存器中
Rm寄存器是操作数。会将此寄存器中的值存放于存储单元中
[Rn]是寄存器间接寻址,Rn保存的是某个存储单元的地址
单片机的基准电压一般为3.3V,如果外部信号超过了AD测量范围,可以采用电阻分压的方法,但是要注意阻抗匹配问题。比如,SMT32的模数输入阻抗约为10K,如果外接的分压电阻无法远小于该阻值,则会因为信号源输出阻抗较大,AD的输入阻抗较小,从而输入阻抗对信号源信号的电压造成分压,最终导致电压读取误差较大。
因此对于使用单片机读取外部信号电压,外接分压电阻必须选用较小的电阻,或者在对功耗有要求的情况下,可选用大阻值的电压分压后,使用电压跟随器进行阻抗匹配(电压跟随器输入阻抗可达到几兆欧姆,输出阻抗为几欧姆甚至更小)。如果信号源的输出阻抗较大,可采用电压跟随器匹配后再接电阻分压。
对于外置的ADC芯片,在选型时,要留意其类型(SAR型、开关电容型、FLASH型、双积分型、Sigma-Delta型),不同类型的ADC芯片输入阻抗不同——
很多新手在单片机上走的第一步是点亮第一个LED灯,实际上因为开发板的不同,所编写的代码也不同,关键是你要去了解你用的开发板的电路布局。对于电路方面的知识我这里也不祥讲,我要做的是无论你用哪一种开发板我的文章都能帮助你。
P0 = 0xFE;
这句代码大家不陌生。
自1831年英国M.法拉第造出第一台手摇圆盘直流发电机,电机已经有超过180年历史,电机是一种利用电和磁的相互作用实现能量转换和传递的电磁机械装置,广义的电机包括电动机和发电机。电动机从电系统吸收电能,向机械系统输出机械能,各种类型的电动机广泛应用于国民经济各部门以及家用电器中,主要作为驱动各种机械设备的动力,实际上,电机是名副其实的“用电大户”,消耗了全球70%以上的工业用电,在我国,各种电机的总耗电量占全社会用电总量的60%以上,在目前绿色、节能、减排严峻形势下,高效能电机方案需求很大,Microchip针对本土需求可以提供包括有刷直流、无刷直流、步进电机、交流感应电机在内的高效能方案。
当传输路径上阻抗不连续时,会有反射发生,阻抗匹配的作用就是通过端接元器件,时传输路线上的阻抗连续以去除传输链路上产生的反射。
常见的阻抗匹配有如下几种:
<font color="blue"><strong>1. 串联端接方式</strong></font>