搜索
bottom↓
回复: 13

输入捕获,STM32移植到GD32出错,只能进一次中断。

[复制链接]

出0入0汤圆

发表于 2016-11-3 14:30:41 | 显示全部楼层 |阅读模式
程序移植到GD32,用的还是ST的外设库,输入捕获一直出问题。其他功能正常。麻烦大家帮看一下。

TIM2初始化

  1. //输入捕获
  2. static void TIM2_Mode_Config(void)
  3. {
  4.     TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
  5.     TIM_ICInitTypeDef  TIM_ICInitStructure;
  6.     TIM_DeInit(TIM2);
  7.    
  8.     /* Time base configuration */
  9.    
  10.     TIM_TimeBaseStructure.TIM_Period = 0xffff;         
  11.     TIM_TimeBaseStructure.TIM_Prescaler = 287;
  12.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  13.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  14.     TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  15.    
  16.     TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  17.     TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  18.     //TIM输入2,3或4选择对应地与IC1或IC2或IC3或IC4相连
  19.     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   

  20.     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV4;
  21.     //选择输入比较滤波器 0x0 - 0xF
  22.     TIM_ICInitStructure.TIM_ICFilter = 0x8;  //0x8
  23.    
  24.     TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
  25.    
  26.     /* Select the TIM3 Input Trigger: TI2FP2 */
  27.     TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
  28.    
  29.     /* Select the slave Mode: Reset Mode */
  30.     TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
  31.    
  32.     /* Enable the Master/Slave Mode */
  33.     TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   
  34.    
  35.     /* Enable the CC2 Interrupt Request */
  36.     TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
  37.    
  38.     /* TIM enable counter */
  39.     TIM_Cmd(TIM2, ENABLE);   
  40. }
复制代码



TIM2中断

  1. void TIM2_ISR(void)
  2. {
  3.         Uint16 IC2Value;

  4.         if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
  5.         {               
  6.                 TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清除中断标志位

  7.                 IC2Value = TIM_GetCapture2(TIM2);
  8.         }

  9.         //此处软件清除也没用
  10.         //TIM2->SR &= ~0x0404;  //软件清除CC2IF和CC2OF标志

  11. }
复制代码



断点调试的时候,只能进中断一次,IC2Value为0,就再也进不去中断了。

STM32中一切正常。





按照GD32的应用笔记,也对照过了。难道是哪里没做到位还是寄存器不同? 搞不定了,只能求助大家。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2016-11-3 14:41:16 | 显示全部楼层
这种时候,应该找你的fae

出0入0汤圆

 楼主| 发表于 2016-11-3 14:50:05 | 显示全部楼层
黑夜之狼 发表于 2016-11-3 14:41
这种时候,应该找你的fae

量小,一般用芯片都是我们哭着喊着求别人的,悲催哪。

出20入186汤圆

发表于 2016-11-3 16:05:50 | 显示全部楼层
不一样的芯片直接移植肯定有问题啊,看芯片手册

出0入0汤圆

 楼主| 发表于 2016-11-24 15:47:11 | 显示全部楼层
