本帖最后由 茂xiang 于 2021-9-2 13:37 编辑
按照规格书说明和大家建议,现在无法进入捕获中断了,华大也没有脉冲测量的完整示例,ε=(´ο`*)))唉
#include "hc32_ddl.h"
#include "hal_CLK.h"
#include "hc32f46x_timer6.h"
#include "sysGeneralFunc.h"
/******************************************************************************/
/** \file main.c
**
** \brief This sample demonstrates how to use Timer6.
**
** - 2018-11-30 1.0 husj first version for Device Driver Library of Timer6.
**
******************************************************************************/
#include "hc32_ddl.h"
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/* KEY0 (SW2)*/
#define SW2_PORT (PortD)
#define SW2_PIN (Pin03)
/* KEY1 (SW4)*/
#define SW4_PORT (PortD)
#define SW4_PIN (Pin04)
/* KEY2 (SW3)*/
#define SW3_PORT (PortD)
#define SW3_PIN (Pin05)
/* KEY3 (SW5)*/
#define SW5_PORT (PortD)
#define SW5_PIN (Pin06)
/* LED0 Port/Pin definition */
#define LED0_PORT (PortE)
#define LED0_PIN (Pin06)
/* LED1 Port/Pin definition */
#define LED1_PORT (PortD)
#define LED1_PIN (Pin07)
/* LED2 Port/Pin definition */
#define LED2_PORT (PortB)
#define LED2_PIN (Pin05)
/* LED3 Port/Pin definition */
#define LED3_PORT (PortB)
#define LED3_PIN (Pin09)
/* LED0~1 toggle definition */
#define LED0_TOGGLE() (PORT_Toggle(LED0_PORT, LED0_PIN))
#define LED1_TOGGLE() (PORT_Toggle(LED1_PORT, LED1_PIN))
#define LED2_TOGGLE() (PORT_Toggle(LED2_PORT, LED2_PIN))
#define LED3_TOGGLE() (PORT_Toggle(LED3_PORT, LED3_PIN))
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
uint16_t u16CaptureA;
uint16_t u16CaptureC;
float ftCapDuty;
//问题,溢出怎么办?-->溢出直接进入中断了
//捕获中断但是下降沿怎么获取?
uint8_t capFlag=0;
uint16_t overFlowCnt=0;
void Timer62_CapInputCallBack(void)
{
if(!capFlag){
capFlag=1;
u16CaptureA = Timer6_GetGeneralCmpValue(M4_TMR62, Timer6GenCompareB);
__NOP();
}else{
capFlag=0;
u16CaptureC = Timer6_GetGeneralCmpValue(M4_TMR62, Timer6GenCompareB);
__NOP();
//计算 u16CaptureC - u16CaptureA
}
}
void Timer62_OverflowCallBack(void)
{
overFlowCnt++;
if(overFlowCnt>=10){
overFlowCnt=0;
}
}
/**
******************************************************************************
** \brief Initialize the system clock for the sample
**
** \param None
**
** \return None
******************************************************************************/
static void SysClkIni(void)
{
en_clk_sys_source_t enSysClkSrc;
stc_clk_sysclk_cfg_t stcSysClkCfg;
stc_clk_mpll_cfg_t stcMpllCfg;
MEM_ZERO_STRUCT(enSysClkSrc);
MEM_ZERO_STRUCT(stcSysClkCfg);
MEM_ZERO_STRUCT(stcMpllCfg);
/* Set bus clk div. */
stcSysClkCfg.enHclkDiv = ClkSysclkDiv1; // 168MHz
stcSysClkCfg.enExclkDiv = ClkSysclkDiv2; // 84MHz
stcSysClkCfg.enPclk0Div = ClkSysclkDiv1; // 168MHz
stcSysClkCfg.enPclk1Div = ClkSysclkDiv2; // 84MHz
stcSysClkCfg.enPclk2Div = ClkSysclkDiv4; // 42MHz
stcSysClkCfg.enPclk3Div = ClkSysclkDiv4; // 42MHz
stcSysClkCfg.enPclk4Div = ClkSysclkDiv2; // 84MHz
CLK_SysClkConfig(&stcSysClkCfg);
CLK_HrcCmd(Enable); //Enable HRC
/* MPLL config. */
stcMpllCfg.pllmDiv = 2ul; //HRC 16M / 2
stcMpllCfg.plln = 42ul; //8M*42 = 336M
stcMpllCfg.PllpDiv = 2ul; //MLLP = 168M
stcMpllCfg.PllqDiv = 2ul; //MLLQ = 168M
stcMpllCfg.PllrDiv = 2ul; //MLLR = 168M
CLK_SetPllSource(ClkPllSrcHRC);
CLK_MpllConfig(&stcMpllCfg);
/* flash read wait cycle setting */
EFM_Unlock();
EFM_SetLatency(EFM_LATENCY_4);
EFM_Lock();
/* Enable MPLL. */
CLK_MpllCmd(Enable);
/* Wait MPLL ready. */
while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy))
{
;
}
/* Switch system clock source to MPLL. */
CLK_SetSysClkSource(CLKSysSrcMPLL);
}
#define IO_TEST_PORT (PortB)
#define IO_TEST_PIN (Pin10)
#define IO_TEST_OUT_H PORT_SetBits(IO_TEST_PORT, IO_TEST_PIN)
#define IO_TEST_OUT_L PORT_ResetBits(IO_TEST_PORT, IO_TEST_PIN)
/*******************************************************************************
*名 称:IIC_IO_Init(void)
*功 能:软件IIC,IO口输出初始化
*说 明:
*修 改:
*******************************************************************************/
void IO_OUT_Init(){
stc_port_init_t stcPortInit;
MEM_ZERO_STRUCT(stcPortInit); //必须初始化结构体,否则IO口设置异常 21-06-08(IO翻转对比测试)
stcPortInit.enPinMode = Pin_Mode_Out;
stcPortInit.enExInt = Disable;
stcPortInit.enPullUp = Disable;
IO_TEST_OUT_H; //IO输出高低必须写在前面,初始化默认是低电平,否则会有一个脉冲
PORT_Init(IO_TEST_PORT, IO_TEST_PIN, &stcPortInit);
}
/**
*******************************************************************************
** \brief Main function of project
**
** \param None
**
** \retval int32_t return value, if needed
**
******************************************************************************/
int32_t main(void)
{
uint16_t u16Period;
uint16_t u16Compare;
stc_timer6_basecnt_cfg_t stcTIM6BaseCntCfg;
stc_timer6_port_output_cfg_t stcTIM6PWMxCfg;
stc_timer6_port_input_cfg_t stcTIM6CapxCfg;
stc_timer6_gcmp_buf_cfg_t stcGCMPBufCfg;
stc_port_init_t stcPortInit;
stc_irq_regi_conf_t stcIrqRegiConf;
stc_timer6_sw_sync_t stcSwSyncStart;
MEM_ZERO_STRUCT(stcTIM6BaseCntCfg);
MEM_ZERO_STRUCT(stcTIM6PWMxCfg);
MEM_ZERO_STRUCT(stcTIM6CapxCfg);
MEM_ZERO_STRUCT(stcGCMPBufCfg);
MEM_ZERO_STRUCT(stcPortInit);
MEM_ZERO_STRUCT(stcIrqRegiConf);
MEM_ZERO_STRUCT(stcSwSyncStart);
SysClkIni(); //系统时钟,PCLK0 168MHz
PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM62, Enable); //TIM62时钟使能
//设置1:PB2设置捕获输入口
PORT_SetFunc(PortB, Pin02, Func_Tim6, Disable); //Timer62 TrigB
/******************Config Timer62 count mode*************************/
stcTIM6BaseCntCfg.enCntMode = Timer6CntSawtoothMode; //Sawtooth wave mode
stcTIM6BaseCntCfg.enCntDir = Timer6CntDirUp; //Counter counting up
stcTIM6BaseCntCfg.enCntClkDiv = Timer6PclkDiv1024; //Count clock: pclk0/1024
Timer6_Init(M4_TMR62, &stcTIM6BaseCntCfg); //timer6 PWM frequency, count mode and clk config
u16Period = 0xFFFFu; //168MHz/1024/0xffff=2.5Hz 164K频率,计满400mS
Timer6_SetPeriod(M4_TMR62, Timer6PeriodA, u16Period); //Period set
/*捕获输入源设置*/
stcTIM6CapxCfg.enPortSel = Timer6TrigB; //Capture Input Port: TIME6_TRIGB
stcTIM6CapxCfg.enPortMode = Timer6ModeCaptureInput; //Capture input function
stcTIM6CapxCfg.bFltEn = false; //Input filter disable
stcTIM6CapxCfg.enFltClk = Timer6FltClkPclk0Div16; //Filter clock,不影响,不使能filter
Timer6_PortInputConfig(M4_TMR62, &stcTIM6CapxCfg); //Input config TMR6x->FCONR_f.NOFIENTB
/*脉宽测量,下降沿捕获,上升沿启动,上升沿清0,下降沿停止*/
M4_TMR62->PCONR_f.CAPMDB = 1; //CAPMDB设置1为捕获功能
Timer6_ConfigHwCaptureB(M4_TMR62, Timer6HwTrigTimTriBFall); //HW Capture: timer6TrigB port fall trig TMR6x->HCPBR
Timer6_ConfigHwStart(M4_TMR62, Timer6HwTrigTimTriBRise); //HW Start: 根据文档说明增加
Timer6_ConfigHwClear(M4_TMR62, Timer6HwTrigTimTriBRise); //HW Clear: 配置硬件清零事件选择寄存器(HCLRR),使得每次发生捕获事件后,计数器从0开始重新计数。
Timer6_ConfigHwStop(M4_TMR62, Timer6HwTrigTimTriBFall); //HW Stop: imer6TrigB port fall trig
Timer6_EnableHwClear(M4_TMR62);
Timer6_ConfigHwCntUp(M4_TMR62, Timer6HwCntTRIGBRise); //硬件同步计数(HCUPR)
// Timer6_EnableHwStart(M4_TMR6_TypeDef *TMR6x)
/*config interrupt*/
/* Enable timer62 GCMAR interrupt */
Timer6_ConfigIrq(M4_TMR62, Timer6INTENB, true); //捕获中断
stcIrqRegiConf.enIRQn = Int003_IRQn; //Register INT_TMR61_GUDF Int to Vect.No.002
stcIrqRegiConf.enIntSrc = INT_TMR62_GCMB; //Select Event interrupt function
stcIrqRegiConf.pfnCallback = &Timer62_CapInputCallBack; //Callback function
enIrqRegistration(&stcIrqRegiConf); //Registration IRQ
stcIrqRegiConf.enIRQn = Int003_IRQn; //Register INT_TMR61_GUDF Int to Vect.No.002
stcIrqRegiConf.enIntSrc = INT_TMR62_GOVF; //溢出中断函数
stcIrqRegiConf.pfnCallback = &Timer62_OverflowCallBack; //Callback function
enIrqRegistration(&stcIrqRegiConf); //Registration IRQ
NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); //Clear Pending
NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_04); //Set priority
NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); //Enable NVIC
/*start timer6*/
// stcSwSyncStart.bTimer62 = true;
// Timer6_SwSyncStart(&stcSwSyncStart);
Timer6_StartCount(M4_TMR62);
IO_OUT_Init();
while(1){
IO_TEST_OUT_H; //高电平20uS捕获测试
Delay_us(20);
IO_TEST_OUT_L; //低电平1S
Delay_ms(1000);
__NOP();
}
}
|