logo
 
首页-> 产品信息-> 8位单片机
 
入门指南
开发&工具
应用方案
客户支持
 
学习e条龙
一、单片机简介 二、指令系统 三、IO端口 四、中断系统
五、定时/计数器 六、串行接口 七、模拟外设 八、其它硬件
九、开发工具 、应用实例 十一、附录  

其它硬件功能模块原理及应用

内容索引
8.1 复位 8.4 看门狗定时器
8.2 时钟源  8.5 时基与蜂鸣器输出
8.3 低功耗工作模式  

8.1 复位

  SPMC65 系列单片机共提供 5 种复位方式,分别是:

  1 .上电复位( POR )

  2 .外部复位( RESET )

  3 .低电压复位( LVR )

  4 .看门狗复位( WDTR )

  5 .非法地址复位( IAR )

  复位时序请参考 图 8.1 。

图 8 . 1 复位时序图

  按照复位结果可以分为系统复位和 CPU 复位。系统复位不仅复位 CPU ,同时还会复位所有的内部模块(包括 I/O 、 Timer 、 A/D 、 D/A 、各种控制寄存器等都将初始化为默认值);而 CPU 复位只会复位 CPU ,即 PC 指针重新指向初始地址,程序重新从头开始执行,同时也会复位堆栈指针,指向堆栈的最高地址。具体请参考 表 8.1 。

表 8 . 1 复位源功能列表

复位源

复位功能

上电复位( POR )

系统复位

外部复位( RESET )

系统复位

低电压复位( LVR )

系统复位

看门狗复位( WDTR )

仅复位 CPU 和看门狗电路

非法地址复位( IAR )

仅复位 CPU 和看门狗电路

8.1.1 上电复位( POR )

  当单片机的电源电压 VDD 上升到 1.45V ,便会开始上电复位;首先要等 40ms 的时间以待电源稳定,然后会再等待 40ms 的时间以待系统时钟稳定;最后还要经过 1024 个系统时钟周期后,完成系统复位和 CPU 复位。上电复位为系统复位,复位后所有的寄存器都初始化为默认值。

  上电复位时序请参考 图 8.2 。

图 8 . 2 上电复位时序图

8.1.2 外部复位( RESET )

  SPMC65 系列单片机提供了一个外部复位管脚 ,可手动系统复位。 管脚为低电平有效,当 管脚电压低于 0.3 × VDD 时,且低电平时间大于 200ns 后,系统开始复位。当 管脚电平跳变为高电平后,系统会等 40ms 以待系统时钟稳定,然后再经过 1024 个系统时钟周期后,完成系统复位和 CPU 复位。外部复位电路图请参考 图 8.3 ,外部复位时序图请参考 图 8.4 。

图 8 . 3 外部复位电路图

图 8 . 4 外部复位时序图

8.1.3 低电压复位( LVR )

  低电压复位即当单片机的电源电压低于设定的复位电压值大于 1024 个系统时钟时,芯片便会产生复位,以保证单片机不会在非正常的电压范围内工作;当电源电压恢复后,会经过 1024 个系统时钟后,完成系统复位(包括 CPU 复位),进入正常工作状态。导致电源电压过低的原因很多,如电压的反跳、负载过重等。低电压复位时序图请参考 图 8.5 。

图 8 . 5 低电压复位时序图

  低电压复位功能使能 / 禁止可以在芯片配置选项寄存器中进行设置,可以参考软硬件开发工具的章节。

  复位电压值可以通过复位电压选择寄存器 P_LVR_Opt ( $36 ) Bit0 位选择 。 SPMC65 系列单片机提供的复位电压为 4.0V 和 2.5V 可选;该寄存器默认值为 #00h 。

