打印
[USB芯片]

【CH32X035评估板测评】+3、基于定时器的呼吸灯实现

[复制链接]
2971|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#有奖活动# #申请原创# @21ic小管家
【CH32X035评估板测评】+3、基于定时器的呼吸灯实现
1、程序解读
这段程序主要实现了使用 TIM1 定时器和 PWM 输出模式来控制 GPIOB 引脚 9 的 PWM 输出。
下面是对程序的详细总结:
定义了一些宏,包括 PWM_MODE1 和 PWM_MODE2,用于选择 PWM 输出模式,以及 PWM_SPE_MODE_DISABLE 和 PWM_SPE_MODE_ENABLE,用于选择 PWM 特殊模式。
TIM1_PWMOut_Init 函数用于初始化 TIM1 定时器和 PWM 输出。首先使能 GPIOB 和 TIM1 的时钟。然后配置 GPIOB 引脚 9 为复用推挽输出模式,设置输出速度为 50MHz。接着配置 TIM1 定时器的周期、预分频器、时钟分割和计数模式。根据宏定义的 PWM_MODE,选择 PWM 输出模式为 PWM1 或 PWM2。设置 PWM 输出状态为使能,设置 PWM 脉冲宽度为 ccp,设置 PWM 输出极性为高电平。如果宏定义的 PWM_SPE_MODE 为使能,则启用 PWM 特殊模式。最后使能 TIM1 的 PWM 输出,配置 TIM1 的 PWM 输出预装载和 ARR 预装载,使能 TIM1 定时器。
在 main 函数中,首先更新系统时钟和初始化串口。然后打印系统时钟和芯片 ID。调用 TIM1_PWMOut_Init 函数初始化 TIM1 定时器和 PWM 输出。最后进入一个无限循环。
总体而言,这段程序使用 TIM1 定时器和 PWM 输出模式来控制 GPIOB 引脚 9 的 PWM 输出。通过配置定时器的周期、预分频器和 PWM 脉冲宽度,可以控制 PWM 输出的频率和占空比。
2、程序
#include "debug.h"
#define PWM_MODE1   0
#define PWM_MODE2   1
#define PWM_MODE PWM_MODE1
#define PWM_SPE_MODE_DISABLE   0
#define PWM_SPE_MODE_ENABLE    1
#define PWM_SPE_MODE   PWM_SPE_MODE_DISABLE
void TIM1_PWMOut_Init(u16 arr, u16 psc, u16 ccp)
{
        GPIO_InitTypeDef GPIO_InitStructure={0};
        TIM_OCInitTypeDef TIM_OCInitStructure={0};
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};

        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_TIM1, ENABLE );

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init( GPIOB, &GPIO_InitStructure );

        TIM_TimeBaseInitStructure.TIM_Period = arr;
        TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure);

#if (PWM_MODE == PWM_MODE1)
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

#elif (PWM_MODE == PWM_MODE2)
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

#endif

        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = ccp;
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC1Init( TIM1, &TIM_OCInitStructure );

#if (PWM_SPE_MODE == PWM_SPE_MODE_ENABLE)
        TIM_OC12_SupersedeModeCmd( TIM1, TIM_Supersede_Mode_OC1_H, TIM_Supersede_Mode_OC2_H, ENABLE);
#endif

        TIM_CtrlPWMOutputs(TIM1, ENABLE );
        TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Disable );
        TIM_ARRPreloadConfig( TIM1, ENABLE );
        TIM_Cmd( TIM1, ENABLE );
}

int main(void)
{
        SystemCoreClockUpdate();
        USART_Printf_Init(115200);
        printf("SystemClk:%d\r\n",SystemCoreClock);
        printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );

        TIM1_PWMOut_Init( 100, 48000-1, 20 );

        while(1);
}

3、现象





使用特权

评论回复
沙发
Goodch| | 2023-9-11 17:07 | 只看该作者
看了一下这颗MCU的资源,带有PD、OPA、CMP等,可用于电源相关应用场景

使用特权

评论回复
板凳
forgot| | 2023-9-14 08:47 | 只看该作者
赞一下,非常好的测评,我的板子也收到了,先来学习一下

使用特权

评论回复
地板
SUMMYYY| | 2024-4-7 09:41 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

113

主题

700

帖子

3

粉丝