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 pulse,The FTU can generate multi triggers to trigger other peripherals on SoC. The width of these triggers is one FTU input clock