打印
[STM8]

如果用外部时钟8MHz

[复制链接]
1006|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tian111|  楼主 | 2016-1-27 20:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在学习风驰大大的STM8开发板,外部时钟只有配置成24MHz的,请问下如果用外部时钟8MHz,该如何配置
沙发
宋倩2010| | 2016-1-27 20:26 | 只看该作者
更换晶振为8M的,或者将时钟切换到HSI,再选择HISDIV为二分频

使用特权

评论回复
板凳
tian111|  楼主 | 2016-1-27 20:27 | 只看该作者
#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);
   }

}

使用特权

评论回复
地板
chenho| | 2016-1-27 20:27 | 只看该作者
什么意思程序?

使用特权

评论回复
5
tian111|  楼主 | 2016-1-27 20:28 | 只看该作者
如何修改

使用特权

评论回复
6
gongche| | 2016-1-27 20:34 | 只看该作者

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
huwr| | 2016-1-27 20:34 | 只看该作者
楼主最好看下STM8的相关寄存器,就知道时钟怎么设置了;

使用特权

评论回复
8
tian111|  楼主 | 2016-1-27 20:34 | 只看该作者
好的,我看下,晚安

使用特权

评论回复
9
ccw1986| | 2016-1-28 20:51 | 只看该作者
在程序中定义HSE为8000000

使用特权

评论回复
10
gejigeji521| | 2016-1-30 10:11 | 只看该作者
将时钟切换到HSI,再选择HISDIV为二分频

使用特权

评论回复
11
Thethree| | 2016-1-30 20:07 | 只看该作者
设置一下,有一个hse定义成8M就行了

使用特权

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

本版积分规则

797

主题

8878

帖子

7

粉丝