你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030K6的TIM3定时器可否捕捉两路PWM输入

[复制链接]
xieweibiao 提问时间:2015-10-18 18:00 /
已经调试了一整天发现CH1和CH2可以捕捉一路信号,但是CH3和CH4怎么调试都没有数值,度娘中有说可以,有些又说不能,求解答
收藏 评论5 发布时间:2015-10-18 18:00

举报

5个回答
你好我好大家好! 回答时间:2015-10-18 18:17:47
看参考手册比问谁都权威
xieweibiao 回答时间:2015-10-18 18:50:55
我就是看着手册来写程序的,结果CH3和CH4的值一动不动的,手册上应该是支持的
lkl0305 回答时间:2015-10-18 20:54:04
手册上说的一般不会错的,楼主先找个例子测试一下 0.png
刚声打火机 回答时间:2015-10-19 09:02:40
本帖最后由 刚声打火机 于 2015-10-19 09:11 编辑

两路都是可以捕获的哈
我公司产品中有实际应用
给你贴上源码 可以参考一下

#define TIM1_PRESCALER        2



typedef void (*tim1_cc_irq_t)(void);


/* 使能TIM1 */
#define START_TIM1() \
        do {\
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);\
                TIM_Cmd(TIM1, ENABLE);\
        } while (0);

/* 停止TIM1 */
#define STOP_TIM1() \
        do {\
                TIM_Cmd(TIM1, DISABLE);\
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, DISABLE);\
        } while (0);


void bsp_tim1_init(void);

void tim1_ch3_set_irq_callback(tim1_cc_irq_t func);
void tim1_ch4_set_irq_callback(tim1_cc_irq_t func);

static tim1_cc_irq_t __tim1_cc3_irq = NULL;
static tim1_cc_irq_t __tim1_cc4_irq = NULL;


/* +------------------------------------------+ *
*  |                     TIM1初始化               | *
* +------------------------------------------+ */
void bsp_tim1_init(void)
{
        TIM_ICInitTypeDef TIM_ICInitStructure;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

        /* TIM1 clock enable */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);


        /* TIM1 CC CH3 */
        bsp_gpio_init(GPIOA,
                                  GPIO_Pin_10,
                                  GPIO_Mode_AF,
                                  GPIO_Speed_50MHz,
                                  GPIO_OType_PP,
                                  GPIO_PuPd_UP);

        /* TIM1 CC CH4 */
        bsp_gpio_init(GPIOA,
                                  GPIO_Pin_11,
                                  GPIO_Mode_AF,
                                  GPIO_Speed_50MHz,
                                  GPIO_OType_PP,
                                  GPIO_PuPd_UP);

        /* Connect TIM pins to AF2 */
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_2);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_2);


        TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF;                                                                                         
    /* 累计 TIM_Period个频率后产生一个更新或者中断 */
    TIM_TimeBaseStructure.TIM_Prescaler = TIM1_PRESCALER - 1;                // 24M
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                 // 采样分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     // 向上计数模式
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

        TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        TIM_ICInitStructure.TIM_ICFilter = 0x0;
        TIM_ICInit(TIM1, &TIM_ICInitStructure);

        TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

        TIM_ICInitStructure.TIM_ICFilter = 0x0;
        TIM_ICInit(TIM1, &TIM_ICInitStructure);

        TIM_Cmd(TIM1, ENABLE);

        TIM_ITConfig(TIM1, TIM_IT_CC3, ENABLE);
        TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);

        nvic_config(TIM1_CC_IRQn, TIM1_CC_PRIOR, ENABLE);
}




/* +------------------------------------------+ *
* |         TIM1 CH3  初始化回调函数   | *
* +------------------------------------------+ */
void tim1_ch3_set_irq_callback(tim1_cc_irq_t func)
{
        __tim1_cc3_irq = func;
}


/* +------------------------------------------+ *
* |         TIM1 CH4  初始化回调函数   | *
* +------------------------------------------+ */
void tim1_ch4_set_irq_callback(tim1_cc_irq_t func)
{
        __tim1_cc4_irq = func;
}


/* +------------------------------------------+ *
* |                  TIM1 CC 中断                 | *
* +------------------------------------------+ */
void TIM1_CC_IRQHandler(void)
{         
        if (TIM_GetITStatus(TIM1, TIM_IT_CC3) == SET) {
                TIM_ClearITPendingBit(TIM1, TIM_IT_CC3);
                if (NULL != __tim1_cc3_irq) {
                        (__tim1_cc3_irq)();
                }
        }

        if (TIM_GetITStatus(TIM1, TIM_IT_CC4) == SET) {
                TIM_ClearITPendingBit(TIM1, TIM_IT_CC4);
                if (NULL != __tim1_cc4_irq) {
                        (__tim1_cc4_irq)();
                }
        }
}

补充一下:
bsp_gpio_init()   这个函数我自己封装过,定义是这样的:
/* +------------------------------------------+ *
* |            封装了一层GPIO初始化函数     | *
* +------------------------------------------+ */

/* GPIO Group Periph Manager*/
typedef struct ggm_s {
        GPIO_TypeDef *gpio_x;
        u32 periph;
        vu32 bit_map;
} ggpm_t;



static ggpm_t ggpm[MAX_GPIO_GROUP_NUM] = {
        {GPIOA, RCC_AHBPeriph_GPIOA, 0x0},
        {GPIOB, RCC_AHBPeriph_GPIOB, 0x0},
        {GPIOC, RCC_AHBPeriph_GPIOC, 0x0},
        {GPIOD, RCC_AHBPeriph_GPIOD, 0x0},
        {GPIOE, RCC_AHBPeriph_GPIOE, 0x0},
        {GPIOF, RCC_AHBPeriph_GPIOF, 0x0},
};



void bsp_gpio_init(GPIO_TypeDef *gpio_x, u32 gpio_pin, GPIOMode_TypeDef mode, GPIOSpeed_TypeDef speed, GPIOOType_TypeDef otype, GPIOPuPd_TypeDef pupd)
{
        GPIO_InitTypeDef gpio_init_struct;
        int i = 0;

        for (i = 0; i < (sizeof(ggpm) / sizeof(ggpm_t)); i++) {
                if (ggpm.gpio_x == gpio_x) {
                        if ( ! (ggpm.bit_map & GPIO_PIN_NUM_MASK) ) {
                                RCC_AHBPeriphClockCmd(ggpm.periph, ENABLE);
                        }
                       
                        ggpm.bit_map |= gpio_pin;
                       
                        gpio_init_struct.GPIO_Pin = gpio_pin;
                        gpio_init_struct.GPIO_Mode = mode;
                        gpio_init_struct.GPIO_Speed = speed;
                        gpio_init_struct.GPIO_OType = otype;
                        gpio_init_struct.GPIO_PuPd = pupd;
                       
                        GPIO_Init(gpio_x, &gpio_init_struct);
               
                        break;
                }
        }       

       
}



后知后觉 回答时间:2016-7-27 00:13:46
刚声打火机 发表于 2015-10-19 09:02
两路都是可以捕获的哈
我公司产品中有实际应用
给你贴上源码 可以参考一下

  你这个代码封装的还是不错的

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版