逐飞TC264库学习:定时器中断和编码器的应用(与STM32 HAL库对比)

​​​​​pit(定时器中断)

PIT , 是programmable interval timer 可编程间隔定时器 DSC中的器件 的缩写,所以就是定时器中断,有点像32里的timer(TIMx)

目前看来一共能用通道的有四个

typedef enum // 枚举通道号
{
    CCU60_CH0,
    CCU60_CH1,
    CCU61_CH0,
    CCU61_CH1,
}pit_index_enum;

因为涉及到中断,为方便设定中断优先级,所以要像uart那节一样先记得 

#include "isr_config.h"                 //一个设定优先级的头文件

/*********32里就可以直接通过cude来配置相关优先级了,一般保持默认也没事

***********/

初始化函数

pit_ms_init(PIT_NUM, 500);     

// 初始化 CCU6_0_CH0 (逐飞例程将PIT_NUM宏定义为CCU60_CH0)为周期中断 1000ms 周期

原型:#define pit_ms_init(pit_index, time)  pit_init((pit_index), (time*1000))   // (单位为 毫秒)

//——————————————————————————————————————-
//  函数简介      pit_ms初始化
//  参数说明      pit_index           选择CCU6模块
//  参数说明      time                周期时间(单位:毫秒)
//  返回参数      void
//  使用示例      pit_ms_init(CCU60_CH0, 5);      // 设置周期中断5ms
//——————————————————————————————————————-

类似的还有一个微秒的 pit_us_init(pit_index, time)

/*****这应该就相当于32里的(在MX中使能中断后的) HAL_TIM_Base_Start_IT(&htim2); ********/

中断回调函数(其实是个多层宏定义嵌套拓展怪,不断open declaration 后的东西超出了我的c语言理解范围,姑且就理解为函数吧)

//三个参数里的第一个在ADS里字体会被自动加粗,因为它其实是一个自定义函数名

IFX_INTERRUPT(cc60_pit_ch0_isr, 0, CCU6_0_CH0_ISR_PRIORITY)
{
    interrupt_global_enable(0);                     // 开启中断嵌套
    pit_clear_flag(CCU60_CH0);

    //剩下的部分写你想干的事情
}

