GD32F150 APB2 上的定时器不工作?

[复制链接]
173|2
 楼主 | 2018-5-29 09:40 | 显示全部楼层 |阅读模式
我使用 GD32F150G8U6 器件,单板基本工作正常,包括 GPIO 点灯, USB FS, UART 等。在使用 Timer 时遇到连接在 APB2 上的定时器无法工作。

我初始化定时器时钟

    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA | RCC_AHBPERIPH_GPIOB , ENABLE);
    RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER2 | RCC_APB1PERIPH_TIMER3  | RCC_APB1PERIPH_TIMER6  | RCC_APB1PERIPH_TIMER14, ENABLE);
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_TIMER15 | RCC_APB2PERIPH_TIMER16 | RCC_APB2PERIPH_TIMER17, ENABLE);


设置 TIMER3

    GPIO_InitStructure.GPIO_Pin                          = GPIO_PIN_6;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOA, GPIO_PINSOURCE6, GPIO_AF_1);


TIMER_DeInit(TIMER3);
    TIMER_TimeBaseStructure.TIMER_Prescaler     = 719;
    TIMER_TimeBaseStructure.TIMER_CounterMode= TIMER_COUNTER_UP;
    TIMER_TimeBaseStructure.TIMER_Period         = 50;
    TIMER_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
    TIMER_BaseInit(TIMER3, &TIMER_TimeBaseStructure);

    TIMER_ICInitStructure.TIMER_CH                   = TIMER_CH_1;
    TIMER_OCInitStructure.TIMER_OCMode          = TIMER_OC_MODE_PWM1;
    TIMER_OCInitStructure.TIMER_OCPolarity       = TIMER_OC_POLARITY_HIGH;
    TIMER_OCInitStructure.TIMER_OutputState     = TIMER_OUTPUT_STATE_ENABLE;
    TIMER_OCInitStructure.TIMER_Pulse               = 25;
    TIMER_OC1_Init(TIMER3, &TIMER_OCInitStructure);

    TIMER_OC1_Preload(TIMER3, TIMER_OC_PRELOAD_DISABLE);
    TIMER_CARLPreloadConfig(TIMER3, ENABLE);

    TIMER_Enable(TIMER3, ENABLE);   

用示波器在 PA6 上可观察到方波信号。但是对于 Timer17, 基本上是同样的设置

    GPIO_InitStructure.GPIO_Pin                              = GPIO_PIN_7;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOA, GPIO_PINSOURCE7, GPIO_AF_5);

    TIMER_DeInit(TIMER17);
    TIMER_TimeBaseStructure.TIMER_Prescaler         = 719;
    TIMER_TimeBaseStructure.TIMER_CounterMode   = TIMER_COUNTER_UP;
    TIMER_TimeBaseStructure.TIMER_Period             = 50;
    TIMER_TimeBaseStructure.TIMER_ClockDivision    = TIMER_CDIV_DIV1;
    TIMER_BaseInit(TIMER17, &TIMER_TimeBaseStructure);

    TIMER_ICInitStructure.TIMER_CH              = TIMER_CH_1;
    TIMER_OCInitStructure.TIMER_OCMode     = TIMER_OC_MODE_PWM1;
    TIMER_OCInitStructure.TIMER_OCPolarity  = TIMER_OC_POLARITY_HIGH;
    TIMER_OCInitStructure.TIMER_OutputState= TIMER_OUTPUT_STATE_ENABLE;
    TIMER_OCInitStructure.TIMER_Pulse          = 25;
    TIMER_OC1_Init(TIMER17, &TIMER_OCInitStructure);

    TIMER_OC1_Preload(TIMER17, TIMER_OC_PRELOAD_DISABLE);
    TIMER_CARLPreloadConfig(TIMER17, ENABLE);
    TIMER_Enable(TIMER17, ENABLE);      


在 PA7 上看不到任何信号。变换其它的I/O 引脚,试过 TIMER (15,16, 17)情况都相同,而这些定时器都是挂在 APB2上,它们需要进行特殊的设置吗?

| 2018-5-31 11:22 | 显示全部楼层
搞个完整测试代码出来才可以帮你查
 楼主 | 2018-6-1 11:30 | 显示全部楼层

#include "gd32f1x0_gpio.h"
#include "gd32f1x0_syscfg.h"
#include "gd32f1x0_rcc.h"
#include "gd32f1x0_misc.h"
#include "gd32f1x0_timer.h"

//  此文件可以与 startup.s 组成一个项目。使用 GD32标准外设库 2.0
// 把下面的 #if 0 改为 1 则使用 TIMER 3, 在 PA6 上可示波器观察输出
// 再改回来使用 TIMER 16, 没有输出, 只有连续的高电平。

#if 0
#define TEST_TIMER              TIMER3
#define TEST_PIN_AF_CONFIG      GPIO_AF_1
#else
#define TEST_TIMER              TIMER16
#define TEST_PIN_AF_CONFIG      GPIO_AF_5
#endif

int main(void) {
    GPIO_InitPara       GPIO_InitStructure;
    TIMER_BaseInitPara  TIMER_TimeBaseStructure;
    TIMER_OCInitPara    TIMER_OCInitStructure;
   
    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA, ENABLE);
    RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER3, ENABLE);
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_TIMER16, ENABLE);
   
    GPIO_InitStructure.GPIO_Pin                 = GPIO_PIN_6;
    GPIO_InitStructure.GPIO_Mode                = GPIO_MODE_AF;
    GPIO_InitStructure.GPIO_Speed               = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_OType               = GPIO_OTYPE_PP;
    GPIO_InitStructure.GPIO_PuPd                = GPIO_PUPD_NOPULL;

    GPIO_Init(GPIOA, &GPIO_InitStructure);
    GPIO_PinAFConfig(GPIOA,  GPIO_PINSOURCE6,   TEST_PIN_AF_CONFIG);
   
    TIMER_DeInit(TEST_TIMER);
    TIMER_TimeBaseStructure.TIMER_Prescaler     = 0;
    TIMER_TimeBaseStructure.TIMER_CounterMode   = TIMER_COUNTER_UP;
    TIMER_TimeBaseStructure.TIMER_Period        = 36000;
    TIMER_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
    TIMER_TimeBaseStructure.TIMER_RepetitionCounter = 0;
    TIMER_BaseInit(TEST_TIMER,  &TIMER_TimeBaseStructure);
   
    TIMER_OCStructInit(&TIMER_OCInitStructure);
    TIMER_OCInitStructure.TIMER_OCMode          = TIMER_OC_MODE_TOGGLE;
    TIMER_OCInitStructure.TIMER_OCPolarity      = TIMER_OC_POLARITY_HIGH;
    TIMER_OCInitStructure.TIMER_OutputState     = TIMER_OUTPUT_STATE_ENABLE;
    TIMER_OCInitStructure.TIMER_Pulse           = 18000;
    TIMER_OC1_Init(TEST_TIMER, &TIMER_OCInitStructure);
   
    TIMER_OC1_Preload(TEST_TIMER,       TIMER_OC_PRELOAD_DISABLE);
    TIMER_CARLPreloadConfig(TEST_TIMER, ENABLE);
   
    TIMER_Enable(TEST_TIMER,    ENABLE);   
   
        while (1) {
        }
}

扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

分享 快速回复 返回顶部 返回列表