STM32F101xx/F103xx固件库函数:TIM模块详解

需积分: 44 224 下载量 117 浏览量 更新于2024-08-07 收藏 2.55MB PDF 举报
“STM32 固件库 中文版” STM32固件库是针对32位ARM微控制器STM32F101xx和STM32F103xx设计的一个功能丰富的函数库,包含了这些微控制器所有外设的操作函数、数据结构和宏。库中的每个外设驱动都有对应的函数集,涵盖了外设的所有功能,旨在简化用户对微控制器外设的使用,从而缩短开发周期并降低成本。 TIM库是STM32固件库中的一个重要部分,它提供了对定时器(TIM)的全面控制。TIM库函数主要用于配置和管理STM32中的定时器功能,包括时间基数设置、输出比较(OC)、输入捕获(IC)以及中断和DMA配置等。 1. `TIM_DeInit`函数用于将TIMx寄存器重置为默认值,这是在初始化定时器前通常会执行的步骤。 2. `TIM_TimeBaseInit`函数根据提供的结构体`TIM_TimeBaseInitStruct`中的参数初始化TIM的时间基数,设置计数器的工作频率、周期和分频因子等。 3. `TIM_OCInit`和`TIM_ICInit`分别用于配置TIM的输出比较和输入捕获功能,可以根据需要设置PWM模式、极性、通道等。 4. `TIM_TimeBaseStructInit`、`TIM_OCStructInit`和`TIM_ICStructInit`为结构体填充默认值,方便快速初始化。 5. `TIM_Cmd`函数用来启用或禁用TIMx外设,控制定时器的运行状态。 6. `TIM_ITConfig`用于开启或关闭TIM的特定中断,如更新中断、比较中断等。 7. `TIM_DMAConfig`和`TIM_DMACmd`则涉及DMA配置,允许定时器触发DMA传输,实现数据的高效传输。 8. `TIM_InternalClockConfig`、`TIM_ITRxExternalClockConfig`和`TIM_TIxExternalClockConfig`等函数用于配置TIM的时钟源,可以选择内部时钟、外部触发输入作为时钟。 9. `TIM_ETRClockMode1Config`和`TIM_ETRClockMode2Config`用于配置外部触发的计数模式,适应不同的系统需求。 10. `TIM_ETRConfig`和`TIM_SelectInputTrigger`允许选择和配置TIM的外部触发源。 11. `TIM_PrescalerConfig`用于设置预分频器的值,影响定时器的实际计数频率。 12. `TIM_CounterModeConfig`可以设置计数器的工作模式,如向上计数、向下计数或中心对齐模式。 13. `TIM_ForcedOCxConfig`系列函数用于强制设置TIM的输出通道电平,常用于PWM输出的初始化。 14. `TIM_ARRPreloadConfig`控制TIM在自动重装载寄存器上的预装载功能,决定何时更新计数器的值。 15. `TIM_SelectCCDMA`选择捕获比较的DMA源,便于通过DMA进行数据处理。 16. `TIM_OCxPreloadConfig`系列函数用于控制各比较通道的预装载寄存器,决定PWM输出的更新方式。 17. `TIM_OCxFastConfig`可以设置输出比较通道的快速响应特性,提高输出响应速度。 STM32固件库的API遵循严格的ANSI-C标准,具有良好的可移植性,并且通过了MISRA-C2004标准的验证,增强了代码的健壮性。此外,库函数的输入值实时检查有助于调试,但可能会增加代码体积和执行时间,在优化阶段可以考虑移除。虽然库函数适用于大多数应用,但对于对代码大小和速度有特殊要求的项目,开发者可以根据具体需求对库函数进行调整。固件库用户手册详细描述了库的架构、安装指导以及每个外设的使用方法,为开发者提供了全面的参考。

void TIM2_PWMShiftInit_3(TypeDef_Tim* Tim) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0}; Tim->Psc=3; Tim->TimeClock=200000000;// Tim->Frequence=2000;// Tim->Duty=0.5; Tim->DT=2000;// Tim->Arr=Tim->TimeClock/(Tim->Psc+1)/Tim->Frequence/2;// // Tim->CH1Ccr=Tim->Arr-(Tim->Arr*Tim->Duty)-Tim->DT/((Tim->Psc+1)*(1000000000.0f/Tim->TimeClock));// Tim->CH2Ccr=Tim->Arr-(Tim->Arr*Tim->Duty); Tim->Htim.Instance = TIM2; Tim->Htim.Init.Prescaler = Tim->Psc; Tim->Htim.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3; Tim->Htim.Init.Period = Tim->Arr; Tim->Htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; Tim->Htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(&Tim->Htim); HAL_TIM_Base_Start_IT(&Tim->Htim);// sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&Tim->Htim, &sClockSourceConfig); HAL_TIM_OC_Init(&Tim->Htim); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&Tim->Htim, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = Tim->CH1Ccr; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;// sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&Tim->Htim, &sConfigOC, TIM_CHANNEL_3); __HAL_TIM_ENABLE_OCxPRELOAD(&Tim->Htim, TIM_CHANNEL_3); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = Tim->CH2Ccr; sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;// sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_OC_ConfigChannel(&Tim->Htim, &sConfigOC, TIM_CHANNEL_4); __HAL_TIM_ENABLE_OCxPRELOAD(&Tim->Htim, TIM_CHANNEL_4); __HAL_RCC_GPIOB_CLK_ENABLE(); /**TIM2 GPIO Configuration PB10 ------> TIM2_CH3 PB11 ------> TIM2_CH4 */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_TIM_PWM_Start(&Tim->Htim, TIM_CHANNEL_3); HAL_TIM_PWM_Start(&Tim->Htim, TIM_CHANNEL_4); } TIM2_PWMShiftInit_3(&MyTim2);是什么意思

2023-04-24 上传