这个东西是从逐飞使用 CCU6_0_CH0 来进行定时器中断的例程中扒出来的,所以如果要使用不同的定时器,大抵照猫画虎把相应的0改成1就好了(CCU6_0_CH0_ISR_PRIORITY 就是在 "isr_config.h" 里定义的

/*********

这个可能就相当于32里的

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  if(htim == &htim2)

        {

                //想做啥,往这儿写

        }

}

**************/

pit_clear_flag(CCU60_CH0);

原型:#define pit_clear_flag(pit_index) (IfxCcu6_clearInterruptStatusFlag(IfxCcu6_getAddress((IfxCcu6_Index)(pit_index / 2)), (IfxCcu6_InterruptSource)(7+((pit_index % 2)*2))))

肉眼可见的非常复杂,完全没有注释其实也意味着逐飞没有想让用户理解的意思,所以只要知道这是一个清除定时器中断标志位的“函数”就行了,跟上面的中断回调函数捆绑使用即可

/*******32里cube配置出来的代码在用户看不到的地方已经自带清理标志位功能了(拿个EXTI的例子,因为就这个中断处理函数写得最简单www)

*********/

timer(计时器)

单纯的计时器方面就比较简单了

system_start();

原型:void system_start (void)

//——————————————————————————————————————-
//  函数简介      systick定时器启动
//  返回参数      void
//  使用示例      system_start(); // 启动定时器,记录下当前的时间
//——————————————————————————————————————-
/*****在32里常用的类似玩意儿的话,可能就是每次定时器终端回调时,其实就会自动清空一次计数(因为本来就是靠计数溢出来进行周期判定的嘛)*****/

uint32 system_getval (void) 

#define system_getval_ms()          (system_getval() / 100000)      // 获取当前计时时间  单位ms
#define system_getval_us()          (system_getval() / 100   )      // 获取当前计时时间  单位us
#define system_getval_ns()          (system_getval() * 10    )      // 获取当前计时时间  单位ns

//——————————————————————————————————————-
//  函数简介     获得当前System tick timer的值
//  返回参数     uint32           返回从开始到现在的时间(单位10ns)
//  使用示例     uint32 tim = system_getval();
//  备注信息     在核心0调用此函数则使用STM0模块  核心1则使用STM1模块
//——————————————————————————————————————-
/********比较像32里的这个?

#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT)

//该函数通过直接访问计数器寄存器 TIMx_CNT来获取计数器的当前计数值

不过不太常用

*********/

encoder(编码器)

以下只摘录了正交编码器的部分

encoder_quad_init(ENCODER_QUADDEC, ENCODER_QUADDEC_A, ENCODER_QUADDEC_B);       // 初始化编码器模块与引脚 正交解码编码器模式

原型:void encoder_quad_init (encoder_index_enum encoder_n, encoder_channel1_enum count_pin, encoder_channel2_enum dir_pin);

//——————————————————————————————————————-
//  函数简介      正交编码器采集初始化
//  参数说明      encoder_n       选择所使用的GPT12定时器
//  参数说明      ch1_pin         ENCODER 通道 1
//  参数说明      ch2_pin         ENCODER 通道 2
//  返回参数      void
//  使用示例      encoder_quad_init(TIM2_ENCODER, TIM2_ENCODER_CH1_P00_7, TIM2_ENCODER_CH2_P00_8);// 使用T2定时器   P00_7引脚为A通道    P00_8引脚为B通道
//  备注信息
//——————————————————————————————————————-

typedef enum // 枚举编码器引脚
{
    TIM2_ENCODER_CH1_P00_7,      // T2定时器 计数引脚可选范围
    TIM2_ENCODER_CH1_P33_7,

    TIM3_ENCODER_CH1_P02_6,      // T3定时器 计数引脚可选范围

    TIM4_ENCODER_CH1_P02_8,      // T4定时器 计数引脚可选范围

    TIM5_ENCODER_CH1_P21_7,      // T5定时器 计数引脚可选范围
    TIM5_ENCODER_CH1_P10_3,

    TIM6_ENCODER_CH1_P20_3,      // T6定时器 计数引脚可选范围
    TIM6_ENCODER_CH1_P10_2,
}encoder_channel1_enum;

typedef enum // 枚举编码器引脚
{
    TIM2_ENCODER_CH2_P00_8,     // T2定时器 计数方向引脚可选范围
    TIM2_ENCODER_CH2_P33_6,

    TIM3_ENCODER_CH2_P02_7,     // T3定时器 计数方向引脚可选范围

    TIM4_ENCODER_CH2_P00_9,     // T4定时器 计数方向引脚可选范围
    TIM4_ENCODER_CH2_P33_5,

    TIM5_ENCODER_CH2_P21_6,     // T5定时器 计数方向引脚可选范围
    TIM5_ENCODER_CH2_P10_1,

    TIM6_ENCODER_CH2_P20_0,     // T6定时器 计数方向引脚可选范围
}encoder_channel2_enum;

typedef enum  // 枚举 定时器编号
{
    TIM2_ENCODER,
    TIM3_ENCODER,
    TIM4_ENCODER,
    TIM5_ENCODER,
    TIM6_ENCODER,
}encoder_index_enum;

//pit_ms_init(PIT0, 100);                                                     // 初始化 PIT0 为周期中断 100ms 周

/**********************************************************************************************************

比较类似  32 定时器的编码器模式(不过与32不同,貌似实际上是不占用中断所需的定时器的

别忘了还有HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);

**************************************************************************************************************/ 

encoder_data_quaddec = encoder_get_count(ENCODER_QUADDEC);                  // 获取编码器计数

原型:int16 encoder_get_count (encoder_index_enum encoder_n)

//——————————————————————————————————————-
//  函数简介      编码器数据采集
//  参数说明      gptn            选择所使用的定时器
//  返回参数      void
//  使用示例      int16 speed; speed = encoder_get_count(TIM2_ENCODER); // 使用T2定时器
//  备注信息
//——————————————————————————————————————-

/********类似32中的__HAL_TIM_GetCounter(&htim3);************/
 

encoder_clear_count(ENCODER_QUADDEC);                                       // 清空编码器计数

原型:void encoder_clear_count (encoder_index_enum encoder_n)
//——————————————————————————————————————-
//  函数简介      编码器计数清除
//  参数说明      gptn            选择所使用的定时器
//  返回参数      void
//  使用示例      encoder_clear_count(TIM2_ENCODER);// 使用T2定时器
//  备注信息
//——————————————————————————————————————-
/********类似于32中的__HAL_TIM_SET_COUNTER(&htim3,0);**************//看学长的码这样写的

作者:吗喽是这样打的吗

物联沃分享整理
物联沃-IOTWORD物联网 » 逐飞TC264库学习:定时器中断和编码器的应用(与STM32 HAL库对比)

发表评论