一、硬件
RGB LED 连接方式

二、PWM 配置流程
在 pin_mux.c 中配置引脚复用为 PWM 功能 IOCON_PIO_FUNC1 表示复用为 PWM,
核心代码实现
static void PWM_DRV_InitPwm(void)
{
    uint16_t deadTimeVal;
    pwm_signal_param_t pwmSignal[2];
    uint32_t pwmSourceClockInHz;
    uint32_t pwmFrequencyInHz = APP_DEFAULT_PWM_FREQUENCY;
    pwmSourceClockInHz = PWM_SRC_CLK_FREQ;
    /* Set deadtime count, we set this to about 650ns */
    deadTimeVal = ((uint64_t)pwmSourceClockInHz * 650) / 1000000000;
    pwmSignal[0].pwmChannel       = kPWM_PwmA;
    pwmSignal[0].level            = kPWM_HighTrue;
    pwmSignal[0].dutyCyclePercent = 50; /* 1 percent dutycycle */
    pwmSignal[0].deadtimeValue    = deadTimeVal;
    pwmSignal[0].faultState       = kPWM_PwmFaultState0;
    pwmSignal[0].pwmchannelenable = true;
    pwmSignal[1].pwmChannel       = kPWM_PwmB;
    pwmSignal[1].level            = kPWM_HighTrue;
    pwmSignal[1].dutyCyclePercent = 50;
    pwmSignal[1].deadtimeValue    = deadTimeVal;
    pwmSignal[1].faultState       = kPWM_PwmFaultState0;
    pwmSignal[1].pwmchannelenable = true;
    PWM_SetupPwm(FLEXPWM0, kPWM_Module_0, pwmSignal, 1, kPWM_SignedCenterAligned, pwmFrequencyInHz,
                 pwmSourceClockInHz);
    PWM_SetupPwm(FLEXPWM1, kPWM_Module_2, pwmSignal, 2, kPWM_SignedCenterAligned, pwmFrequencyInHz,
                 pwmSourceClockInHz);
}
    pwm_config_t pwmConfig;
    pwm_fault_param_t faultConfig;
    uint32_t pwmVal1 = 2;
    uint32_t pwmVal2 = 4;
    uint32_t pwmVal3 = 5;
	pwmConfig.enableDebugMode = false;
	pwmConfig.reloadSelect = kPWM_LocalReload;
	pwmConfig.clockSource = kPWM_BusClock;
	pwmConfig.prescale = kPWM_Prescale_Divide_1;
	pwmConfig.initializationControl = kPWM_Initialize_LocalSync;
	pwmConfig.forceTrigger = kPWM_Force_Local;
	pwmConfig.reloadFrequency = kPWM_LoadEveryOportunity;
	pwmConfig.reloadLogic = kPWM_ReloadImmediate;
	pwmConfig.pairOperation = kPWM_Independent;
    PWM_GetDefaultConfig(&pwmConfig);
#ifndef BOARD_INIT_DEBUG_CONSOLE_PERIPHERAL
    /* Init FSL debug console. */
    BOARD_InitDebugConsole();
#endif
#ifdef DEMO_PWM_CLOCK_DEVIDER
    pwmConfig.prescale = DEMO_PWM_CLOCK_DEVIDER;
#endif
    /* Use full cycle reload */
    pwmConfig.reloadLogic = kPWM_ReloadPwmFullCycle;
    /* PWM A & PWM B form a complementary PWM pair */
    pwmConfig.pairOperation   = kPWM_ComplementaryPwmA;
    pwmConfig.enableDebugMode = true;
    /* Initialize submodule 0 */
    if (PWM_Init(FLEXPWM0, kPWM_Module_0, &pwmConfig) == kStatus_Fail)
    {
        PRINTF("PWM initialization failed\n");
        return 1;
    }
    if (PWM_Init(FLEXPWM1, kPWM_Module_2, &pwmConfig) == kStatus_Fail)
	{
		PRINTF("PWM initialization failed\n");
		return 1;
	}
    /* Initialize submodule 1, make it use same counter clock as submodule 0. */
    pwmConfig.clockSource           = kPWM_Submodule0Clock;
    pwmConfig.prescale              = kPWM_Prescale_Divide_1;
    pwmConfig.initializationControl = kPWM_Initialize_MasterSync;
    
        PWM_FaultDefaultConfig(&faultConfig);
