TIM输出比较的三种模式

2023-05-16

TIM输出比较的三种模式

----------------------------------------------------------------------------------------------------------
此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。
当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:
● 将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER寄存器中的
CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平
(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻
转(OCxM=011)。
● 设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。
● 若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。
● 若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位
选择DMA请求功能),则产生一个DMA请求。
TIMx_CCMRx中的OCxPE位选择TIMx_CCRx寄存器是否需要使用预装载寄存器。


设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。

若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCXIE位),则产生一个中断。

若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位选择DMA请求功能),则产生一个DMA请求。
TIMx_CCMRx中的OCxPE位选择TIMx_CCRx寄存器是否需要使用预装载寄存器。
在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。
同步的精度可以达到计数器的一个计数周期。输出比较模式(在单脉冲模式下)也能用来输出一个单脉冲。
输出比较模式的配置步骤:

1.
选择计数器时钟(内部,外部,预分频器)
2.
将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中
3.
如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。
4.
选择输出模式,例如:必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和CCxE=’1’,当计数器CNT与CCRx匹配时翻转OCx的输出管脚,CCRx预装载未用,开启OCx输出且高电平有效。
5.
设置TIMx_CR1寄存器的CEN位启动计数器
TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)

程序如下:

  TIM_TimeBaseStructure.TIM_Period = 65535;         
  TIM_TimeBaseStructure.TIM_Prescaler = 0;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 
  TIM_PrescalerConfig(TIM2, 35999, TIM_PSCReloadMode_Immediate);

 
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;//这个地方就是改比较模式的

   但是由于比较模式无论选哪个对于产生中断的作用是一样的,所以选TIMING都可以       
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;         
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val; 
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);//

TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。这里设置为Disable

就是为了后面在中断服务子程序可以修改TIMx_CCR实时起作用~

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;         
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;         
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_4;         
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);
 
  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
 
  TIM_ARRPreloadConfig(TIM2, ENABLE);//TIM_OCPreload_Enable

 
  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);

    // STM3210B-LK1,  set PC.04 - PC.07
  GPIO_SetBits(GPIOC, GPIO_Pin_4 |GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);

 
  TIM_Cmd(TIM2, ENABLE);

  while (1)
  {
  } 
}

中断服务子程序:

 


void TIM2_IRQHandler(void)
  {  u16 capture;
     u16 CCR1_Val = 1000;
     u16 CCR2_Val = 500;
     u16 CCR3_Val = 250;
     u16 CCR4_Val = 125;

  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
   
    capture = TIM_GetCapture1(TIM2);
    TIM_SetCompare1(TIM2, capture + CCR1_Val);

   设置TIMx捕获比较1寄存器值然后动态修改其CCR的值 使整个程序一直进行下去
    
    // PC.04
    GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_4)));
 
  }

  else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM2);
    TIM_SetCompare2(TIM2, capture + CCR2_Val);
 
    // PC.05
    GPIO_WriteBit(GPIOC, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_5)));
   
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
    capture = TIM_GetCapture3(TIM2);
    TIM_SetCompare3(TIM2, capture + CCR3_Val);
  
    // PC.06
    //GPIO_ResetBits(GPIOC, GPIO_Pin_6);
     GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));
  }
  else
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
    capture = TIM_GetCapture4(TIM2);
    TIM_SetCompare4(TIM2, capture + CCR4_Val);
     
    // PC.07
   // GPIO_ResetBits(GPIOC, GPIO_Pin_7);
     GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));

  }
}


------------------------------------------------------------------------------------------------------------------

在STM32的某些应用中,用户有周期性执行某些程序的要求,使用定时器可以产生固定的时间周期,满足 这样的需求。

STM32相关特征:
STM32高级定时器TIM1、TIM8,通用定时器TIM2、TIM3、TIM4、TIM5;
定时器最大时钟72MHz,配合预分频,提供灵活的时钟周期;
每个TIM有4个独立捕获/比较通道,DMA/中断功能;
通道工作在输出比较定时模式,一个TIM至多可以提供4个不同的定时周期。

 

