外部中断:外部中断也是绝大多数MCU所具有的基本功能,一般用于信号的实时触发,中断的方式有上升沿、下降沿触发和电平触发等。外部中断一般通过输入口来实现,若为IO口,则只有设为输入时其中断功能才会开启;若为输出口,则外部中断功能将自动关闭。外部中断的应用如下: 外部触发信号的检测:一种是基于实时性的要求,比如可控硅的控制,突发性信号的检测等;而另一种情况则是省电的需要; 信号频率的测量:可以通过上升沿或者下降沿触发中断; 按键的检测和系统的唤醒:对于进入休眠状态的MCU,一般需要通过外部中断来进行唤醒,最基本的形式则是按键,通过按键的动作来产生电平的变化;
通讯接口:MCU所提供的通讯接口一般包括SPI接口,UART,I2C接口等,其分别描述如下: SPI接口:此类接口是绝大多数MCU都提供的一种最基本通讯方式,其数据传输采用同步时钟来控制,信号包括:SDI(串行数据输入)、SDO(串行数据输出)、SCLK(串行时钟)、CS(可选);此类接口可以工作在Master方式或Slave方式下,通俗说法就是看谁提供时钟信号,提供时钟的一方为Master,相反的一方则为Slaver,可实现全双工通讯; UART/USART:属于最基本的一种异步/同步传输接口,其信号线只有Rx和Tx两条,基本的数据格式为:Start Bit + Data Bit(7-bits/8-bits) + Parity Bit(Even, Odd or None) + Stop Bit(1~2Bit)。一位数据所占的时间称为Baud Rate(波特率)。对于大多数的MCU来讲,数据为的长度、数据校验方式(奇校验、偶校验或无校验)、停止位(Stop Bit)的长度及Baud Rate是可以通过程序编程进行灵活设定。此类接口最常用的方式就是实现RS232通讯或者RS485通讯。 I2C接口:I2C是由Philips开发的一种数据传输协议,同样采用2根信号来实现:SDAT(串行数据输入输出)和SCLK(串行时钟)。其最大的好处是可以在此总线上挂接多个设备,通过地址来进行识别和访问;I2C总线的一个最大的好处就是非常方便用软件通过IO口(片上资源或者普通IO口模拟)来实现,其通讯方式是半双工。
Watchdog(看门狗定时器):Watchdog也是绝大多数MCU的一种基本配置,大多数的MCU的Watchdog只能允许程序对其进行复位而不能对其关闭(有的是在程序烧入时来设定的,如Microchip PIC系列MCU),而有的MCU则是通过特定的方式来决定其是否打开,如STM32系列,只要程序访问了Watchdog寄存器,就自动开启且不能再被关闭。一般而言watchdog的复位时间是可以程序来设定的。Watchdog的最基本的应用是为MCU因为意外的故障而导致死机提供了一种自动复位的功能。 MCU程序的编写 对于MCU的程序编写,其基本的框架可以说是大体一致的,一般分为初始化部分(这是MCU程序设计与PC最大的不同),主程序循环体和中断处理程序三大部分,其分别说明如下: 初始化:对于所有的MCU程序的设计来讲,初始化是最基本也是最重要的一步,一般包括如下内容: IO口的初始化:根据项目的应用的要求,设定相关IO口的输入输出方式,对与输入口,需要设定其上拉或下拉电阻;对于输出口,则必须设定其出世的电平输出,以防出现不必要的错误; 中断的设置:对于所有项目需要用到的中断源,应该给予开启并设定中断的触发条件,而对于不使用的多余的中断,则必须给予关闭; 其他功能模块的初始化:对于所有需要用到的MCU的外围功能模块,必须按项目的应用的要求进行相应的设置,如UART的通讯,需要设定Baud Rate,数据长度,校验方式和Stop Bit的长度等,而对于定时器则必须设置其时钟源,分频数及初值等; 变量的初始化:完成了MCU的硬件和资源的初始化后,接下来就是对程序中使用到的一些变量和数据的初始化设置,这一部分的初始化需要根据具体的项目及程序的总体安排来设计。比如说读取EEPROM中存储的掉电保存输出等;
主程序循环体:用户编写的程序多是周而复始循环执行的,因此其主程序体基本上都是以while循环的方式来设计。 中断处理程序:中断函数是一种特殊的函数,只有相应中断被触发后MCU才去执行该部分函数。51单片机的中断函数是通过interrupt关键字来实现的,实例写法如下: void Timer_Isr() interrupt 0 interrupt是关键字,数字0是中断向量号。 对于32位的单片机而言,中断入口函数都在.s启动函数里注册好了,实例写法如下(以STM32单片机为例): void TIM2_IRQHandler() 下图是.s启动函数中截取的中断函数句柄:
单片机是一门工具,以应用为主,所以说了这么多,一句话来总结:要学好单片机必须动手多加练习。
|