这两天,和队友在做合泰杯的参赛作品。发现官方并没有给库函数的使用说明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)
▄ 2个16位通用定时器– GPTM
▄ 每个 GPTM 具有高达 4个通道, 带PWM、 比较输出或输入捕捉功能
▄ 外部触发输入
通用定时器 GPTM0 和GPTM1包括一个16位向上/向下计数器,4个16位捕捉/比较寄存器 (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