大伙请注意 GD32F103/105 定时器外部计数不能用,原厂确认过的

[复制链接]
3646|14
手机看帖
扫描二维码
随时随地手机跟帖
sqqdfny|  楼主 | 2017-12-13 18:36 | 显示全部楼层 |阅读模式
本帖最后由 sqqdfny 于 2017-12-13 20:02 编辑

下面这个代码是在STM32上量产过的,在GD的芯片上,不能计数,咨询代理商,说是GD的不支持外部计数。有大神能指点一下么。
QQ:792739069   email:sqqdfny@163.com

static u32 _count[4] = {0,0,0,0};
//===================================================================
u16 GetExtCounter(u32 ch)
{
        if(ch > 3) return (0);
        return ((u16)_count[ch]);
}
//===================================================================
//在RTC 1Hz中断中调用,每秒调用一次
void ExtCounterHandler(void)
{
        _count[0] = TIM2->CNT; TIM2->CNT = 0;
        _count[1] = TIM3->CNT; TIM3->CNT = 0;
        _count[2] = TIM4->CNT; TIM4->CNT = 0;
        _count[3] = TIM5->CNT; TIM5->CNT = 0;
}
//===================================================================
void ExtCounterInit(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
        
        //PA0 TIM2_CH1
        //PA1 TIM5_CH2
        //PA6 TIM3_CH1
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_10MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        //PB7 TIM4_CH2
        GPIO_InitStructure.GPIO_Mode         = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Pin         = GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed         = GPIO_Speed_10MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
        TIM2->CR1 = (1 << 8);   //外部采样时钟  36M
        TIM2->CR2 = 0;
        TIM2->SMCR = (7) | (5 << 4);
        TIM2->CCMR1 = (1) | (7 << 4);  //上升沿计数,1分频,   1/4采样,8次采样确认一个脉冲
        TIM2->CCER = 0;
        TIM2->DIER = 0;            //关中断
        TIM2->CNT = 0;
        TIM2->CR1 |= BIT0;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
        TIM3->CR1 = (1 << 8);   //外部采样时钟  36M
        TIM3->CR2 = 0;
        TIM3->SMCR = (7) | (5 << 4);
        TIM3->CCMR1 = (1) | (7 << 4);  //上升沿计数,1分频,   1/4采样,8次采样确认一个脉冲
        TIM3->CCER = 0;
        TIM3->DIER = 0;            //关中断
        TIM3->CNT = 0;
        TIM3->CR1 |= BIT0;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        TIM4->CR1 = (1 << 8);   //外部采样时钟  36M
        TIM4->CR2 = 0;
        TIM4->SMCR = (7) | (6 << 4);
        TIM4->CCMR1 = (1 << 8) | (7 << 12);  //上升沿计数,1分频,   1/4采样,8次采样确认一个脉冲
        TIM4->CCER = 0;
        TIM4->DIER = 0;            //关中断
        TIM4->CNT = 0;
        TIM4->CR1 |= BIT0;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
        TIM5->CR1 = (1 << 8);   //外部采样时钟  36M
        TIM5->CR2 = 0;
        TIM5->SMCR = (7) | (6 << 4);
        TIM5->CCMR1 = (1 << 8) | (7 << 12);  //上升沿计数,1分频,   1/4采样,8次采样确认一个脉冲
        TIM5->CCER = 0;
        TIM5->DIER = 0;            //关中断
        TIM5->CNT = 0;
        TIM5->CR1 |= BIT0;
}  
lvben5d| | 2017-12-14 17:14 | 显示全部楼层
兄弟,你的130或150 用的库版本是多少? V3.0.0后,定时器为 TIMER0  TIMER1  TIMER2  TIMER5  TIMER13   TIMER14  TIMER15  TIMER16 。没有3 和 4 6了。。。

使用特权

评论回复
sqqdfny|  楼主 | 2017-12-14 17:18 | 显示全部楼层
lvben5d 发表于 2017-12-14 17:14
兄弟,你的130或150 用的库版本是多少? V3.0.0后,定时器为 TIMER0  TIMER1  TIMER2  TIMER5  TIMER13   T ...

我用的是GD32F105RC,上面贴的代码是 STM32F103RC,我用的库是 2017-06-20, V2.0.0, firmware for GD32F10x

使用特权

评论回复
sqqdfny|  楼主 | 2017-12-14 17:21 | 显示全部楼层
我个人觉得GD原厂的回复太不上心了,如果TIMER的CH0 CH1不能进行外部计数,那编码器就没法用了,编码器接不了,电机控制这块基本上也就没得玩了。但是可以肯定的是,STM32的代码直接搬过来是用不了的。

使用特权

评论回复
comeon201208| | 2017-12-17 13:48 | 显示全部楼层
外部计数器的设置是否有问题的

使用特权

评论回复
firstblood| | 2017-12-18 21:42 | 显示全部楼层
这是原厂的设计问题的?

使用特权

评论回复
baimiaocun2015| | 2017-12-18 23:19 | 显示全部楼层
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);这是时钟源的选择的

使用特权

评论回复
sqqdfny|  楼主 | 2017-12-19 11:53 | 显示全部楼层
comeon201208 发表于 2017-12-17 13:48
外部计数器的设置是否有问题的

1.我这个配置在STM32上没有问题
2.GD回复定时器配置跟STM32是一样的

使用特权

评论回复
sqqdfny|  楼主 | 2017-12-19 11:54 | 显示全部楼层
firstblood 发表于 2017-12-18 21:42
这是原厂的设计问题的?

我不是直接咨询的原厂,是代理商转的话。说是原厂回复只支持ETR外部计数。现在的解决办法是改板,换到PA15(TIMER1_ETR)

使用特权

评论回复
GONGO| | 2017-12-22 16:11 | 显示全部楼层
“大伙请注意 GD32F103/105 定时器外部计数不能用,原厂确认过的”

你搞错了,没有这个问题

程序里面加一句,

TIMx->ARR = 0xFFFF;

使用特权

评论回复
tongbu2015| | 2017-12-23 14:01 | 显示全部楼层
这个难道是原厂的设计bug的?

使用特权

评论回复
zhangbo1985| | 2017-12-23 16:15 | 显示全部楼层
这定时器的外部计数为何不能用?

使用特权

评论回复
afgnhgrf| | 2017-12-24 19:12 | 显示全部楼层
看来GD抄的挺历害的,连Bug都抄了

使用特权

评论回复
chuntian2016| | 2017-12-29 21:43 | 显示全部楼层
这个不应该啊,,原厂会有相应的补丁撒的

使用特权

评论回复
wangguanfu| | 2018-3-2 20:40 | 显示全部楼层
本帖最后由 wangguanfu 于 2018-3-2 20:42 编辑

gd的部分寄存器 复位值随机,要初始化,而st的复位值确定,,,原封不动复制st的代码就如lz一样呵呵了,呵呵呵了   ,呵呵呵呵了,呵呵呵呵呵了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

1

粉丝