浅谈STM32高级定时器TIM1的OSSR和OSSI、OISX,OISXN的作用和区别

谈到STM32的高级定时器,可能大家都比较头痛,因为这里面的关系总是纠缠在一起,剪不断理还乱,特别是OSSR和OSSI位,总感觉模模糊糊,不知所云,借助空余时间,给这几个知识点做一个总结。首先,在STM32中文参考手册里面提到,

OSSR:运行模式下“关闭状态”选择

该位用于MOE=1且通道为互补输出。没有互补输出的定时器中不存在OSSR位

0:当定时器不工作时,禁止OC/OCN输出(OC/OCN使能信号=0)

1:当定时器不工作时,一旦CCXE=1或CCXNE=1,首先开启OC/OCN并输出无效电平,然后置OC/OCN使能输出=1

这是stm32手册上的解释,但是很多人也许会有这样的困惑,那何为定时器不工作呢?我的理解就是,定时器的某个输出通道没有使能输出,打个比方:如果TIM1的通道1 CC1E=1,而CC1NE=0,此时就是stm32手册上所讲的“不工作”,其实说实在话,这个解释个人感觉是不能理解的,不工作很多人会理解为CR1的CEN=0;计数器停止工作,其实这是不正确的。

讲了这么多,大家可能会问,那OSR位到底是干什么的,有什么作用呢?那我们来看这个


当MOE=1的时候,OSSR=1 CCXE=0 CCXNE=1时,我们发现本来OCX通道被禁止使能,此时的输出状态却是OCX=CCXP,OCX_EN=1,OCX输出被使能了,并且输出的电平由CCXP决定,只是这种情况下互补输出通道必须有一个通道被使能,也就验证了手册上的描述  1:当定时器不工作时,一旦CCXE=1或CCXNE=1,首先开启OC/OCN并输出无效电平,然后置OC/OCN使能输出=1,如果互补的两个通道都禁止,则输出禁止,这就是OSSR位对整个定时器的影响。

我们可以通过一段程序加以理解,



//通过TIM1的CH1输出互补的两个信号
//通过TIM8的CH1输出做刹车信号
void TIM1_configration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; 
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 | RCC_APB2Periph_GPIOC, ENABLE);
	
	
	//TIM1: PA8为CH1_OC1 PB13为CH1_OC1N PB12为刹车信号输入端
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_Init(GPIOB, &GPIO_InitStructure); //PB13和PA8配置为复用推挽输出		
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;	
	GPIO_Init(GPIOB, &GPIO_InitStructure); //PB12做TIM1_BKIN		
	//TIM8:PC7位OC2输出 用作刹车信号
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;	
	GPIO_Init(GPIOC, &GPIO_InitStructure); //PC7	

	//CH1_OC2通道配置 用作刹车信号输出
	TIM8->PSC = 899; //80KHz频率
	TIM8->ARR = 20000; //计时0.25s 
	TIM8->CNT = 0X00;
	TIM8->CCMR1 &= ~(0X03<<8);
	TIM8->CCMR1 |= 1<<10;
	TIM8->CCMR1 |= 0X06<<12; //PWM输出模式1
	TIM8->CCR2 |= 10000; //占空比50%
	TIM8->CCER |= 1<<4; //OC2输出使能
	TIM8->DIER = 0X00;
	TIM8->SR = 0X00;
	TIM8->BDTR |= 1<<15; 
	TIM8->CR1 = 0X01; //使能计数器	
	
	//TIM1:CH1_OC通道配置
	//时基单元配置
	TIM1->PSC = 0; //80KHz频率
	TIM1->ARR = 5000; //计时0.5ms 
	TIM1->CNT = 0X00;
	TIM1->DIER = 0X00; //无中断
	TIM1->CR2 |= (0<<9 | 0<<8); //设置OIS1=0 OIS1N = 0 
	TIM1->SR = 0X00; //SR设置缺省值
	TIM1->CCMR1 |= 0X74; //pwm2模式 CC1输出
	TIM1->CCER |= 0X09; //使能CC1E 禁止CC1EN
	TIM1->CCR1 = 2000; //占空比20%
	TIM1->BDTR = 0XFFE2; //死区时间10.9us 高电平刹车
	TIM1->CR1 = 0X201; //使能计数器
}


