打印
[技术问答]

HC32L110的PCA比较捕获和TIM4/5/6的捕获功能是一样的吗?

[复制链接]
楼主: wzx1994
手机看帖
扫描二维码
随时随地手机跟帖
21
wzx1994|  楼主 | 2020-9-8 17:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
guguo8266 发表于 2020-9-8 16:37
110低功耗串口和普通串口一起用,为啥库文件定义重复?如何修改?

我这边没有用低功耗串口

使用特权

评论回复
22
guguo8266| | 2020-9-9 15:52 | 只看该作者
wzx1994 发表于 2020-9-8 17:41
我这边没有用低功耗串口

好像需要自己改动库

使用特权

评论回复
23
guguo8266| | 2020-9-9 15:56 | 只看该作者
HC32L110的高级定时器输入捕捉功能连续计算周期,请问谁会操作每次清零重新测值?

使用特权

评论回复
24
wzx1994|  楼主 | 2020-9-9 15:57 | 只看该作者
guguo8266 发表于 2020-9-9 15:52
好像需要自己改动库

一般情况下不建议直接改库。自己可以折腾一下

使用特权

评论回复
25
wzx1994|  楼主 | 2020-9-9 15:58 | 只看该作者
guguo8266 发表于 2020-9-9 15:56
HC32L110的高级定时器输入捕捉功能连续计算周期,请问谁会操作每次清零重新测值? ...

只要清除掉计数值就行了,下次进中断就是重新计数的值

使用特权

评论回复
26
guguo8266| | 2020-9-9 16:07 | 只看该作者
wzx1994 发表于 2020-9-9 15:58
只要清除掉计数值就行了,下次进中断就是重新计数的值

请问有库函数吗?
直接操作计数值不会

使用特权

评论回复
27
guguo8266| | 2020-9-9 16:10 | 只看该作者
wzx1994 发表于 2020-9-9 15:58
只要清除掉计数值就行了,下次进中断就是重新计数的值

留个球球号:95194961

使用特权

评论回复
28
wzx1994|  楼主 | 2020-9-9 16:15 | 只看该作者
guguo8266 发表于 2020-9-9 16:07
请问有库函数吗?
直接操作计数值不会

void Adt4CaptureACalllback(void)
{
    Adt_GetCaptureValue(AdTIM4, AdtCHxA, &u16Capture);
                Adt_ClearIrqFlag(AdTIM4,AdtCMAIrq);
                Adt_StopCount(AdTIM4);
                Adt_ClearCount(AdTIM4);
                Adt_StartCount(AdTIM4);
}

使用特权

