📄 stm8+
字号:
#include "STM8S105S4.H"
#include "STM8_include.H"
unsigned char ceshi_CLK;//用于测试中断是发生在哪个
/*
中断
CSSD :HSE失效使能
SWIF :切换时钟使用
*/
void init_system_clock(void)
{
CLK_SWCR =0x06;
/*CLK_SWCR =00000110;
BIT3 0:有时钟切换事件发生中断标志位,软件写0清除中断标志
BIT2 1:时钟切换中断使能
BIT1 1:使能时钟切换
BIT 0: 切换时钟未进行
*/
CLK_SWR = 0XB4;//HSE作为主时钟源
CLK_ICKR=0x07;
/*CLK_ICKR=00000111;
BIT5 0:活跃停机模式主电压调节器开
BIT4 只读位
BIT3 1:LSI使能
BIT2 1:从停机或者活跃停机模式快速唤醒使能
BIT1 只读位
BIT0 1:内部高速RC开,CCS被激活作为备用震荡器
*/
CLK_ECKR=0x01;
/*CLK_ECKR
BIT1 只读位,判断HSE是否准备就绪
BIT0 1:HSE开
*/
/*CLK_CMSR 只读寄存器*/
CLK_CKDIVR=0x00;
/*
BIT[4:3] 00:高速内部时钟预分频器为1
BIT[2:0] 000:CPU预分频因子为1
*/
CLK_PCKENR1=0XFF;
/*
BIT7 TIM1
BIT6 TIM3
BIT5 TIM2
BIT4 TIM4
BIT3 UART2/3
BIT2 UART1 BIT1 SPI
BIT0 I2C
*/
CLK_PCKENR1=0XFF;
/*
BIT7 CAN
BIT6 X
BIT5 X
BIT4 X
BIT3 ADC
BIT2 AWU BIT1 X
BIT0 X
*/
CLK_CSSR=0x05;
/*CLK_CSSR=00000101;
BIT3 0:为HSE失效中断标志位
BIT2 1:时钟安全系统检测中断使能
BIT1 只读位,读取是否辅助振荡器开
BIT0 1:时钟安全系统开
*/
CLK_CCOR=0x1E;
/*CLK_CCOR=00011110;
BIT6 只读位
BIT5 只读位
BIT[4:1] 1111输出CPU时钟
BIT0 0:禁止CCO输出
*/
ITC_SPR1 &= 0XCF;//优先级2级
}
@far @interrupt void System_Clock_IRQ (void)
{
if((CLK_SWCR & 0x08) == 0x08)//如果切换时钟发生
{
CLK_SWCR &= 0x05;//清除SWIF标志位,并且禁止切换时钟
//CLK_ICKR &= 0XFE;
//清除ICKR第0位,关闭HSI,减小功耗(不知道关闭HSI会不会影响时钟安全系统CCS)
ceshi_CLK=1;
}
if((CLK_CSSR & 0x08) == 0x08)//如果HSE失效,使用HSI 16M
{
CLK_CSSR =0x05;//清除HSE失效标志位
CLK_CKDIVR = 0X00;
/*
BIT[4:3] 00:高速内部时钟预分频器为1
BIT[2:0] 000:CPU预分频因子为1
*/
ceshi_CLK=2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -