史上最强单片机科普 应广单片机( 三 )


单片机编程
单片机编程和PC机编程有很大的区别 。虽然现在基于C语言的单片机开发工具越来越流行,但是对于一个高效的程序代码和喜欢使用汇编语言的设计人员来说,汇编语言仍然是最简洁有效的编程语言 。
对于MCU编程来说,其基本框架可以说是大体一致的,一般分为三个部分:初始化部分(这是MCU编程与PC最大的区别)、主程序循环体和中断处理程序,分别描述如下:
初始化:对于所有MCU程序的设计来说,外化是最基本也是最重要的一步,一般包括以下内容:
屏蔽所有中断并初始化堆栈指针:初始化部分通常不希望发生任何中断 。
清除系统的RAM区域并显示Memory:虽然有时可能不是完全必要的,但从可靠性和一致性的角度来看,建议养成良好的编程习惯,尤其是为了防止意外错误 。
IO口初始化:根据项目的应用需求,设置相关IO口的输入输出方式,对向输入口设置上拉或下拉电阻;对于输出端口,有必要设置其输出电平,以防止不必要的错误 。
中断设置:对于项目需要的所有中断源,都要开启并设置中断的触发条件,而不使用的不必要的中断必须关闭 。
其他功能模块初始化:对于需要使用的MCU的所有外围功能模块,必须根据项目的应用需求进行相应的设置 。例如,对于UART通信,需要设置波特率、数据长度、检查模式和停止位长度,而对于编程器定时器,必须设置其时钟源、分频数和重新加载数据 。
参数外化:MCU的硬件和资源外化后,下一步就是初始化程序中使用的一些变量和数据 。这部分的初始化需要根据具体项目和方案的整体安排进行设计 。对于一些使用EEPROM保存预设项目数的应用,建议在初始化时将相关数据复制到MCU的RAM中,提高程序对数据的访问速度,降低系统功耗(原则上访问外部EEPROM会增加功耗) 。
主程序循环体:大多数单片机长时间连续运行,所以其主程序体基本上是循环设计的 。对于具有多种工作模式的应用程序,可能有多个循环体,可以通过状态标志进行转换 。对于主程序体,一般安排以下模块:
计算程序:计算程序一般比较耗时,所以坚决反对将其置于任何中断状态,尤其是乘除法 。
显示程序:主要用于带外置LED和液晶驱动器的应用 。
中断处理程序:中断处理程序主要用于处理实时性要求较高的任务和事件,如外部突发信号检测、按键检测处理、计时计数、LED显示扫描等 。
一般来说,中断程序应该保持代码尽可能简洁和简短 。对于不需要实时处理的功能,可以在中断中设置触发标志,然后主程序可以执行特定的事务——这一点非常重要,尤其是对于低功耗、低速度的MCU,需要保证所有中断的及时响应 。
对于不同任务体的安排,不同的单片机有不同的处理方法 。
例如,对于低速低功耗的MCU(Fosc=32768Hz)应用,考虑到此类项目均为手持设备,使用普通LCD显示,对按键和显示的响应要求实时性较高,因此,按键的动作和数据的显示应采用定时中断的方式处理 。对于高速MCU,比如FOSC的1mhz应用,由于此时MCU有足够的时间执行主程序循环体,所以可以只在相应的中断中设置各种触发标志,将所有任务放在主程序体中执行 。
在单片机的编程中,需要特别注意的一点是,防止中断和主程序体中同一变量或数据同时被访问或设置 。有效的防范方法是将这类数据的处理安排在一个模块中,通过判断触发标志来决定是否执行该数据的相关操作;但是,在其他程序体(主要是中断)中,只对需要处理数据的地方设置触发标志 。―这样可以保证数据执行的可预测性和唯一性 。
全球主流MCU厂商
欧美地区
1.飞思卡尔+恩智浦(Freescale+恩智浦):荷兰,主要提供16位和32位MCU 。应用领域:汽车电子、LED及通用照明、医疗保健、多媒体融合、家电及电动工具、楼宇自动化技术电机控制、电源及电源转换器、能源及智能电网、自动化、计算机及通信基础设施 。
2.微芯片+Atmel(微芯片技术+Termel):美国主要提供16位和32位MCU 。应用:汽车电子、工业应用、电机控制、汽车、楼宇自动化、家用电器、家庭娱乐、工业自动化、照明、物联网、智能能源、移动电子设备、计算机外设 。
【史上最强单片机科普 应广单片机】3.Cypress+Spansion:美国,主要提供8位、16位、32位MCU 。应用:汽车电子、家用电器、医疗保健、消费电子、通信和电信、工业和无线 。
4.ADI(阿德里亚诺半导体):美国主要提供8位、16位、32位MCU 。适用范围:航空空航空航天与国防、汽车应用、建筑技术、通信、消费电子、能源、医疗保健、仪器仪表与测量、电机、工业自动化与安全 。

推荐阅读