一 程序简介: 该工程主要涉及到gpio和rcc,tim部分,工程实现的功能是系统时钟内部和外部的切换已验证系统时钟的的安全性,当外部时钟失效时 会自动切换到内部时钟运行 时钟特征: 1 强大的控制器,更容易得到高性能的同时保证功率最低 2 可独立管理的时钟源,都带有分频器 没有倍频 可以得到更高精度的时钟 3 可靠的无障碍时钟切换机制。程序运行中可以切换时钟源 4 抗干扰时钟配置寄存器,大部分时钟寄存器有一个互补寄存器,如果不匹配就会产生复位(系统自动完成) 时钟源: 1—24m外部晶振 外部时钟信号 最高24m //以上为HSE 16m高速内部rc振荡器 // HSI 128k低速振荡器 //LSI 言归正传 看我的程序: 程序的现象是下载运行后,四个led会按照tim中断的频率 循环依次点亮,此时如果破坏外部晶振,时钟源会自动切换到内部时钟,现象是led点亮间隔变大了。 二 程序配置: 1. Led----gpio void GPIO_Init(void) { LED1-3===PD0 PD1 PD3 PD_DDR |= 0x0D; /*8位寄存器DDR用来配置io口的输入输出模式,每一位对应相应名称的io口 这里我们配置 0, 1, 3位为输出 (1为输出,0为输入). 即 00001011==0D */ PD_CR1 |= 0x0D; /* CR1配置输入输出模式下的 功能,在输出模式下为 : 0 开漏输出 1 推免输出 */ PD_CR2 = 0x00; /* 输出最大速度到2MHz 1:配置为10m. */ } 请看stm8手册 gpio部分 Io配置的知识: 推挽输出与开漏输出的区别: >>推挽输出:可以输出高,低电平,连接数字器件。 输出 0 时,N-MOS 导通,P-MOS 高阻 ,输出0。 输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。 >>开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。 输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);此模式可以把端口作为双向IO使用。 2.LED--时钟配置: void CLK_Init(void) { /* Configure clock prescaler */ CLK_CKDIVR = 0x01; /*分频时钟源 */ /* To select external source by automtic switch */ CLK_SWCR |= 0x02; /* 使能转化 */ CLK_SWR = 0xB4; /* 时钟源选择 选择HSE*/ while (!(CLK_SWCR & 0x08)); /* 等待直到转换完成 */ if (CLK_CMSR != 0xB4) 检测是不是配置的时钟源 while(1); /*以上是配置时钟源 只是单单的选择时钟源 CLK_CSSR |= 0x01; 这句才是本历程的关键 使能时钟安全机制 因为它检测的只是外部时钟 所以才有上面配置时钟源的程序,因为默认情况下是HSI/8 注:MCU 一但使用了辅助时钟源 即使外部时钟正常也切换不回去了 直到下一次复位。 } 结合程序看下图 3.LED---tim Stm8拥有6个定时器 其中 Tim1 16高级定时器 Tim 2 3 5 16位通用定时器 Tim 4 6 8位基本定时器 本程序用的是tim4 8位的 void TIM_Init(void) { /* TIM4 Peripheral Configuration */ /* Time Base configuration */ TIM4_PSCR = 0x04; /* 分频值 =16. */ TIM4_ARR = 0xFF; /* 重载入值 */ /*TIM4 counter enable */ TIM4_CR1 |= 0x01; /* 开启tim4 */ TIM4_IER |= 0x01; /*开启计数更新中断. */ } Tim4 功能较少 配置相对简单 主要功能:8位向上计数自动重装 3位可编程预分频 中断 计数中断 Tim6还有输入信号同步和检测中断 功能。 |
为啥图片打不开 |