HSI16时钟信号由内部16MHz的RC振荡器产生。
HSI16的RC振荡器具有以低成本(无外部组件)提供时钟源的优点。它的启动时间也比HSE晶体振荡器快,但即使经过校准,频率也不如外部晶体振荡器或陶瓷谐振器准确。
从停止模式(停止0、停止1、停止2)唤醒后,可以选择HSI16时钟作为系统时钟。如果HSE晶体振荡器发生故障,它也可以用作备用时钟源。
由于制造工艺的变化,HSI16的RC振荡器的频率可能因芯片而异,所以每个器件在25°C时都由ST进行工厂校准,精度为1%。
复位后,出厂校准值加载到内部时钟源校准寄存器(RCC_ICSCR)的HSICAL[7:0]位中。
如果应用系统受到电压或温度变化的影响,这可能会影响HSI16的RC振荡器的频率。可以使用内部时钟源校准寄存器(RCC_ICSCR)中的HSITRIM[6:0]位来调整应用中的HSI16频率。
时钟控制寄存器(RCC_CR)中的(HSIRDY=1)位用来指示HSI16已经稳定运行。HSI16启动时,在硬件将(HSIRDY)位置1前,HSI16的时钟信号不会输出。
利用时钟控制寄存器(RCC_CR)中的(HSION)位打开和关闭HSI16的RC振荡器。
以下是实现启动HSI16的代码:
#define RCC ((uint32_t)0x40021000)
#define RCC_CR (*(volatile uint32_t *)(uint32_t)(RCC+0x00))
#define RCC_CR_HSIRDY BIT(10)
#define RCC_CR_HSION BIT(8)
// 使能HSI16(16MHz)
RCC_CR |= RCC_CR_HSION;
// 检测HSI16状态,等待HSI16稳定
unsigned int i;
for(i=0; i<1000; i++)
{
if (RCC_CR & RCC_CR_HSIRDY) break;
delay();
}