STM8S时钟与GPIO管理:TIM2/TIM3寄存器详解

需积分: 15 50 下载量 82 浏览量 更新于2024-08-08 收藏 6.09MB PDF 举报
"STM8S系列单片机的TIM2/TIM3定时器相关寄存器详解" 在STM8微控制器中,TIM2和TIM3是通用定时器,它们具有多种功能,广泛应用于计数、脉冲宽度调制(PWM)、定时等任务。STM8S从入门到精通的资料中,特别提到了TIM2/TIM3的相关寄存器——TIMx_CR1(控制寄存器1),它是理解定时器工作原理的关键。 控制寄存器1 TIMx_CR1 包含多个位,用于配置和控制定时器的操作。其中: - BIT7:APRE(Auto-Preload Register)自动预装载使能位。当APRE置位时,定时器的自动预装载功能被激活,TIM4_ARR(自动重载寄存器)的值会被加载到计数器(TIMx_CNT)之前。如果APRE清零,自动预装载功能关闭,计数器不再从缓冲区获取值。 - BIT6 至 BIT4:这些位是保留位,不应由用户编程,通常保持为0。 - BIT3:UDIS(Update Disable)更新禁用位。当UDIS置位时,定时器的更新事件被禁止,即不允许对TIMx_RCR(重载值寄存器)和TIMx_ARR进行更新。反之,UDIS清零时,允许更新。 - BIT2:URS(Update Request Source)更新请求源。URS位用于选择更新事件的触发条件,若URS为0,仅在定时器计数器到达ARR时产生更新事件;若URS为1,则更新事件由软件或特定的外部事件触发。 - BIT1:OPM(One Pulse Mode)单脉冲模式。当OPM置位时,定时器工作在单脉冲模式,计数器仅执行一次递增,然后停止,等待下一次启动。 - BIT0:CEN(Counter Enable)计数器使能位。CEN位是定时器启动/停止的开关,置位时启动定时器,清零则停止定时器。 STM8的开发涉及多种工具,如STVD(ST Visual Develop)、IAR Embedded Workbench以及固件库。这些工具提供了对寄存器的直接访问和高级的库函数,简化了开发过程。例如,使用库函数可以方便地控制GPIO和定时器,而不需要直接操作寄存器,这使得代码更易于理解和维护。 STM8S的GPIO(通用输入/输出)寄存器如Px_ODR、Px_IDR、Px_DDR、Px_CR1和Px_CR2,分别用于设置输出数据、读取输入数据、定义数据方向、控制端口特性及配置中断等功能。在实际应用中,可以通过这些寄存器实现LED的控制和独立按键的读取。 时钟管理是STM8S中的重要部分,包括主时钟源的选择和配置,如高速外部晶振(HSE)、高速内部RC振荡器(HSI)等。时钟源的选择直接影响到系统性能和定时器的工作精度。 TIM2/TIM3的控制寄存器是STM8S单片机定时功能的核心,通过理解并正确配置这些寄存器,开发者可以实现精确的定时任务。同时,GPIO和时钟管理也是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 上传