原理
TIM某输出/捕获通道工作在输出比较定时模式
计数器计数至比较值时产生中断,在中断中刷新捕获比较寄存器,这样在相同时间间隔后可产生下一次中断


TIM2时钟设置为36MHz,预分频设置为2,使用输出比较-翻转模式(Output Compare Toggle Mode)。

TIM2计数器时钟可表达为:TIM2 counter clock = TIMxCLK / (Prescaler +1) = 12 MHz

设置TIM2_CCR1寄存器值为32768,则CC1更新频率为TIM2计数器时钟频率除以CCR1寄存器值,为366.2 Hz。因此,TIM2通道1可产生一个频率为183.1 Hz的周期信号。

同理,根据寄存器TIM2_CCR2 、TIM2_CCR3和 TIM2_CCR4的值,TIM2通道2可产生一个频率为366.3 Hz的周期信号;TIM2通道3可产生一个频率为732.4 Hz的周期信号;TIM2通道4可产生一个频率为1464.8 Hz的周期信号。

#include "stm32f10x_lib.h"



TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
vu16 CCR1_Val = 32768;
vu16 CCR2_Val = 16384;
vu16 CCR3_Val = 8192;
vu16 CCR4_Val = 4096;
ErrorStatus HSEStartUpStatus;


void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
   


int main(void)
{
#ifdef DEBUG
  debug();
#endif

 
  RCC_Configuration();

 
  NVIC_Configuration();
 
 
  GPIO_Configuration();

 

 
  TIM_TimeBaseStructure.TIM_Period = 65535;   //这里必须是65535
     
  TIM_TimeBaseStructure.TIM_Prescaler = 2;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;  //管脚输出模式:翻转(TIM输出比较触发模式)
   
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;         
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;   //翻转周期

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//TIM输出比较极性低

  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);//失能TIMx在CCR1上的预装载寄存器

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;         
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;         
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_4;         
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
 
 
  TIM_Cmd(TIM2, ENABLE);

 
  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);

  while (1)
  {
  } 
}


void RCC_Configuration(void)
 
 
  RCC_DeInit();

 
  RCC_HSEConfig(RCC_HSE_ON);

 
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
   
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

   
    FLASH_SetLatency(FLASH_Latency_2);
 
   
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
 
   
    RCC_PCLK2Config(RCC_HCLK_Div1);

   
    RCC_PCLK1Config(RCC_HCLK_Div4);

   
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

   
    RCC_PLLCmd(ENABLE);

   
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

   
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

   
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }

 
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}


void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
}


void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
#ifdef  VECT_TAB_RAM 
 
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else 
 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
#endif
 
 
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; 
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

#ifdef  DEBUG

void assert_failed(u8* file, u32 line)
{
 

  while (1)
  {
  } 
}
#endif

 

 

 

 

中断服务:



void TIM2_IRQHandler(void)
{
 
  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//检查指定的TIM中断发生与否
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 );//清除TIMx的中断待处理位
 capture = TIM_GetCapture1(TIM2);
 TIM_SetCompare1(TIM2, capture + CCR1_Val );//设置TIMx自动重装载寄存器值
        //将TIM2_CC1的值增加CCR1_Val,使得下一个TIM事件也需要CCR1_Val个脉冲,

  }
 
 
  if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {
     TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
 capture = TIM_GetCapture2(TIM2);
    TIM_SetCompare2(TIM2, capture + CCR2_Val);
  } 

 
  if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
 capture = TIM_GetCapture3(TIM2);
    TIM_SetCompare3(TIM2, capture + CCR3_Val);
  }

 
  if (TIM_GetITStatus(TIM2, TIM_IT_CC4) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
 capture = TIM_GetCapture4(TIM2);
    TIM_SetCompare4(TIM2, capture + CCR4_Val);
  }  
}


----------------------------------------------------------------------------------------------------------
TIMx的输出比较模式是用来控制一个输出波形或者指示何时一段给定的的时间已经到时。
当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:

