STM8S定时器TIM1时基配置与计数模式解析

需积分: 15 50 下载量 131 浏览量 更新于2024-08-08 收藏 6.09MB PDF 举报
"STM8S时基定时器TIM1的工作原理及配置" STM8S系列微控制器中的TIM1是一个高级定时器,它具有多种功能和灵活的配置选项,适用于各种复杂的定时任务。在“TIM1时基示意图-a2-漫画相对论”中,主要讨论了TIM1时基定时器的基本结构和工作方式。 TIM1时基定时器的核心是计数器,它可以被不同的时钟源驱动。CK_PSC预分频时钟可以选择系统主时钟f_MASTER、外部时钟输入TIx、外部触发输入ETR或内部触发输入ITRx作为源。这些时钟源的选择通过时钟/触发控制器完成,该控制器的具体配置将在后续章节详细阐述。当选择外部时钟输入TIx作为时钟源时,计数器会在输入信号的每个上升沿或下降沿增加计数;而选择外部触发输入ETR时,计数器的增减则由ETR信号的上升沿或下降沿触发。 预分频器是TIM1的一个关键组件,它将CK_PSC时钟进行16位分频,生成用于计数器计数的CK_CNT时钟。预分频系数可以从1到65536的任何整数,这个值存储在预装载寄存器中,一旦写入低8位,就会立即被加载到影子寄存器。然而,新的预分频值只有在发生更新事件后才会生效。在访问TIM1的16位寄存器时,需要遵循先写高8位再写低8位的顺序。 TIM1计数器支持多种计数模式:向上计数、向下计数以及双向计数。在向下计数模式下,计数器从自动装载寄存器TIMx_ARR的值开始,向下计数至0,然后再次从自动装载值开始,这一过程会触发一个计数器向下溢出事件。如果在TIM1_CR1寄存器中的UDIS位被清除,还会触发更新事件。 STM8S开发涉及使用STVD(ST Visual Develop)和IAR等软件开发平台,以及固件库函数进行编程。对于初学者,了解STM8S的GPIO(通用输入输出)和时钟管理等基本概念是至关重要的。GPIO的配置包括设置端口的数据方向、输出数据、输入状态以及控制寄存器等,而时钟管理则涉及选择合适的主时钟源,如高速外部晶振HSE或高速内部RC振荡器HSI,以满足不同应用对时序精度和功耗的要求。 在实际应用中,开发者可能需要使用库函数简化操作,例如使用GPIO库函数来控制LED的亮灭或读取独立按键的状态,或者利用时钟管理库配置系统时钟。掌握STM8S的这些基本知识和操作方法,对于进行有效的嵌入式系统开发至关重要。

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