历史上的今天
返回首页

历史上的今天

今天是:2025年08月19日(星期二)

正在发生

2021年08月19日 | STM32学习笔记(一)时钟和定时器

2021-08-19 来源:eefocus

由于近期在准备海洋航行器比赛,正好趁此机会学习一下ARM,看到周围很多同学都在使用32,所以我也买了一块STM32F103ZET6,准备好好地学习一下。


STM32的时钟系统相当的复杂,包含了5个时钟源,分别是HSI HSE LSI LSE PLL,HSI是高速内部时钟、RC振荡器,频率为8M,HSE是高速外部时钟,即晶振,我的核心板上晶振为8M。LSI为低速内部时钟、RC振荡器,频率40k,LSE为低速外部时钟,接32.768kHz晶振,作为RTC时钟源。PLL为锁相环倍频输出,最大不超过72M。


我在学习定时器时先看的是TIM3,它挂载在APB1分频器上,APB1上面挂载的是低速外设,APB2上挂载高速外设。


在system_stm32f10x.c文件下,有默认定义SYSCLK_FREQ_72MHz,同时在SystemInit()函数下调用了SetSysClock(),根据宏定义将时钟设为72M。


读取SystemCoreClock变量即可获得系统时钟频率。


在默认情况下,系统的各个时钟频率如下:


   SYSCLK:72M


   AHB:72M


   APB1(PCLK1):36M


   APB2(PCLK2):72M


   PLL:72M


详细的定时器设定如下:


   ①首先要搞清楚定时器的计数时钟频率,在预分频系数≠1的时候,TIM2~7的时钟频率为APB1的2倍,即72MHz,预分频系数的默认值不是1,但我并未查到该如何设置该值。


   ②定时器的设置主要包括定时器的初始化和中断的初始化。


2.1 定时器初始化:


首先定义TIM_TimeBaseInitTypeDef类型的结构体,它包含了如下的内容:


typedef struct

{

  uint16_t TIM_Prescaler;        

  uint16_t TIM_CounterMode;     

  uint16_t TIM_Period;           

  uint16_t TIM_ClockDivision;   

  uint8_t TIM_RepetitionCounter; 

} TIM_TimeBaseInitTypeDef;


第一项TIM_Prescaler是预分频值,它与TIM_Period(重载周期值)的乘积即为计数的总值。


第二项TIM_CounterMode为计数模式,它的内容如下:


#define TIM_CounterMode_Up                 ((uint16_t)0x0000)

#define TIM_CounterMode_Down               ((uint16_t)0x0010)

#define TIM_CounterMode_CenterAligned1     ((uint16_t)0x0020)

#define TIM_CounterMode_CenterAligned2     ((uint16_t)0x0040)

#define TIM_CounterMode_CenterAligned3     ((uint16_t)0x0060)


后面三项为中心对齐模式,指的是计数到一定的值,产生溢出事件,再向下计数到0。常用的为向上计数模式,即TIM_CounterMode_Up


第四项TIM_ClockDivision为时钟分割,对于时钟分割没有查到太多的描述,一般设定为TIM_CKD_DIV1,或者直接填入0x0000。


第五项TIM_RepetitionCounter为PWM模式的一些设定,一般的定时器不用设置。


除此之外还要设置中断的类型,一般的定时器为更新中断,即由溢出事件产生的中断,设置的方式为:TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE),其中第一项是定时器代号,第二项为类型,这里设定为更新方式,第三项为使能。


根据上述内容我们知道,初始化的过程如下:


TIM_TimeBaseInitTypeDef TIM_STR;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//TIM3挂载在APB1上

//由于预分频系数默认不是1,所以TIM3的时钟为2*APB1=72M

TIM_STR.TIM_Period=arr;

TIM_STR.TIM_Prescaler=psc;

//(arr+1)*(psc+1)/TIM时钟=定时器溢出中断触发周期

TIM_STR.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_STR.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3,&TIM_STR);

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);


2.2 中断初始化:


中断初始化为操作NVIC(嵌套向量中断控制器)函数。 设置方式如下:


NVIC_STR.NVIC_IRQChannel=TIM3_IRQn;//设定为TIM3中断

NVIC_STR.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0级

NVIC_STR.NVIC_IRQChannelSubPriority=3;//从优先级3级

NVIC_STR.NVIC_IRQChannelCmd=ENABLE;//IRQ通道时能

NVIC_Init(&NVIC_STR);//中断初始化

