智能车学习(四)—— Cmp学习

一、代码共享

1、cmp.h

#ifndef HSCMP_H
#define HSCMP_H

//1 头文件
#include "common.h"
//2 宏定义
//2.1比较模块号宏定义
#define cmpch0 CMP0_BASE_PTR

//2.2 比较模块中断号处理
#define CMP0irq 16

//3函数声明
//============================================================================
//函数名称:hw_cmp_init
//函数返回     无
//参数说明;reference:参考电压选择  0=VDDA 3.3V 1=VREF 1.2V
//         plusChannel: 正比较通道号
//         minusChannel:负比较通道号
//功能概要:CMP模块初始化
//============================================================================
void hw_cmp_init(uint8_t reference,uint8_t plusChannel,uint8_t minusChannel);

        
        
        
//============================================================================
//函数名称:hw_enable_cmp_int
//函数返回:无
//参数说明:无
//功能概要:开比较中断。
//============================================================================
void hw_enable_cmp_int();

        
        
        
//============================================================================
//函数名称:hw_disable_cmp_int
//函数返回:无
//参数说明:无
//功能概要:关比较中断
//============================================================================
void hw_disable_cmp_int();
        
        
        

#endif  //__ISR_H

 

2、cmp.c

#include "cmp.h"


//============================================================================
//函数名称:hw_cmp_init
//函数返回     无
//参数说明    reference:参考电压选择  0=VDDA 3.3V   1=VREF 1.2V
//           plusChannel: 正比较通道号
//           minusChannel:负比较通道号
//         通道0,1,2,3 对应 PTC6, PTC7, PTC8, PTC9
//功能概要:CMP模块初始化
//============================================================================
void hw_cmp_init(uint8_t reference,uint8_t plusChannel,uint8_t minusChannel)
{
        //通过获取模块号选择比较器基址
        CMP_MemMapPtr cmpch = CMP0_BASE_PTR;

        if(plusChannel>7)
            plusChannel = 7;
        if(plusChannel<=0)
            plusChannel = 0;

        if(minusChannel>7)
            minusChannel = 7;
        if(minusChannel<=0)
            minusChannel = 0;

        //使能比较模块时钟
        SIM_SCGC4 |=SIM_SCGC4_CMP_MASK;

        //初始化寄存器
        CMP_CR0_REG(cmpch) = 0;
       CMP_CR1_REG(cmpch) = 0;
       CMP_FPR_REG(cmpch) = 0;
        //如果设置了标志清除中断标志
        CMP_SCR_REG(cmpch) = 0x06;
       CMP_DACCR_REG(cmpch) = 0;
       CMP_MUXCR_REG(cmpch) = 0;

        //配置寄存器
        //过滤,数字延时禁止
        CMP_CR0_REG(cmpch) = 0x00;
        //连续模式,高速比较,无过滤输出,输出引脚禁止
        CMP_CR1_REG(cmpch) = 0x16;
        //过滤禁止
        CMP_FPR_REG(cmpch) = 0x00;
        //使能上升沿和下降沿中断,清标志位
        CMP_SCR_REG(cmpch) = 0x1E;


        if(reference==0)//参考电压选择VDD3.3V
        {
            //6位参考DAC使能,选择VDD作为DAC参考电压
            CMP_DACCR_REG(cmpch) |= 0xC0;
        }
        else//参考电压选择VREF OUT 1.2V
        {
            //6位参考DAC使能,选择VREF作为DAC参考电
            CMP_DACCR_REG(cmpch) |= 0x80;
        }


        CMP_MUXCR_REG(cmpch) = CMP_MUXCR_PSEL(plusChannel)//正通道选择
                             | CMP_MUXCR_MSEL(minusChannel);//负通道选择


        //选择输出引脚
        PORTC_PCR5=PORT_PCR_MUX(6);
        //CMP使能
        CMP_CR1_REG(cmpch) |= CMP_CR1_EN_MASK;

}




//============================================================================
//函数名称:hw_enable_cmp_int
//函数返回:无
//参数说明:无
//功能概要:开比较中。
//============================================================================
void hw_enable_cmp_int()
{
    //通过获取模块号选择比较器基址
     CMP_MemMapPtr cmpch = CMP0_BASE_PTR;
    //开放cmp接收中断,上升沿下降沿均触发
     CMP_SCR_REG(cmpch)|=  CMP_SCR_IEF_MASK  | CMP_SCR_IER_MASK;
     enable_irq(16);
}

//============================================================================
//函数名称:hw_disable_cmp_int
//函数返回:无
//参数说明:无
//功能概要:关比较中断
//============================================================================
void hw_disable_cmp_int()
{
    //通过获取模块号选择比较器基址
    CMP_MemMapPtr cmpch = CMP0_BASE_PTR;
    //关闭cmp接收中断,上升沿下降沿均关闭
    CMP_SCR_REG(cmpch)&=(~CMP_SCR_IEF_MASK) | (~CMP_SCR_IER_MASK );
    //关接收引脚的IRQ中断
    disable_irq(16);

}

 

二、使用方法

hw_enable_cmp_int();
    

    while(1)
    {
      hw_cmp_init(0,PTC6,PTC7);
    }

 

三、存在的问题:

      代码能够执行,可以通过编译看结果,但是不知道是哪个管教进行输出的。

转载于:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4862265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值