手机做网站用什么国家超算互联网公司排名

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

手机做网站用什么,国家超算互联网公司排名,网站注册好域名怎么办,定制开发app文章目录 1、TIM定时器1.1定时器类型1.2定时中断的基本结构 2 定时器初始化2.2 初始化定时器的步骤2.3 TIM库函数2.4 配置TIM2.4.1 Timer.c2.4.2 Timer.c2.4.3 main.c 1、TIM定时器 定时器的功能可以对输入的时钟进行计数#xff0c;并在计数值达到设定值时触发中断。 他包含… 文章目录 1、TIM定时器1.1定时器类型1.2定时中断的基本结构 2 定时器初始化2.2 初始化定时器的步骤2.3 TIM库函数2.4 配置TIM2.4.1 Timer.c2.4.2 Timer.c2.4.3 main.c 1、TIM定时器 定时器的功能可以对输入的时钟进行计数并在计数值达到设定值时触发中断。 他包含16位计数器CNT)、预分频器(PSC)、自动重装寄存器ARR的时基单元在72MHz计数时钟下可以实现最大59.65s的定时。不仅具备基本的定时中断功能而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型。 计数器CNT用来执行计数定时的一个寄存器每来一个时钟计数器加1 预分频器PSC对计数器的时钟进行分频使奇数更加灵活 自动重装寄存器RCC使计数值的目标值也就是想要多少个时钟申请中断。 1.1定时器类型 STM32F103C8T6定时器资源有TIM1、TIM2、TIM3、TIM4 基本定时器从基准时钟到预分频器再到计数器计数器计数自增同时不断地与自动重装寄存器进行比较他们相等时即计时时间到这时会产生一个更新中断和中断事件CPU响应更新中断最后完成定时中断的任务。基本定时器仅支持向上计数这一模式。 通用定时器和高级定时器不仅支持向上计数模式还支持向下计数模式和中央对齐模式。 STM32定时器的一大特色就是主从触发模式DAC的功能他能让硬件在不受程序的控制下实现自动运行。如果运用得当在某些情景下可以极大的减轻CPU的负担。 1.2定时中断的基本结构 定时中断和内外时钟源选择所涉及的结构如下图所示 PSC、CNT和ARR三个部分构成了时基单元下面是运行控制控制寄存器的一些位比如启动停止、向上或向下计数等等操作这些寄存器就能控制时基单元的运行了。 左边是为时基单元提供时钟的部分右边是计时时间到产生新更新中断后的信号去向。如果是高级定时器在右边部分还会多一个重复计数器。 2 定时器初始化 我们通过定时中断的整个框架结构图将图中的每个模块都打通就能让定时器工作了。
2.2 初始化定时器的步骤 这里以初始化TIM2定时器为例 1.RCC开启时钟TM2是APB1总线的外设所以要使用APB1的开启时钟函数 2.选择时基单元的时钟源对于定时中断我们就选择内部时钟源 3.配置时基单元包括其中的PSC、ARR、CNT等等 4.配置输出中断控制允许更新中断输出到NVIC 5.配置NVIC在NVIC中打开定时器中断的通道并分配一个优先级 6.运行控制整个模块配置完成后需要使能一下计数器当定时器使能后计数器就会开始计数当计数器更新时触发中断最后写一个定时器的中断函数这样这个中断函数每隔一段时间就能自动执行一次了。 2.3 TIM库函数 下面我们来介绍一部分与TIM有关的库函数 1.TIM_DeInit恢复缺省配置。 2.TIM_TimeBaseInit时基单元初始化有两个参数第一个TIMx选择某个定时器第二个是结构体包含了配置时基单元的一些参数。 3.TIM_TimeBaseStructInit可以把结构体赋一个默认值。 4.TIM_Cmd使能计数器2个参数第一个TIMx选择定时器第二个NewState新的状态也就是选择使能或者失能。 5.TIM_ITConfig用来使能输出信号3个参数第一个TIMx选择定时器第二个TIM_IT选择配置哪个中断输出第三个NewState新的状态选择使能还是失能。 6.TIM_InternalClockConfig选择内部时钟。 7.TIM_ITRxExternalClockConfig选择TIMx其他定时器的时钟第一个参数选择要配置的定时器第二个参数选择要接入哪个其他的定时器。 8.TIM_TIxExternalClockConfig选择TIx捕获通道的时钟4个参数第一个参数TIMx第二个参数选择TIx的某个引脚第三个参数选择输入的极性第四个参数选择滤波器。 9.TIM_ETRClockMode1Config选择ETR通过外部时钟模式1输入的时钟4个参数第一个参数TIMx第二个参数外部触发预分频器这里可以对ETR的外部时钟再提前做一个分频第三、四个参数分别是选择极性和滤波器。 10.TIM_ETRClockMode2Config选择ETR通过外部时钟模式2输入的时钟参数与上面一样。 11.TIM_ETRConfig单独用来配置ETR引脚的预分频器、极性、滤波器等参数。 总结 1、第6-11个函数总共6个函数对应的是时基单元的时钟选择部分可选择RCC内部时钟、ETR外部时钟、ITRx其他定时器、ITx捕获通道等。 2、第9-10个函数总共2个函数对于ETR外部时钟而言这两个函数是等效的参数也是一样的若不需要触发输入的功能那么这两个函数原则上是可以互换的。 12.TIM_PrescalerConfig单独写预分频的值第二个参数就是要写入预分频的值第三个参数是选择写入的模式。预分频器有一个缓冲器写入的值是在更新事件发生后才有效的所以这里有个写入模式可以选择听从安排在更新事件生效或是在写入后手动产生一个更新事件让这个值立刻生效。 13.TIM_CounterModeConfig用来改变计数器的计数模式第二个参数用来选择新的计数器模式。 14.TIM_ARRPreloadConfig自动重装器预装功能配置。 15.TIM_SetCounter给计数器写入一个值。 16.TIM_SetAutoreload给自动重装器写入一个值。 17.uint16_t TIM_GetCounter获取当前计数器的值他的返回值就是当前计数器的值。 18.uint16_t TIM_GetPrescaler获取当前预分频器的值。 19.FlagStatus TIM_GetFlagStatus 20.TIM_ClearFlag主要用于清除定时器的中断标志位。 21.ITStatus TIM_GetITStatus 22.TIM_ClearITPendingBit主要用于清除中断线路的中断挂起位。 这4个函数是用来获取标志位和清除标志位。 2.4 配置TIM 我们定一个时间让定时器每隔一个时间产生中断来实现每隔一个固定时间执行一段程序如下 2.4.1 Timer.c #include stm32f10x.h void Timer_Init(void) { //1.开启时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //2.选择时基单元的时钟定时器上电后默认就是使用内部时钟若不调用这个函数那也是使用的内部时钟 TIM_InternalClockConfig(TIM2);//选择内部时钟 //3.配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivisionTIM_CKD_DIV1;//选择1分频TIM_TimeBaseInitStructure.TIM_CounterModeTIM_CounterMode_Up;//选择向上计数模式//若想定时1s定时频率72M/(PSC1)/(ARR1),预分频器和计数器都有1个数的偏差所以要-1TIM_TimeBaseInitStructure.TIM_Period10000-1;//ARR自动重装的值TIM_TimeBaseInitStructure.TIM_Prescaler7200-1;//预分频器的值TIM_TimeBaseInitStructure.TIM_RepetitionCounter0;//重复计数器是高级定时器才有的TIM_TimeBaseInit(TIM2,TIM_TimeBaseInitStructure);TIM_ClearFlag(TIM2,TIM_FLAG_Update);//手动把更新中断标志位清除一下避免刚初始化完就进入中断//4.使能更新中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //5.配置NVIC NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannelTIM2_IRQn;//选择定时器TIM2在NVIC里的通道NVIC_InitStructure.NVIC_IRQChannelCmdENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority2;//抢占优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority1;//响应优先级NVIC_Init(NVIC_InitStructure); //6.启动定时器TIM_Cmd(TIM2,ENABLE); } 2.4.2 Timer.c #ifndef __TIMERH #define __TIMER_H_void Timer_Init(void);#endif 2.4.3 main.c #include stm32f10x.h // Device header #include TIMER.Huint16_t Num; int main(void) {OLED_Init();Timer_Init();OLED_ShowString(1,1,Num:);while(1){OLED_ShowNum(1,5,Num,5);} }void TIM2_IRQHandler(void)//定时器2的中断函数 {if(TIM_GetITStatus(TIM2,TIM_IT_Update)SET)//检查中断标志位{Num;TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位} }