【嵌入式】微芯旺KungFu32A156MQT使用PWM实现呼吸灯

由于例程给我的IO口是G8,但是我的板子上没有暴露G8引脚,所以需要查看数据手册,重映射一个IO口作为CCP的PWM输出

 

例: 可见PB10使用AF2重映射到CCP0的通道3上,所以使用PB10

观察自己的GPIO口是否产生PWM波,可以使用示波器,但是示波器买不起,我用的是逻辑分析仪查看当前IO口电平变化情况

 

以下是呼吸灯代码

#include "system_init.h"

#define PWM_Edge_Out (0U)//边沿对齐PWM信号
#define PWM_Center_Out (1U)//中心对齐PWM信号
#define CCP_PWM_WORK (PWM_Edge_Out)//  选择PWM工作模式,  0:边沿对齐PWM信号    1:中心对齐PWM信号

/**
  * 描述  PWM输出功能初始化参数。
  * 输入 : CCPx: 指向CCP或通用定时器内存结构的指针,
  *               取值CCPx_SFR,x为0/1/2/3/4/18/19
  *    Channel:  CCP_CHANNEL_1: 通道1
  *              CCP_CHANNEL_2: 通道2
  *              CCP_CHANNEL_3: 通道3
  *              CCP_CHANNEL_4: 通道4
  *      Period: 周期值:32位数
  *     Duty:占空比:32位数
  *
  * 返回  无。
  */
void CCPx_PWM_PPX_Duty(CCP_SFRmap *CCPx, uint32_t Channel, uint16_t Period, uint16_t Duty)
{
    TIM_Reset(CCPx);//定时器外设复位,使能外设时钟
    CCP_PWM_Mode_Config(CCPx, Channel, CCP_PWM_MODE);//CCP PWM功能通道模式
    CCP_Channel_Output_Control(CCPx, Channel, CCP_CHANNEL_OUTPUT_PWM_ACTIVE);//配置CCP通道输出控制PWM输出,高有效
    CCP_Set_Compare_Result(CCPx, Channel, Duty);//PWM占空比

    GPTIM_Updata_Immediately_Config(CCPx, TRUE);//立即更新控制
    GPTIM_Updata_Enable(CCPx, TRUE);//配置更新使能
    GPTIM_Work_Mode_Config(CCPx, GPTIM_TIMER_MODE);//定时模式选择
    GPTIM_Set_Counter(CCPx, 0);//定时器计数值
    GPTIM_Set_Period(CCPx, Period);//定时器周期值
    GPTIM_Set_Prescaler(CCPx, 240);////定时器预分频值 120_000000/240=5_00000HZ

#if CCP_PWM_WORK == PWM_Edge_Out
    GPTIM_Counter_Mode_Config(CCPx, GPTIM_COUNT_UP_OF);//向上计数模式,即边沿对齐PWM信号
#else
    GPTIM_Counter_Mode_Config(CCPx, GPTIM_COUNT_UP_DOWN_OF);//向上、向下计数模式,即中心对齐PWM信号
#endif

    GPTIM_Clock_Config(CCPx, GPTIM_SCLK);//选用SCLK时钟
    GPTIM_Cmd(CCPx, TRUE);//定时器启动控制使能
}

int main()
{
    //初始化
    SystemInit(120);
    systick_delay_init(120);

    //GPIO口重映射-(映射表参考数据手册)
    GPIO_Write_Mode_Bits(GPIOB_SFR, GPIO_PIN_MASK_10, GPIO_MODE_RMP);
    GPIO_Pin_RMP_Config(GPIOB_SFR, GPIO_Pin_Num_10, GPIO_RMP_AF2);

    //呼吸灯程序
    unsigned char i=0;
    while (1){
        for(i=0;i<20;i++){
            CCPx_PWM_PPX_Duty(CCP0_SFR, CCP_CHANNEL_3, 1000, 500+i*25);//5_00000/1_000=500HZ
            systick_delay_ms(100);
        }
        for(i=0;i<20;i++){
            CCPx_PWM_PPX_Duty(CCP0_SFR, CCP_CHANNEL_3, 1000, 975-i*25);//5_00000/1_000=500HZ
            systick_delay_ms(100);
        }
    }
}

 

posted @ 2023-02-08 09:34  海底淤泥  阅读(384)  评论(0编辑  收藏  举报