(四) timer+pit(定时器中断)+encoder(编码器)-逐飞TC264库学习(对比STM32 HAL库)

这篇具有很好参考价值的文章主要介绍了(四) timer+pit(定时器中断)+encoder(编码器)-逐飞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来配置相关优先级了,一般保持默认也没事

逐飞 定时器枚举,学习,stm32,嵌入式硬件,单片机

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

初始化函数

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(CCU6
0_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)

逐飞 定时器枚举,学习,stm32,嵌入式硬件,单片机

*********/

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不同,貌似实际上是不占用中断所需的定时器的

逐飞 定时器枚举,学习,stm32,嵌入式硬件,单片机

别忘了还有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);                                       // 清空编码器计数文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单片机】STM32单片机读取旋转编码器,TIM定时器编码器模式捕获,程序

    旋转编码器简单来说,就是会输出2个PWM,依据相位可以知道旋转方向,依据脉冲个数可以知道旋转的角度。一般旋转一圈有一个固定数值的脉冲个数。 旋转编码器广泛用于电机、或者角度传感器,STM32的定时器可以直接接入这两个波形获取到信息。 前两个引脚(接地和Vcc)

    2024年02月13日
    浏览(45)
  • STM32定时器编码器模式实现直流有刷电机测速(HAL库)

    最近在做一个单片机大作业,要用到直流有刷,在这里把学习编码器的知识记录一下,学习参考资料: 正点原子DMF407电机控制专题教程_V1.0 我所使用的编码器是市面上常见的 磁电增量式编码器 ,其有AB两相,用于输出电机转动时的 脉冲数 ,AB两相的先后顺序决定了电机的

    2023年04月24日
    浏览(64)
  • 初出茅庐的小李博客之STM32CubeMx配置定时器的编码器模式

    上次文章写了编码器是如何工作的,今天就来用STM32F103C8T6的TIM3的通道1跟通道2编写一个编码器识别程序。 话不多说,上教程! 选择外部高速时钟源HSE 选择中断模式触发下降沿有效 默认是上拉输入 添加用户标签为SWITCH 使能NVIC配置 选择编码器模式 分频值设置为2-1 计数值设

    2024年02月12日
    浏览(38)
  • STM32一个定时器同时配置编码器和PWM输出时PWM无法正常输出的原因【避坑】

             最近我在做写代码的时候,因为定时器的资源紧张,就在一个定时器上同时配置了编码器和PWM,发现PWM无法正常输出,查了很久发现网上资料不多,在仔细翻阅手册研究后才发现是 时钟信号 的问题。 具体原因 定时器在设置编码器模式后,计数的时钟源就会变成编

    2024年02月04日
    浏览(52)
  • Flink timer定时器

    常见timer 基于处理时间或者事件时间处理过一个元素之后, 注册一个定时器, 然后指定的时间执行. Context和OnTimerContext 所持有的TimerService对象拥有以下方法: currentProcessingTime(): Long 返回当前处理时间 currentWatermark(): Long 返回当前watermark的时间戳 registerProcessingTimeTimer(timestamp: Lon

    2024年02月07日
    浏览(49)
  • Python中的定时器用法:Timer定时器和schedule库

    目录 一、引言 二、Timer定时器 1、Timer定时器的原理 2、Timer定时器的使用方法 3、Timer定时器的实际应用案例 三、schedule库 1、schedule库的原理 2、schedule库的使用方法 3、schedule库的实际应用案例 四、Timer定时器和schedule库的比较 1、功能差异 2、适用场景 五、实际应用案例 六、

    2024年01月16日
    浏览(71)
  • Jmeter之同步定时器(Synchronizing Timer)

    同步定时器类似LoadRunner的集合点,作用是阻塞线程,达到指定的线程数量后,再一起释放。 添加定时器同步定时器(Synchronizing Timer) 1、模拟用户组的数量:每次释放的线程数量,即 并发数。 默认为0 设置为0则并发数等于线程租中的线程数;设置大于0则等待达到这个数量

    2024年02月11日
    浏览(55)
  • GD32系列笔记六:定时器Timer

    目录 一、定时器的作用 二、定时器介绍 三、定时器配置 1. 用作封装延时函数,提高程序实时性; 2. 测试某段代码的执行时间; 3. 一些外设的核心,如PWM输入捕获、输出比较等。 1.时钟树 2.结构图(基本定时器为例)  TIMER_CK就是CK_TIMER    3. 工作原理               1. 

    2024年02月13日
    浏览(42)
  • MSP432---Timer_A定时器详解

    msp432数据手册slau356h.pdf,P782 目录 1. 时钟源选择和分频器 2. 定时器A工作(计数)模式  2.1 停止模式  2.2 增计数模式  2.3 连续计数模式  2.4 增减计数模式 3. 捕获/比较模块  3.1 捕获模式 3.2 比较模式  4. 中断 5. Timer_A寄存器 6. 软件实例 MSP432单片机定时器模块 有:看门狗定时

    2024年02月16日
    浏览(49)
  • TM4C123系列(五)————timer定时器(timer模式)

    一.实验简介 通过定时器的timer模式来计时实现以1s为间隔将LED翻转。 二.板载定时器介绍 TM4C有两种定时器,一种为16/32bit的,一种是32/64bit的,两种定时器各有六个,对于每个定时器来说,它可以单独以较大的bit位作为一个定时器工作,也可以拆分为两个较小的bit位的定时器

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包