评论回复
29
guguo8266| | 2020-9-9 17:17 | 只看该作者
wzx1994 发表于 2020-9-9 16:15
void Adt4CaptureACalllback(void)
{
    Adt_GetCaptureValue(AdTIM4, AdtCHxA, &u16Capture);

你的改动好像不对啊?计数的值还是在增加?!

使用特权

评论回复
30
wzx1994|  楼主 | 2020-9-9 17:20 | 只看该作者
guguo8266 发表于 2020-9-9 17:17
你的改动好像不对啊?计数的值还是在增加?!

不会啊。我每次读出来的值都是对的。并不是增加的。你将你读到的值存放到一个数组里面,读100次,在判断数组存满100次的位置加个断点,看一下数组里面的值和你实际输入捕获的值是否一致

使用特权

评论回复
31
guguo8266| | 2020-9-9 17:30 | 只看该作者
本帖最后由 guguo8266 于 2020-9-9 17:33 编辑
wzx1994 发表于 2020-9-9 17:20
不会啊。我每次读出来的值都是对的。并不是增加的。你将你读到的值存放到一个数组里面,读100次,在判断 ...
uint8_t u8Adt**=0;


void Adt4CaptureBCalllback(void)
{
    u8Adt**=1;
    Adt_GetCaptureValue(AdTIM4, AdtCHxB, &u16Capture);



    Adt_GetCntState(AdTIM4, &stcAdt4CntState);



                Adt_ClearIrqFlag(AdTIM4,AdtCMAIrq);
                Adt_StopCount(AdTIM4);
                Adt_ClearCount(AdTIM4);
                Adt_StartCount(AdTIM4);


}

    Clk_SetPeripheralGate(ClkPeripheralGpio, TRUE); //端口外设时钟使能
   
    Gpio_SetFunc_TIM4_CHB_P24();

    if (Ok != Clk_SetPeripheralGate(ClkPeripheralAdt, TRUE))//ADT外设时钟使能
    {
        return Error;
    }
    enAdt = AdTIM4;
   
   
   
    stcAdtBaseCntCfg.enCntDir = AdtCntUp;                       ///< 递加计数 ,默认是递减计数
    stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0Div256;          ///< PCLK0
    Adt_Init(enAdt, &stcAdtBaseCntCfg);                         //ADT载波、计数模式、时钟配置
   
    stcAdtTIM4BCfg.enCap = AdtCHxCompareInput;                  ///< CHx端口设定为捕获输入功能
    Adt_CHxXPortConfig(enAdt, AdtCHxB, &stcAdtTIM4BCfg);        //端口CHB配置,捕获输入功能
   
    Adt_ConfigHwCaptureB(enAdt, AdtHwTrigTimxBRise);            //硬件捕获B条件配置///
   
    Adt_ConfigHwClear(AdTIM4, AdtHwTrigTimxBRise);
   
    Adt_ConfigIrq(enAdt, AdtCMBIrq, TRUE, Adt4CaptureBCalllback); //捕获中断B配置
   
    Adt_StartCount(enAdt);

使用特权

评论回复
评论
guguo8266 2020-9-9 17:35 回复TA
请您看看源码 
32
wzx1994|  楼主 | 2020-9-9 18:13 | 只看该作者

Adt_ClearIrqFlag(AdTIM4,AdtCMAIrq);
AdtCMAIrq改成AdtCMBIrq

使用特权

评论回复
33
guguo8266| | 2020-9-10 08:41 | 只看该作者
wzx1994 发表于 2020-9-9 18:13
Adt_ClearIrqFlag(AdTIM4,AdtCMAIrq);
AdtCMAIrq改成AdtCMBIrq

非常感谢您的帮助,但是依然不行,有规律的递增,我检测的是方波信号。

使用特权

评论回复
34
martinhu| | 2020-9-10 09:05 | 只看该作者
wzx1994 发表于 2020-9-3 13:57
例程我也用了,根据例程来改,但是获得的计数值居然每次是累加的。只能手动去清除计数值 ...

按图中划框的设置,就可以实现自动捕获周期和自动清零,
你可以参考L19x或者L13x最新的捕获例程

使用特权

评论回复
35
wzx1994|  楼主 | 2020-9-10 09:35 | 只看该作者
martinhu 发表于 2020-9-10 09:05
按图中划框的设置,就可以实现自动捕获周期和自动清零,
你可以参考L19x或者L13x最新的捕获例程

看了136的输入捕获例程,的确比110的输入捕获例程简单明了一点。

使用特权

评论回复
36
wzx1994|  楼主 | 2020-9-10 09:48 | 只看该作者
guguo8266 发表于 2020-9-10 08:41
非常感谢您的帮助,但是依然不行,有规律的递增,我检测的是方波信号。 ...

按照HC32L136的例程可以。你代码里面只要加上这几段代码应该就可以了,你看着改一下    Adt_ConfigHwCaptureA(enAdt,AdtHwTrigTimxAFall);                                //< CHxA端口上采样到下降沿
Adt_ConfigHwCaptureA(enAdt,AdtHwTrigTimxARise);                                //< CHxA端口上采样到上升沿
Adt_EnableHwClear(enAdt);

使用特权

评论回复
评论
wzx1994 2020-9-10 15:19 回复TA
@martinhu :是的,136的例程的相对于以前的例程,现在的例程更容易上手。希望110也能像136一样 
martinhu 2020-9-10 15:08 回复TA
如果是捕获周期的话,捕获边沿是下降沿,那么硬件清零的边沿也是下降沿。 
37
guguo8266| | 2020-9-11 14:18 | 只看该作者
wzx1994 发表于 2020-9-10 09:48
按照HC32L136的例程可以。你代码里面只要加上这几段代码应该就可以了,你看着改一下    Adt_ConfigHwCaptu ...

#include "ddl.h"
#include "lpuart.h"
#include "bt.h"
#include "clk.h"
#include "lpm.h"
#include "gpio.h"

#include "uart.h"

/******************************************************************************
* Local pre-processor symbols/macros ('#define')                           
******************************************************************************/

/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/

/******************************************************************************
* Local type definitions ('typedef')                                         
******************************************************************************/

/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/

/******************************************************************************
* Local variable definitions ('static')                                      *
******************************************************************************/

/******************************************************************************
* Local pre-processor symbols/macros ('#define')                             
******************************************************************************/

/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
******************************************************************************
** \brief  Main function of project
**
** \return uint32_t return value, if needed
**
** This sample
**
******************************************************************************/
//static stc_adt_cntstate_cfg_t stcAdt4CntState;
//static uint16_t u16Capture;

/******************************************************************************
* Local variable definitions ('static')                                      *
******************************************************************************/


/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/





uint8_t u8RxData[2]={0x50,0x00};
uint8_t u8Rx**=0;
void RxIntCallback(void)
{
    u8RxData[1]=M0P_LPUART->SBUF;
        u8Rx** = 1;
        
        LPUart_ClrStatus(LPUartRxFull);//LPUartRxFull
}
void ErrIntCallback(void)
{
  LPUart_ClrStatus(LPUartRFRAMEError);
}





uint8_t u8RxDataUartch1[2]={0x51,0x00};
uint8_t u8Rx**Uartch1=0;


void RxIntCallbackUartch1(void)
{
    u8RxDataUartch1[1]=M0P_UART1->SBUF;
    u8Rx**Uartch1=1;
   
    Uart_ClrStatus(UARTCH1,UartRxFull);
   
}

void ErrIntCallbackUartch1(void)
{
  Uart_ClrStatus(UARTCH1,UartRFRAMEError);
}



int32_t main(void)
{  
  
         
    uint16_t timer=0;
    uint32_t pclk=0;
       
  
    uint16_t u16timer=0;
    uint32_t u32sclk=0;

    volatile uint32_t u32Val = 0;
   
      
   
    stc_lpuart_config_t  stcConfig;
    stc_lpuart_irq_cb_t  stcLPUartIrqCb;
    stc_lpuart_multimode_t stcMulti;
    stc_lpuart_sclk_sel_t  stcLpuart_clk;
    stc_lpuart_mode_t       stcRunMode;
    stc_lpuart_baud_config_t  stcBaud;
    stc_bt_config_t stcBtConfig;
   
   
    stc_uart_config_t  stcConfigUartch1;
    stc_uart_irq_cb_t stcUartIrqCbUartch1;
    stc_uart_multimode_t stcMultiUartch1;
    stc_uart_baud_config_t stcBaudUartch1;
    stc_bt_config_t stcBtConfigUartch1;
   
   
   
    DDL_ZERO_STRUCT(stcConfig);
    DDL_ZERO_STRUCT(stcLPUartIrqCb);
    DDL_ZERO_STRUCT(stcMulti);
    DDL_ZERO_STRUCT(stcBtConfig);
  
    DDL_ZERO_STRUCT(stcConfigUartch1);
    DDL_ZERO_STRUCT(stcUartIrqCbUartch1);
    DDL_ZERO_STRUCT(stcMultiUartch1);
    DDL_ZERO_STRUCT(stcBtConfigUartch1);
    DDL_ZERO_STRUCT(stcBaudUartch1);
  

   
    Gpio_InitIO(0,3,GpioDirOut);//指示灯
    Gpio_SetIO(0,3,1);
   
    Clk_SetRCLFreq(ClkFreq38_4K);
    Clk_SwitchTo(ClkRCL);
    Clk_SetRCHFreq(ClkFreq22_12Mhz);
    Clk_SwitchTo(ClkRCH);
   

   
    Clk_SetPeripheralGate(ClkPeripheralLpUart,TRUE);            //使能LPUART时钟
    Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);
   
   
    Gpio_InitIOExt(2,5,GpioDirOut,TRUE,FALSE,FALSE,FALSE);
    Gpio_InitIOExt(2,6,GpioDirOut,TRUE,FALSE,FALSE,FALSE);

    Gpio_SetFunc_UART2RX_P25();
    Gpio_SetFunc_UART2TX_P26();
   

   
    stcLpuart_clk.enSclk_sel = LPUart_Pclk;//LPUart_Rcl;
   
    stcLpuart_clk.enSclk_Prs = LPUartDiv1;///<div1
    stcConfig.pstcLpuart_clk = &stcLpuart_clk;

    stcRunMode.enLpMode = LPUartNoLPMode;//正常工作模式
    stcRunMode.enMode   = LPUartMode1;///<模式1
    stcConfig.pstcRunMode = &stcRunMode;

    stcLPUartIrqCb.pfnRxIrqCb = RxIntCallback;
    stcLPUartIrqCb.pfnTxIrqCb = NULL;
    stcLPUartIrqCb.pfnRxErrIrqCb = ErrIntCallback;
    stcConfig.pstcIrqCb = &stcLPUartIrqCb;
    stcConfig.bTouchNvic = TRUE;

    stcMulti.enMulti_mode = LPUartNormal;//只有模式2/3才有多主机模式

    stcConfig.pstcMultiMode = &stcMulti;
   
    LPUart_EnableIrq(LPUartRxIrq);

    LPUart_Init(&stcConfig);

    if(LPUart_Pclk == stcLpuart_clk.enSclk_sel)
        u32sclk = Clk_GetPClkFreq();
    else if(LPUart_Rcl == stcLpuart_clk.enSclk_sel)
        u32sclk = 38400u;//此处建议用户使用内部38.4K时钟,如果用户使用32.768K时钟的,此处更新成32768

      
    stcBaud.u32Baud = 19200u;
    stcBaud.bDbaud = 1u;//
    stcBaud.u8LpMode = LPUartNoLPMode;///<非低功耗模式
    stcBaud.u8Mode = LPUartMode3;
    u16timer = LPUart_SetBaudRate(u32sclk,stcLpuart_clk.enSclk_Prs,&stcBaud);
    stcBtConfig.enMD = BtMode2;///< 自动重装载16位计数器/定时器
    stcBtConfig.enCT = BtTimer; ///< 定时器功能
    stcBtConfig.enTog = BtTogEnable;///< 翻转输出使能
    Bt_Init(TIM2, &stcBtConfig);//调用basetimer2设置函数产生波特率
    Bt_ARRSet(TIM2,u16timer);//重载值设置
    Bt_Cnt16Set(TIM2,u16timer);//6位计数器初值设置
    Bt_Run(TIM2);

    LPUart_EnableFunc(LPUartRx);   
   

   
   
        
    Gpio_InitIOExt(2,3,GpioDirOut,TRUE,FALSE,FALSE,FALSE);   
    Gpio_InitIOExt(2,4,GpioDirOut,TRUE,FALSE,FALSE,FALSE);   
   
   
    Gpio_SetFunc_UART1TX_P23();
    Gpio_SetFunc_UART1RX_P24();
   
    //外设时钟使能
    Clk_SetPeripheralGate(ClkPeripheralBt,TRUE);//模式0/2可以不使能
    Clk_SetPeripheralGate(ClkPeripheralUart1,TRUE);



    stcUartIrqCbUartch1.pfnRxIrqCb = RxIntCallbackUartch1;
    stcUartIrqCbUartch1.pfnTxIrqCb = NULL;
    stcUartIrqCbUartch1.pfnRxErrIrqCb = ErrIntCallbackUartch1;
    stcConfigUartch1.pstcIrqCb = &stcUartIrqCbUartch1;
    stcConfigUartch1.bTouchNvic = TRUE;
  

    stcConfigUartch1.enRunMode = UartMode1;//测试项,更改此处来转换4种模式测试
   

    stcMultiUartch1.enMulti_mode = UartNormal;//测试项,更改此处来转换多主机模式,mode2/3才有多主机模式

    stcConfigUartch1.pstcMultiMode = &stcMultiUartch1;
   
    stcBaudUartch1.bDbaud = 1u;//双倍波特率功能
    stcBaudUartch1.u32Baud = 19200u;//更新波特率位置
    stcBaudUartch1.u8Mode = UartMode1; //计算波特率需要模式参数
    pclk = Clk_GetPClkFreq();
    timer=Uart_SetBaudRate(UARTCH1,pclk,&stcBaudUartch1);

    stcBtConfigUartch1.enMD = BtMode2;
    stcBtConfigUartch1.enCT = BtTimer;
   
   
    Bt_Init(TIM1, &stcBtConfigUartch1);//调用basetimer1设置函数产生波特率
    Bt_ARRSet(TIM1,timer);
    Bt_Cnt16Set(TIM1,timer);
    Bt_Run(TIM1);

   
    Uart_Init(UARTCH1, &stcConfigUartch1);
    Uart_ClrStatus(UARTCH1,UartRxFull);
    Uart_EnableIrq(UARTCH1,UartRxIrq);
    Uart_ClrStatus(UARTCH1,UartRxFull);
    Uart_EnableFunc(UARTCH1,UartRx);
   
   
   
    while (1)
    {
      
               
        
                Gpio_SetIO(0,3,u8Rx**||u8Rx**Uartch1);
               
               
                if(u8Rx**Uartch1)
                {
                       
                       
                                
                                Uart_SendData(UARTCH1,u8RxDataUartch1[0]);
                                Uart_SendData(UARTCH1,u8RxDataUartch1[1]);
                                u8Rx**Uartch1=0;
                     
                }  
               
               
                if(u8Rx**)
                {
                       
                       
                               
                                u8Rx**=0;
                                LPUart_SendData(u8RxData[0]);
                                LPUart_SendData(u8RxData[1]);
                     
                                if(0x99==u8RxData[1])
                                {  
                                
                                                
                                                                 
                                                LPUart_SendData((uint8_t)('<'));                 
                                                LPUart_SendData((uint8_t)('R'));      
                                                LPUart_SendData((uint8_t)('D'));     
                                                LPUart_SendData((uint8_t)('_'));     
                                                LPUart_SendData((uint8_t)('N'));     
                                                LPUart_SendData((uint8_t)('A'));      
                                                LPUart_SendData((uint8_t)('M'));     
                                                LPUart_SendData((uint8_t)('E'));     
                                                LPUart_SendData((uint8_t)('>'));
                           
                                 
                                 
                                 
                                }
               
      
                        
                        }
                        
               
               
        }
   
}

