[技术问答] HC32F460 Timer6 捕获脉宽问题

[复制链接]
3761|4
 楼主| 茂xiang 发表于 2021-9-2 13:32 | 显示全部楼层 |阅读模式
本帖最后由 茂xiang 于 2021-9-2 13:37 编辑

按照规格书说明和大家建议,现在无法进入捕获中断了,华大也没有脉冲测量的完整示例,ε=(´ο`*)))唉

  1. #include "hc32_ddl.h"
  2. #include "hal_CLK.h"
  3. #include "hc32f46x_timer6.h"
  4. #include "sysGeneralFunc.h"

  5. /******************************************************************************/
  6. /** \file main.c
  7. **
  8. ** \brief This sample demonstrates how to use Timer6.
  9. **
  10. **   - 2018-11-30  1.0  husj  first version for Device Driver Library of Timer6.
  11. **
  12. ******************************************************************************/

  13. #include "hc32_ddl.h"

  14. /*******************************************************************************
  15. * Local type definitions ('typedef')
  16. ******************************************************************************/

  17. /*******************************************************************************
  18. * Local pre-processor symbols/macros ('#define')
  19. ******************************************************************************/
  20. /* KEY0 (SW2)*/
  21. #define  SW2_PORT           (PortD)
  22. #define  SW2_PIN            (Pin03)
  23. /* KEY1 (SW4)*/
  24. #define  SW4_PORT           (PortD)
  25. #define  SW4_PIN            (Pin04)
  26. /* KEY2 (SW3)*/
  27. #define  SW3_PORT           (PortD)
  28. #define  SW3_PIN            (Pin05)
  29. /* KEY3 (SW5)*/
  30. #define  SW5_PORT           (PortD)
  31. #define  SW5_PIN            (Pin06)

  32. /* LED0 Port/Pin definition */
  33. #define  LED0_PORT          (PortE)
  34. #define  LED0_PIN           (Pin06)

  35. /* LED1 Port/Pin definition */
  36. #define  LED1_PORT          (PortD)
  37. #define  LED1_PIN           (Pin07)

  38. /* LED2 Port/Pin definition */
  39. #define  LED2_PORT          (PortB)
  40. #define  LED2_PIN           (Pin05)

  41. /* LED3 Port/Pin definition */
  42. #define  LED3_PORT          (PortB)
  43. #define  LED3_PIN           (Pin09)

  44. /* LED0~1 toggle definition */
  45. #define  LED0_TOGGLE()      (PORT_Toggle(LED0_PORT, LED0_PIN))
  46. #define  LED1_TOGGLE()      (PORT_Toggle(LED1_PORT, LED1_PIN))
  47. #define  LED2_TOGGLE()      (PORT_Toggle(LED2_PORT, LED2_PIN))
  48. #define  LED3_TOGGLE()      (PORT_Toggle(LED3_PORT, LED3_PIN))

  49. /*******************************************************************************
  50. * Global variable definitions (declared in header file with 'extern')
  51. ******************************************************************************/
  52. uint16_t u16CaptureA;
  53. uint16_t u16CaptureC;
  54. float ftCapDuty;

  55. //问题,溢出怎么办?-->溢出直接进入中断了
  56. //捕获中断但是下降沿怎么获取?
  57. uint8_t capFlag=0;
  58. uint16_t overFlowCnt=0;
  59. void Timer62_CapInputCallBack(void)
  60. {
  61.         if(!capFlag){
  62.                 capFlag=1;
  63.                 u16CaptureA = Timer6_GetGeneralCmpValue(M4_TMR62, Timer6GenCompareB);
  64.                 __NOP();
  65.         }else{
  66.                 capFlag=0;
  67.                 u16CaptureC = Timer6_GetGeneralCmpValue(M4_TMR62, Timer6GenCompareB);
  68.                 __NOP();
  69.                 //计算 u16CaptureC - u16CaptureA
  70.         }
  71. }

  72. void Timer62_OverflowCallBack(void)
  73. {
  74.         overFlowCnt++;
  75.         if(overFlowCnt>=10){
  76.                 overFlowCnt=0;
  77.         }
  78. }

  79. /**
  80. ******************************************************************************
  81. ** \brief  Initialize the system clock for the sample
  82. **
  83. ** \param  None
  84. **
  85. ** \return None
  86. ******************************************************************************/
  87. static void SysClkIni(void)
  88. {
  89.     en_clk_sys_source_t       enSysClkSrc;
  90.     stc_clk_sysclk_cfg_t      stcSysClkCfg;
  91.     stc_clk_mpll_cfg_t        stcMpllCfg;

  92.     MEM_ZERO_STRUCT(enSysClkSrc);
  93.     MEM_ZERO_STRUCT(stcSysClkCfg);
  94.     MEM_ZERO_STRUCT(stcMpllCfg);

  95.     /* Set bus clk div. */
  96.     stcSysClkCfg.enHclkDiv = ClkSysclkDiv1;   // 168MHz
  97.     stcSysClkCfg.enExclkDiv = ClkSysclkDiv2;  // 84MHz

  98.     stcSysClkCfg.enPclk0Div = ClkSysclkDiv1;  // 168MHz
  99.     stcSysClkCfg.enPclk1Div = ClkSysclkDiv2;  // 84MHz
  100.     stcSysClkCfg.enPclk2Div = ClkSysclkDiv4;  // 42MHz
  101.     stcSysClkCfg.enPclk3Div = ClkSysclkDiv4;  // 42MHz
  102.     stcSysClkCfg.enPclk4Div = ClkSysclkDiv2;  // 84MHz
  103.     CLK_SysClkConfig(&stcSysClkCfg);

  104.     CLK_HrcCmd(Enable);       //Enable HRC

  105.     /* MPLL config. */
  106.     stcMpllCfg.pllmDiv = 2ul;   //HRC 16M / 2
  107.     stcMpllCfg.plln    = 42ul;  //8M*42 = 336M
  108.     stcMpllCfg.PllpDiv = 2ul;   //MLLP = 168M
  109.     stcMpllCfg.PllqDiv = 2ul;   //MLLQ = 168M
  110.     stcMpllCfg.PllrDiv = 2ul;   //MLLR = 168M
  111.     CLK_SetPllSource(ClkPllSrcHRC);
  112.     CLK_MpllConfig(&stcMpllCfg);

  113.     /* flash read wait cycle setting */
  114.     EFM_Unlock();
  115.     EFM_SetLatency(EFM_LATENCY_4);
  116.     EFM_Lock();

  117.     /* Enable MPLL. */
  118.     CLK_MpllCmd(Enable);

  119.     /* Wait MPLL ready. */
  120.     while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
  121.     {
  122.         ;
  123.     }

  124.     /* Switch system clock source to MPLL. */
  125.     CLK_SetSysClkSource(CLKSysSrcMPLL);
  126. }


  127. #define IO_TEST_PORT        (PortB)
  128. #define IO_TEST_PIN                (Pin10)
  129. #define IO_TEST_OUT_H        PORT_SetBits(IO_TEST_PORT, IO_TEST_PIN)
  130. #define IO_TEST_OUT_L        PORT_ResetBits(IO_TEST_PORT, IO_TEST_PIN)


  131. /*******************************************************************************
  132. *名    称:IIC_IO_Init(void)
  133. *功    能:软件IIC,IO口输出初始化
  134. *说    明:
  135. *修    改:
  136. *******************************************************************************/
  137. void IO_OUT_Init(){
  138.         stc_port_init_t stcPortInit;
  139.         MEM_ZERO_STRUCT(stcPortInit);                                                //必须初始化结构体,否则IO口设置异常 21-06-08(IO翻转对比测试)
  140.         stcPortInit.enPinMode = Pin_Mode_Out;
  141.     stcPortInit.enExInt = Disable;
  142.     stcPortInit.enPullUp = Disable;

  143.         IO_TEST_OUT_H;                                                                                //IO输出高低必须写在前面,初始化默认是低电平,否则会有一个脉冲
  144.         PORT_Init(IO_TEST_PORT, IO_TEST_PIN, &stcPortInit);
  145. }


  146. /**
  147. *******************************************************************************
  148. ** \brief  Main function of project
  149. **
  150. ** \param  None
  151. **
  152. ** \retval int32_t return value, if needed
  153. **
  154. ******************************************************************************/
  155. int32_t main(void)
  156. {
  157.     uint16_t                         u16Period;
  158.     uint16_t                         u16Compare;
  159.     stc_timer6_basecnt_cfg_t         stcTIM6BaseCntCfg;
  160.     stc_timer6_port_output_cfg_t     stcTIM6PWMxCfg;
  161.     stc_timer6_port_input_cfg_t      stcTIM6CapxCfg;
  162.     stc_timer6_gcmp_buf_cfg_t        stcGCMPBufCfg;
  163.     stc_port_init_t                  stcPortInit;
  164.     stc_irq_regi_conf_t              stcIrqRegiConf;
  165.     stc_timer6_sw_sync_t             stcSwSyncStart;

  166.     MEM_ZERO_STRUCT(stcTIM6BaseCntCfg);
  167.     MEM_ZERO_STRUCT(stcTIM6PWMxCfg);
  168.     MEM_ZERO_STRUCT(stcTIM6CapxCfg);
  169.     MEM_ZERO_STRUCT(stcGCMPBufCfg);
  170.     MEM_ZERO_STRUCT(stcPortInit);
  171.     MEM_ZERO_STRUCT(stcIrqRegiConf);
  172.     MEM_ZERO_STRUCT(stcSwSyncStart);

  173.     SysClkIni();                                                                                        //系统时钟,PCLK0 168MHz
  174.     PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM62, Enable);        //TIM62时钟使能

  175.         //设置1:PB2设置捕获输入口
  176.     PORT_SetFunc(PortB, Pin02, Func_Tim6, Disable);                  //Timer62 TrigB

  177.     /******************Config Timer62 count mode*************************/
  178.     stcTIM6BaseCntCfg.enCntMode   = Timer6CntSawtoothMode;        //Sawtooth wave mode
  179.     stcTIM6BaseCntCfg.enCntDir    = Timer6CntDirUp;                        //Counter counting up
  180.     stcTIM6BaseCntCfg.enCntClkDiv = Timer6PclkDiv1024;                //Count clock: pclk0/1024
  181.     Timer6_Init(M4_TMR62, &stcTIM6BaseCntCfg);                                //timer6 PWM frequency, count mode and clk config
  182.     u16Period = 0xFFFFu;                                                                        //168MHz/1024/0xffff=2.5Hz   164K频率,计满400mS
  183.     Timer6_SetPeriod(M4_TMR62, Timer6PeriodA, u16Period);        //Period set
  184.       
  185.         /*捕获输入源设置*/
  186.         stcTIM6CapxCfg.enPortSel  = Timer6TrigB;                           //Capture Input Port: TIME6_TRIGB
  187.         stcTIM6CapxCfg.enPortMode = Timer6ModeCaptureInput;                //Capture input function
  188.         stcTIM6CapxCfg.bFltEn     = false;                                 //Input filter disable
  189.         stcTIM6CapxCfg.enFltClk   = Timer6FltClkPclk0Div16;                //Filter clock,不影响,不使能filter
  190.         Timer6_PortInputConfig(M4_TMR62, &stcTIM6CapxCfg);                 //Input config TMR6x->FCONR_f.NOFIENTB
  191.       
  192.         /*脉宽测量,下降沿捕获,上升沿启动,上升沿清0,下降沿停止*/
  193.         M4_TMR62->PCONR_f.CAPMDB = 1;                                                                                //CAPMDB设置1为捕获功能
  194.         Timer6_ConfigHwCaptureB(M4_TMR62, Timer6HwTrigTimTriBFall);               //HW Capture: timer6TrigB port fall trig TMR6x->HCPBR
  195.         Timer6_ConfigHwStart(M4_TMR62, Timer6HwTrigTimTriBRise);                        //HW Start: 根据文档说明增加
  196.         Timer6_ConfigHwClear(M4_TMR62, Timer6HwTrigTimTriBRise);                  //HW Clear: 配置硬件清零事件选择寄存器(HCLRR),使得每次发生捕获事件后,计数器从0开始重新计数。
  197.         Timer6_ConfigHwStop(M4_TMR62, Timer6HwTrigTimTriBFall);                                //HW Stop: imer6TrigB port fall trig
  198.         Timer6_EnableHwClear(M4_TMR62);
  199.         Timer6_ConfigHwCntUp(M4_TMR62, Timer6HwCntTRIGBRise);                                //硬件同步计数(HCUPR)
  200. //        Timer6_EnableHwStart(M4_TMR6_TypeDef *TMR6x)
  201.       
  202.     /*config interrupt*/
  203.     /* Enable timer62 GCMAR interrupt */
  204.     Timer6_ConfigIrq(M4_TMR62, Timer6INTENB, true);                                                //捕获中断

  205.     stcIrqRegiConf.enIRQn = Int003_IRQn;                                            //Register INT_TMR61_GUDF Int to Vect.No.002
  206.     stcIrqRegiConf.enIntSrc = INT_TMR62_GCMB;                                       //Select Event interrupt function
  207.     stcIrqRegiConf.pfnCallback = &Timer62_CapInputCallBack;                          //Callback function
  208.     enIrqRegistration(&stcIrqRegiConf);                                             //Registration IRQ

  209.         stcIrqRegiConf.enIRQn = Int003_IRQn;                                            //Register INT_TMR61_GUDF Int to Vect.No.002
  210.     stcIrqRegiConf.enIntSrc = INT_TMR62_GOVF;                                       //溢出中断函数
  211.     stcIrqRegiConf.pfnCallback = &Timer62_OverflowCallBack;                          //Callback function
  212.     enIrqRegistration(&stcIrqRegiConf);                                             //Registration IRQ
  213.       
  214.     NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);                                    //Clear Pending
  215.     NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_04);                //Set priority
  216.     NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);                                           //Enable NVIC

  217.     /*start timer6*/
  218. //    stcSwSyncStart.bTimer62 = true;
  219. //    Timer6_SwSyncStart(&stcSwSyncStart);
  220.         Timer6_StartCount(M4_TMR62);
  221.       
  222.         IO_OUT_Init();
  223.         while(1){
  224.                 IO_TEST_OUT_H;                //高电平20uS捕获测试
  225.                 Delay_us(20);
  226.                 IO_TEST_OUT_L;                //低电平1S
  227.                 Delay_ms(1000);
  228.                 __NOP();
  229.         }
  230. }










 楼主| 茂xiang 发表于 2021-9-2 13:33 | 显示全部楼层
本帖最后由 茂xiang 于 2021-9-2 13:36 编辑

按照规格书说明和大家建议,现在无法进入捕获中断了
sadicy 发表于 2021-9-3 10:50 | 显示全部楼层
感觉,有点复杂了
 楼主| 茂xiang 发表于 2021-9-3 11:51 | 显示全部楼层
问题解决了,TrigB必须开启Timer61时钟,谁能想到?!!!
同时要使能Start、Clear、Stop!!!
martinhu 发表于 2021-9-3 13:24 | 显示全部楼层
茂xiang 发表于 2021-9-3 11:51
问题解决了,TrigB必须开启Timer61时钟,谁能想到?!!!
同时要使能Start、Clear、Stop!!! ...

start和stop不需要,只要clear就行。启动的话初始化之后,软件写一次启动就行,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

13

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部