PH2做为TMR4-2的时钟输入。
简单的验证,只需要将旁边的PC13翻转,连接到PH2即可。
直接上代码。
主函数:
int32_t main(void)
{
/* Register write enable for some required peripherals. */
LL_PERIPH_WE(LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU);
LED_Init();
PC13_Init();
GPIO_InitForTim42CLK();
FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR4_2, ENABLE);
TMR42_Config();
/* Register write protected for some required peripherals. */
LL_PERIPH_WP(LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU);
for (;;) {
GPIO_TogglePins(GPIO_PORT_C, GPIO_PIN_13);
}
}
PH2的配置:
void GPIO_InitForTim42CLK(void)
{
stc_gpio_init_t stcGpioInit;
// /* 2. 配置 GPIO 结构体 */
(void)GPIO_StructInit(&stcGpioInit);
stcGpioInit.u16PinState = PIN_STAT_RST;
stcGpioInit.u16PinDir = PIN_DIR_IN;
stcGpioInit.u16PinOutputType = PIN_OUT_TYPE_CMOS;
stcGpioInit.u16PinDrv = PIN_LOW_DRV;
stcGpioInit.u16Latch = PIN_LATCH_OFF;
stcGpioInit.u16PullUp = PIN_PU_ON;
stcGpioInit.u16Invert = PIN_INVT_OFF;
stcGpioInit.u16ExtInt = PIN_EXTINT_ON;
stcGpioInit.u16PinAttr = PIN_ATTR_DIGITAL;
GPIO_Init(GPIO_PORT_H, GPIO_PIN_02, &stcGpioInit);
/* 3. 将 PH2 的复用功能设置为 Func1 (FCMREF) */
GPIO_SetFunc(GPIO_PORT_H, GPIO_PIN_02, GPIO_FUNC_2);
}
定时器配置
static uint32_t TMR4_ClockFreq(void)
{
return CLK_GetBusClockFreq(CLK_BUS_PCLK1);
}
/* TMR4 count value per second */
#define TMR4_COUNT_VALUE_PER_SECOND(div) ((TMR4_ClockFreq() / (1UL << (uint32_t)(div))))
unsigned int temp=0;
static void TMR4_CountValley_IrqCallback(void)
{
GPIO_TogglePins(GPIO_PORT_E, GPIO_PIN_06);
TMR4_ClearStatus(CM_TMR4_2, TMR4_FLAG_CNT_PEAK);
}
static void TMR42_Config(void)
{
stc_tmr4_init_t stcTmr4Init;
stc_irq_signin_config_t stcIrqConfig;
/* Enable timer0 and AOS clock */
FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR4_2, ENABLE);
/* Initialize TMR4 Counter */
stcTmr4Init.u16CountMode = TMR4_MD_SAWTOOTH; //三角波是锯齿波的2倍
stcTmr4Init.u16ClockSrc = TMR4_CLK_SRC_EXTCLK;//TMR4_CLK_SRC_INTERNCLK;
stcTmr4Init.u16ClockDiv = TMR4_CLK_DIV64;
stcTmr4Init.u16PeriodValue = (uint16_t)(TMR4_COUNT_VALUE_PER_SECOND(stcTmr4Init.u16ClockDiv) / \
(2UL * ((uint32_t)TMR4_INT_CNT_MASK15 + 1UL))) - 1U;
(void)TMR4_Init(CM_TMR4_2, &stcTmr4Init);
/* Register IRQ handler && configure NVIC. */
stcIrqConfig.enIRQn = INT000_IRQn;
stcIrqConfig.enIntSrc = INT_SRC_TMR4_2_OVF;
stcIrqConfig.pfnCallback = &TMR4_CountValley_IrqCallback;
(void)INTC_IrqSignIn(&stcIrqConfig);
NVIC_ClearPendingIRQ(stcIrqConfig.enIRQn);
NVIC_SetPriority(stcIrqConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
NVIC_EnableIRQ(stcIrqConfig.enIRQn);
/* Enable the valley interrupt */
TMR4_IntCmd(CM_TMR4_2, TMR4_INT_CNT_PEAK, ENABLE);
/* Start TMR4 count. */
TMR4_Start(CM_TMR4_2);
}
测试结果:LE闪烁,表示TIM4收到时钟,进入中断。