查看: 1684|回复: 0

[原创] LPC55S69的SCT/PWM模块的捕获功能详解

[复制链接]

该用户从未签到

7

主题

15

帖子

0

注册会员

Rank: 2

积分
189
最后登录
2022-3-9
发表于 2020-12-14 15:36:36 | 显示全部楼层 |阅读模式

LPC55S69的SCT/PWM模块的捕获功能详解
这个例子是基于LPC55S69-EVK board, 用MCUXpresso tools来编译调试,由于是直接写外设寄存器,此例子没有用到SDK.
在LPC55S69-EVK board有一个S1按键开关(ISP), 此开关连接到P0_5引脚。


Button_LPC55S69.png


根据LPC55S69用户手册提供的管脚复用图, P0_5和SCT_GP5管脚复用。 因此可以用S1开关产生信号触发SCT模块的捕获功能,使当前SCT的计数值锁存入capture register,且触发中断。

PinAssignment_LPC55S69.png

在SCT中断服务程序中, 判断是否是由SCT_GP5产生的event所触发的中断, 如果是,读取capture register, toggleLED pin.

结果:每一次按下S1开关,都可以看到蓝色LED灯或亮或灭,故此代码运行良好。
附代码如下:


int main(void)

{

    /* Init output LED GPIO. */

    //GPIO_PortInit(GPIO, BOARD_LED_PORT);

    /* Board pin init */

    //BOARD_InitPins();

    LEDInit();

    PwmInit();

    while (1)

    {

    }

}

void LEDInit()

{

    //set IOCON bit

    SYSCON->AHBCLKCTRLX[0]|=1<<13;

    IOCON->PIO[1][4]=0x100;

    //set GPIO1 clock

    SYSCON->AHBCLKCTRLX[0]|=1<<15;


    GPIO->DIR[1]|=1<<4;

    GPIO->NOT[1]=1<<4;

    GPIO->NOT[1]=1<<4;

    GPIO->NOT[1]=1<<4;

    GPIO->NOT[1]=1<<4;

}


void PwmInit(void)

{


    //set PIO0_5 as SCT trigger signal

    //set PIO0_5 as P0_5/FC4_RXD_SDA_MOSI/CT3MAT0/SCT_GPI5(Func4)

    //enable IOCON bit

    SYSCON->AHBCLKCTRLX[0]|=1<<13;

    IOCON->PIO[0][5]=0x104;


    //enable gated clock for MUX

    //P0_5(SCT_GPI5) is routed to SCT0_INPUT3 signal

    SYSCON->AHBCLKCTRLX[0]|=1<<11;

    INPUTMUX->SCT0_INMUX[3]=5;



    //enable SCT0 gated clock

    SYSCON->AHBCLKCTRLX[1]|=1<<2;


    SCT0->CTRL |= (SystemCoreClock/1000000-1) << 5; // set prescaler,SCTimer/PWM clock = 1 MHz

    SCT0->CONFIG|=1<<0|1<<17;

    SCT0->REGMODE = (1 <<2); // register pair 1 and 2 are capture

    SCT0->MATCH[0]= 12000; // match 0 @ 12000/1MHz = 12 msec(timeout)

    SCT0->MATCHREL[0] = 12000;

    SCT0->EV[0].STATE = 0xFFFF; // event 0 only happens in state 0

    SCT0->EV[0].CTRL = (0 <<0) | //MATCHSEL[3:0] = related to match 0

           (1 << 12) | // COMBMODE[13:12] = uses matchcondition only

           (1 << 14) | // STATELD [14] = STATEV is loadedinto state

           (0 << 15); // STATEV [15] = new state is 0

    SCT0->EV[1].STATE = 0xFFFF; // event 1 only happens in state 0

    SCT0->EV[1].CTRL = (0 <<5) |

           (3 << 6) | // IOSEL [9:6] = SCT_IN3

           (2 << 10) | // IOCOND [11:10] = falling edge

           (2 << 12) | // COMBMODE[13:12] = uses IOcondition only

           (1 << 14) | // STATELD [14] = STATEV is loadedinto state

           (0 << 15); // STATEV[ 15] = new state is 0

#if 0

    SCT0->EV[2].STATE= 0xFFFF; // event 2 only happens in state 0

    SCT0->EV[2].CTRL= (0 << 5) |

           (6<< 6) | // IOSEL [9:6] = SCT_IN6

           (1<< 10) | // IOCOND [11:10] = rising edge

           (2<< 12) | // COMBMODE[13:12] = uses IO condition only

           (1<< 14) | // STATELD [14] = STATEV is loaded into state

           (0<< 15); // STATEV [15] = new state is 0

#endif

    SCT0->CAPCTRL[2] = (1 << 1); // event 1 causes capture 0 to beloaded

    //SCT0->CAPCTRL[2] = (1 << 2); // event 2 causescapture 2 to be loaded

    SCT0->LIMIT=0x00;

    //SCT0->LIMIT = 0x0007; // events 0, 1 and 2 are usedas counter limit

    SCT0->EVEN = 0x02; // events 0 and 2 generate interrupts

    //NVIC_EnableIRQ(SCT_IRQn); // enable SCTimer/PWMinterrupt

    //Chip_SCTPWM_Start(SCT_PWM);

    //SCT0 interrupt vector is 12


    NVIC->ISER[0]|=1<<12;

    NVIC->ICPR[0]|=1<<12;

    NVIC->IPR[12]=0x00;

    //start SCT0

    SCT0->CTRL&=~(1<<2);


}

uint32_t capture_Value;

void SCT0_DriverIRQHandler(void)

{

    if(SCT0->EVFLAG&0x02)

    {

        SCT0->EVFLAG|=0x02;

        //toggle LED0

        capture_Value=SCT0->CAP[2];

        //GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u<< BOARD_LED_PIN);

        GPIO->NOT[1]=1<<4;

        __asm("nop");

    }

}










回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-20 00:20 , Processed in 0.132201 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表