历史上的今天
今天是:2024年10月12日(星期六)
2021年10月12日 | STM8与汇编语言(13)--修改CPU的时钟
2021-10-12 来源:eefocus
在有些单片机的应用系统中,并不需要CPU运行在多高的频率。在低频率下运行,芯片的功耗会大大下降。因此希望单片机能提供这个功能,STM8单片机确实有这个功能,并且修改也非常方便。
下面的实验程序首先将CPU的运行时钟设置在8MHZ,然后快速闪烁LED指示灯。接着,通过修改主时钟的分频系数和CPU时钟的分频系数,将CPU时钟频率设置在500KHZ,然后再慢速闪烁LED指示灯。通过观察LED指示灯的闪烁频率,可以看到,同样的循环代码,由于CPU时钟频率的改变,闪烁频率和时间长短都发生了变化。
同样还是利用ST的开发工具,生成一个汇编程序的框架,然后修改其中的main.asm,修改后的代码如下。
stm8/
#include "mapping.inc"
#include "STM8S207C_S.INC"
; 定义堆栈空间的起始位置和结束位置
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
segment 'rom' ; 下面开始定义一个段,该段位于ROM中
main.l ; 定义复位后的第一条指令的标号(即入口地址)
;
; 首先要初始化堆栈指针
LDW X,#stack_end
LDW SP,X
LD A,#08
LD PD_DDR,A ; 将PD3设置成输出
LD A,#08
LD PD_CR1,A ; 将PD3设置成推挽输出
LD A,#00
LD PD_CR2,A
LD A,#$E1
LD CLK_SWR,A ;选择芯片内部的16MHZ的RC振荡器
;为主时钟
MAIN_LOOP.L
;下面设置CPU时钟分频器,使得CPU时钟=主时钟
;通过发光二极管,可以看出,程序运行的速度确实明显提高了
LD A,#$08
LD CLK_CKDIVR,A ; 主时钟 = 16MHZ / 2
; CPU时钟 = 主时钟 = 8MHZ
LD A,#10 ; LED高速闪10次
HIGH_SPEED.L
PUSH A ; 保存寄存器
LD A,#08
LD PD_ODR,A ; 将PD3的输出设置成1
LD A,#100
CALL DELAY_MS ; 延时100MS
LD A,#00 ;
LD PD_ODR,A ; 将PD3的输出设置成0
LD A,#100
CALL DELAY_MS ; 延时100MS
POP A ; 恢复寄存器
DEC A
JRNE HIGH_SPEED
;下面设置CPU时钟分频器,使得CPU时钟=主时钟/4
;通过发光二极管,可以看出,程序运行的速度确实明显下降了
LD A,#$1A ;
LD CLK_CKDIVR,A ; 主时钟 = 16MHZ / 8
; CPU时钟 = 主时钟 / 4 = 500KHZ
LD A,#10 ; LED低速闪10次
LOW_SPEED.L
PUSH A ; 保存寄存器
LD A,#08
LD PD_ODR,A ; 将PD3的输出设置成1
LD A,#100
CALL DELAY_MS ; 延时100MS
LD A,#00
LD PD_ODR,A ; 将PD3的输出设置成0
LD A,#100
CALL DELAY_MS ; 延时100MS
POP A ; 恢复寄存器
DEC A
JRNE LOW_SPEED
JRA MAIN_LOOP
; 函数功能:延时
; 输入参数:寄存器A -- 要延时的毫秒数,这里假设CPU的主频为2MHZ
; 输出参数:无
; 返 回 值:无
; 备 注:无
DELAY_MS.L
PUSH A ; 将入口参数保存到堆栈中
史海拾趣
|
生动形象的教学用电子钟[ZT] 笔者在教学中,设计了一套教学实验用“电子钟”电路。此线路包括七段数码显示器BS205和循环彩灯电路,实验显示生动有趣,各部分原理简单,适宜学生直接观察“编码器”、“译码器”、“寄存器”、“计数器”等逻辑 ...… 查看全部问答> |
|
关于TQ2440触摸屏的应用设计。现在能够实现触摸屏界面的旋转,想添加一些其它的应用功能,请问能不能把显示界面缩小,即原来3.5寸屏的界面,显示为1.75寸的区域,这种功能能够实现吗?如果实现需要涉及那些方面?… 查看全部问答> |
|
我在flash上烧写的镜像文件为 NK.BIN, 我在注册表中添加如下: ; Bind BINFS to the block driver [HKEY_LOCAL_MACHINE\\System\\StorageManager\\Profiles\\FlashDrv] \"DefaultFileSystem\"=\"BINFS\" \"Partition ...… 查看全部问答> |
|
我用的是keil. 遇到到 PA4, PA5 , PA6,PA7 等无法设置输出状态. 在keil的调试状态就感觉无**常设置.而引脚设置跟附近的一样,看起来没错. 但无**常设置.其他的比如PC5~PC7等就没有问题. 初始化的语句:应该没有问题. GPIO_Ini ...… 查看全部问答> |
|
下载 (108.1 KB) 2011-1-19 15:42 我现在在做微功耗,用的是待机模式,我在看微功耗的待机模式的启动项中,有个启动方式是IWDG,但是这中启动方式我没有办法跟踪,我在手册中看到可以检测复位标记来判断是什么方式复位 ...… 查看全部问答> |
|
#include<msp430x44x.h> interrupt[TIMERA0_VECTOR] void Timer_A(void) { ~~~ } void InitSystem(void) { ~~~ //TIME_A TACTL=ID1+TASSEL1+TACLR+ ...… 查看全部问答> |
|
有没有3v可用的数码管驱动芯片?或者怎么用电池给5v的74门供电? 想做个数字钟,但是找不到3v可用的数码管驱动芯片,找到了淘宝上也没卖的。 另外就是考虑怎么给3v/5v元件混合电路用AA电池供电……… 查看全部问答> |