TIM_Cmd(TIM3,ENABLE);//TIM3定时器使能


2.3 把这些都封装成一个函数,既可作为TIM3的初始化函数。如下:


void TIM3_Init(u16 arr,u16 psc)

{

        //定时时间=(arr+1)*(psc+1)/72 单位为us

    TIM_TimeBaseInitTypeDef TIM_STR;

    NVIC_InitTypeDef NVIC_STR;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

    //初始化定时器

    TIM_STR.TIM_Period=arr;

    TIM_STR.TIM_Prescaler=psc;

    TIM_STR.TIM_ClockDivision=TIM_CKD_DIV1;

    TIM_STR.TIM_CounterMode=TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM3,&TIM_STR);

    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

    //初始化中断

    NVIC_STR.NVIC_IRQChannel=TIM3_IRQn;

    NVIC_STR.NVIC_IRQChannelPreemptionPriority=0;

    NVIC_STR.NVIC_IRQChannelSubPriority=3;

    NVIC_STR.NVIC_IRQChannelCmd=ENABLE;

    NVIC_Init(&NVIC_STR);

        //使能定时器

    TIM_Cmd(TIM3,ENABLE);

}


③中断服务函数:


中断函数的名字,TIM3的为TIM3_IRQHandler


中断服务函数内包含了:判断是否发生中断、中断发生后执行的内容、清除标志位三部分。


首先是判断是否发生了更新中断,利用库函数TIM_GetITStatus(P1,P2),它的参数P1为代号,这里是TIM3,P2为中断类型,这里为更新中断TIM_IT_Update,当它为1时即发生了更新中断,这里为了增强可读性,采用一个RESET代表0,当函数返回值不是RESET的时候,即发生了置位(中断)。


清除标志位采用的是库函数TIM_ClearITPendingBit(P1,P2),参数与判断的函数一样。


具体函数如下:


void TIM3_IRQHandler(void)

{

    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)

    {

        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);

    //在这里执行中断内容

    }

}


④完成调用


只要在main函数里调用TIM3_Init()函数,并填入适当的参数,即可实现精确的定时中断,例如获得一秒,即72M个数字中断一次,可分解为10000*7200,配置如下:


TIM3_Init(9999,7199);


推荐阅读

史海拾趣

Fractus公司的发展小趣事

随着技术的不断成熟和产品的市场推广,Fractus逐渐获得了业界的广泛认可。公司在多个国际展会上展示了其创新的天线技术,并赢得了多项重要奖项,包括欧洲联盟IST奖项的特等奖等。这些荣誉不仅提升了Fractus的品牌知名度,也进一步巩固了其在天线技术领域的领先地位。

Gould Ami公司的发展小趣事
检查电源线路是否连接牢固,电压是否稳定。使用万用表等工具检测电源是否正常输出,如有异常及时修复。
Esterline Technologies Corporation公司的发展小趣事
包括电路板损坏、元件老化、接触不良等问题,可能导致脉冲信号异常或无法发出。
BAE Systems公司的发展小趣事

电子行业是一个充满竞争和挑战的领域。面对不断变化的市场环境和客户需求,BAE Systems公司不断调整自身的战略和业务结构。公司注重市场调研和客户需求分析,根据市场变化及时调整产品线和市场策略。同时,公司也加强了对内部管理和流程的优化,提高了运营效率和成本控制能力。这些举措使得公司能够在激烈的市场竞争中保持领先地位,实现稳健发展。

Clulite公司的发展小趣事
  1. 创业初期
    • 描述Clulite公司的创始人或核心团队如何识别电子行业中的某个市场机遇。
    • 讲述他们是如何筹集初始资金,设立公司,并开发出第一款产品或解决方案的。
    • 可以提及公司在初创阶段面临的挑战,如技术难题、市场竞争等。
  2. 技术创新
    • 讲述Clulite如何通过研发创新,推出了一款颠覆性的产品或技术,从而获得了市场认可。
    • 详细描述这一创新过程,包括研发团队的努力、关键技术的突破等。
    • 提及这一创新如何帮助公司在市场上取得了竞争优势。
  3. 市场拓展
    • 描述Clulite如何逐步扩大市场份额,从地区市场走向全国乃至国际市场。
    • 可以讲述公司如何建立销售网络、与合作伙伴建立合作关系,以及参与行业展会等活动来推广品牌和产品。
    • 提及公司在市场拓展过程中遇到的挑战和应对策略。
  4. 品质管理
    • 讲述Clulite如何注重产品质量和客户体验,通过严格的质量控制流程来提升产品可靠性。
    • 描述公司如何建立完善的售后服务体系,为客户提供及时、专业的支持。
    • 提及这些举措如何帮助公司赢得了客户的信任和口碑。
  5. 可持续发展
    • 讲述Clulite如何关注环境保护和社会责任,推动公司的可持续发展。
    • 描述公司如何采取环保措施,减少生产过程中的污染排放。
    • 提及公司如何参与社会公益事业,回馈社会。

