FTU - aman396271/Flagchip_Study GitHub Wiki

定时器溢出中断

目前FTU的时钟源处于关闭状态,为使之能够工作,将时钟源改为PCC_CLKGATE_SRC_SIRCDIV,即12MHz

PCC_CtrlType  FTU_PCC_Config[0] = {EXAMPLE_FTU_PCC, true, PCC_CLKGATE_SRC_SIRCDIV, PCC_CLK_DIV_BY1}
PCC_SetPcc(&FTU_PCC_Config[0]);

FTU代码配置

预期设置一个500ms的定时器,每500ms实现LED闪烁,1分频,OverFlowValue=T*fclk/Prescaler-1,OverFlowValue=46875-1,T单位为s

void Bsp_Ftu_Init(void)
{
	FTU_CommonType    tInitConfig;
	tInitConfig.eClkSrc = FTU_PCC_CLK;//时钟来源
	tInitConfig.ePrescaler = FTU_DIV_128;//分频
        tInitConfig.u32OverflowValue = 46875- 1;//溢出数
	tInitConfig.u32InterruptMask = FTU_INTR_MASK_OVERFLOW;//溢出中断
	tInitConfig.pOverflowCallback = Bsp_FTU_OverflowCallback;//回调函数
	g_tFtuHandle.eInstance = FTU_INSTANCE_0;
	FTU_CommonInit(&g_tFtuHandle, &tInitConfig);
}

注意,u32OverflowValue 不得超过0xFFFF

        if ((uint32_t)pFtuHandle->eInstance >= FTU_INSTANCE_COUNT)
	{
		FTU_ReportDevError(FTU_COMMON_INIT_ID, FTU_E_PARAM_INSTANCE);
	}
	else if (pCommonStruct->u32OverflowValue > FTU_GET_MAX_COUNTER(s_pFtuBasePtrs[pFtuHandle->eInstance]))//最大值为0xFFFF
	{
		FTU_ReportDevError(FTU_COMMON_INIT_ID, FTU_E_PARAM_COUNT);
	}

实际应用

PWM输出

首先确定具体的输出引脚,如FC4150开发板上的LED0,引脚号为PTC30,其对应的FTU引脚为(FTU5_CH4),即FTU5的Channel4 在PORT设置中启用复用功能

    tInitStruct.u32PortPins = EXAMPLE_LED0_PIN;
	tInitStruct.uPortPinMux.u32PortPinMode = PORTC_30_FTU5_CH4;
	tInitStruct.bPullEn = false;
	tInitStruct.bDrvStrengthEn = true;
	tInitStruct.u8PassiveFilterEn = false;
    tPortHandle.eInstance = EXAMPLE_LED0_PORT;
	PORT_InitPins(&tPortHandle, &tInitStruct);

在FTU功能中开启其PWM功能 首先要使能FTU5的时钟

FTU5_PCC_Config[1] = {FTU5_PCC, true, PCC_CLKGATE_SRC_SIRCDIV, PCC_CLK_DIV_BY1};
PCC_SetPcc(&FTU5_PCC_Config[0]);

初始化FTU5,并初始化PWM

void Bsp_Ftu_Init(void)
{
	FTU_CommonType    tInitConfig;
	FTU_PwmModeType   tPwmModeConfig;
	FTU_PwmChannelType tPwmChannel = {0};
	tPwmModeConfig.pPwmChannels = &tPwmChannel;

	tInitConfig.eClkSrc = FTU_PCC_CLK;//时钟来源
	tInitConfig.ePrescaler = FTU_DIV_8;//分频
        tInitConfig.u32OverflowValue = FTU5_OFV - 1;//溢出数
	tInitConfig.u32InterruptMask = FTU_INTR_MASK_OVERFLOW;//溢出中断
	tInitConfig.pOverflowCallback = Bsp_FTU_OverflowCallback;//回调函数
	g_tFtuHandle.eInstance = FTU_INSTANCE_5;
	FTU_CommonInit(&g_tFtuHandle, &tInitConfig);

	tPwmModeConfig.eUpdateMode = FTU_PWM_UPDATE_END_PERIOD;
	tPwmModeConfig.eAlignedMode = FTU_EDGE_ALIGNED_PWM;
	tPwmModeConfig.u32PwmPeriod = PWM_PERIOD;
	tPwmModeConfig.u32ChannelCount = 1;
	tPwmModeConfig.pPwmChannels->u8Channel = FTU_CHANNEL_4;
	tPwmModeConfig.pPwmChannels->u32PwmDuty = 0;//占空比
	tPwmModeConfig.pPwmChannels->ePinMode = FTU_PWM_HIGH_TRUE_PULSE;
	tPwmModeConfig.pPwmChannels->bDeadtimeEnable = false;
	tPwmModeConfig.pPwmChannels->u32ChannelDeadtime = 0;
	tPwmModeConfig.pPwmChannels->u32PhaseShift = 0;
	tPwmModeConfig.pPwmChannels->bLinkMode = false;
	tPwmModeConfig.pPwmChannels->bLinkChannelComplement = false;
	FTU_PwmModeInit(&g_tFtuHandle, &tPwmModeConfig);
}

实现呼吸灯操作

void Bsp_FTU_OverflowCallback(FTU_HandleType *pHandle)
{
	if(pHandle->eInstance == FTU_INSTANCE_5)
	{
		FTU_PwmDutyUpdateType   tPwmDutyChange;
		static uint32_t duty = 0;
		tPwmDutyChange.u8Channel = FTU_CHANNEL_4;
		tPwmDutyChange.u32PhaseShift = 0;
		tPwmDutyChange.bUpdate = true;
		if(duty < PWM_PERIOD-1)
		{
			duty += 1;
		}
		else
		{
			GPIO_Toggle(EXAMPLE_LED2_GPIO, EXAMPLE_LED2_PIN);
			duty = 0;
		}
		tPwmDutyChange.u32Duty = duty;
		FTU_PwmUpdateDuty(&g_tFtuHandle, &tPwmDutyChange);
	}
}

定时器通道产生触发源

由FTU特性中描述FTU channels can be selected to generate a trigger pulseThe FTU can generate multi triggers to trigger other peripherals on SoC. The width of these triggers is one FTU input clock

时钟源的限制

Input Capture

毛刺滤波

End