HT1656 定时器基本配置和输出4路PWM波

      这两天,和队友在做合泰杯的参赛作品。发现官方并没有给库函数的使用说明PDF,连寄存器的介绍也很不友好。在此记录我成长学习的过程,以及分享我的学习过程。如果大家发现有什么错误的地方,麻烦请提出。一起进步。

     1.基本功能定时器  (BFTM)

     ▄ 2 32位比较/匹配向上计数器 — 无I/O控制功能
     ▄ 单次模式 — 一个匹配条件产生后停止计数
     ▄ 重复模式 — 一个匹配条件产生后重启计数器
    基本功能定时器是一个简单的
32 位向上计数器, 可用于测量时间间隔并产生一个单次或者重   复中断。 BFTM 工作在两种功能模式下, 重复模式或单次模式。 在重复模式下, 当一个比较匹配事件发生时, BFTM 重启计数器。 BFTM 也包含一个单次模式, 在此模式下, 当一个比较匹配事件发生时, 计数器停止计数。 


     以下是基本定时器配置过程

//基本定时器初始化
//arr: 定时多少ms
//基本定时器只有向上计数
void  BFTM0_init(u16 arr)
{
	CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};   //开启时钟
  CKCUClock.Bit.BFTM0      = 1;                      //开启BFTM0
  CKCU_PeripClockConfig(CKCUClock, ENABLE);          //开启外设时钟
	
  NVIC_EnableIRQ(BFTM0_IRQn);                        //允许外部中断        
  NVIC_SetPriorityGrouping(BFTM0_IRQn);
  NVIC_SetPriority(BFTM0_IRQn, NVIC_EncodePriority(BFTM0_IRQn, 3, 0));     //设置中断优先级                                                                            
  NVIC_SetPendingIRQ(BFTM0_IRQn);	
	
  BFTM_SetCompare(HT_BFTM0, SystemCoreClock/1000*arr);   //
  BFTM_SetCounter(HT_BFTM0, 0);           
	
	BFTM_ClearFlag(HT_BFTM0);               //清除标志位
  BFTM_IntConfig(HT_BFTM0, ENABLE);       //开启中断服务函数
  BFTM_EnaCmd(HT_BFTM0, ENABLE);          //使能基本定时器BFTM0
}
  

中断服务函数

//基本定时器BFTM0
//中断服务函数
void BFTM0_IRQHandler()
{
	if(BFTM_GetFlagStatus(HT_BFTM0) != RESET)     //是更新中断
	{
	   BFTM_ClearFlag(HT_BFTM0);           //清除标志位 
	}
}



      2.PWM产生和捕获定时器  (GPTM)

       216位通用定时器– GPTM
       ▄ 每个 GPTM 具有高达 4个通道, 带PWM、 比较输出或输入捕捉功能
       ▄ 外部触发输入
     通用定时器
GPTM0 GPTM1包括一个16位向上/向下计数器,416位捕捉/比较寄存器 (CCRs), 一个 16 位计数器重装载寄存器 (CRR) 和多个控制 状态寄存器。它们可用于多种用途, 包括通用计时、 输入信号脉冲宽度测量、 输出波形产生, 如单脉冲波形产生或 PWM输出。 GPTM 支持的编码器接口带有两个输入端口的解码器。 

      以下是我使用一个定时器,产生4路PWM波

