打印
[PIC32/SAM]

PIC32系列-输入捕捉ICAP

[复制链接]
9006|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coshi|  楼主 | 2021-9-1 18:51 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1、输入捕捉简介

输入捕捉模块用于在输入引脚上发生事件时,捕捉来自两个可选时基之一的定时器值。输入捕捉功能在需要进行频率(时间周期)和脉冲测量的应用中很有用。

输入捕捉模块有多种工作模式,可通过 ICxCON 寄存器进行选择。


• 在 ICx 引脚输入信号的每个下降沿捕捉定时器值


• 在 ICx 引脚输入信号的每个上升沿捕捉定时器值


• 在 ICx 引脚输入信号的每 4 个上升沿捕捉一次定时器值


• 在 ICx 引脚输入信号的每 16 个上升沿捕捉一次定时器值


• 在 ICx 引脚输入信号的每个上升沿和下降沿捕捉定时器值


• 先在指定边沿,之后在每个边沿捕捉定时器值

输入捕捉模块都具有以下特殊功能寄存器


• ICxCON:输入捕捉控制寄存器


• ICxBUF:输入捕捉缓冲寄存器


还具有以下用于中断控制的相关位


• 中断允许控制位 (ICxIE)


• 中断标志状态位 (ICxIF)


• 中断优先级控制位 (ICxIP)


• 中断子优先级控制位 (ICxIS)



使用特权

评论回复
沙发
coshi|  楼主 | 2021-9-1 18:53 | 只看该作者
2、状态和寄存器

寄存器汇总

ICXCON:输入捕捉X控制寄存器

bit 15 ON:输入捕捉模块使能位

1 = 使能模块


0 = 禁止并复位模块、禁止时钟、禁止中断产生并允许进行 SFR 修改


bit 14 FRZ:调试模式冻结控制位


1 = 处于 Debug (调试)模式时模块停止工作


0 = 处于 Debug (调试)模式时模块不停止工作


注: FRZ 仅在调试异常模式下可写,在正常模式下强制为 0。


bit 13 SIDL:空闲模式停止控制位


1 = 在 CPU Idle (空闲)模式下暂停工作


0 = 在 CPU Idle (空闲)模式下继续工作


bit 12-10 未实现:读为 0


bit 9 ICFEDGE :先捕捉边沿选择位 (仅在模式 6 下,即 ICM<2:0>= 110 时使用)


1 = 先捕捉上升沿


0 = 先捕捉下降沿


bit 8 ICC32:32 位捕捉选择位


1 = 32 位定时器资源捕捉


0 = 16 位定时器资源捕捉


bit 7 ICTMR :定时器选择位 (当 ICxC32 (ICxCON<8>)为 1 时,不会影响定时器选择)


0 = Timer3 作为捕捉的计数器源


1 = Timer2 作为捕捉的计数器源


bit 6-5 ICI<1:0>: :中断控制位


11 = 每 4 个捕捉事件中断一次


10 = 每 3 个捕捉事件中断一次


01 = 每 2 个捕捉事件中断一次


00 = 每 1 个捕捉事件中断一次


bit 4 ICOV:输入捕捉溢出状态标志位 (只读)


1 = 发生了输入捕捉溢出


0 = 未发生输入捕捉溢出


bit 3 ICBNE: 输入捕捉缓冲区非空状态位 (只读)


1 = 输入捕捉缓冲区非空;至少可以再读一个捕捉值


0 = 输入捕捉缓冲区为空


bit 2-0 ICM<2:0>:输入捕捉模式选择位


111 = 仅中断模式 (仅在处于 Sleep (休眠)或 Idle (空闲)模式时支持)


110 = 简单捕捉事件模式——每个边沿,先捕捉指定边沿,之后捕捉每个边沿


101 = 预分频捕捉事件模式——每 16 个上升沿


100 = 预分频捕捉事件模式——每 4 个上升沿


011 = 简单捕捉事件模式——每个上升沿


010 = 简单捕捉事件模式——每个下降沿


001 = 边沿检测模式——每个边沿 (上升沿和下降沿)


000 = 捕捉禁止模式


使用特权

评论回复
板凳
coshi|  楼主 | 2021-9-1 18:54 | 只看该作者

ICXBUF:输入捕捉 X 缓冲寄存器

bit 31-0 ICxBUF<31:0>: 缓冲寄存器位

当前捕捉的输入定时器计数的值。


定时器选择


每个模块可以选择两个 16 位定时器中的一个或一个 32 位定时器作为时基, 32 位定时器是由两个 16 位定时器组合构成的。


16 位捕捉模式: ICTMR设置为 0 时选择 Timer3 进行捕捉, ICTMR设置为1时选择 Timer2 进行捕捉,


32 位捕捉模式: ICC32位1,Timer2 提供低 16 位, Timer3 提供高 16 位


输入捕捉使能


将 ON 位(ICxCON<15>)置 1 可以使能输入捕捉模块。当该位清零时,模块会复位。将模块复位具有以下影响:


• 清零溢出条件标志


• 将 FIFO 复位为空状态


• 复位事件计数 (用于中断产生)


• 复位预分频器计数


无论 ON 位 (ICxCON<15>)状态如何,都允许读写寄存器。


输入捕捉事件模式 ICM<2:0>


• 简单捕捉事件模式:


- 在 ICx 引脚输入信号的每个下降沿捕捉定时器值


- 在 ICx 引脚输入信号的每个上升沿捕捉定时器值


- 在 ICx 引脚输入信号的每个上升沿和下降沿捕捉定时器值,从指定边沿开始捕捉


• 预分频捕捉事件模式:


- 在 ICx 引脚输入信号的每 4 个上升沿捕捉一次定时器值


- 在 ICx 引脚输入信号的每 16 个上升沿捕捉一次定时器值


• 边沿检测模式


• 仅中断模式


节能模式下的操作


休眠模式下的输入捕捉操作


当器件进入 Sleep (休眠)模式时,外设时钟被禁止。在 Sleep (休眠)模式下,输入捕捉模块只能用作外部中断源。该模式可以通过设置 ICM<2:0> 控制位(ICxCON<2:0>)= 111 进行使能(对于仅中断模式)。在该模式下,捕捉引脚的上升沿将使器件从休眠状态唤醒。如果允许了相应的模块中断位,并且模块优先级达到要求,将产生中断。


如果输入捕捉模块被配置为除 ICM<2:0> = 111 以外的模式,并且器件进入 Sleep(休眠)模式,则外部引脚的任何上升沿或下降沿都不会产生从休眠模式唤醒条件。


空闲模式下的输入捕捉操作


当器件进入 Idle (空闲)模式时,外设时钟源保持工作,但 CPU 停止执行代码。空闲模式停止控制位 SIDL (ICxCON<13>)决定模块在 Idle (空闲)模式下是停止还是继续工作。


器件从休眠或空闲模式唤醒


在使用仅中断模式时,当器件处于 Sleep (休眠)或 Idle (空闲)模式时,输入捕捉事件可将器件唤醒或产生中断 (如果允许)。



使用特权

评论回复
地板
coshi|  楼主 | 2021-9-1 18:56 | 只看该作者

3、使用Harmony工具生成输入捕捉代码

1、在Available Components中将ICAP1组件添加到右侧的Project Graph中;

2、ICAP1组件初始化配置如下

3、添加定时器模块

4、ICAP1模块配置

5、定时器模块配置

6、生成的代码与原始代码存在差异,需进行确认;

7、代码生成后需要的操作;


        1、系统初始化完成后添加ICAP以及定时器启动函数;


        2、添加应用层函数;


8、编译运行将代码烧录到开发板中;点击编译按钮,编译提示BUILD SUCCESSFUL,点击烧录,提示Programming/Verify complete,通过串口观察捕捉数据。

ICAP配置说明

Select Input Capture Mode:输入捕捉模式选择,可选为如下模式

Input Capture module is disabled 捕捉禁止模式


Edge Detect mode every edge(rising and falling)边沿检测模式,每个边沿


Simple Capture Event mode every falling edge简单捕捉模式,每个下降沿


Simple Capture Event mode every rising edge简单捕捉模式,每个上升沿


Prescaled Capture Event mode every fourth rising edge预分频捕捉事件模式,每4个上升沿;


Prescaled Capture Event mode every sixteenth rising edge预分频捕捉事件模式,每16个上升沿;


Simple Capture Event mode every edge, specified edge first and every edge thereafter简单捕捉事件模式,先捕捉指定边沿,之后捕捉每个边沿


Interrupt-Only mode(only supported while in Sleep mode or Idle mode)仅中断模式,仅在处于Sleep或Idle模式时支持


Select Timer Source:定时器选择,可选为TMR2或TMR3


Select Timer Width:定时器宽度选择,可选为16位或32位定时器


Stop in IDLE:为空闲状态停止


Enable Capture Interrupt:使能捕获中断


Enable Error Interrupt:使能错误中断



使用特权

评论回复
5
coshi|  楼主 | 2021-9-1 18:57 | 只看该作者

4、实际代码分析
plib_icap1.c

//输入捕捉初始化
void ICAP1_Initialize (void)
{
    /*Setup IC1CON */
    /*ICM = 1 */ //输入捕捉模式选择 001边沿检测模式,每个边沿
    /*ICI = 0 */ //中断控制位 00每个捕捉事件中断一次
    /*ICTMR = 1 */ //定时器选择 1定时器2
    /*C32 = 0 */ //32位捕捉选择位 0 16位定时器资源捕捉
    /*FEDGE = 0 */ //先捕捉边沿选择位(仅在模式6下)
    /*SIDL = false */ //空闲模式停止控制位 0不停止工作

    IC1CON = 0x81;
}

//模块使能
void ICAP1_Enable (void)
{
    IC1CONSET = _IC1CON_ON_MASK; //输入捕捉模块使能
}

//模块禁止
void ICAP1_Disable (void)
{
    IC1CONCLR = _IC1CON_ON_MASK; //禁止并复位模块
}

//读取当前捕捉的输入定时器计数值
uint16_t ICAP1_CaptureBufferRead (void)
{
    return (uint16_t)IC1BUF; //输入捕捉缓冲寄存器
}

//输入捕捉缓冲区非空状态位读取
bool ICAP1_CaptureStatusGet (void)
{
    bool status = false;
    status = ((IC1CON >> ICAP_STATUS_BUFNOTEMPTY) & 0x1); //输入捕捉缓冲区非空状态位
    return status;
}

//读取错误状态
bool ICAP1_ErrorStatusGet (void)
{
    bool status = false;
    status = ((IC1CON >> ICAP_STATUS_OVERFLOW) & 0x1); //输入捕捉溢出状态标志位
    return status;
}
定时器代码不赘述。


使用特权

评论回复
6
coshi|  楼主 | 2021-9-1 18:59 | 只看该作者
5、实验验证

编译运行将代码烧录到开发板中;点击编译按钮,编译提示BUILD SUCCESSFUL,点击烧录,提示Programming/Verify complete,通过串口观察发送输入捕捉数据。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

3308

帖子

4

粉丝