请注意,这些故事需要根据Clulite公司的实际情况进行调整和补充。如果你需要更具体的内容,建议查阅Clulite公司的官方网站、新闻报道或行业分析报告,以获取更详细的信息和数据。

ARBOR公司的发展小趣事

ARBOR公司深知合作的重要性,积极与上下游企业建立紧密的合作关系。公司通过与供应商和客户建立长期稳定的战略合作关系,实现了资源共享和优势互补。这种合作模式不仅降低了公司的运营成本,也提高了产品的竞争力。同时,ARBOR公司还积极参与行业交流活动,推动整个电子产业的健康发展。

问答坊 | AI 解惑

【讨论】FPGA技术的学习和就业

一。自我情况说明 上研究生。实验室是搞嵌入式计算技术的。目前主要研究是设计一个多核并行处理器。使用FPGA来进行验证。 我也打算投入FPGA的方向。并为之努力。 下学期就开始,打算先从VHDL和ISE环境学起(我们实验室用的是XILINX)。 二。 ...…

查看全部问答>

MC8051 IPcore找熟悉的人一起探讨

现在我用到手了MC8051的IPcore的代码,可是不太熟,好多地方不明白,也没有开发板.所以想找熟悉的人探讨一下.mc8051的压缩包是我从网上下的,你可以以自已去原网站下.是free的.…

查看全部问答>

新手问问题。。望各位大侠花一两分钟帮小弟解答一下。。

各位大侠好。。小弟是新手。。想问一下用1602还有一块51单片机做一个电子钟。。都要用到什么东西。。望能详细点解答。。最好能细到连电子元器件都说明。。而且最好能有个大概的制作步骤。。。小弟在此谢过了。。…

查看全部问答>

数据采集开的问题

我用的是PCL-812pg的卡,里面PT_EnableEvent 的count搞不清,请问下,count是指多 少个中断发中断事件给用户,那么这个count的大小是否必须小于buffer的一半,否则b uffer都满了,还没发中断事件给用户,checkevent也检测不到,是不是这个意思 ...…

查看全部问答>

关于WINDOWS XP下直接IO(IN/OUT)硬盘MBR是否可行

我在WIN XP下写了简单的驱动进入ring0层后,试图直接IO硬盘的MBR,我通过IN指令可以正常读取到硬盘的MBR,但是当我用OUT指令写入的事后发现没有任何效果,WIN XP也并没有crash,但是就是在检查MBR的时候发现MBR内容一点没有变化根本没有我写入的内 ...…

查看全部问答>

从wince看djyos的生存空间和价值——与戴先生的对话

    跟成都的戴先生认识,还得感谢QQ,通过djyos。     戴:你现在djyos发展得怎么样了?     我:正在努力.     就这样开始我我们的对话,通过QQ聊天,我知道戴先生是一个有10几年敬业的嵌入式业者,由于 ...…

查看全部问答>

在PB中编译好的dll不能加载成功

写了一个简单的按键驱动(流驱动),加入2440的bsp创建的工程中,修改了cfw.c,armint.c中的中断设置,注册表也改了(在bib文件中加入dll的话报警告说多次进入dll,所以就去掉了bib文件中的,警告也没了。),但是驱动就是不能用,一条打印信息都没 ...…

查看全部问答>

请教:做嵌入式系统,这两个公司哪个好一些。

做嵌入式系统,这两个公司哪个好一些。 周立功 http://www.zlgmcu.com/help/renlizhiyuan.asp 广哈通信 http://www.ghtchina.com…

查看全部问答>

OK6410开发板哪些地方升级了?变化大吗?

OK6410开发板哪些地方升级了?变化大吗?…

查看全部问答>

用STLINK烧录STM8S103F3芯片有百分之几工作不正常!

                                 用STLINK烧录STM8S103F3芯片有百分之几工作不正常,有些功能正常,有些功能不正常!重烧后正常,不知道是怎么回事 ...…

查看全部问答>