将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER寄存器中的CCxP位)定义的值输出到对应的管脚上。在比较匹配时,输出管脚可以保持它的电平(OCxM=000)、

被设置成有效电平(OCxM=001)、

被设置成无有效电平(OCxM=010)

或进行翻转(OCxM=011)。

 

 

这几种模式对应定义在库中

TIM_OCInitTypeDef structure
TIM_OCInitTypeDef定义于文件“stm32f10x_tim.h”:
typedef struct
{
u16 TIM_OCMode;
u16 TIM_Channel;
u16 TIM_Pulse;
u16 TIM_OCPolarity;
} TIM_OCInitTypeDef;

 

 

TIM_OCMode选择定时器模式。该参数取值见下表。

STM32开发板学习日记-[4]TIM输出比较的三种模式



设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。

若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCXIE位),则产生一个中断。

若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位选择DMA请求功能),则产生一个DMA请求。
TIMx_CCMRx中的OCxPE位选择TIMx_CCRx寄存器是否需要使用预装载寄存器。
在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。
同步的精度可以达到计数器的一个计数周期。输出比较模式(在单脉冲模式下)也能用来输出一个单脉冲。
输出比较模式的配置步骤:

1.
选择计数器时钟(内部,外部,预分频器)
2.
将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中
3.
如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。
4.
选择输出模式,例如:必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和CCxE=’1’,当计数器CNT与CCRx匹配时翻转OCx的输出管脚,CCRx预装载未用,开启OCx输出且高电平有效。
5.
设置TIMx_CR1寄存器的CEN位启动计数器
TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。

 

 

 

这三种模式我都拿板子的例程改了一下 ~

000:冻结。输出比较寄存器TIMx_CCR1与计数器TIMx_CNT间的比较对OC1REF不起作用;也就是Timing模式
001:匹配时设置通道1为有效电平。当计数器TIMx_CNT的值与捕获/比较寄存器1(TIMx_CCR1)相同时,强制OC1REF为高。这个也就是ACTIVE模式
010:匹配时设置通道1为无效电平。当计数器TIMx_CNT的值与捕获/比较寄存器1(TIMx_CCR1)相同时,强制OC1REF为低。这个也就是INACTIVE模式
011:翻转。当TIMx_CCR1=TIMx_CNT时,翻转OC1REF的电平。也就是toggle模式

 

 

程序如下:



 
  TIM_TimeBaseStructure.TIM_Period = 65535;         
  TIM_TimeBaseStructure.TIM_Prescaler = 0;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
 
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

 
  TIM_PrescalerConfig(TIM2, 35999, TIM_PSCReloadMode_Immediate);

 
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;//这个地方就是改比较模式的

   但是由于比较模式无论选哪个对于产生中断的作用是一样的,所以选TIMING都可以       
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;         
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val; 
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);//

TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。这里设置为Disable

就是为了后面在中断服务子程序可以修改TIMx_CCR实时起作用~

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;         
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;         
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);

 
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_4;         
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val; 
 
  TIM_OCInit(TIM2, &TIM_OCInitStructure);
 
  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
 
  TIM_ARRPreloadConfig(TIM2, ENABLE);//TIM_OCPreload_Enable

 
  TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);

    // STM3210B-LK1,  set PC.04 - PC.07
  GPIO_SetBits(GPIOC, GPIO_Pin_4 |GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);

 
  TIM_Cmd(TIM2, ENABLE);

  while (1)
  {
  } 
}

中断服务子程序:

 