对比了GD32的例程,搞定了。

  1. /**
  2.   * @brief  Configure the TIMER peripheral.
  3.   * @param  None
  4.   * @retval None
  5.   */
  6. void TIM_Configuration(void)
  7. {
  8. /* TIMER3 configuration: PWM Input mode ------------------------
  9.      The external signal is connected to TIMER3 CH1 pin (PA6)
  10.      The Rising edge is used as active edge
  11.      The TIMER3 CHCC1 is used to compute the frequency value
  12.      The TIMER3 CHCC2 is used to compute the duty cycle value
  13.   ------------------------------------------------------------ */
  14.    
  15.     TIMER_BaseInitPara TIM_TimeBaseStructure;
  16.     TIMER_ICInitPara   TIM_ICInitStructure;;

  17.     /* TIMER3 clock enable */
  18.     RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_TIMER3,ENABLE);

  19.     /* TIMER3  configuration */
  20.     TIMER_DeInit(TIMER3);
  21.     TIM_TimeBaseStructure.TIMER_Prescaler     = 53999;
  22.     TIM_TimeBaseStructure.TIMER_CounterMode   = TIMER_COUNTER_UP;
  23.     TIM_TimeBaseStructure.TIMER_Period        = 65535;
  24.     TIM_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;
  25.     TIMER_BaseInit(TIMER3,&TIM_TimeBaseStructure);

  26.     /* Input capture configuration */
  27.     TIM_ICInitStructure.TIMER_CH          = TIMER_CH_1;
  28.     TIM_ICInitStructure.TIMER_ICPolarity  = TIMER_IC_POLARITY_RISING;
  29.     TIM_ICInitStructure.TIMER_ICSelection = TIMER_IC_SELECTION_DIRECTTI;
  30.     TIM_ICInitStructure.TIMER_ICPrescaler = TIMER_IC_PSC_DIV1;
  31.     TIM_ICInitStructure.TIMER_ICFilter    = 0x0;
  32.     TIMER_PWMCaptureConfig(TIMER3,&TIM_ICInitStructure);

  33.     /* Slave Mode selection: TIMER3 */
  34.     TIMER_SelectInputTrigger(TIMER3,TIMER_TS_TI1FP1);

  35.     TIMER_SelectSlaveMode(TIMER3,TIMER_SLAVE_MODE_RESET);

  36.     /* Select the Master Slave Mode */
  37.     TIMER_SelectMasterSlaveMode(TIMER3,TIMER_MASTER_SLAVE_MODE_ENABLE);

  38.     /* Auto-reload preload enable */
  39.     TIMER_CARLPreloadConfig(TIMER3,ENABLE);
  40.    
  41.     /* Clear the CH1 Interrupt flag an Enable the CH1 Interrupt Request */
  42.     TIMER_ClearIntBitState(TIMER3,TIMER_INT_CH1);
  43.     TIMER_INTConfig(TIMER3,TIMER_INT_CH1,ENABLE);

  44.     /* TIMER enable counter */
  45.     TIMER_Enable( TIMER3, ENABLE );
  46. }
复制代码



在触发设置完毕后,需要重载ARR,并且在开启捕捉中断前先清空中断标记

  1. /* Select the TIM3 Input Trigger: TI2FP2 */
  2.     TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
  3.    
  4.     /* Select the slave Mode: Reset Mode */
  5.     TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
  6.    
  7.     /* Enable the Master/Slave Mode */
  8.     TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);   

  9.         /* GD32 BEGIN */
  10.         TIM_ARRPreloadConfig(TIM2, ENABLE);                 //使能TIM2重载寄存器ARR
  11.         TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清除中断标志位
  12.         /* GD32 END */
  13.    
  14.     /* Enable the CC2 Interrupt Request */
  15.     TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
  16.    
  17.     /* TIM enable counter */
  18.     TIM_Cmd(TIM2, ENABLE);
复制代码

出0入0汤圆

发表于 2020-11-18 13:53:54 | 显示全部楼层
博主您好,我也遇到跟您类似的问题,写了捕获温度传感器(NST1001)的脉冲程序,我用的也是stm32的固件库,单片机是gd32的,也是只能进入中断一次,按照您的方法试了一下也没有成功…加了您好友想要请教一下,方便通过一下吗

出100入101汤圆

发表于 2020-11-18 14:22:11 来自手机 | 显示全部楼层
18516573919 发表于 2020-11-18 13:53
博主您好,我也遇到跟您类似的问题,写了捕获温度传感器(NST1001)的脉冲程序,我用的也是stm32的固件库, ...

gd32没有自己的固件库?为啥用stm32的固件库

出0入0汤圆

发表于 2020-11-18 16:08:38 | 显示全部楼层
fengyunyu 发表于 2020-11-18 14:22
gd32没有自己的固件库?为啥用stm32的固件库

因为我以前没写过,刚开始上手写,stm32的例程源码比较多,改起来方便…

出0入0汤圆

