你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F2xx的定时器的应用

[复制链接]
STMCU小助手 发布时间:2021-12-1 22:35
定时器计数值的确定。

    TIMER的时钟不是直接来源于APB1或者APB2,而是来自经过APB1或者APB2一个倍频器后的时钟。当APBx的预分频数为1时,这个倍频器不起作用,此时定时器的时钟频率等于APBx的频率;当APBx倍频数为其他数值时(即预分频数位2,4,8,16时),这个倍频数起作用,定时器时钟为APBx的两倍。例如AHB=60MHz,APB1为AHB的2分频,即为30MHz,则挂载在APB1下的时钟的频率为60MHz(2倍频)。



各个功能定时器的比较表。

Timer分布

O5@B8VPHF(`$][M780(]81Y.png

ZIZ8PI1]{VDP@0@UPD4WPXV.png

2R$QRD77UN__V$IHZ@)KXZM.png

3%3{(A52L[K}E`%({21]P_V.png

RPFBG2D6{X43}}H8W98$L.png

)MDOR]U_Q2WEZPE9T`DZ_44.png

1E$F%R6}KH${605$}IP_G96.png

_6C_X(L0JO%KS$P)51`6_JR.png



systemtick的时钟直接来源于AHB,而且是24位的定时时钟,一般常用在实时操作系统中。定时非常准确。以下是systemtick的配置函数,由专门的中断void SysTick_Handler(void)。

/**

  * @brief  SysTick时钟配置。

  * @note   调用的是系统中的配置函数,将其函数名改掉而已,便于统一管理。

  *               只需要在该配置中加入计数值即可实现任意时间的定时配置,包括1us。

  *             <h2><center>需要结合中断函数。

  *               void SysTick_Handler(void){···}</center></h2>

  * @param  ticks   :     计数值。该计数值可通过以下公式求得:AHB_Clk*需要定时值,

  *                                    例如需要定时1ms,且60MHz的AHB,则计数值 = 60MHz*1ms = 600000。     

  * @retval 返回配置是否成功标志。

  */

60MHz AHB1时钟systemtick定时中断。

  1. uint32_t BSP_CLK_SysTick_Config(uint32_t ticks)

  2. {

  3.          if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */



  4.          SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */

  5.          NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */

  6.          SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */

  7.          SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |

  8.                                SysTick_CTRL_TICKINT_Msk   |

  9.                                SysTick_CTRL_ENABLE_Msk;                 /* Enable SysTick IRQ and SysTick Timer */

  10.   return (0);                                                    /* Function successful */

  11. }

复制代码

30MHz APB1时钟10us定时中断。

  1. void TIM_Configuration(void)

  2. {

  3.          NVIC_InitTypeDef NVIC_InitStructure1;

  4.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  5.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);



  6.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  7.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;

  8.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;

  9.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;

  10.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;

  11.          NVIC_Init(&NVIC_InitStructure1);



  12.          TIM_DeInit(TIM3);

  13.          TIM_TimeBaseStructure.TIM_Period = 599;

  14.          TIM_TimeBaseStructure.TIM_Prescaler = 0;

  15.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

  16.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;



  17.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);



  18.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);



  19.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);



  20.          TIM_Cmd(TIM3, ENABLE);

  21. }
复制代码


30MHz APB1时钟1ms定时中断。

  1. void TIM_Configuration(void)

  2. {

  3.          NVIC_InitTypeDef NVIC_InitStructure1;

  4.          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  5.          RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);



  6.          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  7.          NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;

  8.          NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0;

  9.          NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;

  10.          NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;

  11.          NVIC_Init(&NVIC_InitStructure1);



  12.          TIM_DeInit(TIM3);

  13.          TIM_TimeBaseStructure.TIM_Period = (60000-1);

  14.          TIM_TimeBaseStructure.TIM_Prescaler = 0;

  15.          TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

  16.          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;



  17.          TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);



  18.          TIM_ClearFlag(TIM3, TIM_FLAG_Update);



  19.          TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);



  20.          TIM_Cmd(TIM3, ENABLE);

  21. }

复制代码

收藏 评论0 发布时间:2021-12-1 22:35

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版