金色金融公司网站源码设计分公司加盟

当前位置: 首页 > news >正文

金色金融公司网站源码,设计分公司加盟,项目建设背景与必要性,中国品牌网站设计一、定时器的概念 定时器#xff08;TIM#xff09;#xff0c;可以对输入的时钟信号进行计数#xff0c;并在计数值达到设定值的时候触发中断。 STM32的定时器系统有一个最为重要的结构是时基单元#xff0c;它由一个16位计数器#xff0c;预分频器#xff0c;和自动重… 一、定时器的概念 定时器TIM可以对输入的时钟信号进行计数并在计数值达到设定值的时候触发中断。 STM32的定时器系统有一个最为重要的结构是时基单元它由一个16位计数器预分频器和自动重装寄存器构成。在时钟信号来临的时候首先会由预分频器对该信号进行分流使得一部分或者全部的信号进入计时器开始计数当计数值达到自动重装寄存器的值时由硬件触发中断将中断信号递交给NVIC最后进入CPU运行中断服务函数。在72MHz的时钟下最大可以实现59.65s的定时。当然如果你觉得这个时间不够长还可以利用STM32的定时器级联功能将一个定时器的中断信号作为第二个定时器的时钟输入这样定时时长可以呈现几何状的爆炸增长。 STM32的定时器不仅仅具有基本的定时中断功能还包含了内外时钟源选择、输入捕获用于测量输入信号的脉冲长度、输出比较用于产生输出波形如PWM脉冲宽度调制、编码器接口适用于读取正交编码器的位置信息、主从触发模式等多种功能。根据复杂度和应用场景上述功能被划分到了高级定时器、通用定时器、基本定时器三个类型的定时器中。 二、简单看看定时器电路图 1.基本定时器 这里面有一个影子寄存器方框下面有阴影的就是影子寄存器它有助于确保定时器的准确性和同步性。 预装载寄存器是程序员可以直接访问和修改的寄存器。影子寄存器是定时器内部实际使用的寄存器它的值由预装载寄存器在特定条件下更新而来影子寄存器的存在使得我们在修改一个定时器的自动重装寄存器的值来控制定时时长的时候不会立即生效而是在当前时钟中断已经完成到了更新事件/更新中断的节点才会被修改这样就保证了定时器的准确性和同步性。 2.通用定时器  在这里我们只需要着重关心上面框出来的部分即可下面的其他功能之后会有所涉猎 3.高级定时器 高级定时器是在通用定时器的基础上增加了框图部分大家可以先看看电路图也是在之后会讲到 三、定时器的基本结构 上面我们已经看到了各种定时器的基本电路图已经了解了其原理。下图是对上述的总结框图我们只需要按照这个图就可以配置好。 打开定时器的时钟 使用RCC_APB1PeriphClockCmd或RCC_APB2PeriphClockCmd函数打开相应的定时器资源。配置时钟源 将时钟资源设为内部时钟源或外部时钟源。配置时基单元 设置计数器模式向上、向下或中央对齐。配置预分频器PSC和自动重装载寄存器ARR。配置中断 清除定时器更新标志位。使能定时器的更新中断。配置NVIC中断分组 设置中断的优先级和使能中断线路。使能定时器 启动定时器开始运行。 四、示例代码 void TIM2_Init() {//打开RCC的定时器2时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//设置TIM2为内部时钟TIM_InternalClockConfig(TIM2);//配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;//向上计数TIM_TimeBaseInitStructure.TIM_Period (10000 - 1); // 自动重装载值TIM_TimeBaseInitStructure.TIM_Prescaler (7200 - 1); // 预分频值TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0;TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);//清除定时器标志位因为配置好上面的定时器后就被视作产生一次更新中断//然后标志位就被置1了如果不清除定时器就是从1开始定时TIM_ClearFlag(TIM2, TIM_FLAG_Update);//打开TIM2的中断输出控制TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//配置NVIC的分组和优先级NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;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);//打开计数器使能TIM2TIM_Cmd(TIM2, ENABLE); }//中断服务函数 void TIM2_IRQHandler(void) {//检测是否由TIM2产生的中断if(TIM_GetITStatus(TIM2, TIM_IT_Update) SET){//清除TIM2产生中断的标志位TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//处理过程number;} } 五、外部时钟代码 void Timer_Init(void) {/开启时钟/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/GPIO初始化/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure); //将PA0引脚初始化为上拉输入/外部时钟配置/TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);//选择外部时钟模式2时钟从TIM_ETR引脚输入//注意TIM2的ETR引脚固定为PA0无法随意更改//最后一个滤波器参数加到最大0x0F可滤除时钟信号抖动/时基单元初始化/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; //定义结构体变量TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; //时钟分频选择不分频此参数用于配置滤波器时钟不影响时基单元功能TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; //计数器模式选择向上计数TIM_TimeBaseInitStructure.TIM_Period 10 - 1; //计数周期即ARR的值TIM_TimeBaseInitStructure.TIM_Prescaler 1 - 1; //预分频器即PSC的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; //重复计数器高级定时器才会用到TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure); //将结构体变量交给TIM_TimeBaseInit配置TIM2的时基单元 /中断输出配置/TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除定时器更新标志位//TIM_TimeBaseInit函数末尾手动产生了更新事件//若不清除此标志位则开启中断后会立刻进入一次中断//如果不介意此问题则不清除此标志位也可TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //开启TIM2的更新中断/NVIC中断分组/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2//即抢占优先级范围0~3响应优先级范围0~3//此分组配置在整个工程中仅需调用一次//若有多个中断可以把此代码放在main函数内while循环之前//若调用多次配置分组的代码则后执行的配置会覆盖先执行的配置/NVIC配置/NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn; //选择配置NVIC的TIM2线NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; //指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; //指定NVIC线路的抢占优先级为2NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; //指定NVIC线路的响应优先级为1NVIC_Init(NVIC_InitStructure); //将结构体变量交给NVIC_Init配置NVIC外设/TIM使能/TIM_Cmd(TIM2, ENABLE); //使能TIM2定时器开始运行 } 外部时钟和内部时钟唯一的区别就是时钟的来源不同不过配置都大同小异只需要注意外部时钟是连接到哪一个GPIO口上的然后把这个GPIO口配置成为上拉/下拉/浮空输入模式并且把时钟设置为外部时钟即可 下图为时钟源的选择的不同