使用特权

评论回复
评论
guguo8266 2020-9-11 14:21 回复TA
调了一天了,不通,烧写程序后,只进一次,后面自己就不进了 
guguo8266 2020-9-11 14:19 回复TA
这两个串口不能同时中断接收吗? 
38
guguo8266| | 2020-9-14 14:56 | 只看该作者
wzx1994 发表于 2020-9-10 09:48
按照HC32L136的例程可以。你代码里面只要加上这几段代码应该就可以了,你看着改一下    Adt_ConfigHwCaptu ...

清零一般是一个周期一清,但是有时是2个周期,偶尔3个周期,我直接晕倒了!不知诸位大侠碰到过没有!

使用特权

评论回复
39
wzx1994|  楼主 | 2020-9-14 15:18 | 只看该作者
guguo8266 发表于 2020-9-14 14:56
清零一般是一个周期一清,但是有时是2个周期,偶尔3个周期,我直接晕倒了!不知诸位大侠碰到过没有! ...

进中断就会清掉吧。我的都是这样。

使用特权

评论回复
40
guguo8266| | 2020-9-14 15:22 | 只看该作者
wzx1994 发表于 2020-9-14 15:18
进中断就会清掉吧。我的都是这样。

我存了10次的值,跑了一会就出现好多次.

使用特权

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

本版积分规则