这里我们通过使能CC1E而禁止CC1NE,实验现象表明,CC1NE首先是=CCXP,然后被由OSSR和OSSI确定的模式拉到相应的空闲模式,实现对应的波形,如下


到此,总结完毕


  • 15
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
帮我将代码修改为标准库 void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc) { TIM_OC_InitTypeDef sConfigOC ; g_atimx_cplm_pwm_handle.Instance = ATIM_TIMX_CPLM; /* 定时器x / g_atimx_cplm_pwm_handle.Init.Prescaler = psc; / 定时器预分频系数 / g_atimx_cplm_pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP; / 向上计数模式 / g_atimx_cplm_pwm_handle.Init.Period = arr; / 自动重装载值 / g_atimx_cplm_pwm_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; / 时钟分频因子 / g_atimx_cplm_pwm_handle.Init.RepetitionCounter = 0; / 重复计数器寄存器为0 / g_atimx_cplm_pwm_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; / 使能影子寄存器TIMx_ARR / HAL_TIM_PWM_Init(&g_atimx_cplm_pwm_handle) ; / 设置PWM输出 / sConfigOC.OCMode = TIM_OCMODE_PWM1; / PWM模式1 / sConfigOC.Pulse = 0; / 比较值为0 / sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; / OCy 低电平有效 / sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW; / OCyN 低电平有效 / sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; / 不使用快速模式 / sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; / 主通道的空闲状态 / sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; / 互补通道的空闲状态 / HAL_TIM_PWM_ConfigChannel(&g_atimx_cplm_pwm_handle, &sConfigOC, ATIM_TIMX_CPLM_CHY); / 配置后默认清CCER的互补输出位 / / 设置死区参数,开启死区中断 / sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE; / OSSR设置为1 / sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; / OSSI设置为0 / sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; / 上电只能写一次,需要更新死区时间时只能用此值 / sBreakDeadTimeConfig.DeadTime = 0X0F; / 死区时间 / sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; / BKE = 0, 关闭BKIN检测 / sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW; / BKP = 1, BKIN低电平有效 / sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; / 使能AOE位,允许刹车后自动恢复输出 / HAL_TIMEx_ConfigBreakDeadTime(&g_atimx_cplm_pwm_handle, &sBreakDeadTimeConfig); / 设置BDTR寄存器 */ }
06-09
以下是修改后的标准库代码: ``` void atim_timx_cplm_pwm_init(uint16_t arr, uint16_t psc) { TIM_HandleTypeDef g_atimx_cplm_pwm_handle; TIM_OC_InitTypeDef sConfigOC; TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; g_atimx_cplm_pwm_handle.Instance = ATIM_TIMX_CPLM; g_atimx_cplm_pwm_handle.Init.Prescaler = psc; g_atimx_cplm_pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP; g_atimx_cplm_pwm_handle.Init.Period = arr; g_atimx_cplm_pwm_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; g_atimx_cplm_pwm_handle.Init.RepetitionCounter = 0; g_atimx_cplm_pwm_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; HAL_TIM_PWM_Init(&g_atimx_cplm_pwm_handle); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW; sConfigOC.OCNPolarity = TIM_OCNPOLARITY_LOW; sConfigOC.OCFastMode = TIM_OCFAST_ENABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; HAL_TIM_PWM_ConfigChannel(&g_atimx_cplm_pwm_handle, &sConfigOC, ATIM_TIMX_CPLM_CHY); sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_ENABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0X0F; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(&g_atimx_cplm_pwm_handle, &sBreakDeadTimeConfig); } ``` 注意:以上代码是基于您提供的代码进行修改的,没有进行实际测试,可能需要根据实际情况进行调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值