历史上的今天
返回首页

历史上的今天

今天是:2024年11月05日(星期二)

正在发生

2021年11月05日 | STM32F103ZET6 — TIM6/TIM7

2021-11-05 来源:eefocus

介绍

STM32F103ZET6 定时器资源非常丰富,根据 datasheet 描述,涵盖如下几种类型:


高级定时器 TIM1 / TIM8

通用定时器 TIM2 / TIM3 / TIM4 / TIM5 

基本定时器 TIM6/ TIM7

本次描述的重点是基本定时器 TIM6/ TIM7


基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。这2个定时器是互相独立的,不共享任何资源。


时钟

可以看到来自 APB1 的低频时钟经过频率x2供给了 TIM2~TIM7,其中包含了 TIM6/ TIM7,所以供给此部分的时钟为 72MHz


在 TIM6 / TIM7 中存在一个预分频器,支持输入的时钟进行预分频,计数器使用预分频后的时钟进行计数:

预分频的参数配置支持 1~65536


模式

TIM6 / TIM7 支持基本的循环计数,计数方式是从小到大。并且可以支持在任何时间内进行预分频系数的配置,配置在下一个UEV产生后生效。(UEV指的是一个更新时间,即一次计数溢出,当然,也可以支持软件进行主动触发)


可以支持 auto reload 和 one shot 的模式,即计数器完成一次计数之后,是自动重载之前的值,继续计数,还是完成一次计数任务后,停止计数。通过配置 TIMx_CR1 的 OPM单脉冲模式 (One-pulse mode) 来选择:

中断

可以通过配置中断,来达到计数器上溢出时刻产生对应的中断




配置过程

1. 打开 TIM6 / TIM7 的时钟


2. 配置中断优先级 NVIC 并使能中断


3. 配置分频系数和计数器的达到溢出的上限数值


4. 启用自动重装载预装载


5. 选择auto reload模式


6. 选择更新源(全开)


7. 开启溢出中断


8. 使能定时器




代码

初始化部分

这里 72MHz 的时钟输入,预分频为 7200(7200 - 1,这里是 datasheet中描述的预分频计算方法),计数为10000次溢出,故产生的是 1s 的定时器:


#define TIM6_CNT    (10000 - 1)

#define TIM6_PSC    (7200 - 1)

static SK_TIM6_NVICConifg(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;

 

 

    /* PE5/PE6 */

    NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

}

 

void SK_TIM6_Init(void)

{   

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

 

    SK_TIM6_NVICConifg();

 

    /// Step 1 : Open TIM6&TIM7 Clock

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);

 

    /// Step 2 : Set basic settings

    // Input CLOCK = 72MHz

    TIM_TimeBaseStructure.TIM_Period = TIM6_CNT;

    TIM_TimeBaseStructure.TIM_Prescaler = TIM6_PSC;

    TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

 

    TIM_ARRPreloadConfig(TIM6, ENABLE);

 

    TIM_SelectOnePulseMode(TIM6, TIM_OPMode_Repetitive);

 

    TIM_UpdateRequestConfig(TIM6, TIM_UpdateSource_Global);

 

    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);

 

    TIM_Cmd(TIM6, ENABLE);

}


中断处理部分

void TIM6_IRQHandler(void)

{

    static uint8_t cnt = 0;

    if (TIM_GetITStatus(TIM6, TIM_IT_Update))

    {

        TIM_ClearITPendingBit(TIM6, TIM_IT_Update);

        if (!cnt)

        {

            SK_SetLedStatus(SK_LED_1, SK_LED_ON);

            cnt++;

        }

        else

        {

            SK_SetLedStatus(SK_LED_1, SK_LED_OFF);

            cnt--;

        }

    }

}

推荐阅读

史海拾趣

Celduc Relais公司的发展小趣事

Celduc Relais公司注重企业文化的建设,倡导创新、协作、责任和卓越的核心价值观。公司通过举办各类文化活动、培训和学习等方式,提升员工的凝聚力和归属感。同时,公司还建立了完善的激励机制,鼓励员工积极创新、追求卓越。这一举措为公司的发展提供了强大的文化支撑和人才保障。

这五个故事只是Celduc Relais公司发展历程中的冰山一角,但它们足以展现出公司在技术创新、市场拓展、质量管理、环保理念和企业文化建设等方面的努力和成就。正是这些因素的共同作用,使得Celduc Relais公司在电子行业中脱颖而出,成为一家备受尊敬的企业。