#ifdef DEMO_PWM_FAULT_LEVEL
    faultConfig.faultLevel = DEMO_PWM_FAULT_LEVEL;
#endif
    /* Sets up the PWM fault protection */
    PWM_SetupFaults(FLEXPWM0, kPWM_Fault_0, &faultConfig);
    PWM_SetupFaults(FLEXPWM0, kPWM_Fault_1, &faultConfig);
    PWM_SetupFaults(FLEXPWM0, kPWM_Fault_2, &faultConfig);
    PWM_SetupFaults(FLEXPWM0, kPWM_Fault_3, &faultConfig);
    PWM_SetupFaults(FLEXPWM1, kPWM_Fault_0, &faultConfig);
    PWM_SetupFaults(FLEXPWM1, kPWM_Fault_1, &faultConfig);
    PWM_SetupFaults(FLEXPWM1, kPWM_Fault_2, &faultConfig);
    PWM_SetupFaults(FLEXPWM1, kPWM_Fault_3, &faultConfig);
    /* Set PWM fault disable mapping for submodule 0/1/2 */
    PWM_SetupFaultDisableMap(FLEXPWM0, kPWM_Module_0, kPWM_PwmA, kPWM_faultchannel_0,
                             kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);
    PWM_SetupFaultDisableMap(FLEXPWM1, kPWM_Module_2, kPWM_PwmA, kPWM_faultchannel_0,
                             kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);
    PWM_SetupFaultDisableMap(FLEXPWM1, kPWM_Module_2, kPWM_PwmB, kPWM_faultchannel_0,
                             kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);
                             
                             
    PWM_DRV_InitPwm();
    /* Set the load okay bit for all submodules to load registers from their buffer */
    PWM_SetPwmLdok(FLEXPWM0, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
    PWM_SetPwmLdok(FLEXPWM1, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
    /* Start the PWM generation from Submodules 0, 1 and 2 */
    PWM_StartTimer(FLEXPWM0, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2);
    PWM_StartTimer(FLEXPWM1, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2);
    
    
        int flag1 = 1;
    int flag2 = 1;
    int flag3 = 1;
    /* Enter an infinite loop, just incrementing a counter. */
    while(1) {
    	/* Delay at least 100 PWM periods. */
		SDK_DelayAtLeastUs((1000000U / APP_DEFAULT_PWM_FREQUENCY) * 100, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
		pwmVal1 += flag1 * 2;
		pwmVal2 += flag2 * 4;
		pwmVal3 += flag3 * 5;
		/* Reset the duty cycle percentage */
		if (pwmVal1 == 100)
			flag1 = -1;
		if (pwmVal1 == 0)
			flag1 = 1;
		if (pwmVal2 == 100)
			flag2 = -1;
		if (pwmVal2 == 0)
			flag2 = 1;
		if (pwmVal3 == 100)
			flag3 = -1;
		if (pwmVal3 == 0)
			flag3 = 1;
		/* Update duty cycles for all 3 PWM signals */
		PWM_UpdatePwmDutycycle(FLEXPWM0, kPWM_Module_0, kPWM_PwmA, kPWM_SignedCenterAligned, pwmVal1);
		PWM_UpdatePwmDutycycle(FLEXPWM1, kPWM_Module_2, kPWM_PwmA, kPWM_SignedCenterAligned, pwmVal2);
		PWM_UpdatePwmDutycycle(FLEXPWM1, kPWM_Module_2, kPWM_PwmB, kPWM_SignedCenterAligned, pwmVal3);
		/* Set the load okay bit for all submodules to load registers from their buffer */
		PWM_SetPwmLdok(FLEXPWM0, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
		PWM_SetPwmLdok(FLEXPWM1, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
    }三.PWM脚定义
进入引脚定义页面,对RGB灯的三个引脚进行定义,定义为FlexPWM模式。

PWM输出引脚包括PWM种类PWM0/PWM1、PWM通道A/B及PWM的子模块,P3_13引脚的路由信号相关参数如下。

四.实现效果


 
					
				
 
			
			
			
						
			 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

