(谢谢各位关注。这周出差了几天,现在更上。。。)
3.3.2 时钟配置实现
为使系统快速启动,复位后时钟控制器自动使用HSI的8分频(HSI/8)做为主时钟。其原因为HSI的稳定时间短,而8分频可保证系统在较差的VDD条件下安全启动。 一旦主时钟源稳定,用户程序可将主时钟切换到另外的时钟源。 与时钟配置相关的寄存器主要包括以下几种。 (1)内部时钟寄存器(CLK_ICKR) : 复位值:0x01 7 6 5 4 3 2 1 0 rw r rw rw r rw 表3-6 内部时钟寄存器位定义 | | | REGAH:活跃停机(Active Halt) 模式下电压调节器关闭 由软件置位或清除。为1时,一旦MCU进入活跃停机(Active Halt) 模式,主电压调节器将关闭,从而唤醒时间将比较长。 0:活跃停机(Active Halt) 模式下主电压调节器处于开 1:活跃停机(Active Halt) 模式下主电压调节器处于关 | | LSIRDY:低速内部振荡器准备就绪 由硬件置位或清除 0:LSI时钟未准备就绪 1:LSI时钟准备就绪 | | LSIEN:低速内部振荡器使能 由软件置位或清除。如果LSI为必需的,则硬件将该位置1,例如: - 当时钟源切换至LSI时(参见寄存器CLK_SWR) - 当LSI被指定为时钟输出源(CCO)时(参见寄存器CLK_CCOR) - 当BEEP被使能时(寄存器BEEP_CSR的位BEEPEN=1) - 当LSI测量被使能时(寄存器AWU_CSR的位MSR=1) 当LSI被指定为主时钟源/CCO时钟源/AWU/IWDG的时钟源时,该位不能被清除。 0:关闭低速内部振荡器 1:打开低速内部振荡器 | | FHWU:从停机(Halt)或活跃停机(Active Halt)模式快速唤醒 由软件置位或清除 0:从停机(Halt)或活跃停机(Active Halt)模式快速唤醒禁用 1:从停机(Halt)或活跃停机(Active Halt)模式快速唤醒使能 | | HSIRDY:高速内部振荡器准备就绪 由硬件置位或清除 0:HSI未准备就绪 1:HSI准备就绪 | | HSIEN:高速内部RC振荡器使能 由软件置位或清除。如果HSI为必需的,则硬件将该位置1,例如: - 当被CSS激活,做为安全备用振荡器 - 当时钟源切换至HSI(参见寄存器CLK_SWR) - 当HSI被指定为时钟输出源(CCO)时(参见寄存器CLK_CCOR) 当HSI被指定为主时钟源,或CCO时钟源,或安全备份(辅助)时钟源时,该位不能被清除。 0:高速内部RC关。 1:高速内部RC开。 |
(2)外部时钟寄存器(CLK_ECKR) 复位值:0x00 7 6 5 4 3 2 1 0 r rw 表3-7 外部时钟寄存器位定义 | | | HSERDY:高速外部晶体振荡器准备就绪 由硬件置位或清除。 0:HSE未准备就绪 1:HSE准备就绪 | | HSEEN:高速外部晶体振荡器使能 由软件置位或清除。用于打开或关闭外部晶体振荡器。下列情况下,由硬件将该位置1: -当时钟源切换至HSE(参见寄存器CLK_SWR) - 当HSE被指定为时钟输出源(CCO)时(参见寄存器CLK_CCOR) 当HSE被指定为主时钟源,或CCO时钟源时,该位不能被清除。 0:HSE关 1:HSE开 |
(3)主时钟状态寄存器(CLK_CMSR) 复位值:0xE1 7 6 5 4 3 2 1 0 r r r r r r r r 表3-8 主时钟状态寄存器位定义 | CKM[7:0]:主时钟状态位 由硬件置位或清除。用以指示当前所选的主时钟源。如果该寄存器中的值为无效值,则产生MCU复位 0xE1:HSI为主时钟源(复位值) 0xD2:LSI为主时钟源(仅当LSI_EN选项位为1时) 0xB4:HSE为主时钟源 |
(4)主时钟切换寄存器(CLK_SWR) 复位值:0xE1 7 6 5 4 3 2 1 0 rw rw rw rw rw rw rw rw 表3-9 主时钟切换寄存器位定义 | SWI[7:0]:主时钟选择位 由软件写入。用以选择主时钟源。当时钟切换正在进行(SWBSY=1)时,该寄存器的内容将被写保护。如果寄存器CLK_CSSR的位AUX=1,则该寄存器将被置位复位值(HSI)。如果选择了快速Halt唤醒模式(寄存器CLK_ICKR的位FHW=1),从停机(Halt)/ 活跃停机(Active Halt)唤醒时,该寄存器将被硬件设置为E1h(选择HSI) 0xE1:HSI为主时钟源(复位值) 0xD2:LSI为主时钟源(仅当LSI_EN选项位为1时) 0xB4:HSE为主时钟源 |
(5)切换控制寄存器(CLK_SWCR) 复位值:未定义 7 6 5 4 3 2 1 0 rc_w0 rw rw rw 表3-10 切换控制寄存器位定义 | | | SWIF:时钟切换中断标志位 由硬件置位或软件写0清除。该位的含义取决于SWEN位的状态。参见图15和图16。 手动切换模式下(SWEN=0): 0:目标时钟源未准备就绪 1:目标时钟源准备就绪 自动切换模式下(SWEN=0): 0:无时钟切换事件发生 1:有时钟切换事件发生 | | SWIEN:时钟切换中断使能 由软件置位或清除 0:时钟切换中断禁用 1:时钟切换中断使能 | | SWEN:切换启动/停止 由软件置位或清除。向该位写1将切换主时钟至寄存器CLK_SWR指定的时钟源。 0:禁止时钟切换的执行 1:使能时钟切换的执行 | | SWBSY:切换忙 由硬件置位或清除。可由软件清除以复位时钟切换过程。 0:无时钟切换在进行。 1:时钟切换正在进行。 |
(6)时钟分频寄存器(CLK_CKDIVR) 复位值:0x18 7 6 5 4 3 2 1 0 rw rw rw rw rw 表3-11 时钟分频寄存器位定义 | | | HSIDIV[1:0]:高速内部时钟预分频器 由软件写入,用于指定HSI分频因子。 00:fHSI = fHSI RC输出 01:fHSI = fHSI RC输出/2 10:fHSI = fHSI RC输出/4 11:fHSI = fHSI RC输出/8 | | CPUDIV[2:0]:CPU时钟预分频器 由软件写入,用于指定CPU时钟预分频因子。 000:fCPU = fMASTER 001:fCPU = fMASTER/2 010:fCPU = fMASTER/4 011:fCPU = fMASTER/8 100:fCPU = fMASTER/16 101:fCPU = fMASTER/32 110:fCPU = fMASTER/64 111:fCPU = fMASTER/128 |
更多时钟配置相关寄存器请详见STM8参考手册。 对STM8编程时,配置时钟可通过寄存器操作完成,也可通过固件库函数完成。 当时钟配置为HSI,并且选择1分频,即主时钟频率为16MHZ时。如果通过寄存器操作完成配置,参考语句如下: /* fCPU=fMASTER = 16MHz */ CLK->CKDIVR = 0x00; // HSIDIV[1:0]=0x00, CPUDIV[2:0]=0x00 如果使用库函数,参考语句如下: /* Select fCPU = 16MHz */ CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); 其中,CLK_PRESCALER_HSIDIV1变量及CLK_SYSCLKConfig函数均已在外设库固件库中定义好。 如CLK_PRESCALER_HSIDIV1的定义在STM8S_CLK.H文件的168行,语句为: CLK_PRESCALER_HSIDIV1 = (u8)0x00, /*!< High speed internal clock prescaler: 1 */ CLK_SYSCLKConfig函数的定义在STM8S_CLK.C文件的623行,定义为: void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef ClockPrescaler) { /* check the parameters */ assert_param(IS_CLK_PRESCALER_OK(ClockPrescaler)); if (((u8)ClockPrescaler & (u8)0x80) == 0x00) /* Bit7 = 0 means HSI divider */ { CLK->CKDIVR &= (u8)(~CLK_CKDIVR_HSIDIV); CLK->CKDIVR |= (u8)((u8)ClockPrescaler & (u8)CLK_CKDIVR_HSIDIV); } else /* Bit7 = 1 means CPU divider */ { CLK->CKDIVR &= (u8)(~CLK_CKDIVR_CPUDIV); CLK->CKDIVR |= (u8)((u8)ClockPrescaler & (u8)CLK_CKDIVR_CPUDIV); } } 不难看出,固件库函数已经完成了对寄存器的操作。在FLASH空间足够大时,使用固件库编程,可大大降低产品开发难度,缩短产品开发时间,提高产品开发效率。 |