历史上的今天
返回首页

历史上的今天

今天是: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              ; 将入口参数保存到堆栈中

推荐阅读

史海拾趣

GAIA Converter Inc公司的发展小趣事

锋鸣电子(北京分公司)在成立初期便意识到供应链管理的重要性。公司通过与上游原材料供应商建立长期稳定的合作关系,确保原材料的稳定供应和成本控制。同时,公司还加强了对下游客户的沟通与服务,根据客户需求定制化生产,提升客户满意度。通过高效的供应链整合,锋鸣电子在激烈的市场竞争中保持了良好的竞争力,实现了业务的稳步增长。

Gruner AG公司的发展小趣事
通过给LED施加适当的电压和电流,观察其发光情况是否正常。
Flamar公司的发展小趣事

随着电子行业的全球化趋势日益明显,Flamar公司积极实施国际化战略,通过设立海外研发中心、生产基地和销售网络,不断拓展全球市场。公司先后在欧洲、亚洲等地建立分支机构,与当地企业建立紧密的合作关系,共同推动电子技术的创新与应用。通过国际市场的开拓,Flamar公司不仅实现了业务规模的快速增长,还进一步提升了品牌的国际知名度和影响力。

鞍山圣罗佳(ASL)公司的发展小趣事

面对电子行业供应链日益复杂的挑战,Flamar公司高度重视供应链管理和优化工作。公司通过引入先进的供应链管理系统,实现了对原材料采购、生产制造、物流配送等各个环节的精准控制。同时,公司还积极与上下游企业建立长期稳定的合作关系,共同构建高效的供应链生态体系。这些措施有效降低了公司的运营成本,提高了生产效率和产品质量,进一步增强了公司的市场竞争力。

Amidon Associates Inc公司的发展小趣事

在追求经济效益的同时,Flamar公司始终不忘履行企业社会责任。公司积极响应全球绿色可持续发展号召,将环保理念融入产品研发、生产和销售的各个环节。通过采用环保材料、优化生产工艺、推广节能产品等措施,Flamar公司有效降低了产品生命周期中的环境影响。此外,公司还积极参与公益事业和社会活动,为推动电子行业的绿色可持续发展贡献自己的力量。

ADPOW公司的发展小趣事

在市场竞争日益激烈的背景下,ADPOW公司深知品质是生存和发展的关键。因此,公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司注重品牌建设,通过广告宣传、参加展会等方式提升品牌知名度和美誉度。这些举措有效提升了公司的市场竞争力。

问答坊 | AI 解惑

生动形象的教学用电子钟[ZT]

生动形象的教学用电子钟[ZT] 笔者在教学中,设计了一套教学实验用“电子钟”电路。此线路包括七段数码显示器BS205和循环彩灯电路,实验显示生动有趣,各部分原理简单,适宜学生直接观察“编码器”、“译码器”、“寄存器”、“计数器”等逻辑 ...…

查看全部问答>

新手提问:如何同时安装C51 和 MDK

我现在安装了MDK3.22a,但是编译不了C51程序,还要安装什么呀…

查看全部问答>

TQ2440 触摸屏

关于TQ2440触摸屏的应用设计。现在能够实现触摸屏界面的旋转,想添加一些其它的应用功能,请问能不能把显示界面缩小,即原来3.5寸屏的界面,显示为1.75寸的区域,这种功能能够实现吗?如果实现需要涉及那些方面?…

查看全部问答>

wince,在flash中保存文件!

我在flash上烧写的镜像文件为 NK.BIN, 我在注册表中添加如下: ; Bind BINFS to the block driver [HKEY_LOCAL_MACHINE\\System\\StorageManager\\Profiles\\FlashDrv]     \"DefaultFileSystem\"=\"BINFS\"     \"Partition ...…

查看全部问答>

STM32GPIO不受控?

我用的是keil. 遇到到 PA4, PA5 , PA6,PA7 等无法设置输出状态. 在keil的调试状态就感觉无**常设置.而引脚设置跟附近的一样,看起来没错. 但无**常设置.其他的比如PC5~PC7等就没有问题. 初始化的语句:应该没有问题.    GPIO_Ini ...…

查看全部问答>

stm32低功耗管理复位问题,请教~~

下载 (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+ ...…

查看全部问答>

比较器

有那位高手可以推荐高速比较器的电路,急!!!!…

查看全部问答>

寻迹小车DIY

这是当年毕业设计参考的项目了,最近翻资料翻出来,抖出来晒晒太阳.... 那个觉得有用就拿去吧    …

查看全部问答>

有没有3v可用的数码管驱动芯片?或者怎么用电池给5v的74门供电?

想做个数字钟,但是找不到3v可用的数码管驱动芯片,找到了淘宝上也没卖的。 另外就是考虑怎么给3v/5v元件混合电路用AA电池供电………

查看全部问答>