[STM32F4] STM32F4定时器配置

[复制链接]
1237|18
 楼主| wangtaohui 发表于 2023-8-20 23:14 | 显示全部楼层 |阅读模式
定时器时钟配置
定时器分类
以stm32f4为例,总共包括14个定时器(time2和time5为32位,其余均为16位)
不同种类的定时器挂靠的时钟来源不同

7210064e22dc9bf98e.png
 楼主| wangtaohui 发表于 2023-8-20 23:14 | 显示全部楼层
定时器时钟
不同的定时器挂载在不同的总线上(APBx,x=1,2),内部时钟图如下图所示:

6876564e22dd705bab.png
 楼主| wangtaohui 发表于 2023-8-20 23:14 | 显示全部楼层
在system_stm32f4xx.c中已经设置APB1和APB2时钟,其中APB1为168/4=42Mhz,APB2为168/2=84Mhz
2852464e22df18ed36.png
 楼主| wangtaohui 发表于 2023-8-20 23:15 | 显示全部楼层
   但是定时器和挂靠在APB1和APB2的IO口不同,从下图中可以看出,180MHZ经过APBx分频后,
   直接用在普通的IO口;而在定时器使用时,如果当APBx时钟分频为1时,定时器对应的时钟为
   APBx的时钟,当APBx时钟分频不为1时,定时器对应的时钟为APBx的时钟的2倍。从上述表格上
   可以看出APB1 presclaer和APB2 presclaer分别为4、2,不是1,所以定时器的时钟为
   (CK_INT)为84MHZ/168MHZ(视挂载情况决定)。
 楼主| wangtaohui 发表于 2023-8-20 23:15 | 显示全部楼层
6883964e22e00e9360.png
其中,定时器时钟频率具体对应多少,其实和RCC-DCKCFGR寄存器有直接关系。

1898864e22e0ed6db9.png
 楼主| wangtaohui 发表于 2023-8-20 23:15 | 显示全部楼层
寄存器RCC-DCKCFGR中的TIMPRE位配置如下:
2848764e22e1c13966.png
9376264e22e22687b7.png
 楼主| wangtaohui 发表于 2023-8-20 23:16 | 显示全部楼层
案例
定时器初始化(输入捕获实验)
  1. void TIM5_CH1_Cap_Init(u32 arr)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         NVIC_InitTypeDef NVIC_InitStructure;

  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);          //TIM5时钟使能   
  7.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);         //使能PORTA时钟       
  8.        
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
  12.         //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  13.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ; //下拉
  14.         GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0

  15.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用位定时器5
  16.   
  17.         TIM_TimeBaseStructure.TIM_Prescaler=83;  //定时器分频
  18.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  19.         TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
  20.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  21.        
  22.         TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);

  23.         //初始化TIM5输入捕获参数
  24.     TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
  25.     TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  26.     TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  27.     TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  28.     TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  29.     TIM_ICInit(TIM5, &TIM5_ICInitStructure);
  30.                
  31.     TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断       
  32.        
  33.     TIM_Cmd(TIM5,ENABLE );         //使能定时器5

  34.     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
  35.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3
  36.         NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;                //子优先级3
  37.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  38.         NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
  39.        
  40. }
 楼主| wangtaohui 发表于 2023-8-20 23:16 | 显示全部楼层
(1)TIM_TimeBaseStructure.TIM_Prescaler=83; //定时器分频,Time5挂载在APB1(42Mhz),因为RCC-DCKCFGR中的TIMPRE位影响(RCC-DCKCFGR寄存器仅适用于 STM32F42xxx 和 STM32F43xxx 设备。在STM32F407默认TIMPRE为0),Time5时钟分频为84Mhz,
 楼主| wangtaohui 发表于 2023-8-20 23:16 | 显示全部楼层
(2)TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; Timex-CR1中的CKD位控制。
9665964e22e599835a.png
 楼主| wangtaohui 发表于 2023-8-20 23:16 | 显示全部楼层
(3)初始化TIM5输入捕获参数
8866664e22e6586f36.png
 楼主| wangtaohui 发表于 2023-8-20 23:17 | 显示全部楼层
Time5的滤波和分频在Timex-CCMR1中进行设置

7066864e22e7213267.png
 楼主| wangtaohui 发表于 2023-8-20 23:17 | 显示全部楼层
  1.     TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断       
  2.        
  3.     TIM_Cmd(TIM5,ENABLE );         //使能定时器5

  4.     NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
 楼主| wangtaohui 发表于 2023-8-20 23:17 | 显示全部楼层