void TIM2_IRQHandler(void)
  {  u16 capture;
     u16 CCR1_Val = 1000;
     u16 CCR2_Val = 500;
     u16 CCR3_Val = 250;
     u16 CCR4_Val = 125;

  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
   
    capture = TIM_GetCapture1(TIM2);
    TIM_SetCompare1(TIM2, capture + CCR1_Val);

   设置TIMx捕获比较1寄存器值然后动态修改其CCR的值 使整个程序一直进行下去
    
    // PC.04
    GPIO_WriteBit(GPIOC, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_4)));
 
  }

  else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
    capture = TIM_GetCapture2(TIM2);
    TIM_SetCompare2(TIM2, capture + CCR2_Val);
 
    // PC.05
    GPIO_WriteBit(GPIOC, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_5)));
   
  }
  else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
    capture = TIM_GetCapture3(TIM2);
    TIM_SetCompare3(TIM2, capture + CCR3_Val);
  
    // PC.06
    //GPIO_ResetBits(GPIOC, GPIO_Pin_6);
     GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));
  }
  else
  {
   
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
    capture = TIM_GetCapture4(TIM2);
    TIM_SetCompare4(TIM2, capture + CCR4_Val);
     
    // PC.07
   // GPIO_ResetBits(GPIOC, GPIO_Pin_7);
     GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));

  }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TIM输出比较的三种模式 的相关文章

  • docker容器webui界面之portainer

    docker通常下都是命令行管理 xff0c 不太方便 xff0c web管理能直观一点 xff0c 如果是公司有运维组 xff0c ssh账号也不用给到开发这边 单机安装命令 docker run d p 19000 9000 name
  • Windows 10安装ubuntu18.04双系统(bios和boot manager)

    1 按照网上教程制作系统盘 xff1b 2 在windows下创建空白区 xff0c 为ubuntu分配空间 xff1b 3 用做好的系统盘安装系统 由于各个厂商计算机的bios和boot manager启动键不同 xff0c 自行百度 本
  • OpenCv入门(三)——阈值化处理

    目录 0x01 OTSU 0X02 固定阈值化 0x03 自适应阈值化 0x04 双阈值化 0x05 半阈值化 在图像处理中 xff0c 处理灰度图像的计算量要小于处理彩色图像 xff0c 而二值化图像 xff08 只含灰度值0或1 xff
  • 运行gazebo时出现[Err] [REST.cc:205] Error in REST request

    出现错误 xff1a Err REST cc 205 Error in REST request libcurl 51 SSL no alternative certificate subject name matches target h
  • 安装双系统ubuntu18.04后,不能进入ubuntu界面的解决办法

    某天晚上电脑自动升级了bios xff0c 作为新手小白此时还没有意识到问题 第二天开机发现电脑不仅不能进去ubuntu xff0c 连bios都进不去了 多次开机关机重复后 xff0c 灵机一动改成重启 xff0c 终于有进入bios的界
  • Python中集合的使用

    1 set add xff09 xff1a 向集合中添加元素 xff0c 是整体添加进集合set中 xff1b set update 向集合中添加元素 xff0c update是将字符串中的拆分成字符进行追加 xff1b eg s1 61
  • Resource not found问题

    在运行ros中的xacro文件时出现的如下问题 resource not found mbot description ROS path 0 61 opt ros melodic share ros ROS path 1 61 opt ro
  • 启动Moveit Setup Assistant出错

    1 首先安装moveit配置助手 xff0c 我的ubuntu版本是18 04 xff0c 所以运行 xff1a sudo apt get install ros melodic moveit 填写个人密码安装 source opt ros

