404网站怎么做,中山皇冠建设开发有限公司网站,订制网站,天空台108网站找手工活带回家做今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置#xff0c;文章提供原理#xff0c;代码#xff0c;测试工程下载。
目录
时钟树与时钟系统#xff1a;
滴答计时器#xff1a;
定时器计时中断#xff1a;
测试结果#xff1a;
测…今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置文章提供原理代码测试工程下载。
目录
时钟树与时钟系统
滴答计时器
定时器计时中断
测试结果
测试工程下载 时钟树与时钟系统 该系统介绍在 STM32F10x-中文参考手册 P56页开始 微控制器的时钟系统包括以下几个主要的时钟源
1. HSEHigh-Speed External 外部高速晶振可接入外部晶振作为系统时钟源。 2. HSIHigh-Speed Internal 内部高速振荡器提供内部时钟源。 3. PLLPhase Locked Loop 锁相环可以通过将外部时钟源或内部时钟源倍频得到更高的系统时钟频率。
时钟系统的配置和选择可以通过对系统寄存器 RCCReset and Clock Control的相应位进行配置。根据配置的不同时钟系统可分为以下几个模式
1. HSI模式使用HSI作为系统时钟源。 2. HSE模式使用HSE作为系统时钟源。 3. PLL模式通过PLL倍频方式产生高频时钟。 1、单片机内部的RC振荡器是8Mhz 2、通过单片机引脚(OSC_IN OSC_OUT)接外部的晶振这里就对外部的晶振有要求了要求外部晶振输入频率范围是4Mhz~32Mhz 3、是通过单片机引脚接外部的低速32.768Khz晶振这个是单独的给内部的实时时钟模块(RTC)使用 4、是内部的低速RC振荡器40K可以给RTC用也可以给IWDG看门狗模块用 5、是时钟信号从MCO这个引脚上输出这个输出可以作为测试看看内部的时钟配置是否正确也可以用作和其他硬件进行时钟同步用 如上5种不同类型的时钟供给不同的需求内置的RC振荡器受到温度影响会大一些 这几个外部时钟晶振接口根据需求使用也可选择不用空着或者接其他电路也可以 时钟信号进来还要操作一些相关寄存器 分频/倍频后才成为系统时钟SYSCLK、HSI时钟、HSE时钟等等之类的应用于单片机各个模块(比如定时器、ADC、USART、APB perpherials、I2C… ) 滴答计时器
#include SysTick.hstatic u8 fac_us0; //us延时倍乘数
static u16 fac_ms0; //ms延时倍乘数//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void SysTick_Init(u8 SYSCLK)
{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_usSYSCLK/8; fac_ms(u16)fac_us*1000;
} //延时nus
//nus为要延时的us数.
void delay_us(u32 nus)
{ u32 temp; SysTick-LOADnus*fac_us; //时间加载 SysTick-VAL0x00; //清空计数器SysTick-CTRL|SysTick_CTRL_ENABLE_Msk ; //开始倒数 do{tempSysTick-CTRL;}while((temp0x01)!(temp(116))); //等待时间到达 SysTick-CTRL~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick-VAL 0X00; //清空计数器
}//延时nms
//注意nms的范围
//SysTick-LOAD为24位寄存器,所以,最大延时为:
//nms0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms1864
void delay_ms(u16 nms)
{ u32 temp; SysTick-LOAD(u32)nms*fac_ms; //时间加载(SysTick-LOAD为24bit)SysTick-VAL 0x00; //清空计数器SysTick-CTRL|SysTick_CTRL_ENABLE_Msk ; //开始倒数 do{tempSysTick-CTRL;}while((temp0x01)!(temp(116))); //等待时间到达 SysTick-CTRL~SysTick_CTRL_ENABLE_Msk; //关闭计数器SysTick-VAL 0X00; //清空计数器
} 定时器计时中断
查表可知TIM2/3/4是适合作通用定时器的 此处我以初始化定时器4为通用定时器举例 计数器溢出频率 CK CNT_OV CK CNT / (ARR1) CK PSC / (PSC 1) / (ARR 1) 这里的计数器溢出频率单位是赫兹计数器溢出频率的倒数就是定时器触发的时间周期一般我们计算用的是下面一个等于号的式子这里的符号表示如下 CK_PSC 一般为72Mhz72 00 000 ARR 自动重装 对应变量TIM_Period 范围0~65535 PSC 分频 对应变量 TIM_Prescaler 范围0~65535 1. 定时器时钟分频TIMx_PSC 是用来将系统时钟通常为主频分频为定时器的时钟频率。例如如果系统时钟为72MHz定时器时钟分频设置为72-1则定时器时钟频率为1MHz。定时器时钟分频越大定时器的时钟频率越低。 2. 预分频TIMx_ARR 是用来设置定时器溢出时间自动重装载寄存器值的参数。当定时器计数器达到预分频值时定时器将溢出并产生中断或其他相关事件。预分频的值决定了定时器溢出时间的长度。例如如果预分频值为1000定时器时钟频率为1MHz则定时器溢出时间为1ms。 以下为初始化定时器 2 作定时中断周期为1ms 每次进入定时中断都会通过串口1 打印一次进入中断的总次数T #include TIMER_init.h//初始化定时器2用作计时中断定时器
void Timer2_Init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);TIM_InternalClockConfig(TIM2);//选择哪个中断就写哪个TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; //修改分频对实际情况影响不大可以不修改,这里是不分频可选1~72TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; //向上对齐模式同时还有向下对齐中央对齐模式TIM_TimeBaseInitStructure.TIM_Period 10000 - 1; //计数器周期。该参数决定了计数器计数溢出前的最大值。TIM_TimeBaseInitStructure.TIM_Prescaler 7200 - 1; //分频器预分频系数。该参数决定了计数器时钟频率的变化程度。TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; //高级计数器需要不需要用到的直接给0就好TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update); //用于解决一复位时就先进一次中断的情况TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; //抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; //响应优先级NVIC_Init(NVIC_InitStructure);TIM_Cmd(TIM2, ENABLE);}定时中断服务函数
#include TIMER_init.huint16_t T;void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) SET){printf(T%d,T);T;TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清出中断寄存器标志位用于退出中断}
}测试结果 测试工程下载https://download.csdn.net/download/qq_64257614/88202750?spm1001.2014.3001.5503