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

米拓建站从零开始网站建设

米拓建站,从零开始网站建设,常州网站设计公司,如何制作微信小程序答题一、定时器的概念 定时器(TIM),可以对输入的时钟信号进行计数,并在计数值达到设定值的时候触发中断。 STM32的定时器系统有一个最为重要的结构是时基单元,它由一个16位计数器,预分频器,和自动重…

一、定时器的概念

        定时器(TIM),可以对输入的时钟信号进行计数,并在计数值达到设定值的时候触发中断。

        STM32的定时器系统有一个最为重要的结构是时基单元,它由一个16位计数器,预分频器,和自动重装寄存器构成。在时钟信号来临的时候,首先会由预分频器对该信号进行分流,使得一部分或者全部的信号进入计时器开始计数,当计数值达到自动重装寄存器的值时,由硬件触发中断,将中断信号递交给NVIC最后进入CPU运行中断服务函数。在72MHz的时钟下最大可以实现59.65s的定时。当然如果你觉得这个时间不够长,还可以利用STM32的定时器级联功能,将一个定时器的中断信号作为第二个定时器的时钟输入,这样定时时长可以呈现几何状的爆炸增长。

        STM32的定时器不仅仅具有基本的定时中断功能,还包含了:内外时钟源选择、输入捕获(用于测量输入信号的脉冲长度)、输出比较(用于产生输出波形,如PWM(脉冲宽度调制))、编码器接口(适用于读取正交编码器的位置信息)、主从触发模式等多种功能。根据复杂度和应用场景,上述功能被划分到了高级定时器、通用定时器、基本定时器三个类型的定时器中。

二、简单看看定时器电路图

1.基本定时器

        这里面有一个影子寄存器(方框下面有阴影的就是影子寄存器),它有助于确保定时器的准确性和同步性。

  • 预装载寄存器是程序员可以直接访问和修改的寄存器。
  • 影子寄存器是定时器内部实际使用的寄存器,它的值由预装载寄存器在特定条件下更新而来
  • 影子寄存器的存在,使得我们在修改一个定时器的自动重装寄存器的值来控制定时时长的时候,不会立即生效,而是在当前时钟中断已经完成,到了更新事件/更新中断的节点才会被修改,这样就保证了定时器的准确性和同步性。

2.通用定时器 

        在这里,我们只需要着重关心上面框出来的部分即可,下面的其他功能之后会有所涉猎

3.高级定时器

高级定时器是在通用定时器的基础上增加了框图部分,大家可以先看看电路图,也是在之后会讲到

三、定时器的基本结构

        上面我们已经看到了各种定时器的基本电路图,已经了解了其原理。下图是对上述的总结框图,我们只需要按照这个图就可以配置好。

  1. 打开定时器的时钟
    • 使用RCC_APB1PeriphClockCmd或RCC_APB2PeriphClockCmd函数打开相应的定时器资源。
  2. 配置时钟源
    • 将时钟资源设为内部时钟源或外部时钟源。
  3. 配置时基单元
    • 设置计数器模式(向上、向下或中央对齐)。
    • 配置预分频器(PSC)和自动重装载寄存器(ARR)。
  4. 配置中断
    • 清除定时器更新标志位。
    • 使能定时器的更新中断。
  5. 配置NVIC中断分组
    • 设置中断的优先级和使能中断线路。
  6. 使能定时器
    • 启动定时器开始运行。

四、示例代码

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口配置成为上拉/下拉/浮空输入模式,并且把时钟设置为外部时钟即可

下图为时钟源的选择的不同

http://www.yayakq.cn/news/168856/

相关文章:

  • 如何在建设教育协会网站注册考试做网站的需要考什么证书吗
  • 美食网站建设的必要性社区网站优化
  • 商业网站建设定位成都电商网站开发公司
  • 网站建设的开发工具南昌seo关键词排名
  • 珠海网站建设小小网络买卖平台
  • 莆田网站制作公司网页设计html代码大全桂林
  • 贝智康积分网站开发娄底本地做寄生虫网站
  • 网站开发价格表wordpress开发管理系统
  • 做推文的网站的推荐广州市天河区发布
  • 合肥市建设网站有域名怎么建设网站
  • 网站备案核网站建设功能解说
  • 天津网站优化排名推广阿里巴巴做实商网站的条件
  • 免费网站软件免费下载安装wordpress 输出错误信息
  • 网站开发需求ppt计算机网站建设维护的目的
  • 网站建设做网站多少钱百度收录怎么弄
  • 国内外网站开发有哪些技术个人网站备案名字大全
  • 企业网站备案管理系统网站投放
  • 棋牌网站page做网站
  • 网站开发要学的课程长春网站制作招聘信息
  • 淮南市潘集区信息建设网站重庆微信营销网站
  • 织梦dedecms绿色led照明公司企业网站模板 下载58同城网络营销
  • 营销型网站设计方案国内vps推荐
  • 网站如何被搜索到网站流量统计模板
  • 网站怎么做跳站vis设计机构
  • asp制作网站咸宁网页设计
  • 石家庄高端网站建设最新手机发布会
  • 深圳方维网站设计公司引擎优化是什么工作
  • 适合新手做网站的图片网站建设方案
  • 网站开发工程师发展趋势商城网站建设合同
  • 备案号如何绑定多个网站广东省建设工程交易中心