有更新中断和捕获中断两种方式,但是TIM5_IRQn对应全局中断。在stm32f4xx.h中进行配置。
  1.   CAN1_TX_IRQn                = 19,     /*!< CAN1 TX Interrupt                                                 */
  2.   CAN1_RX0_IRQn               = 20,     /*!< CAN1 RX0 Interrupt                                                */
  3.   CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                                */
  4.   CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                                */
  5.   EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                                     */
  6.   TIM1_BRK_TIM9_IRQn          = 24,     /*!< TIM1 Break interrupt and TIM9 global interrupt                    */
  7.   TIM1_UP_TIM10_IRQn          = 25,     /*!< TIM1 Update Interrupt and TIM10 global interrupt                  */
  8.   TIM1_TRG_COM_TIM11_IRQn     = 26,     /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
  9.   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                                    */
  10.   TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                             */
  11.   TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                             */
  12.   TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                             */
  13.   I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                              */
  14.   I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                              */
  15.   I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                              */
  16.   I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                              */
  17.   SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                             */
  18.   SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                             */
  19.   USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                                           */
  20.   USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                                           */
  21.   USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                                           */
  22.   EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                                   */
  23.   RTC_Alarm_IRQn              = 41,     /*!< RTC Alarm (A and B) through EXTI Line Interrupt                   */
  24.   OTG_FS_WKUP_IRQn            = 42,     /*!< USB OTG FS Wakeup through EXTI line interrupt                     */
  25.   TIM8_BRK_TIM12_IRQn         = 43,     /*!< TIM8 Break Interrupt and TIM12 global interrupt                   */
  26.   TIM8_UP_TIM13_IRQn          = 44,     /*!< TIM8 Update Interrupt and TIM13 global interrupt                  */
  27.   TIM8_TRG_COM_TIM14_IRQn     = 45,     /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */
  28.   TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                                    */
  29.   DMA1_Stream7_IRQn           = 47,     /*!< DMA1 Stream7 Interrupt                                            */
  30.   FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                             */
  31.   SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                             */
  32.   TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                             */
  33.   SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                             */
  34.   UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                                            */
  35.   UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                                            */
  36.   TIM6_DAC_IRQn               = 54,     /*!< TIM6 global and DAC1&2 underrun error  interrupts                 */
  37.   TIM7_IRQn                   = 55,     /*!< TIM7 global interrupt                                             */
  38.   DMA2_Stream0_IRQn           = 56,     /*!< DMA2 Stream 0 global Interrupt                                    */
  39.   DMA2_Stream1_IRQn           = 57,     /*!< DMA2 Stream 1 global Interrupt                                    */
  40.   DMA2_Stream2_IRQn           = 58,     /*!< DMA2 Stream 2 global Interrupt                                    */
  41.   DMA2_Stream3_IRQn           = 59,     /*!< DMA2 Stream 3 global Interrupt                                    */
  42.   DMA2_Stream4_IRQn           = 60,     /*!< DMA2 Stream 4 global Interrupt                                    */
  43.   ETH_IRQn                    = 61,     /*!< Ethernet global Interrupt                                         */
  44.   ETH_WKUP_IRQn               = 62,     /*!< Ethernet Wakeup through EXTI line Interrupt                       */
  45.   CAN2_TX_IRQn                = 63,     /*!< CAN2 TX Interrupt                                                 */
  46.   CAN2_RX0_IRQn               = 64,     /*!< CAN2 RX0 Interrupt                                                */
  47.   CAN2_RX1_IRQn               = 65,     /*!< CAN2 RX1 Interrupt                                                */
  48.   CAN2_SCE_IRQn               = 66,     /*!< CAN2 SCE Interrupt                                                */
  49.   OTG_FS_IRQn                 = 67,     /*!< USB OTG FS global Interrupt                                       */
  50.   DMA2_Stream5_IRQn           = 68,     /*!< DMA2 Stream 5 global interrupt                                    */
  51.   DMA2_Stream6_IRQn           = 69,     /*!< DMA2 Stream 6 global interrupt                                    */
  52.   DMA2_Stream7_IRQn           = 70,     /*!< DMA2 Stream 7 global interrupt                                    */
  53.   USART6_IRQn                 = 71,     /*!< USART6 global interrupt                                           */
  54.   I2C3_EV_IRQn                = 72,     /*!< I2C3 event interrupt                                              */
  55.   I2C3_ER_IRQn                = 73,     /*!< I2C3 error interrupt                                              */
  56.   OTG_HS_EP1_OUT_IRQn         = 74,     /*!< USB OTG HS End Point 1 Out global interrupt                       */
  57.   OTG_HS_EP1_IN_IRQn          = 75,     /*!< USB OTG HS End Point 1 In global interrupt                        */
  58.   OTG_HS_WKUP_IRQn            = 76,     /*!< USB OTG HS Wakeup through EXTI interrupt                          */
  59.   OTG_HS_IRQn                 = 77,     /*!< USB OTG HS global interrupt                                       */
  60.   DCMI_IRQn                   = 78,     /*!< DCMI global interrupt                                             */
  61.   CRYP_IRQn                   = 79,     /*!< CRYP crypto global interrupt                                      */
  62.   HASH_RNG_IRQn               = 80,     /*!< Hash and Rng global interrupt                                     */
  63.   FPU_IRQn                    = 81      /*!< FPU global interrupt                                              */
  64.   
 楼主| wangtaohui 发表于 2023-8-20 23:17 | 显示全部楼层
注意:当中断向量不对应所有中断时,应选择对应的中断向量。例如Time1对应多种中断向量,在编写时要选择对应的中断向量。
 楼主| wangtaohui 发表于 2023-8-20 23:17 | 显示全部楼层
  1.   TIM1_BRK_TIM9_IRQn          = 24,     /*!< TIM1 Break interrupt and TIM9 global interrupt                    */
  2.   TIM1_UP_TIM10_IRQn          = 25,     /*!< TIM1 Update Interrupt and TIM10 global interrupt                  */
  3.   TIM1_TRG_COM_TIM11_IRQn     = 26,     /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
  4.   TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt     
帛灿灿 发表于 2024-2-21 08:27 | 显示全部楼层

当电路出现异常过压并达到其击穿电压时
Bblythe 发表于 2024-2-21 09:30 | 显示全部楼层

例如下图中在SPI信号线上串联电阻就是为了改善匹配情况
周半梅 发表于 2024-2-21 11:26 | 显示全部楼层

即原/副边交错通断。
Pulitzer 发表于 2024-2-21 12:29 | 显示全部楼层

般只要关注值、精度、额度功率
童雨竹 发表于 2024-2-21 14:25 | 显示全部楼层

然后将其用作在PCB组装过程中放置在另一个板上的独立部件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

529

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部