查看: 700|回复: 0

[评测分享] 【NXP OKdo E1双核Cortex M33开发板】试用6:LPC55S69之定时器

[复制链接]
  • TA的每日心情
    无聊
    2021-4-7 11:23
  • 签到天数: 27 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2020-11-28 16:29:51 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 雪孩爱雪 于 2020-11-28 16:31 编辑

    继续学习基础部分。实验目的:使用CTimer来产生100ms和1s标志位,用于在主循环中使用。


    一、引脚。

    GPIO中

    二:代码

    #include "fsl_debug_console.h"

    #include "board.h"

    #include "fsl_ctimer.h"

    #include "pin_mux.h"

    #include <stdbool.h>

    #define CTIMER CTIMER2                 /* Timer 2 */

    #define CTIMER_MAT_OUT kCTIMER_Match_1 /* Match output 1 */

    #define CTIMER_CLK_FREQ CLOCK_GetCTimerClkFreq(2U)

    void ctimer2_callback(uint32_t flags);

    volatile uint32_t g_pwmPeriod   = 0U;

    volatile uint32_t g_pulsePeriod = 0U;

    static ctimer_callback_t ctimer_callback[] = {ctimer2_callback};

    volatile uint32_t gCtimer100msCnt = 0U;

    volatile uint32_t gCtimer100msFlag = 0U;

    volatile uint32_t gCtimer1sFlag = 0U;

    status_t CTIMER_GetPwmPeriodValue(uint32_t pwmFreqHz, uint8_t dutyCyclePercent, uint32_t timerClock_Hz) {

        g_pwmPeriod = (timerClock_Hz / pwmFreqHz) - 1;

        if (dutyCyclePercent == 0) {

            g_pulsePeriod = g_pwmPeriod + 1;

        } else {

            g_pulsePeriod = (g_pwmPeriod * (100 - dutyCyclePercent)) / 100;

        }

        return kStatus_Success;

    }

    void ctimer2_callback(uint32_t flags) {

            gCtimer100msFlag = 1;

            if(gCtimer100msCnt > 9) {

                    gCtimer1sFlag = 1;

                    gCtimer100msCnt = 0;

            } else {

                    gCtimer100msCnt++;

            }

    }

    int main(void) {

        ctimer_config_t config;

        uint32_t timerClock;

        uint8_t flag1 = 0,flag2 = 0;

        CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);

        CLOCK_AttachClk(kFRO_HF_to_CTIMER2);

        BOARD_InitPins();

        BOARD_BootClockPLL150M();

        BOARD_InitDebugConsole();

        CTIMER_GetDefaultConfig(&config);

        timerClock = CTIMER_CLK_FREQ / (config.prescale + 1);

        CTIMER_Init(CTIMER, &config);

        CTIMER_RegisterCallBack(CTIMER, &ctimer_callback[0], kCTIMER_SingleCallback);

        CTIMER_GetPwmPeriodValue(10, 50, timerClock); // 10Hz = 100ms中断一次

        CTIMER_SetupPwmPeriod(CTIMER, CTIMER_MAT_OUT, g_pwmPeriod, g_pulsePeriod, true);

        CTIMER_StartTimer(CTIMER);

        while (1) {

                if(gCtimer100msFlag == 1) {

                        if(flag1 == 0) {

                                GPIO_PinWrite(BOARD_INITPINS_OUT1_GPIO,BOARD_INITPINS_OUT1_PORT,BOARD_INITPINS_OUT1_PIN,0);

                                flag1 = 1;

                        } else {

                                GPIO_PinWrite(BOARD_INITPINS_OUT1_GPIO,BOARD_INITPINS_OUT1_PORT,BOARD_INITPINS_OUT1_PIN,1);

                                flag1 = 0;

                        }

                        gCtimer100msFlag = 0;

                } else if(gCtimer1sFlag == 1) {

                        if(flag2 == 0) {

                                GPIO_PinWrite(BOARD_INITPINS_OUT2_GPIO,BOARD_INITPINS_OUT2_PORT,BOARD_INITPINS_OUT2_PIN,0);

                                flag2 = 1;

                        } else {

                                GPIO_PinWrite(BOARD_INITPINS_OUT2_GPIO,BOARD_INITPINS_OUT2_PORT,BOARD_INITPINS_OUT2_PIN,1);

                                flag2 = 0;

                        }

                        gCtimer1sFlag = 0;

                }

        }

    }


    三、其它问题。

    我在使用CTimer0、1、3、4时,发现timerClock = CTIMER_CLK_FREQ / (config.prescale + 1);的CTIMER_CLK_FREQ为0,将其改为96000000即可。


    回复

    使用道具 举报

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

    本版积分规则

    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 23:32 , Processed in 0.118367 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.