表 8 . 2 低电压复位选择寄存器 P_LVR_Opt ( $36,R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

-

-

-

-

-

-

-

LVRV40

-

-

-

-

-

-

-

R/W

  Bit [7:1]   保留

  Bit [0]    LVRV40 :复位电压选择位

           0 = 低电压复位电压为 2.5V

           1 = 低电压复位电压为 4.0V (该位在芯片运行后仅可设置一次,上电复位才可将其清除)

  注:寄存器 P_LVR_Opt 进行设置时需要连续写两次才能将值有效写入。

8.1.4 看门狗复位( WDTR )

  SPMC65 系列单片机提供了看门狗复位方式,以保证程序的正常运行。看门狗定时器的计数频率可以通过设置相关寄存器进行选择,看门狗定时器每次溢出会产生一次看门狗中断信号,若连续 8 次看门狗定时器溢出中断,则会发生一次看门狗复位;所以在这个时间内,看门狗定时器必须被清除(向 P_WDT_Clr 寄存器中写入 #55h )。看门狗复位功能使能 / 禁止可以在芯片配置选项寄存器中进行设置,可以参考软硬件开发工具的章节。 CPU 复位时只会清除看门狗定时器并重新开始计数,但不能清除看门狗的复位标志。清除看门狗的复位标志请参考 9.1.6 。

  看门狗复位时序请参考 图 8.6 。

图 8 . 6 看门狗复位时序图

8.1.5 非法地址复位( IAR )

  非法地址复位( IAR ),可以防止系统进入非法地址。当程序对某个地址进行读写操作时,如果超出 SPMC65 系列单片机的寻址范围,或预留不能被访问的地址区域时,便会产生非法地址复位信号,复位 CPU 。

8.1.6 系统控制寄存器 P_SYS_Ctrl ( $30,R/W )

  系统复位标志寄存器主要是用来标识上述五种复位是否发生,可以进行读 / 写操作。读操作:读相应位可以查看是否发上了复位动作;写操作:写相应位为 1 ,清除相应的复位标志。

表 8 . 3 系统控制寄存器 P_SYS_Ctrl ( $30,R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

POR

ERST

LVR

-

WDR

IAR

-

-

R/W

R/W

R/W

-

R/W

R/W

-

-

 Bit [7]  POR :上电复位标志位
   
        0 = 无上电复位发生
       
        1 = 上电复位发生
   
  Bit [6]  ERST :外部复位标志
   
        0 = 无外部复位发生
       
        1 = 外部复位发生
   
  Bit [5]  LVR :低电压复位标志
   
        0 = 无低电压复位发生
       
        1 = 低电压复位发生
   
  Bit [4]  保留
   
  Bit [3]  WDR :看门狗复位标志
   
        0 = 无看门狗复位发生
       
        1 = 看门狗复位发生
   
  Bit [2]  IAR :非法地址复位标志
   
        0 = 无非法地址复位发生
       
        1 = 非法地址复位发生
   
  Bit [1:0] 保留

  注:寄存器 P_SYS_Ctrl 进行设置时需要连续写两次才能将值有效写入。

  【例 8-1 】 保存寄存器 P_SYS_Ctrl 的值,然后将其清除。

  lda  P_SYS_Ctrl ; 读出复位标志
   
  sta  G_MworkReg1 ; G_MworkReg1 为定义的变量
   
  lda  #FFh ; 清除复位标志
   
  sta  P_SYS_Ctrl
   
  sta  P_SYS_Ctrl

8.2 时钟源

  SPMC65 系列单片机支持三种时钟输入方式:晶体输入、 RC 振荡输入和外部时钟输入。

A .晶体输入 B . RC 振荡输入 C .外部时钟输入

图 8 . 7 SPMC65 系列时钟输入方式

  晶体和外部时钟输入振荡频率 F OSC 最大为 16MHz ,经片内二分频电路后,得到系统时钟 FSYS (即 CPU 工作的频率),即系统时钟最大为 8MHz 。

  RC 振荡电路中建议电容值为 50pf ,电阻 R 和频率的对应关系请参考 表 8.4 , RC 振荡方式提供的最大系统时钟为 8MHz 。

表 8 . 4 电阻 R 和频率对应关系

频率 (Hz)

R ( ), C=50pf

FSYS =500K

17.2k

FSYS =1M

9.26k

FSYS =2M

4.2k

FSYS =4M

1.73k

FSYS =6M

1.08k

FSYS =8M

740

  晶体、 RC 振荡和外部时钟输入三种时钟源输入方式可根据不同的需要,通过对芯片配置选项进行设置进行选择,详细的请参考第十章中的介绍。

  在使用 RC 振荡输入模式时,为便于测量振荡信号,判断 RC 振荡器是否起振以及振荡情况是否正常,可以通过设置芯片配置选项,使能管脚 XO 输出振荡频率。 有关芯片配置选项的设置请参考第十章有关 FortisIDE 的介绍。

8.3 低功耗工作模式

  SPMC65 系列单片机提供三种工作模式,分别是正常模式( NORMAL )、掉电模式( STOP )、挂起模式( HALT )。芯片上电后直接进入 NORMAL 模式,所有的硬件功能模块均为可用。为了降低整个芯片的功耗,还提供了 STOP 和 HALT 两种低功耗模式。低功耗模式可以被唤醒源唤醒,进入正常工作模式。而外部复位都可以使芯片从低功耗模式强行进行复位,并进入正常工作模式,所以可以把外部复位看为特殊的唤醒源。

  系统进入 STOP 模式,片上振荡器停止, CPU 以及所有的硬件功能模块也停止。但是 RAM 区的数据包括控制寄存器的设置仍然保持不变( RAM 区的数据、寄存器中的值和锁存器中的内容保持不变)。由于 I/O 口的相关的寄存器(数据寄存器、方向寄存器和属性寄存器)设置不变,所以 I/O 端口管脚状态保持不变。

  来自 I/O 管脚的外部中断或者看门狗中断可以唤醒系统重新进入正常模式,所以在进入 STOP 模式之前必须打开相应的中断。若使用看门狗进行唤醒,则必须先打开看门狗定时器。而外部复位可看作特殊的唤醒源,当系统工作在 STOP 模式下时,外部复位的效果实际上就是使系统复位,然后再进入正常工作模式(程序从头执行)。

  系统在 STOP 模式下由外部中断或看门狗中断唤醒时,系统会延时 40ms 的时间(延时波动为 20ms~60ms )以待系统时钟稳定,之后才进入正常的唤醒后操作。

  在 HALT 模式下,所有的周边保持原来状态,正常工作。只有 CPU 停止工作以节省功耗,所以 HALT 模式下功耗大于 STOP 模式下的功耗。 HALT 模式下,所有的中断源都可以作为唤醒源。 表 8.5 为三种模式下 CPU 和周边硬件的运行情况。

表 8 . 5 CPU 和周边硬件运行表

工作模式

写寄存器 P_Mode_Ctrl ($31)

CPU 工作状态

外围工作状态

STOP

#5Ah

OFF

OFF

HALT

#A5h

OFF

ON

NORMAL

-

ON

ON

  三种工作模式之间的关系请参考 图 8.8 。

图 8 . 8 工作模式转换

  低功耗模式控制寄存器 P_MODE_Ctrl($31) 默认值为 #00h ,其功能请参考 表 8.6 。

表 8 . 6低功耗模式控制寄存器 P_MODE_Ctrl($31,R/W)

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

Mode_Ctrl7

Mode_Ctrl6

Mode_Ctrl5

Mode_Ctrl4

Mode_Ctrl3

Mode_Ctrl2

Mode_Ctrl1

Mode_Ctrl0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Bit [7:0]   Mode_Ctrl[7:0] : 工作模式选择位

         读操作:

           数值总是 0x00

        写操作:

           0x5A= 进入 Stop 模式

           0xA5= 进入 HALT 模式

           0x66= 复位除了 CPU 外的所有内部模块

  注:寄存器 P_Mode_Ctrl 进行设置时需要连续写两次才能将值有效写入。

操作:

  •  进入 STOP 模式操作

  在进入 STOP 模式前必须清除所有的中断请求标志 (P_INT_Flag0, P_INT_Flag1, P_INT_Flag2) ,和使能相应的外部中断作为唤醒源。然后执行进入 STOP 模式指令,即连续两次写 # 5Ah 到 低功耗控制寄存器 P_Mode_Ctrl ,由于系统可能会受到外界干扰等情况,所以为了增加程序的可靠性,可以插入多于 2 条的 NOP 指令 。

  •  唤醒 STOP 模式操作

  外部复位或外部中断都可以将单片机从 STOP 模式唤醒到正常工作模式。而外部复位实际上是系统复位的操作,会将初始化所有控制寄存器为默认值,但并不改变片内 RAM 的数值。外部中断唤醒方式将保留片内 RAM 和控制寄存器的数值。

  当使用中断将 CPU 唤醒后,程序会产生分支:如果状态寄存器 P 中的中断屏蔽位( I )为 1 ,主程序会继续执行“进入 STOP 语句”的下一句指令,继续执行。但是如果( I )为 0 ,主程序便会跳转到中断服务子程序去执行,执行完后会返回到“进入 STOP 语句”的下一句指令,继续执行。

图 8 . 9 STOP 模式操作流程图

  •  进入 HALT 模式

  在进入 HALT 模式前必须清除所有的中断请求标志( P_INT_Flag0, P_INT_Flag1, P_INT_Flag2 ),和使能相应的外部中断作为唤醒源。然后执行进入 HALT 模式指令,即连续两次写 # A5h 到 低功耗控制寄存器 P_Mode_Ctrl ,由于系统可能会受到外界干扰等情况,所以为了增加程序的可靠性,可以插入多于 2 条的 NOP 指令。

  •  唤醒 HALT 模式

  所有的中断都可以作为 HALT 模式的唤醒源,例如:外部中断、定时 / 计数器溢出中断、看门狗中断、 ADC 中断、捕获中断、 SPI 中断和 UART 通讯中断等。同样外部复位也可以使系统从 HALT 模式“唤醒”,使系统复位;外部复位唤醒将初始化控制寄存器为默认值但并不改变 RAM 的值;通过外部中断则二者的值都不会改变。

  当使用中断将 CPU 唤醒后,程序会产生分支:如果状态寄存器 P 中的中断屏蔽位( I )为 1 ,主程序会继续执行“进入 HALT 语句”的下一句指令,继续执行。但是如果( I )为 0 ,主程序便会跳转到中断服务子程序去执行,执行完后会返回到“进入 HALT 语句”的下一句指令,继续执行。

图 8 . 10 HALT 模式操作流程图

【例 8 - 2 】 设置进入 STOP 模式,并使能 INT0 作为唤醒源。

  lda  #00000000B
   
  sta  P_IOB_Data
   
  sta  P_IOB_Attrib
   
  lda  #11101111B    ; 设置 PB4 为下拉输入,作为 INT0 唤醒输入
   
  sta  P_IOB_Dir
   
  lda  #00000010B    ; 设置 INT0 为上升沿触发,其余为下降沿触发
   
  sta  P_IRQ_Opt1
   
  sta  P_IRQ_Opt1
   
  lda  #FFh
   
  sta  P_INT_Flag0    ; 清中断请求标志
   
  lda  #00000001B    ; 使能 IRQ0 INT (INT0) 作为唤醒源
   
  sta  P_INT_Ctrl0
   
  cli           ; 打开全部中断
   
  lda  #5Ah       ; 进入 STOP 模式
   
  sta  P_MODE_Ctrl
   
  sta  P_MODE_Ctrl
   
  nop          ; 添加两条 NOP 指令
 
  nop
 
  lda #00h

8.4 看门狗定时器

8.4.1 看门狗定时器结构

  看门狗定时器用来产生定时信号,从而判断系统是否运行正常,其时钟源来自片内 RC 振荡电路,振荡频率典型值为 25kHz 。看门狗定时器的中断频率可以通过软件设置改变(看门狗定时器控制寄存器 P_WDT_Ctrl 设置),当其连续中断 8 次,便会溢出产生看门狗复位信号,复位 CPU 。其结构图请参考 图 8.11 。

图 8 . 11 看门狗定时器结构图

8.4.2 看门狗定时器控制寄存器

  看门狗定时器的相关设置是通过写看门狗定时器控制寄存器 P_WDT_Ctrl ( $32 )实现的,其默认初值为 #F0h ;看门狗定时器控制寄存器的功能请参考 表 8.7 。

表 8 . 7 看门狗定时器控制寄存器( $32,R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

SCKEN

WDS2

WDS1

WDS0

-

-

-

-

R/W

R/W

R/W

R/W

-

-

-

-

 Bit [7]  SCKEN : STOP 模式下看门狗定时器(即慢速的 25KHz 振荡器)使能位
 
          0 = STOP 模式下禁止看门狗定时器
         
          1 = STOP 模式下使能看门狗定时器
       
  Bit [6:4] WDS [2:0]: 看门狗中断时钟选择位
      
          000 = fslow/128
         
          001 = fslow/256
         
          010 = fslow/512
         
          011 = fslow/1024
         
          100 = fslow/2048
         
          101 = fslow/4096
         
          110 = fslow/8192
         
          111 = fslow/16384
 
  f slow :片内 RC 振荡频率 典型值为 25kHz 。
 
  注:寄存器 P_WDT_Ctrl 进行设置时需要连续写两次才能将值有效写入。

  程序正常运行时,需要在规定的时间内清狗,具体操作为向清狗寄存器 P_WDT_Clr ( $10 )中写入 #55h 。

表 8 . 8 清狗寄存器 P_WDT_Clr ( $10,R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

-

-

-

-

-

-

-

-

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

  Bit [7:0] WDT_CLR[7:0] : 清狗指令
  
        写操作:
       
          #55h 到清狗计数器进行清狗操作
       
        读操作:
       
          始终为 #00h
  
总结:1 、用户可以通过寄存器 P_WDT_Ctrl ( $32h )设置合适的看门狗定时器中断频率;

   2 、在看门狗功能使能的情况下,要在特定的时间间隔内写 #55h 到寄存器 P_WDT_Clr ( $10 )进行清狗操作。

8.4.3 看门狗中断

  使能看门狗中断的设置步骤如下:

  •  使能看门狗中断;

  •  用“ SEI ”指令关闭中断 ;

  •  设置看门狗操作相关的寄存器,如 P_INT_Ctrl0 中的 WDT 使能位和 P_WDT_Ctrl 中的 WDT 周期;

  •  用“ CLI ”指令打开中断 ;

  •  等待中断产生 。

  【例 8 - 3 】 设置看门狗定时器

  lda  #F0h      ; 设置看门狗中断为 25KHz/16384= 1.5Hz
   
  sta  P_WDT_Ctrl
   
  sta  P_WDT_Ctrl
   
  lda  #FFh
   
  sta  P_INT_Flag0  ; 清看门狗复位标志
   
  set  P_INT_Ctrl0,6 ; 使能看门狗中断
   
  cli         ; 打开总中断

8.5 时基与蜂鸣器输出

8.5.1 时基

  SPMC65 系列单片机提供了一个 8 位时基定时器,用来产生时间基准信号(简称时基信号),即产生一所选定频率的时基中断信号;时基信号的周期从 16us ~ 1s 共 15 种可选,通过设置时基 / 蜂鸣器控制寄存器 P_BUZ_Ctrl ( $2D )的 Bit [7:4] 位 ( 即 INTIMS [3:0]) 选择,以提供系统控制中需要的时钟信号。

8.5.2 蜂鸣器

  SPMC65 系列单片机支持蜂鸣器驱动输出。通过输出频率可调、占空比为 50 %的方波来驱动蜂鸣器,频率在 1KHz ( 976Hz )到 2MHz 之间可选,通过设置时基 / 蜂鸣器控制寄存器 P_BUZ_Ctrl ( $2D )的 Bit [3:0] 位(即 BZFS [3:0] )进行选择。

8.5.3 时基和蜂鸣器输出控制寄存器 P_BUZ_Ctrl( $2D )

  时基和蜂鸣器输出控制寄存器 P_BUZ_Ctrl ( $2D )用来选择时基时钟和蜂鸣器驱动输出的频率。其默认初始值为 #00h ,具体功能请参考 表 8.9 。

表 8 . 9 时基和蜂鸣器输出控制寄存器 P_BUZ_Ctrl ( $2D,R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

INTIMS3

INTIMS2

INTIMS1

INTIMS0

BZFS3

BZFS2

BZFS1

BZFS0

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Bit [7:4] INTIMS[3:0] : 时基时钟选择位

     0000 = 时基功能禁止
     
      0001 = FSYS /2^7
     
      0010 = FSYS /2^8
     
      0011 = FSYS /2^9
     
      0100 = FSYS /2^10
     
      0001 = FSYS /2^11
     
      0110 = FSYS /2^12
     
      0111 = FSYS /2^13
     
      1000 = FSYS /2^14
     
      1001 = FSYS /2^15
     
      1010 = FSYS /2^16
     
      1011 = FSYS /2^17
     
      1100 = FSYS /2^18
     
      1101 = FSYS /2^19
     
      1110 = FSYS /2^21
     
      1111 = FSYS /2^23

Bit [3:0] BZFS[3:0] : 蜂鸣器时钟频率选择位

      0000 = 蜂鸣器输出功能禁止
      
       0001 = FSYS /2^6
      
       0010 = FSYS /2^7
      
       0011 = FSYS /2^8
      
       0100 = FSYS /2^9
      
       0101 = FSYS /2^10
      
       0110 = FSYS /2^11
      
       0111 = FSYS /2^12
      
       1000 = FSYS /2^13
      
       1001 = FSYS /2^2
      
       1010 = FSYS /2^3
      
       1011 = FSYS /2^4
      
       1100 = FSYS /2^5
      
       1101 = FSYS /2^5
      
       1110 = FSYS /2^5
      
       1111 = FSYS /2^5

【例 8 - 4 】 利用时基定时器产生 512 us 为周期的中断 (FSYS = 8MHz) 。

  lda  #60h     ; 设置时基频率为 512us
   
  sta  P_BUZ_Ctrl
   
  lda  #20h
   
  sta  P_INT_Ctrl2  ; 使能时基定时器中断
   
  cli         ; 使能中断

【例 8 - 5 】 利用蜂鸣器输出 128 u s ,占空比为 50 %的信号 (FSYS = 8MHz) 。

 lda  #05h      ; 设置蜂鸣器输出频率为 128 us

 sta  P_BUZ_Ctrl

版权所有:北京凌阳爱普科技有限公司 京ICP备05061966号 未经许可网站内容严禁复制、转载,任何人不得擅自使用
友情链接:凌阳爱普 嵌入式培训 安卓培训 凌阳大学计划 北京嵌入式培训 深圳嵌入式培训 成都嵌入式培训