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);************/
文章来源:https://www.toymoban.com/news/detail-840315.html
encoder_clear_count(ENCODER_QUADDEC); // 清空编码器计数文章来源地址https://www.toymoban.com/news/detail-840315.html
原型:void encoder_clear_count (encoder_index_enum encoder_n)
//-------------------------------------------------------------------------------------------------------------------
// 函数简介 编码器计数清除
// 参数说明 gptn 选择所使用的定时器
// 返回参数 void
// 使用示例 encoder_clear_count(TIM2_ENCODER);// 使用T2定时器
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
/********类似于32中的__HAL_TIM_SET_COUNTER(&htim3,0);**************//看学长的码这样写的
到了这里,关于(四) timer+pit(定时器中断)+encoder(编码器)-逐飞TC264库学习(对比STM32 HAL库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!