//输出四路PWM波控制后轮两个电机
//arr:自动重装值
//psc:时钟预分频数
//GT0 PA4 PA5 PA6 PA7
void GPTM_PWM_init(u16 arr,u16 psc)
{

    GPTM_TimeBaseInitTypeDef TimeBaseIniture;   //结构体
    GPTM_OutputInitTypeDef   OutIniture;

    CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
    CKCUClock.Bit.PA         = 1;       //GPIOA时钟打开
    CKCUClock.Bit.AFIO       = 1;       //复用时钟
    CKCUClock.Bit.GPTM0      = 1;
    CKCU_PeripClockConfig(CKCUClock, ENABLE);      //时钟使能
    HT32F_DVB_GPxConfig(GPIO_PA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, AFIO_MODE_4);  //开启复用功能

    GPTM_TimeBaseStructInit(&TimeBaseIniture);      //填写每个变量的默认值
		
    //定时器时基以及计数方式初始化
    TimeBaseIniture.CounterMode=GPTM_CNT_MODE_UP;            //边沿对齐向上模式
    TimeBaseIniture.CounterReload=arr;                       //计数重装载计数器
    TimeBaseIniture.Prescaler=psc;                           //预分频系数
    TimeBaseIniture.PSCReloadTime=GPTM_PSC_RLD_IMMEDIATE;    //立即重装载
    GPTM_TimeBaseInit(HT_GPTM0,&TimeBaseIniture);
		
    GPTM_ClearFlag(HT_GPTM0, GPTM_FLAG_UEV);  //清除更新中断标志
    GPTM_OutputStructInit(&OutIniture);    //填写每个变量的默认值


//  0通道输出 PA4
    OutIniture.Channel=GPTM_CH_0;
    OutIniture.Control=GPTM_CHCTL_ENABLE;         //GPTM通道使能
    OutIniture.OutputMode=GPTM_OM_PWM1;          //GPTM 通道 PWM1输出模式  PWM2模式翻转
    OutIniture.Polarity=GPTM_CHP_NONINVERTED;    //GPTM 通道极性是高电平或上升沿        
    OutIniture.Compare=400;                      // 这个是配置占空比的
    GPTM_OutputModeConfig(HT_GPTM0,GPTM_CH_0,GPTM_OM_PWM1);
    GPTM_OutputInit(HT_GPTM0,&OutIniture);


//  1通道输出 PA5
    OutIniture.Channel=GPTM_CH_1;
    OutIniture.Control=GPTM_CHCTL_ENABLE;         //GPTM通道使能
    OutIniture.OutputMode=GPTM_OM_PWM1;          //GPTM 通道 PWM1输出模式  PWM2模式翻转
    OutIniture.Polarity=GPTM_CHP_NONINVERTED;    //GPTM 通道极性是高电平或上升沿        
    OutIniture.Compare=500;                      // 这个是配置占空比的
    GPTM_OutputModeConfig(HT_GPTM0,GPTM_CH_1,GPTM_OM_PWM1);
    GPTM_OutputInit(HT_GPTM0,&OutIniture);

//  2通道输出 PA6
    OutIniture.Channel=GPTM_CH_2;
    OutIniture.Control=GPTM_CHCTL_ENABLE;         //GPTM通道使能
    OutIniture.OutputMode=GPTM_OM_PWM1;          //GPTM 通道 PWM1输出模式  PWM2模式翻转
    OutIniture.Polarity=GPTM_CHP_NONINVERTED;    //GPTM 通道极性是高电平或上升沿        
    OutIniture.Compare=100;                      // 这个是配置占空比的
    GPTM_OutputModeConfig(HT_GPTM0,GPTM_CH_2,GPTM_OM_PWM1);
    GPTM_OutputInit(HT_GPTM0,&OutIniture);

//  3通道输出 PA7
    OutIniture.Channel=GPTM_CH_3;
    OutIniture.Control=GPTM_CHCTL_ENABLE;         //GPTM通道使能
    OutIniture.OutputMode=GPTM_OM_PWM1;          //GPTM 通道 PWM1输出模式  PWM2模式翻转
    OutIniture.Polarity=GPTM_CHP_NONINVERTED;    //GPTM 通道极性是高电平或上升沿        
    OutIniture.Compare=800;                      // 这个是配置占空比的
    GPTM_OutputModeConfig(HT_GPTM0,GPTM_CH_3,GPTM_OM_PWM1);
    GPTM_OutputInit(HT_GPTM0,&OutIniture);

    GPTM_IntConfig(HT_GPTM0, GPTM_INT_CH0CC|GPTM_INT_CH1CC|GPTM_INT_CH2CC|GPTM_INT_CH3CC, ENABLE);  //中断
		
    GPTM_Cmd(HT_GPTM0,ENABLE);  //使能计数
}
      

      单独的PWM占空比改变

GPTM_SetCaptureCompare0(HT_GPTM0, 300);    //用于设置占空比函数
GPTM_SetCaptureCompare1(HT_GPTM0, 0);
GPTM_SetCaptureCompare2(HT_GPTM0, 500);
GPTM_SetCaptureCompare3(HT_GPTM0, 0);


     以下分享找到的相关的HT1656的相关资料

      链接: http://pan.baidu.com/s/1dEJQe9j

      密码:suyt


                                                                                                         

                                                                                                                                                                                                                                                                                                CQUT-YL
































      

     

      

      

你可能感兴趣的:(嵌入式,合泰杯,HT1656,库函数,定时器基本配置,4路PWM波)