打印
[STM8]

用外部时钟

[复制链接]
1103|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenjunt|  楼主 | 2017-5-31 23:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

最近在学习风驰大大的STM8开发板,外部时钟只有配置成24MHz的,请问下如果用外部时钟8MHz,该如何配置
沙发
supernan| | 2017-5-31 23:44 | 只看该作者

更换晶振为8M的,或者将时钟切换到HSI,再选择HISDIV为二分频

使用特权

评论回复
板凳
chenjunt|  楼主 | 2017-5-31 23:47 | 只看该作者

#include "sysclock.h"
static void HSE_ClockStartUpConfiguration(HSE_Clock_TypeDef HSE_Clock,HSE_ClockStartUpTime_TypeDef HSE_ClockStartUpTime);
/* 自定义新类型 */

/* 自定义宏 */
#define DEBUG
/*******************************************************************************
* 名称: HSE_ClockStartUpConfiguration
* 功能: 时钟的选择,可以实现外部的时钟切换
* 形参: HSE_Clock 外部时钟类型的选择
         HSE_ClockStartUpTime 外部时钟起振稳定时间
* 返回: 无
* 说明: 如果外部时钟是大于16MHzflash需要插入一个等待周期
         小于或者等于16MHz则不需要
         这些设置写进flash,运行一次即可,在调试的时候运行即可
               
******************************************************************************/
static void HSE_ClockStartUpConfiguration(HSE_Clock_TypeDef HSE_Clock,HSE_ClockStartUpTime_TypeDef HSE_ClockStartUpTime)
{
  FLASH_Unlock(FLASH_MEMTYPE_DATA);/*要对选项字节写操作,必须要先解锁FLASH*/
  while(!(FLASH->IAPSR & FLASH_IAPSR_DUL));/*等待解锁完毕*/
/*如果外部时钟是大于16MHz或者小于等于24MHz,flash需要插入一个等待周期,小于或者等于16MHz则不需要*/
  if(HSE_Clock==HSE_24MHz)   
  FLASH_ProgramOptionByte(FLASH_WAIT_STATES_ADDRESS,HSE_Clock);
  FLASH_ProgramOptionByte(HSE_CLOCK_STARTUP_ADDRESS,HSE_ClockStartUpTime);
  /*外部时钟启动稳定周期*/
  FLASH_Lock(FLASH_MEMTYPE_DATA);/*操作完要加锁*/
   
}
/*******************************************************************************
* 名称: DefaultSystemClockForHSI
* 功能: 恢复默认HSI功能的设置
* 形参: 无     
* 返回: 无
* 说明: 这些设置写进flash,运行一次即可,在调试的时候运行即可
******************************************************************************/
void DefaultSystemClockForHSI(void)
{
  FLASH_Unlock(FLASH_MEMTYPE_DATA);/*要对选项字节写操作,必须要先解锁FLASH*/
  while(!(FLASH->IAPSR & FLASH_IAPSR_DUL));/*等待解锁完毕*/
  FLASH_EraseOptionByte(FLASH_WAIT_STATES_ADDRESS);/*恢复HSI时钟*/
  FLASH_EraseOptionByte(HSE_CLOCK_STARTUP_ADDRESS);
  FLASH_Lock(FLASH_MEMTYPE_DATA);/*操作完要加锁*/
}


/*******************************************************************************
* 名称: Sysclock_Init
* 功能: 设置系统时钟频率
* 形参: 无
* 返回: 无
* 说明: 时钟选择
         如果选择外部24MHz主时钟的,外部不是24M的话
         把#define HSE_24M  HSE_VALUE注释掉即可,
         如果不需要切换到外部时钟,把#define __HSE_VALUE  HSE_VALUE
         注释掉即可
******************************************************************************/
void SystemClock_Init(SystemClock_TypeDef sysclk)
{

   if(sysclk==HSE_Clock)/*选用外部时钟*/
   {
     #ifdef DEBUG
     HSE_ClockStartUpConfiguration(HSE_24MHz,HSECNT_8CLK);
     #endif
     while (!CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE,\
            CLK_CURRENTCLOCKSTATE_DISABLE));
     /*切换到外部时钟,并等待时钟却换成功*/
   }
   else
   {
     #ifdef DEBUG
     DefaultSystemClockForHSI();
     #endif
     CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
   }

}

使用特权

评论回复
地板
xxrs| | 2017-5-31 23:47 | 只看该作者
什么意思程序?

使用特权

评论回复
5
chenjunt|  楼主 | 2017-5-31 23:48 | 只看该作者

如何修改

使用特权

评论回复
6
houcs| | 2017-5-31 23:49 | 只看该作者

void main()
{
        CLK->ECKR = 0x01;   //enable external crystal
        CLK->SWCR = 0x02;  //switch change enable
        CLK->SWR = 0xB4;   //set external crystal
        while((CLK->SWCR & 0x08)==0); //wait change finished
        CLK->SWCR = 0xFD;

        //CLK_CKDIVR= 1;        //2,4,8,16,...24MHz 不能分频为8MHz
        //直接使用外部8MHz晶体

        while(1)
        {
                ;
        }
}

使用特权

评论回复
7
liuzaiy| | 2017-5-31 23:49 | 只看该作者

楼主最好看下STM8的相关寄存器,就知道时钟怎么设置了;

使用特权

评论回复
8
yinxiangh| | 2017-5-31 23:50 | 只看该作者

在程序中定义HSE为8000000

使用特权

评论回复
9
yinxiangh| | 2017-5-31 23:51 | 只看该作者

将时钟切换到HSI,再选择HISDIV为二分频

使用特权

评论回复
10
pangb| | 2017-5-31 23:51 | 只看该作者

设置一下,有一个hse定义成8M就行了

使用特权

评论回复
11
chenjunt|  楼主 | 2017-5-31 23:52 | 只看该作者
其实还是不大明白,我再琢磨琢磨吧,多谢了哈,结贴了先

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

718

主题

7868

帖子

5

粉丝