找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7498|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM8L時(shí)鐘切換詳解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140343 發(fā)表于 2016-10-10 00:58 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
SMT8L的四大時(shí)鐘源LSELSI,HSE,HSI,都可以作為系統(tǒng)時(shí)鐘。


系統(tǒng)上電后,HSI/8作為默認(rèn)系統(tǒng)時(shí)鐘,啟動(dòng)完成后,用戶可以切換系統(tǒng)時(shí)鐘源。
切換分為自動(dòng)切換和手動(dòng)切換,沒(méi)有太大的區(qū)別。
下面是自動(dòng)切換的流程圖,按照此流程圖,編寫(xiě)程序,即可實(shí)現(xiàn)時(shí)鐘切換。
只需要三步即可實(shí)現(xiàn)系統(tǒng)時(shí)鐘切換:
①置位CLK_SWCR寄存器中的SWEN位,允許時(shí)鐘切換
②向CLK_SWR中寫(xiě)數(shù)據(jù),選擇目標(biāo)時(shí)鐘源
③等待SWBSY清零,即等待時(shí)鐘切換完成


時(shí)鐘切換完成后,在主循環(huán)中翻轉(zhuǎn)IO電平,通過(guò)測(cè)量IO口的輸出頻率,可以直觀的看到切換時(shí)鐘,系統(tǒng)時(shí)鐘頻率發(fā)生了變化。
本程序選擇LSE32.768KHz)作為系統(tǒng)時(shí)鐘,時(shí)鐘切換完成后,PC7翻轉(zhuǎn)電平,使用邏輯分析可以測(cè)量到此時(shí)PC7的輸出頻率。如下圖:


可以看到PC7輸出頻率為2.73KHz,并不是32.768KHz。這是因?yàn)椋?/font>STM8L一個(gè)指令周期為二個(gè)時(shí)鐘周期,同時(shí)翻轉(zhuǎn)電平的程序,高電平時(shí)間需要3個(gè)指令周期,低電平時(shí)間同樣為3個(gè)指令周期。所以最終測(cè)量到的IO輸出頻率為32.768KHz/2/6=2.730667KHz。如果選擇的時(shí)鐘源為16M(HSI),則最終測(cè)得的IO輸出頻率為16M/2/6=1.33M。要注意,系統(tǒng)時(shí)鐘的分頻器默認(rèn)8分頻,需要清零分頻器,才滿足此計(jì)算方式。
#include"iostm8l152c6.h"
/****************************************************************************************
*開(kāi)發(fā)環(huán)境:IAR for stm8v6.5
*硬件平臺(tái):STM8L-DISCOVERY
*功能說(shuō)明:本程序選擇LSE32.768KHz)作為系統(tǒng)時(shí)鐘,時(shí)鐘切換完成后,PC7翻轉(zhuǎn)電平,使用邏輯分析可以測(cè)量到此時(shí)PC7的輸出頻率,最終測(cè)量到的IO輸出頻率為32.768KHz/2/6=2.730667KHz。
*    者:茗風(fēng)
****************************************************************************************/
/******************************************************************************************************
*      稱:voidGPIO_Init(void)
*      能:初始化PC7為高速推挽輸出
*  入口參數(shù):無(wú)
*  出口參數(shù):無(wú)
*  說(shuō)    明:測(cè)量系統(tǒng)時(shí)鐘頻率的IO,測(cè)量到的頻率是:目標(biāo)時(shí)鐘源/2/6
*      例:無(wú)
******************************************************************************************************/
void GPIO_Init(void)
{
  PC_CR1_C17  =1;//推挽輸出
  PC_CR2_C27  =1;//高速輸出
  PC_DDR_DDR7 =1;//PC4輸出
//  PC_ODR_ODR7 =0;//輸出低電平
}
/******************************************************************************************************
*      稱:voidCLOCK_Init(void)
*      能:系統(tǒng)時(shí)鐘切換為LSE,32.768KHz
*  入口參數(shù):無(wú)
*  出口參數(shù):無(wú)
*  說(shuō)    明:
*      例:無(wú)
******************************************************************************************************/
void CLOCK_Init(void)
{
  CLK_CKDIVR =0x00;//CLK_CKDIVR寄存器默認(rèn)0x03分頻值為8
//自動(dòng)切換
  CLK_SWCR_SWEN =1;//允許切換時(shí)鐘
  CLK_SWR =0x08;//寫(xiě)入一個(gè)八位的值,用于選擇目標(biāo)時(shí)鐘源
  while(CLK_SWCR_SWBSY);//等待時(shí)鐘切換完成
//手動(dòng)切換
//  CLK_SWR =0x08;//寫(xiě)入一個(gè)八位的值,用于選擇目標(biāo)時(shí)鐘源
//  while(!CLK_ECKR_LSERDY);//等待目標(biāo)時(shí)鐘源穩(wěn)定
//  CLK_SWCR_SWEN =1;//允許切換時(shí)鐘
  /*
*0x01HSI selected as system clock source
*0x02LSI selected as system clock source
*0x04HSE selected as system clock source
*0x08LSE selected as system clock source
  */
}
/******************************************************************************************************
*      稱:int main(void)
*      能:通過(guò)PC4輸出選擇的時(shí)鐘
*  入口參數(shù):無(wú)
*  出口參數(shù):無(wú)
*  說(shuō)    明:因?yàn)?/font>STM8l discovery沒(méi)有接外部高速晶振,所以沒(méi)辦法輸出HSE,不要
*      例:無(wú)
******************************************************************************************************/
void main( void )
{
GPIO_Init();
CLOCK_Init();
while(1)
  {
    PC_ODR_ODR7 ^=1;
  }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表