全球主流8位MCU芯片详细解剖:MC9S08AC60

来源:网络

点击:815

A+ A-

所属频道:新闻中心

关键词: MC9S08AC60,8位MCU,飞思卡尔,MCU

       相信很多人在学习MCU(单片机)的时候,都是从最基本的8位MCU开始的。如今,尽管32位MCU甚至更多功能强大的MCU大有下探取代之势,但是在许多工程师的记忆里以及相当一部分应用领域,8位单片机依然是不可磨灭的一代经典!本文将结合单片机的生产厂商,带你深入了解主流8位单片机的功能结构,引脚说明,模块分析以及具体应用等等。

      飞思卡尔 MC9S08AC60

      简介

      MC9S08AC60系列MCU是低成本、高性能HCS08系列8位微处理器单元  (MCU)的成员。这个系列的单片机均由一对引脚兼容的8位和32位器件组成,是Flexis系列器件的第3个系列产品。Flexis系列控制器是飞思卡尔控制器联合体的连接点,使8位与32位兼容性成为现实。

      模块结构图

      经典盘点——8位主流单片机学习详解NO.1:飞思卡尔 MC9S08AC60

      系统时钟图

      经典盘点——8位主流单片机学习详解NO.1:飞思卡尔 MC9S08AC60

      引脚图

      经典盘点——8位主流单片机学习详解NO.1:飞思卡尔 MC9S08AC60

      通用引脚连接

      经典盘点——8位主流单片机学习详解NO.1:飞思卡尔 MC9S08AC60

      重要引脚说明

      电源(VDD, VSS, VDDAD, VSSAD)

      VDD 和VSS 是MCU的主电源引脚。该电压源为所有I/O 缓冲电路以及内部稳压器供电。内部稳压器向CPU  和MCU的其它内部电路提供稳压后的低电压源。

      VDDAD 和VSSAD 是MCU的模拟电源引脚。该电源为ADC 模块供电。必须在离该模拟电源引脚尽可能近的地方连接一个0.1 μF  陶瓷旁路电容,来抑制高频噪音。

      振荡器(XTAL, EXTAL)

      复位后,MCU使用内部生成的时钟(自时钟模式— fSelf_reset),相当于8 MHz  晶体振荡频率。这个频率的时钟源在复位启动时使用,可以作为停止恢复的时钟源,这样可以避免较长的晶体启动延迟。该MCU还包含一个可修整的内部时钟发生器(ICG)  模块,可以用它来运行MCU。

      RESET 引脚

      RESET  是一个专用的引脚,内置一个上拉器件。它有输入滞后,包含一个高电流输出驱动,无输出斜率控制。内部加电复位和低压复压电路一般都不需要外部复位电路。  这个引脚通常连接到标准的6引脚后台调试连接器,这样开发系统可以直接复位MCU系统。

      后台/模式选择(BKGD/MS)

      在复位时,BKGD/MS 引脚充当模式选择引脚。复位完成后,该引脚立即作为后台引脚,可以用于后台调试通信。当作为后台/模式模式选择引脚时,  该引脚包括一个内部上拉器件,有输入滞后,且无输出斜率控制。当引脚作为后台引脚时,它包括一个高电流输出驱动。当该引脚作为模式选择引脚时,它只有输入,因此不包含标准的输出驱动。

      ADC 参考引脚(VREFH, VREFL)

      VREFH和VREFL 引脚分别为ADC模块的电压参考高输入和电压参考低输入。

      外部中断引脚 (IRQ)

      IRQ 引脚是IRQ中断的输入源,也是BIH 和BIL指令的输入。如果未使能IR功能,这个引脚仍配置为TPMCLK 。

      通用I/O和外设端口

      剩余的引脚被通用I/O和片上外设功能,如定时器和串行I/O系统共用。复位后,所有这些引脚立即配置为高阻抗通用输入,且内部上拉器件关闭。

      重要模块分析

      存储器

      MC9S08AC60系列MCU中的片上存储器包括RAM、非易失性数据存储的Flash存储器、I/O 和控制/  状态寄存器。这些寄存器可分为以下三类:

      • 直接页面寄存器

      • 高位页面寄存器

      • 非易失性寄存器

      复位、中断和系统配置

      复位和中断特性包括:

      • 多源复位,实现灵活的系统配置和可靠操作

      • 加电检测(POR)

      • 低压检测(LVD),使能

      • 外部RESET 引脚

      • COP 看门狗使能,及两个超时选择

      • 非法操作代码

      • 来自后台调试主机的串行命令

      • 复位状态寄存器(SRS) ,指示最新复位的源

      • 每个模块的单独中断向量 (减少轮询开销)

      并行输入/ 输出

      通过端口数据寄存器读/ 写并行I/O。输入输出方向由端口数据方向寄存器控制。下面的结构图举例了一个引脚的并行I/O端口功能。

      经典盘点——8位主流单片机学习详解NO.1:飞思卡尔 MC9S08AC60

      中央处理单元 (S08CPUV2)

      HCS08 CPU具有以下特性:

      • 目标代码完全兼容M68HC05和M68HC08家族

      • 所有寄存器和存储器映射到一个独立的64 KB的地址空间

      • 16位堆栈指针 (64 K字节地址空间内任意大小、任意地址的堆栈)

      • 16位变址寄存器 (H:X)支持强大的索引地址模式

      • 8位累加器 (A)

      • 许多指令把X作为第二个通用8位寄存器

      • 7种寻址模式:

      • 固有寻址模式 — 操作数存于内部寄存器

      • 相对寻址模式 —8位有符号偏移量的分支地址

      • 立即寻址模式 — 操作数位于下一个目标代码

      • 直接寻址模式 — 操作数位于0x0000到0x00FF之间

      • 扩展寻址模式 — 操作数位于64K字节地址空间内

      • H:X相对变址寻址模式 — 提供包括自动增量在内的5种子模式

      • SP相对变址寻址模式 — 大大提高C语言编译的效率

      • 提供四种寻址模式组合的寄存器-寄存器数据转移指令

      • 溢出、半进位、负、零和进位状况码支持根据带符号、无符号、BCD码操作的结果进行条件转移

      • 高效率的位操作指令

      • 快速8位乘8位和16位除8位指令

      • STOP和WAIT指令调用低功耗运行模式

      模数转换器(S08ADC10V1)

      10位模数转换器 (ADC)是新一代的逼近模数转换器,在集成的微处理器片上系统中运行。 这种ADC模块设计支持最高28个独立的模拟输入  (AD0-AD27)。MC9S08AC60系列微处理器上只使用了其中18个(AD0-AD15、AD26和AD27)输入。这些输入通过ADCH位选择。

      ADC模块特点包括:

      • 线性逐次逼近算法,10位精度。

      • 多达28个模拟输入。

      • 8位或10位右对齐格式输出

      • 单个或连续的转换 (单个转换后自动返回到空闲)

      • 设置采样时间和转换速度 (功率)

      • 转换完成标志和中断

      • 输入时钟可以选择高达四个时钟源

      • 在等待或stop3模式中操作为低噪音操作

      • 异步时钟源的低噪音操作

      • 可选的异步硬件转换触发

      • 自动比较小于,大于或等于编程值

      • 温度传感器

      时钟显示程序

      使用MC9S08AC的Timer做一个时钟,并在LCD1602上显示

      lcd1602.h

      #ifndef _NICROSYSTEM_FREESCALE_S08_DEVKIT_LCD1602_H_

      #define _NICROSYSTEM_FREESCALE_S08_DEVKIT_LCD1602_H_

      unsigned char lcd_status(void);

      void lcd_init(void);

      void lcd_write_char(unsigned char x,unsigned char y, unsigned char ch);

      void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s);

      void lcd_write_data(unsigned char data);

      void lcd_write_cmd(unsigned char cmd);

      #endif

      lcd1602.c

      #include “lcd1602.h”

      #include “derivative.h”

      #define LCD_DATA PTED

      #define LCD_DATA_DIR PTEDD

      #define LCD_DATA_DS PTEDS

      #define LCDRS PTAD_PTAD0

      #define LCDRW PTAD_PTAD1

      #define LCDE PTBD_PTBD0

      #define LCDRS_DIR PTADD_PTADD0

      #define LCDRW_DIR PTADD_PTADD1

      #define LCDE_DIR PTBDD_PTBDD0

      #define LCDE_DS PTBDS_PTBDS0

      #define LCDRS_DS PTADS_PTADS0

      #define LCDRW_DS PTADS_PTADS1

      void lcd_clear(void);

      void lcd_write_cmd(unsigned char cmd);

      void init_lcd() {

      LCD_DATA_DIR=0xff;

      LCDRS_DIR=1;

      LCDRW_DIR=1;

      LCDE_DIR=1;

      LCDRS_DS=1;

      LCDRW_DS=1;

      LCDE_DS=1;

      LCD_DATA_DS=0xff;

      LCD_DATA=0;

      LCDE=1;

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      lcd_clear();

      lcd_write_cmd(0x38);//设置lcd功能:8位总线,双行显示,5X7点阵字符

      lcd_write_cmd(0x0f);//显示开关控制:显示ON,光标ON,闪烁ON

      lcd_write_cmd(0x06);//光标输入方式增量移位

      lcd_write_cmd(0x80);

      }

      unsigned char lcd_status() {

      byte lcdstatus;

      LCD_DATA_DIR=0x00;

      LCDRS=0;

      LCDRW=1;

      LCDE=0;

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      LCDE=1;

      lcdstatus=LCD_DATA;

      LCD_DATA_DIR=0xff;

      return lcdstatus;

      }

      void lcd_write_cmd(unsigned char cmd) {

      byte status;

      LCD_DATA=cmd;

      LCDRS=0;

      LCDRW=0;

      LCDE=0;

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      do{

      status=lcd_status();

      }

      while(status&0x80);

      LCDE=1;

      }

      void lcd_clear(void) {

      lcd_write_cmd(0x01);

      }

      void lcd_write_data(unsigned char data) {

      byte status;

      LCD_DATA=data;

      LCDRS=1;

      LCDRW=0;

      LCDE=0;

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      asm(“nop”);

      do{

      status=lcd_status();

      }

      while(status&0x80);

      LCDE=1;

      }

      void lcd_write_char(unsigned char x,unsigned char y,unsigned char ch) {

      if(y)

      lcd_write_cmd(0xc0+x);

      else

      lcd_write_cmd(0x80+x);

      lcd_write_data(ch);

      }

      void lcd_write_str(unsigned char x,unsigned char y,char*s) {

      if(y)

      lcd_write_cmd(0xc0+x);

      else

      lcd_write_cmd(0x80+x);

      while(*s){

      lcd_write_data(*s);

      s++;

      }

      }

      main.c

      #include /* for EnableInterrupts macro */

      #include “derivative.h” /* include peripheral declarations */

      #include “mc9s08ac16.h”

      #include “lcd1602.h”

      const unsigned char  table[10]={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’};

      unsigned char hour=11,minute=20,second=0;

      unsigned char con_result[9];

      void init_system_clk(void)

      {

      ICGC1=0xf8;

      ICGC2=0x89;

      while(ICGS1_LOCK==0);

      }

      void convert() /*covert numeric data to char data,for instance,1 to ‘1’  */

      {

      unsigned char tens,unit;

      tens=second/10;

      unit=second%10;

      con_result[7]=table[unit];

      con_result[6]=table[tens];

      tens=minute/10;

      unit=minute%10;

      con_result[4]=table[unit];

      con_result[3]=table[tens];

      tens=hour/10;

      unit=hour%10;

      con_result[1]=table[unit];

      con_result[0]=table[tens];

      con_result[8]=‘\0’;

      con_result[2]=‘:’;

      con_result[5]=‘:’;

      }

      interrupt VectorNumber_Vtpm1ovf void TMP1_OVF_ISR(void)

      {

      DisableInterrupts;

      TPM1SC_TOF=0;

      second++;

      if(second》59)

      {

      minute++;

      second=0;

      }

      if(minute》59)

      {

      hour++;

      minute=0;

      }

      if(hour》23)

      {

      hour=0;

      }

      convert();

      lcd_write_str(4,1,con_result);

      lcd_write_cmd(0x0c);

      EnableInterrupts;

      }

      void main(void)

      {

      EnableInterrupts; /* enable interrupts */

      /* include your code here */

      SOPT_COPE=0;

      init_system_clk();

      init_lcd();

      lcd_write_str(2,0,“NicroSystem”);

      TPM1SC=0x4e;

      TPM1MODH=0xf4;

      TPM1MODL=0x24;

      for(;;) {

      //__RESET_WATCHDOG(); /* feeds the dog */

      } /* loop forever */

      /* please make sure that you never leave main */

      }

      典型应用

      室内空调系统

      现代空调系统使用越来越多的半导体来支持一系列高级功能,包括节能电机、交互式用户界面和遥控器等。飞思卡尔可提供满足这些领域特定需求的相应解决方案,  例如,能够提高能效并降低工作噪声的高级电机控制解决方案,针对用户界面的一系列控制解决方案,以及针对遥控的基于红外线和射频的解决方案。

      经典盘点——8位主流单片机学习详解NO.1:飞思卡尔 MC9S08AC60

      无刷直流电机(BLDC)

      无刷直流(BLDC)电机在风扇、泵、HVAC风机与压缩机、计算机磁盘驱动器与外设、家用电器、机器人、伺服系统、牵引控制、缝纫机和跑步机等应用中广  泛使用。BLDC电机是一种旋转电动机械,其定子为类似感应电机的传统三相定子,转子使用永磁体。电机扭矩和速度可由微控制器(MCU)或数字信号控制器  (DSC)实现极高效控制。飞思卡尔支持霍尔传感器(换向)和无传感器控制功能。

      经典盘点——8位主流单片机学习详解NO.1:飞思卡尔 MC9S08AC60

      汽车暖通空调(HVAC)

      暖通空调(HVAC)系统利用各种传感器输入的数据,控制不同类型的电机,如用于摆叶的步进电机和直流/无刷直流风扇电机。

      经典盘点——8位主流单片机学习详解NO.1:飞思卡尔 MC9S08AC60

    (审核编辑: 智汇张瑜)

    声明:除特别说明之外,新闻内容及图片均来自网络及各大主流媒体。版权归原作者所有。如认为内容侵权,请联系我们删除。