快速掌握一款新型MCU方法

引入

  任意款MCU的基本原理和功能都是大同小异,不同的是外围的功能模块的配置和数量以及指令系统等。故:对任一款MCU都应由如下几个方面来掌握:

一、了解MCU特点

  ROM空间、RAM空间、IO数量、定时器数量和定时方式、所提供的外围功能模块、中断源、工作电压及功耗等。

二、结合项目明确需求

  根据以上特点,对比实际项目开发的功能进行对比。
  1.明确本项目所需资源与无需资源。
    所需资源:应认真阅读和理解手册。
    无需资源:忽略或浏览即可。
  2.若所选MCU中有不满足项目要求的功能,应认真理解MCU资料尝试间接实现。
  如:需与PC机COM通讯,所选MCU却不支持UART口,则可考虑用外部中断方式实现。

三、开始编程

  若初次使用该款MCU的设计者,可能会遇到对MCU功能描述不明确地方,则可:
    一、编写特别验证程序理解资料所需功能。(时间长、新手)
    二、按自己理解编写,后期调试时再修改和完善。(时间短、老手)

  PS: 指令系统无需花时间理解,随着编程进行会不断熟练。

MCU基本功能

Timer(定时器)

  种类繁多,大体分为两大类:
    一、定时器(Timer):该类是时间间隔固定的定时器,即其定时的时间由系统设定,用户程序不可控,系统只提供几种固定的时间间隔给用户程序选择,如:32Hz、16Hz、8Hz等。
    此类在4位MCU中较常见,可实现时钟、计时等相关功能。

    二、可编程定时器(Programmable Timer):该类是时间间隔可由用户程序控制的定时器,控制方式包括:时钟源的选择、分频数(Prescale)选择及预制数的设定等(不一定全包含)。
    此类应用灵活,最常见应用为:实现PWM输出。
    由于时钟源可*选择,故一般均与Event Counter(事件计数器)合在一起。

IO口

  与外部沟通渠道,根据配置情况,可分以下几类:

  纯输入或纯输出口:

    此类由硬件设计决定,只能是输入或输出,不可用软件进行实时设定。

  直接读写IO口:

    当执行读IO指令则为输入口;
    当执行写IO指令则为输出口;

  程序编程设定输入输出方向:

    由程序根据实际需要设定,应用灵活,可实现总线级应用。如:I2C总线,各种LCD、LED Driver的控制总线等。
  PS: IO使用需牢记:
    输入口:须明确电平信号,确定不可浮空(可增加上拉或下拉电阻实现)。
    输出口: 输出状态电平须考虑外部连接情况,应保证Standby或静态状态下不存在拉电流或灌电流。

外部中断

  一般用于信号的实时触发,数据采样和状态检测。
  中断方式:上升沿、下降沿、电平触发等。
  外部中断一般为输入口实现,若为输出口则自动关闭。

  应用:

    ①外部触发信号的检测(两种情况):
      情况一:基于实时性的要求:如可控硅的控制,突发性信号检测等。
      情况二:省电的需求。

    ②信号频率测量:保证信号不被遗漏。

    ③数据解码:遥控领域,为降低设计成本,采用软件方法来对各种编码数据进行解码。

    ④按键检测和系统唤醒:对进入Sleep状态的MCU,一般需外部中断进行唤醒,最基本形式:通过按键动作产生电平的变化。

通讯接口

  一、UART接口:

    最基本的 异步 传输接口。
    信号线:Rx和Tx两条。
    数据格式Start Bit + Data Bit(7/8 - bits)+Parity Bit(Even,Odd or None)+Stop Bit(1~2Bit).
    波特率(Baud Rate):以为数据所占时间。

  二、SPI接口:

    同步时钟传输接口。
    信号线:SDI(串行数据输入)、SDO(串行数据输出)、SCLK(串行时钟)、Ready信号(可无)。
    可在Master/Slava方式下工作。(提供时钟为Master)

  三、I2C接口:

    由Philips开发的数据传输。
    信号线:SDAT(串行数据输入输出)、SCLK(串行时钟)
    优势:总线挂多个设备,通过地址识别和访问。可用软件通过IO口实现。传输的数据速率由SCLK控制。

看门狗定时器(Watchdog)

  ①只允许程序对其复位而不能对其关闭。
    如:PIC系列,在程序烧入时设定。
  ②通过特定方式决定是否打开。
    如:KS57系列,只要程序访问Watchdog寄存器,就自动开启切不能被关闭。
  watchdog复位时间可程序来设定,为MCU因为意外故障而导致死机提供一种自我恢复的能力。

MCU程序编写

  基本框架:初始化、主程序循环体、中断处理。

初始化

  ①屏蔽所有中断并初始化堆栈指针:初始化部分一般不希望有任何中断发生。
  ②清除系统RAM区域和显示Memory:防止意外错误。
  ③IO口的初始化:根据项目要求,设定先关IO口输入输出方式。
    输入口:设置上拉或下拉电阻。
    输出口 :必须设定初始电平输出,以防不必要错误。
  ④中断设置:需中断源则要设置触发条件,无需则给与关闭。
  ⑤其他功能模块初始化:按对应要求设置。
  ⑥参数初始化:对程序中变量和数据初始化设置。对于EEPROM保存项目未知数可在初始化时将相关数据拷贝到RAM中,以提高程序对数据访问速度,降低系统功耗(EEPROM都会增加电源功耗)。

主程序循环体:

  ①计算程序:一般较为耗时,故坚决反对放在中断中处理。
  ②实时性要求不高或没实时性要求的处理程序。
  ③显示传输程序:真要针对外部LED、LCD Driver的应用。

中断处理程序:

  主要用于处理实时性要求较高的任务和时间,如;外部突发性信号检测,按键检测和处理,定时计数,LED显示扫描等。
  程序应保证代码简洁和短小。

上一篇:痞子衡嵌入式:终于可以放开聊一聊i.MXRT1170这颗划时代MCU了


下一篇:实体框架:C#Winforms绑定源删除datagridview,但标记isDeleted字段为true(不删除)