随机推荐

  • 形参如何改变实参

    把实参数组传递给函数 xff0c 则形参从数组那里得到了起始地址 xff0c 因此数组与实参数组共占了同一段内存单元 xff0c 在函数调用期间 xff0c 该变了形参数组的值 xff0c 也就改变了实参数组的值 例 xff1a int i
  • Linux下ARM 和单片机的串口通信设计

    摘要 xff1a 介绍Linux 环境下串口通信的设计方法和步骤 xff0c 并介绍了ARM9 微处理器s3c2440 在Linux 下和C8051Fxxx 系列单片机进行串行通信的设计方法 xff0c 给出了硬件连接和通信程序流程图 该方
  • AT+CSQ信号质量指示含义

    AT 43 CSQ 命令解释 xff1a 检查网络信号强度和SIM卡情况 命令格式 xff1a AT 43 CSQ lt CR gt 命令返回 xff1a AT 43 CSQ lt rssi gt lt ber gt 其中 lt rssi
  • MIPI接口和DVP接口的区别及优点

    DVP是并口 xff0c 需要PCLK VSYNC HSYNC D 0 xff1a 11 可以是8 10 12bit数据 xff0c 看ISP或baseband是否支持 xff1b MIPI是LVDS xff0c 低压差分串口 只需要要CL
  • 立体耳机插头和四极耳机插头三段、四段处的区别

    立体 耳机插头 和四极 耳机插头 三段 四段处的区别 在日常生活中 xff0c 通常较为细心的消费者就会发现 xff0c 适用于NOKIA手机的 耳机插头 和适用于iphone的 耳机插头 是互补兼容的 xff0c 但是iphone HTC
  • Nuttx学习笔记(一)

    最近在工作上需要用到这个nuttx实时操作系统 xff0c 并且对这个系统进行学习记录以及记录下自己所遇到过的问题 目录 一 环境配置 xff08 1 xff09 基础环境 xff08 2 xff09 下载nuttx xff08 3 xff
  • kernel command line 参数详解

    Linux内核在启动的时候 xff0c 能接收某些命令行选项或启动时参数 当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值 xff0c 可以通过这种方式手动将这些参数传递给内核 如果不使用启动管理器 xff0c 比
  • Internal error: Oops:

    01 02 00 02 24 110 SysRq Emergency Remount R O 01 02 00 02 24 221 mdss fb release all unknown process adbd pid 61 415 mf
  • /proc/meminfo详解

    cat proc meminfo MemTotal 2052440 kB 总内存 MemFree 50004 kB 空闲内存 Buffers 19976 kB 给文件的缓冲大小 Cached 436412 kB 高速缓冲存储器 http b
  • 浅谈Camera工作原理

    一 摄像头简介 摄像头 xff08 CAMERA xff09 又称为电脑相机 电脑眼等 xff0c 它作为一种视频输入设备 xff0c 在过去被广泛的运用于视频会议 远程医疗及实时监控等方面 近年以来 xff0c 随着互联网技术的发展 xf
  • EVT、DVT、PVT、MP等简介

    PLM xff08 Product Lifecycle Management xff09 System xff1a PLM是协助产品能够顺利完成在新产品开发 xff08 NPI xff1a New Product Introduction
  • UbuntuServer 12.04 svn服务的创建

    以下是我整理后的步骤 xff1a 1 安装必要的软件包 xff1a sudo apt get install subversion sudo apt get install libapache2 svn 2 创建一个SVN账号和SVN组 x
  • 在ESXi上把OpenWrt变成真正的路由器

    前面把openwrt装到了VMware workstation上 xff0c 本来想把openwrt直接安装到ESXi的 xff0c 但是转换镜像的时候不能生成OVF或者OVA文件 所以就先把镜像安装到了workstation xff0c
  • 电源和电池两种电源选一的芯片

  • can总线中的SOF、SRR、IDE和RTR数据位都是指什么

    帧起始 SOF xff1a 帧起始 SOF 标志着数据帧和远程帧的起始 xff0c 仅由一个 显性 位组成 仲裁域由标识符和RTR位组成 xff0c 标准帧格式与扩展帧格式的仲裁域格式不同 标准格式里 xff0c 仲裁域由1l位标识符和RT
  • linux makefile的一些变量

  • Nuttx学习笔记(二)————在STM32上部署Nuttx系统

    目录 一 平台配置 二 在ubuntu下使用串口来烧录至目标文件至STM32F07 xff08 一 xff09 ubuntu下stm32flash工具下载 xff08 二 xff09 Ubuntu20 04安装stm32开发环境 xff08
  • linux种Makefile一些自动化变量

  • arm 中的三级流水线中的PC值和当前指令的关系

  • TIM输出比较的三种模式

    TIM输出比较的三种模式 此项功能是用来控制一个输出波形 xff0c 或者指示一段给定的的时间已经到时 当计数器与捕获 比较寄存器的内容相同时 xff0c 输出比较功能做如下操作 xff1a 将输出比较模式 TIMx CCMRx寄存器中的O