Enovation Controls LLC公司的发展小趣事

随着公司实力的不断增强,Celduc Relais开始积极拓展国际市场。公司通过参加国际电子展会、建立海外销售渠道以及与当地合作伙伴建立战略合作关系等方式,逐步打开了欧洲、北美和亚洲等多个国家和地区的市场。这一过程中,公司不仅提升了品牌知名度,也积累了丰富的国际业务经验。

GWM Associates公司的发展小趣事
采用适当的负反馈设计,以提高放大器的稳定性和线性度。
敦泰(FOCALTECH)公司的发展小趣事
这可能是显示屏的电路故障,如显示屏损坏、显示屏与主板连接线松动或主板上控制显示屏的电路出现问题。可以尝试重新插拔连接线,如果问题依旧,可能需要更换显示屏或检修主板。
ET Enterprises Ltd公司的发展小趣事

ET Enterprises Ltd公司的历史可以追溯到1930年代,当时它作为EMI公司的一部分,开始涉足光检测技术领域。在这个早期阶段,公司致力于研究光信号的特性及其检测方法,为后续的光电倍增管技术奠定基础。

EDDING公司的发展小趣事

Eclipse的成功吸引了众多软件和硬件公司的注意。为了进一步扩大Eclipse的影响力和功能,ECLIPSE公司积极寻求与其他公司的合作伙伴关系。通过与IBM、Oracle、Red Hat等公司的合作,Eclipse得以集成更多的功能和工具,提高了其适应性和易用性。这些合作伙伴关系不仅为ECLIPSE公司带来了技术上的支持,也为其带来了更多的商业机会和市场份额。

问答坊 | AI 解惑

映射的意思【经典】

扫地只是我的表面工作,我真实的身份是一位研究憎。    电脑圈圈确实是厉害啊,能够把映射解释的如此贴切,小弟真是佩服。 映射,相当于重定位(remap)的意思 例如,本来我每次去买ARM芯片,都是去找Philips的,所以我从0x00000000路 ...…

查看全部问答>

Verilog HDL 高级数字设计源码

Verilog HDL 高级数字设计源码…

查看全部问答>

内核态驱动和用户态驱动的区别

RT,写wince驱动有一段时间了,但是很惭愧,到现在还没搞清楚内核态驱动和用户态驱动的区别,特来请教…

查看全部问答>

有偿求助,MCP2510驱动

内核为Linux2.6.8.1 CPU为S3C2410 价格好说 联系QQ:195550435…

查看全部问答>

常见的信息终端有哪些?

常见的信息终端有哪些? 请大侠们告知?…

查看全部问答>

6410串口COM2,3都不通?

友坚的UT-6410的开发板,GPIO通过驱动初始化后都已经写寄存器配置成串口模式了,但COM2,3用串口调试助手发送都没有信号,更不用说接受了,我用自发自收23脚相连,也没信号,请大侠帮忙看看怎么回事?…

查看全部问答>

急问 LCD和超级终端双显示shell命令

小弟毕设是实验箱的LCD上和超级终端上双显示shell命令。我在移植内核后,如果使用带QT的文件即root-qtopia-china.cramfs-320x240usb.tar.bz2,则可以在超级终端上用exec 1>/dev/tty1命令重定向使LCD上显示shell命令,但是超级终端上不能显示。若用 ...…

查看全部问答>

请问1PG控制伺服回原点没有爬行停止而是立即停止是何原因?

我在用1PG定位模块控制伺服在原点回归时,当到达DOG开关时,伺服没有爬行停止而是立即停止,而PGO信号灯也没有亮,我在程序里已经设置了#BMF 11为500,已经设置了回零爬行速度,况且我其他台也是这样接线而用同一控制程序,都没有问题,只是此台设 ...…

查看全部问答>

STM32的SPI传输DR寄存器不能赋值

大家好,我是刚开始接触STM32的开发板,主芯片是stm32f103zet6 在做spi通信的时候,用KEIL MDK来做单步调试,执行SPI_I2S_SendData(SPI2, 0x88); 函数后,SPIx->DR的值始终为0,不知道问题出在哪? 请哪位朋友帮忙出些点子? 谢谢啊!…

查看全部问答>