发表于 2020-11-19 10:25:40 | 显示全部楼层
博主你的脉冲是内部定时器产生的还是外部引脚输入的呢?

出0入0汤圆

 楼主| 发表于 2020-11-19 16:10:22 | 显示全部楼层
18516573919 发表于 2020-11-19 10:25
博主你的脉冲是内部定时器产生的还是外部引脚输入的呢?

输入捕获的是外部编码器脉冲。

出0入0汤圆

发表于 2020-11-20 14:26:24 | 显示全部楼层
金色大元宝 发表于 2020-11-19 16:10
输入捕获的是外部编码器脉冲。

我也是外部的一个温度传感器的脉冲输入计数,但是还是只能捕获中断一次…
我想问下预分频系数会影响吗,我输入脉冲频率大概30Khz,预分频系数设置了107,这样可以吗

出0入53汤圆

发表于 2021-1-4 14:29:18 | 显示全部楼层
本帖最后由 zhcj66 于 2021-1-4 15:47 编辑
金色大元宝 发表于 2016-11-24 15:47
对比了GD32的例程,搞定了。


我使用TIM16 没有SMC寄存器,只有高级定时器才有,

我下面的程序会在没有触发信号的时候一直计数不知道怎么去配置正确的输入信号
找到问题了TIM16只能使用内部时钟,不能使用外部输入

  1. //外部计数
  2. void TIM17_InputCapture_Init(void)
  3. {

  4.         TIMER_BaseInitPara  TIM_TimeBaseStructure;
  5.        
  6.         GPIO_InitPara GPIO_InitStructure;
  7.        
  8. #define TIM_IC 1
  9. #if TIM_IC       
  10.         TIMER_ICInitPara        TIM_ICBaseStructure;
  11. #endif       
  12.        
  13.         RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_TIMER17, ENABLE);
  14.     RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB,ENABLE);
  15.         {
  16.                
  17.                 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_9;
  18.                 GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN;
  19.                 GPIO_Init(GPIOB,&GPIO_InitStructure);
  20.                
  21.                 GPIO_PinAFConfig(GPIOB,GPIO_PIN_9, GPIO_AF_2);//PA15需要 PA0不需要映射
  22.         }
  23.         {
  24.                 TIMER_DeInit(TIMER17);
  25.                 TIM_TimeBaseStructure.TIMER_Period = 5000;                       
  26.                 TIM_TimeBaseStructure.TIMER_Prescaler = 0;  //不分频         
  27.                 TIM_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;         
  28.                 TIM_TimeBaseStructure.TIMER_CounterMode = TIMER_COUNTER_UP;
  29.                 TIMER_BaseInit(TIMER17, &TIM_TimeBaseStructure);
  30.                
  31.        
  32.                
  33. #if TIM_IC
  34.                 //设置比较捕获寄存器值为计数器值,可以使得1个定时器读取最多4个计数器的值
  35.                 TIM_ICBaseStructure.TIMER_CH = TIMER_CH_1;//通道
  36.                 TIM_ICBaseStructure.TIMER_ICPolarity = TIMER_IC_POLARITY_RISING;//边沿
  37.                 TIM_ICBaseStructure.TIMER_ICSelection = TIMER_IC_SELECTION_DIRECTTI;//连线
  38.                 TIM_ICBaseStructure.TIMER_ICPrescaler = TIMER_IC_PSC_DIV1;//预分频器
  39.                 TIM_ICBaseStructure.TIMER_ICFilter = 0x0F;//滤波值
  40.                 TIMER_ICInit(TIMER17,&TIM_ICBaseStructure);//初始化输入外设

  41. #endif
  42.                
  43.                 TIMER_SetCounter(TIMER17,0);//计数器置0
  44.         }
  45.         //TIMER_INTConfig(TIMER17, TIMER_INT_UPDATE, ENABLE);//开启相应中断
  46. //        TIM_Cmd(TIM4, DISABLE);
  47.         TIMER_Enable(TIMER17, ENABLE);
  48. }
复制代码

出0入53汤圆

