一般上什么网站,茶叶公司网站源码,西安今晚12点封城吗,编写软件的步骤一、定时器的概述
进行有规律的计数#xff0c;每记一次数的时间都是固定的
定时器的本质#xff1a;计数的总时间 记一次数的时间#xff08;时钟的频率#xff09; * 记多少次#xff08;重装载值#xff09;。
基本定时器属于片上外设#xff0c;系统滴答定时器是…一、定时器的概述
进行有规律的计数每记一次数的时间都是固定的
定时器的本质计数的总时间 记一次数的时间时钟的频率 * 记多少次重装载值。
基本定时器属于片上外设系统滴答定时器是属于内核级别。 STM32的定时器分类 基本定时器主要做一些基本定时功能触发DAC转换 通用定时器包含了基本定时器的所有功能并且还有PWM波电机调速和输入捕获功能 高级定时器包含了通用定时器的所有功能死区和刹车的功能。 基本定时器介绍
基本定时器TIM6和TIM7包含一个16位自动重载每次计数结束就会把重装载值加载到计数器里让它重新开始计数计数器该计数器由可编程预分频器做除法驱动。此类定时器不仅可用作通用定时器以生成时基还可以专门用于驱动数模转换器DAC。实际上此类定时器内部连接到DAC并能够通过其触发输出驱动DAC。这些定时器彼此完全独立不共享任何资源。
基本定时器特征
基本定时器TIM6和TIM7的特性包括
16位自动重载递增计数器
16位可编程预分频器用于对计数器时钟频率进行分频即运行时修改分频系数介于1和65536之间
用于触发DAC的同步电路
发生更新事件时会生成中断DMA请求计数器上溢。
二、基本定时器框架 当前可以操作到的只能是上层寄存器但是真正起作用的是影子寄存器但是影子寄存器是看不见摸不着的所以需要做的是把上层寄存器的值加载到影子寄存器里 三、基本定时器定时预装载过程分析 预分频器 自动重载寄存器 基本时基单元预分频值、重装载值、计数器的值硬件自动计数
基本定时器相关寄存器 TIM6 和 TIM7 控制寄存器 1 (TIMx_CR1) 位 15:8 保留必须保持复位值。 位 7 ARPE 自动重载预装载使能 (Auto-reload preload enable) 0 TIMx_ARR 寄存器不进行缓冲。 1 TIMx_ARR 寄存器进行缓冲。 为0代表没有影子寄存器 为1代表有影子寄存器 位 6:4 保留必须保持复位值。 位 3 OPM 单脉冲模式 (One-pulse mode) 0 计数器在发生更新事件时不会停止计数 1 计数器在发生下一更新事件时停止计数将 CEN 位清零。 0就是连续计数 1单次计数 位 2 URS 更新请求源 (Update request source) 此位由软件置 1 和清零用以选择 UEV 事件源。 0 使能时所有以下事件都会生成更新中断或 DMA 请求。此类事件包括 — 计数器上溢/ 下溢 — 将 UG 位置 1 — 通过从模式控制器生成的更新事件 1 使能时只有计数器上溢 / 下溢会生成更新中断或 DMA 请求。 位 1 UDIS 更新禁止 (Update disable) 此位由软件置 1 和清零用以使能 / 禁止 UEV 事件生成。 0 使能 UEV 。更新 (UEV) 事件可通过以下事件之一生成 — 计数器上溢/ 下溢 — 将 UG 位置 1 — 通过从模式控制器生成的更新事件 然后更新影子寄存器的值。 1 禁止 UEV 。不会生成更新事件各影子寄存器的值 ARR 和 PSC 保持不变。但如果将 UG 位置 1 或者从从模式控制器接收到硬件复位则会重新初始化计数器和预分频器。 位1首先要置为0才能让位2有效 位1置0代表当前会有更新事件生成更新影子寄存器的值 位2置1代表当前只有计数器上溢可以进入中断 位 0 CEN 计数器使能 (Counter enable) 0 禁止计数器 1 使能计数器 注意只有事先通过软件将 CEN 位置 1 才可以使用门控模式。而触发模式可通过硬件自动将 CEN 位置 1 。 在单脉冲模式下当发生更新事件时会自动将 CEN 位清零。 TIM6 和 TIM7 DMA/ 中断使能寄存器 (TIMx_DIER) 位 15:9 保留必须保持复位值。 位 8 UDE 更新 DMA 请求使能 (Update DMA request enable) 0 禁止更新 DMA 请求。 1 使能更新 DMA 请求。 位 7:1 保留必须保持复位值。 位 0 UIE 更新中断使能 (Update interrupt enable) 0 禁止更新中断。 1 使能更新中断。 位 0 UIE 更新中断使能 (Update interrupt enable) 0 禁止更新中断。 1 使能更新中断。 如果置1当发生更新事件时就可以进入中断服务函数 TIM6 和 TIM7 状态寄存器 (TIMx_SR) 位 15:1 保留必须保持复位值。 位 0 UIF 更新中断标志 (Update interrupt flag) 该位在发生更新事件时通过硬件置 1 。但需要通过软件清零。 0 未发生更新。 1 更新中断挂起。该位在以下情况下更新寄存器时由硬件置 1 — 上溢或下溢并且当 TIMx_CR1 寄存器中 UDIS 0 时。 — 当由于 TIMx_CR1 寄存器中 URS 0 且 UDIS 0 而通过软件使用 TIMx_EGR 寄存器中 的 UG 位重新初始化 CNT 时。 TIM6 和 TIM7 事件生成寄存器 (TIMx_EGR) 位 15:1 保留必须保持复位值。 位 0 UG 更新生成 (Update generation) 该位可通过软件置 1 并由硬件自动清零。 0 不执行任何操作。 1 重新初始化定时器计数器并生成寄存器更新事件。请注意预分频器计数器也将清零但 预分频比不受影响。 把UG位置1就可以把上层寄存器的值加载到影子寄存器里来 TIM6 和 TIM7 计数器 (TIMx_CNT) 位 15:0 CNT[15:0] 计数器值 (Counter value) TIM6 和 TIM7 预分频器 (TIMx_PSC) 位 15:0 PSC[15:0] 预分频器值 (Prescaler value) 计数器时钟频率 CK_CNT 等于 f CK_PSC / (PSC[15:0] 1) 。 PSC 包含在每次发生更新事件时要装载到实际预分频器寄存器的值 TIM6 和 TIM7 自动重载寄存器 (TIMx_ARR) 位 15:0 ARR[15:0] 自动重载值 (Auto-reload value) ARR 为要装载到实际自动重载寄存器的值。 有关 ARR 更新和行为的详细信息请参见 第 17.3.1 节第 484 页的时基单元 。 当自动重载值为空时计数器不工作。 1. 配置时钟在使用定时器之前需要先配置时钟。定时器的时钟源可以是内部时钟或外部时钟。 2. 配置定时器模式在基本定时器中有两种模式分别是计数模式和自动重载模式。需要根据实际需求选择合适的模式。 3. 配置定时器周期设置定时器的自动重载值即计数器的最大值。 4. 配置计数器设置定时器的初始值一般为0。 5. 启动定时器将定时器控制寄存器中的使能位设置为1即可启动定时器。 6. 判断定时器是否完成可以通过读取定时器的状态寄存器来判断定时器是否完成了一次计数。 7. 重置定时器如果需要再次使用定时器需要将定时器的计数器和状态寄存器清零。 8. 处理定时器中断如果开启了定时器中断当定时器完成一次计数时会触发中断需要在中断服务函数中进行相应的处理。 中断方式 1. 打开TIM6的时钟 2. 往预分频器里写预分频值记一次数的时间 3. 往重装载寄存器里写值记多少次 4. 上层寄存器加载到影子寄存器里配置CR1寄存器 5. 产生一次更新事件让UG位置1 6. 使能更新中断 7. 配置中断优先级 8. 使能核心响应中断 9. 使能计数器 10. 编写中断服务函数 #include time7.h
/************************************
函数功能定时器7的初始化
函数形参u32 nms 65536 / 1000 65ms
函数返回值void
函数说明最大的定时时间由预分频值和重装载值来决定
作者
日期
************************************/void TIM7_Init(u32 nms)
{//1. 打开TIM7的时钟RCC-APB1ENR (0X1 5); //2. 往预分频器里写预分频值记一次数的时间范围0-65535之间TIM7-PSC 8400 - 1;//84分频10us记一次数//3. 往重装载寄存器里写值记多少次TIM7-ARR nms * 10;//4. 上层寄存器加载到影子寄存器里配置CR1寄存器TIM7-CR1 | 0X1 7;//配置ARR有影子寄存器TIM7-CR1 ~(0X1 3);//不停进行计数TIM7-CR1 ~(0X1 1);//使能EUV让更新事件有效TIM7-CR1 | (0X1 2);//只有计数器上溢才能产生中断或DMA请求//5. 产生一次更新事件让UG位置1TIM7-EGR | 0X1 0;//6. 使能更新中断TIM7-DIER | 0X1 0;//7. 配置中断优先级NVIC_SetPriority(TIM7_IRQn,NVIC_EncodePriority(7-2,1,1));//8. 使能核心响应中断NVIC_EnableIRQ(TIM7_IRQn);//9. 使能计数器TIM7-CR1 | 0X1 0; }
//10. 编写中断服务函数
void TIM7_IRQHandler(void)
{TIM7-SR0;//状态位清0printf(3s\r\n);
}/************************************
函数功能定时器7的初始化
函数形参u32 nms 65536 / 1000 65ms
函数返回值void
函数说明最大的定时时间由预分频值和重装载值来决定
作者
日期
************************************/
void TIM7_Delay(u32 nms)
{//1. 打开TIM7的时钟RCC-APB1ENR (0X1 5); //2. 往预分频器里写预分频值记一次数的时间范围0-65535之间TIM7-PSC 8400 - 1;//84分频10us记一次数//3. 往重装载寄存器里写值记多少次TIM7-ARR nms * 10;//4. 上层寄存器加载到影子寄存器里配置CR1寄存器TIM7-CR1 | 0X1 7;//配置ARR有影子寄存器TIM7-CR1 ~(0X1 3);//不停进行计数TIM7-CR1 ~(0X1 1);//使能EUV让更新事件有效TIM7-CR1 | (0X1 2);//只有计数器上溢才能产生中断或DMA请求//5. 产生一次更新事件让UG位置1TIM7-EGR | 0X1 0;//6. 使能更新中断TIM7-DIER | 0X1 0;//7. 使能计数器TIM7-CR1 | 0X1 0; //8. 等待计数时间到while(!(TIM7-SR)){}//9. 关闭计时器TIM7-CR1 ~(0X1 0);
}
int main(void)
{NVIC_SetPriorityGrouping(7-2);//选择了优先级分组为第5组抢占优先级所占位数为2位响应优先级所占位数为2位TIM7_Init(3000);while(1){TIM7_Delay(500);}
}