这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持数字示波器】国民技术PWM功能知识分享

共5条 1/1 1 跳转至

【换取手持数字示波器】国民技术PWM功能知识分享

助工
2024-04-18 20:43:15   被打赏 40 分(兑奖)     打赏

国民芯片430的TIM复用功能重映射问题,在大多数MCU中,TIM(定时器)的复用功能重映射通常涉及到将某个特定的定时器功能从一个引脚重新映射到另一个引脚。这种重映射功能提供了很大的灵活性,允许用户根据实际应用需求来配置定时器的输入输出。

为了使用TIM的复用功能重映射,通常需要进行以下步骤:

  1. 查阅数据手册:需要仔细阅读国民芯片430C8L7的数据手册或相关文档。这些数据手册通常会提供关于TIM复用功能重映射的详细信息,包括哪些引脚可以支持重映射、如何配置重映射等。

  2. 配置寄存器:根据数据手册的指引,需要通过设置特定的寄存器来启用TIM的复用功能重映射。这通常涉及到写入特定的值到相关的配置寄存器中。

  3. 编写代码:在开发环境中,编写相应的代码来配置TIM的复用功能重映射。这通常涉及到调用相关的库函数或直接操作寄存器。

  4. 测试和验证:完成代码编写后,将代码烧录到国民芯片430C8L7开发板上,并进行测试和验证。确保TIM的复用功能重映射按预期工作,并满足应用需求。

现在看一下定时器重映射:

image.png

定时器复用:

image.png

代码:

// 定义TIM4定时器的基础配置结构体变量  
TIM_TimeBaseInitTypeDef TIM4_TimeBaseStructure;  
// 定义TIM4定时器的PWM输出配置结构体变量  
OCInitTypeDef TIM4_OCInitStructure;  
  
// 初始化PWM相关的时钟和GPIO  
PWM_RCC_Configuration();  
PWM_GPIO_Configuration();  
  
// 配置TIM4定时器的基础参数  
TIM4_TimeBaseStructure.Period    =  arr;       // 设置定时周期  
TIM4_TimeBaseStructure.Prescaler =  psc;       // 设置预分频值  
TIM4_TimeBaseStructure.ClkDiv    = 0;         // 设置时钟分频因子(通常为0)  
TIM4_TimeBaseStructure.CntMode   = TIM_CNT_MODE_UP; // 设置向上计数模式  
  
// 初始化TIM4定时器  
TIM_InitTimeBase(TIM4, &TIM4_TimeBaseStructure);  
  
// 配置TIM4定时器通道1的PWM1模式  
TIM4_OCInitStructure.OcMode      = TIM_OCMODE_PWM1;       // 设置PWM模式  
TIM4_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE; // 使能输出  
// 这里通常还需要设置比较匹配寄存器值(TIM_SetCompare1/TIM_SetCompareX)来定义PWM的占空比  
  
// 配置TIM4定时器通道3的PWM1模式  
TIM4_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE; // 使能输出(重新配置,因为结构体重用)  
TIM4_OCInitStructure.Pulse       = PWM_val;                // 设置PWM脉冲宽度  
// 初始化TIM4定时器的通道3为PWM模式  
TIM_InitOc3(TIM4, &TIM4_OCInitStructure);  
// 使能TIM4定时器通道3的预装载功能  
TIM_ConfigOc3Preload(TIM4, TIM_OC_PRE_LOAD_ENABLE);  
  
// 使能TIM4定时器的自动重载预装载功能  
TIM_ConfigArPreload(TIM4, ENABLE);  
  
// 启动TIM4定时器的计数器  
TIM_Enable(TIM4, ENABLE);  
  
// 中断处理函数(通常是TIM4的更新中断)  
void TIM4_UP_IRQHandler(void)  
{  
    // 清除中断标志位  
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  
    {  
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);  
          
        // LED3呼吸灯控制逻辑  
        if(timer_cont[1] == 2)  
        {  
            // 呼吸灯的“呼”过程  
            if(l_flag == 1)      
            {  
                flag2 += 1;           // 递增flag2,控制亮度增加  
                if(flag2  >= 1000)   // 达到最大值,开始“吸”过程  
                {  
                    l_flag = 2;      // 设置l_flag为2,进入“吸”过程  
                }  
            }  
            // 呼吸灯的“吸”过程  
            else if(l_flag == 2)  
            {  
                flag2 -= 1;         // 递减flag2,控制亮度减少  
                if(flag2  < 1)      // 达到最小值,开始新一轮的“呼”过程  
                {  
                    l_flag = 1;     // 设置l_flag为1,进入“呼”过程  
                }      
            }  
              
            // 根据flag2的值调整PWM_val来改变LED的亮度  
            // 这里应该有代码来更新PWM_val的值,但您没有提供  
        }  
    }  
}

代码解析:

  1. TIM基础配置

    • 初始化了一个TIM_TimeBaseInitTypeDef类型的结构体TIM4_TimeBaseStructure,并设置了定时器的周期(Period)、预分频值(Prescaler)、时钟分频因子(ClkDiv)以及计数模式(CntMode)。

    • 使用TIM_InitTimeBase函数来应用这些配置到TIM4定时器。

  2. PWM通道配置

    • 初始化了一个OCInitTypeDef类型的结构体TIM4_OCInitStructure,并设置了PWM模式(OcMode)为输出状态(OutputState)。

    • 配置了通道3的PWM脉冲宽度(Pulse),并启用了预装载功能。

    • 最后,使能了TIM4的自动重载预装载功能,并启动了TIM4的计数器。

  3. 中断处理函数中的呼吸灯实现

    • 检查timer_cont[1]的值是否为2,如果是,则进入呼吸灯逻辑。

    • 定义了l_flag和flag2两个变量来控制呼吸灯的“呼”和“吸”过程。

    • 当l_flag为1时,flag2递增,当达到1000时,将l_flag设为2,开始“吸”的过程。

    • 当l_flag为2时,flag2递减,当小于1时,将l_flag设回1,开始新一轮的“呼”过程。



院士
2024-04-18 20:50:49     打赏
2楼

楼主,您这标题,内容与代码是不是不相关啊! 各干各的了啊!?


高工
2024-04-19 09:23:19     打赏
3楼

谢谢分享


专家
2024-04-21 08:15:07     打赏
4楼

谢谢分享


工程师
2024-04-29 10:18:21     打赏
5楼

学习了


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]