发表于 2021-1-4 16:04:16 | 显示全部楼层
zhcj66 发表于 2021-1-4 14:29
我使用TIM16 没有SMC寄存器,只有高级定时器才有,

我下面的程序会在没有触发信号的时候一直计数不知道怎 ...

可以正常运行的程序
  1. void TIM17_InputCapture_Init(void)
  2. {

  3.         TIMER_BaseInitPara  TIM_TimeBaseStructure;
  4.        
  5.         GPIO_InitPara GPIO_InitStructure;
  6.        
  7. #define TIM_IC 1
  8. #if TIM_IC       
  9.         TIMER_ICInitPara        TIM_ICBaseStructure;
  10. #endif       
  11.        
  12.         RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_TIMER1, ENABLE);
  13.     RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOA,ENABLE);
  14.         {
  15.                
  16.                 GPIO_InitStructure.GPIO_Pin = GPIO_PIN_9;
  17.                 GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN;
  18.                 GPIO_Init(GPIOA,&GPIO_InitStructure);
  19.                
  20.                 GPIO_PinAFConfig(GPIOA,GPIO_PIN_9, GPIO_AF_2);//PA15需要 PA0不需要映射
  21.         }
  22.         {
  23.                 TIMER_DeInit(TIMER1);
  24.                 TIM_TimeBaseStructure.TIMER_Period = 5000;                       
  25.                 TIM_TimeBaseStructure.TIMER_Prescaler = 0;  //不分频         
  26.                 TIM_TimeBaseStructure.TIMER_ClockDivision = TIMER_CDIV_DIV1;         
  27.                 TIM_TimeBaseStructure.TIMER_CounterMode = TIMER_COUNTER_UP;
  28.                 TIMER_BaseInit(TIMER1, &TIM_TimeBaseStructure);
  29.                
  30.                 //TIMER_CARLPreloadConfig(TIMER1, ENABLE);
  31.                 TIMER_ClearIntBitState(TIMER1, TIMER_INT_CH1 | TIMER_INT_CH2 | TIMER_INT_CH3 | TIMER_INT_CH4|TIMER_INT_UPDATE);
  32.                 //TIMER_INTConfig(TIMER1, TIMER_INT_UPDATE, ENABLE);
  33.                
  34.                 TIMER_ETRClockMode1Config(TIMER1,TIMER_EXT_TRI_PSC_OFF,TIMER_EXT_TRI_POLARITY_INVERTED,0);//(TIMx,外部出发分频,外部出发极性,滤波值)
  35.        
  36.                
  37. #if TIM_IC
  38.                 //设置比较捕获寄存器值为计数器值,可以使得1个定时器读取最多4个计数器的值
  39.                 TIM_ICBaseStructure.TIMER_CH = TIMER_CH_2;//通道
  40.                 TIM_ICBaseStructure.TIMER_ICPolarity = TIMER_IC_POLARITY_RISING;//边沿
  41.                 TIM_ICBaseStructure.TIMER_ICSelection = TIMER_IC_SELECTION_DIRECTTI;//连线
  42.                 TIM_ICBaseStructure.TIMER_ICPrescaler = TIMER_IC_PSC_DIV1;//预分频器
  43.                 TIM_ICBaseStructure.TIMER_ICFilter = 0x0F;//滤波值
  44.                 TIMER_ICInit(TIMER1,&TIM_ICBaseStructure);//初始化输入外设

  45.                
  46.                 TIMER_SelectInputTrigger(TIMER1,TIMER_TS_TI2FP2);//选择输入触发源
  47.                
  48. #endif
  49.                
  50.                 TIMER_SetCounter(TIMER1,0);//计数器置0
  51.         }
  52.         //TIMER_INTConfig(TIMER1, TIMER_INT_UPDATE, ENABLE);//开启相应中断
  53. //        TIM_Cmd(TIM4, DISABLE);
  54.         TIMER_Enable(TIMER1, ENABLE);
  55. }
复制代码

出0入0汤圆

发表于 2021-1-5 07:49:33 来自手机 | 显示全部楼层
有例程的,按照例程来就好了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 09:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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