c - stm32f103c8t6上TIM2_CH1有问题

标签 c timer stm32 pwm

我使用 3 个定时器(TIM4_CH1、TIM3_CH1、TIM2_CH1)捕获来自 AURORA9x 的输入 PWM 信号。除了 TIM2_CH1 之外,一切都工作正常。我三天之内都无法解决这个问题。可能你们中的一些人遇到过这个问题。 这里是三个计时器的代码。所有定时器的配置都相同,但 TIM2 不起作用

#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "can.h"
#include "main.h"

void TIM4_Config(void);
void TIM3_Config(void);
void TIM2_Config(void);


uint32_t   DataCapture_TIM4=0,
           DataCapture_TIM3=0,
           DataCapture_TIM2=0;

TIM4_CH1 捕获模式的定时器配置

void TIM4_Config(void)
{ 
    TIM_TimeBaseInitTypeDef     TIM_Time_user;
    GPIO_InitTypeDef            port;
    TIM_ICInitTypeDef           TIM_ICInit_user;
    NVIC_InitTypeDef NVIC_InitStructure2;
// TIM4 clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
// GPIOB clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
// TIM4 channel_1 configuration : PB6
port.GPIO_Pin   = GPIO_Pin_6;
port.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
port.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOB, &port);
// Connect TIM pin to AF2

// Enable the TIM4 global Ymtirrupt
NVIC_InitStructure2.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure2);

// Time base configuration
TIM_Time_user.TIM_Period = PERIOD;
TIM_Time_user.TIM_Prescaler = PRESCALER;
TIM_Time_user.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_Time_user.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_Time_user);

//Capture configuration
TIM_ICInit_user.TIM_Channel = TIM_Channel_1;
TIM_ICInit_user.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInit_user.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInit_user.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInit_user.TIM_ICFilter = 0x0;

//Inicialize our structure for capture signal
TIM_PWMIConfig(TIM4, &TIM_ICInit_user);
//input trigger
TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1);

  TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
    // Select the slave Mode: Reset Mode
   TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);

// Enable the TIM4 Counter
TIM4->CR1 |= TIM_CR1_CEN;

// Enable the CC1 Interrupt request
TIM4->DIER |= TIM_IT_CC1;
}

TIM4_CH1 的中断处理程序

void TIM4_IRQHandler(void)
{

if (TIM4->SR & TIM_SR_CC1IF )
    {

        DataCapture_TIM4 = TIM4->CCR2;
    }

}

TIM3_Ch1 的捕获模式

void TIM3_Config(void)
{ 

    TIM_TimeBaseInitTypeDef     TIM_Time_user;
    GPIO_InitTypeDef            port;
    TIM_ICInitTypeDef           TIM_ICInit_user1;
    NVIC_InitTypeDef NVIC_InitStructure1;
// TIM4 clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// GPIOB clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// TIM channel1 confikurotion : PA6
port.GPIO_Pin   = GPIO_Pin_6;
port.GPIO_Mode  = GPIO_Mode_IN_FLOATING;///////////////////////////////
port.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOA, &port);

// Enable the TIM3 global interrupt
NVIC_InitStructure1.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure1.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure1.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure1);
// Time base configuration
TIM_Time_user.TIM_Period = PERIOD;
TIM_Time_user.TIM_Prescaler = PRESCALER;
TIM_Time_user.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_Time_user.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_Time_user);
//
TIM_ICInit_user1.TIM_Channel = TIM_Channel_1;
TIM_ICInit_user1.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInit_user1.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInit_user1.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInit_user1.TIM_ICFilter = 0x0;
//
TIM_PWMIConfig(TIM3, &TIM_ICInit_user1);
//input trigger
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);

  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);
    // Select the slave Mode: Reset Mode
   TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable);
// Enable the TIM3 Counter
TIM3->CR1 |= TIM_CR1_CEN;

// Enable the CC1 Intirrupt Request
TIM3->DIER |= TIM_IT_CC1;
}


Interrupt handler for TIM3_CH1

void TIM3_IRQHandler(void)
{
 if (TIM3->SR & TIM_SR_CC1IF )
    {

        DataCapture_TIM3 = TIM3->CCR2;
    }

}

TIM2_Ch1 的捕获模式存在问题

void TIM2_Config(void)
{ 
    TIM_TimeBaseInitTypeDef     TIM_Time_user;
    GPIO_InitTypeDef            port;
    TIM_ICInitTypeDef           TIM_ICInit_user;
    NVIC_InitTypeDef NVIC_InitStructure2;
// TIM4 clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// GPIOB clock enable
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// TIM2 channel_1 configuration : PA0
port.GPIO_Pin   = GPIO_Pin_0;
port.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
port.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOA, &port);

// Enable the TIM2 global Interrupt
NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure2);

// Time base configuration
TIM_Time_user.TIM_Period = PERIOD;
TIM_Time_user.TIM_Prescaler = PRESCALER;
TIM_Time_user.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_Time_user.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_Time_user);
//
TIM_ICInit_user.TIM_Channel = TIM_Channel_1;
TIM_ICInit_user.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInit_user.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInit_user.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInit_user.TIM_ICFilter = 0x0;
//
TIM_PWMIConfig(TIM2, &TIM_ICInit_user);
//input trigger
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);

  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
    // Select the slave Mode: Reset Mode
   TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);
// Enable the TIM2 Counter
TIM2->CR1 |= TIM_CR1_CEN;
// Enable the CC1 Interrupt Request
TIM2->DIER |= TIM_IT_CC1;
}

TIM2_CH1 的中断处理程序

void TIM2_IRQHandler(void)
{
  if (TIM2->SR & TIM_SR_CC1IF )
    {

        DataCapture_TIM2 = TIM2->CCR2;
    }

}

最佳答案

抱歉,我无法添加评论。您可以在 Debug模式下检查您的设置寄存器值,并检查您的工作和 CubeMx 设置之间的差异以查找问题

关于c - stm32f103c8t6上TIM2_CH1有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55497192/

相关文章:

c - 对一段简单代码的按位运算

ios - 无法使计时器 swift 失效

c - 如何读取ARM Linker生成的<Static Call Graph>?

c++ - 使用 Mbed 库在 STM32 和 PC 之间设置串行 USB 通信

c - char 数组的长度(存储 "int"值的位置)

c - 二维数组以及如何在 C 中打印数组

无法使用 XOR C 加密器加密长字符串

android - onFinish() CountDownTimer 方法太长?

c# - 检查控制计时器的线程的状态

c - STM32L0 GPIO 中断不起作用