沁恒CH32V307使用记录:使用TIM输出PWM信号

目的

使用TIM输出PWM信号是单片机中比较常用的一个功能。这篇文章将对CH32V307中相关内容进行说明。

本文使用沁恒官方的开发板 (CH32V307-EVT-R1沁恒RISC-V模块MCU赤兔评估板) 进行演示。

基础说明

CH32V307拥有多个定时器,只有通用定时器和高级定时器支持PWM输出功能,需要注意的是不同的定时器默认可用时钟源是不同的:
在这里插入图片描述

使用TIM输出PWM信号总的来说操作上分为下面几个部分:

  • 初始化TIM和输出PWM信号的GPIO口的时钟;
  • 配置输出PWM信号的GPIO口为复用输出模式;
  • 配置TIM基本定时参数;
  • 配置PWM输出的通道与参数;

沁恒官方提供了库函数用于操作TIM,主要是 ch32v30x_tim.hch32v30x_tim.c 两个文件,前者中声明了提供给用户调用的函数以及相关的枚举和宏定义类型等。

使用TIM输出PWM信号使用中涉及的原理可以参考下面文章中的基础说明部分:
《使用HAL库开发STM32:Timer基础说明与定时功能使用》
《使用HAL库开发STM32:使用Timer输出PWM信号》

使用例程

CH32V307官方的PWM例程中使用的是TIM1,我这里使用TIM4进行演示,两者使用方式基本上是差不多的,下面是测试代码:

#include "debug.h"

// 初始化GPIO、TIM、PWM,使用见下面main函数
void TIM4_PWMOut_Init(u16 psc, u16 arr, u16 ccp) {
    // 初始化时钟
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM4, ENABLE);

    // 初始化 TIM4_CH1引脚 (PB6)
    GPIO_InitTypeDef GPIO_InitStructure = { 0 };
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOB, &GPIO_InitStructure);

    // 初始化 TIM4
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = { 0 };
    TIM_TimeBaseInitStructure.TIM_Period = arr;         // 计数周期(以TIM时钟分频后的时钟最为计数源)
                                                        // 该值为9表示计数10次为一个周期,49表示计数50次为一个周期,依此类推
    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;      // 分频系数(对TIM时钟进行分频)
                                                        // 该值为0表示不分频,1表示2分频,2表示3分频,依此类推
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit( TIM4, &TIM_TimeBaseInitStructure);

    TIM_ARRPreloadConfig( TIM4, ENABLE);                // 使能arr预装载,如果需要TIM启用的情况下修改计数周期,那么通常使能预装载会比较安全

    // 初始化 TIM4_CH1 PWM
    TIM_OCInitTypeDef TIM_OCInitStructure = { 0 };
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = ccp;                // 比较参数,计数值与该值比较,来改变PWM通道输出电平
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init( TIM4, &TIM_OCInitStructure);

    // TIM_CtrlPWMOutputs(TIM4, ENABLE);                // 高级定时器需要将这个使能才能输出PWM

    TIM_OC1PreloadConfig( TIM4, TIM_OCPreload_Disable); // 使能ccr1预装载,如果需要PWM启用的情况下修改比较参数,那么通常使能预装载会比较安全


    TIM_Cmd( TIM4, ENABLE);                             // 使能定时器
}

int main(void) {
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n", SystemCoreClock);
    printf("ChipID:%08x\r\n", DBGMCU_GetCHIPID());
    TIM4_PWMOut_Init(96 - 1, 1000 - 1, 800);            // 默认配置下时钟为96MHz,对时钟源96分频,即TIM计数时钟为1MHz
                                                        // 计数周期设置为1000,结合上条每次计数为1ms,相当于频率为1000Hz
                                                        // 根据比较模式和PWM模式设置,以及上面的参数设置,这里输出的PWM信号的占空比为80%

    while(1) {
        Delay_Ms(2500);
        TIM_SetCompare1( TIM4, 500);                    // 修改CCR1的值,此处修改后ARR为1000 - 1, 频率为1kHz,CCR1为500,占空比为50%
        Delay_Ms(2500);
        TIM_SetCompare1( TIM4, 200);                    // 修改CCR1的值,此处修改后ARR为1000 - 1,频率为1kHz, CCR1为200,占空比为20%
        Delay_Ms(2500);
        TIM_SetAutoreload( TIM4, 300 - 1);              // 修改ARR的值,此处修改后ARR为300 - 1, 频率为3.33kHz,CCR1为200,占空比为66.67%
        Delay_Ms(2500);
        TIM_SetAutoreload( TIM4, 1000 - 1);             // ARR设置为初始值
        TIM_SetCompare1( TIM4, 800);                    // CCR1设置为初始值
    }
}

上面代码演示如下,注意观察示波器波形下面的 频率、周期和占空比 :
在这里插入图片描述

总结

使用TIM输出PWM信号操作比较简单,只要了解相关原理基本上就能立马上手使用。

  • 9
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
沁恒CH32V307芯片拥有丰富的外设功能,其中包括定时器模块。关于沁恒CH32V307的定时器功能,可以参考使用HAL库开发STM32的文章《使用HAL库开发STM32:Timer基础说明与定时功能使用》和《使用HAL库开发STM32:使用Timer输出PWM信号》。这些文章中详细介绍了使用HAL库来开发定时器功能和输出PWM信号的方法。 沁恒CH32V307是一款基于32位RISC-V指令集的微控制器,具有丰富的外设和性能。它的定时器模块可以用于各种应用场景,例如定时触发事件、测量时间间隔和产生PWM信号等。具体的使用方法可以在开发板和芯片的文档中找到。 另外,使用MounRiver Studio作为开发环境可以方便地进行CH32V307的程序开发和调试。MounRiver Studio提供了编译、调试和仿真等功能,可以帮助开发者高效地开发和测试代码。 总结起来,沁恒CH32V307芯片拥有定时器功能,开发者可以借助HAL库和MounRiver Studio开发环境来进行定时器相关的编程和调试工作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [沁恒CH32V307使用记录使用TIM输出PWM信号](https://blog.csdn.net/Naisu_kun/article/details/129668019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [嵌入式大赛初探之-(1)CH32V307介绍](https://blog.csdn.net/qq_53092944/article/details/130086297)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值