STM8S定时器TIM2/TIM3应用详解

需积分: 15 50 下载量 148 浏览量 更新于2024-08-08 收藏 6.09MB PDF 举报
"STM8S从入门到精通—TIM2/TIM3应用实例" 在STM8微控制器中,TIM2和TIM3是16位通用定时器,具备比基本型定时器更为广泛的功能。它们可以用于生成精确的时间间隔,执行脉宽调制(PWM)输出,捕获输入信号的定时信息,以及实现定时中断等任务。这些定时器不仅适用于简单的计数,还支持向上计数模式,允许开发者根据应用需求进行灵活配置。 TIM2和TIM3的特性包括: 1. **16位计数器**:提供较大的计数值范围,可以实现较长时间的延时或测量较大时间间隔。 2. **预分频器**:允许用户调整计数器的时钟频率,从而实现不同时间分辨率的定时。 3. **自动重载功能**:当计数器达到预设的最大值时,会自动重置为零,并可触发中断或事件。 4. **中心对齐模式**:允许定时器在达到预设值时产生中断,而非仅在计数器到达零或最大值时。 5. **多种工作模式**:包括正常计数、单次触发、连续触发、PWM输出等。 6. **输入捕获和比较通道**:可以捕获外部信号的定时信息,或者与预设值进行比较以生成PWM输出。 在STM8的开发过程中,可以使用STVD(STMicroelectronics Visual Develop)或IAR Embedded Workbench集成开发环境(IDE),结合寄存器操作或固件库函数来配置和控制TIM2/TIM3。 对于寄存器操作,常见的配置包括: - **TIMx_CR1**(Control Register 1):用于启用/禁用定时器,选择工作模式,设置更新事件发生时的行为等。 - **TIMx_CR2**:提供额外的控制选项,如选择输入捕获极性,设置中心对齐模式等。 - **TIMx_PSC**(Prescaler Register):用于设置预分频器的值。 - **TIMx_ARR**(Auto-Reload Register):设置自动重载值,即计数器的上限。 - **TIMx_CCRx**(Capture/Compare Register x):每个定时器通道有相应的CCR寄存器,用于设置比较值,触发中断或PWM输出。 对于固件库函数,例如STM8的标准外设库(Standard Peripherals Library),有专门的API函数供开发者使用,如`TIM_TimeBaseInit()`用于初始化定时器基础设置,`TIM_ICInit()`用于设置输入捕获,`TIM_OCInit()`用于设置输出比较,以及`TIM_Cmd()`用于启用或禁用定时器。 在实际应用中,比如PWM输出,可以先配置TIM2/TIM3的预分频器、自动重载值,然后设置比较寄存器的值来确定PWM周期和占空比。对于输入捕获,可以设置TIMx_IER(Interrupt Enable Register)中的捕获中断标志,当外部信号改变时,定时器会捕获这一时刻,并通过中断服务程序处理捕获的值。 在STM8S的开发过程中,理解并熟练掌握TIM2/TIM3的工作原理和配置方法,能够帮助开发者高效地实现各种时间相关的功能,如电机控制、通信协议时序控制、实时系统调度等。无论是通过寄存器直接编程还是利用库函数,都需要对STM8的时钟系统有深入理解,因为时钟频率直接影响定时精度和性能。同时,确保正确配置中断服务程序,以处理定时器产生的事件,是成功应用定时器的关键。

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 上传