MCXN947 simple_match 例程 学习分享
[复制链接]
介绍
例程使用CTIMER(计数器/定时器模块)来实现一个简单的定时输出功能。具体来说,它设置了一个定时器,当计数器达到预设值时,会切换一个输出(在这个例子中是连接到LED的引脚),从而以固定的频率闪烁LED。
外设结构体配置
matchConfig.enableCounterReset = true;
matchConfig.enableCounterStop = false;
matchConfig.matchValue = CTIMER_CLK_FREQ / 2;
matchConfig.outControl = kCTIMER_Output_Toggle;
matchConfig.outPinInitState = true;
matchConfig.enableInterrupt = false;
CTIMER_SetupMatch(CTIMER, CTIMER_MAT_OUT, &matchConfig);
CTIMER_StartTimer(CTIMER);
外部匹配输出——当匹配寄存器(Match (MR0 - MR3))的值等于定时器计数器(Timer Counter, TC)的值时,该输出可以切换状态、变为低电平、变为高电平,或者不进行任何操作。外部匹配(EMR)控制这一输出的功能。您可以为多个引脚并行选择匹配输出功能。
/*!
* [url=home.php?mod=space&uid=159083]@brief[/url] 匹配配置
*
* 此结构体用于存储每个匹配寄存器的配置设置。
*/
typedef struct _ctimer_match_config
{
uint32_t matchValue; /*!< 存储在匹配寄存器中的值。当计数器达到此值时,会触发预设动作。 */
bool enableCounterReset; /*!< 是否在匹配时重置计数器。
- true: 将重置计数器。
- false: 不会重置计数器。 */
bool enableCounterStop; /*!< 是否在匹配时停止计数器。
- true: 将停止计数器。
- false:不会停止计数器。 */
ctimer_match_output_control_t outControl; /*!< 匹配时在输出使能位/输出上采取的动作。*/
bool outPinInitState; /*!< 输出使能位/输出的初始值。
- true: 初始状态为高电平。
- false: 初始状态为低电平。 */
bool enableInterrupt; /*!< 是否在匹配时生成中断。
- true: 匹配将生成中断。
- false: 匹配时不会生成中断。 */
} ctimer_match_config_t;
例程代码
/*
* Copyright (c) 2016, Freescale Semiconductor, Inc.
* Copyright 2016-2020 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*******************************************************************************
* Includes
******************************************************************************/
#include "fsl_debug_console.h"
#include "pin_mux.h"
#include "board.h"
#include "fsl_ctimer.h"
#include <stdbool.h>
/*******************************************************************************
* Definitions
******************************************************************************/
#define CTIMER CTIMER0 /* Timer 0 */
#define CTIMER_MAT_OUT kCTIMER_Match_0 /* Match output 0 */
#define CTIMER_EMT_OUT (1u << kCTIMER_Match_0)
#define CTIMER_CLK_FREQ CLOCK_GetCTimerClkFreq(0U)
#define LED_RED1_INIT LED_RED_INIT
#define LED_RED1_ON LED_RED_ON
#define LED_RED1_OFF LED_RED_OFF
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
* Variables
******************************************************************************/
/*******************************************************************************
* Code
******************************************************************************/
/*!
* @brief Main function
*/
int main(void)
{
ctimer_config_t config;
ctimer_match_config_t matchConfig;
/* Init hardware*/
/* attach FRO 12M to FLEXCOMM4 (debug console) */
CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);
CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);
/* Use FRO HF clock for some of the Ctimers */
CLOCK_SetClkDiv(kCLOCK_DivCtimer0Clk, 1u);
CLOCK_AttachClk(kFRO_HF_to_CTIMER0);
BOARD_InitPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
#if defined(BOARD_HAS_NO_CTIMER_OUTPUT_PIN_CONNECTED_TO_LED)
LED_RED1_INIT(LOGIC_LED_OFF);
#endif
PRINTF("CTimer match example to toggle the output on a match\r\n");
CTIMER_GetDefaultConfig(&config);
CTIMER_Init(CTIMER, &config);
matchConfig.enableCounterReset = true;
matchConfig.enableCounterStop = false;
matchConfig.matchValue = CTIMER_CLK_FREQ / 2;
matchConfig.outControl = kCTIMER_Output_Toggle;
matchConfig.outPinInitState = true;
matchConfig.enableInterrupt = false;
CTIMER_SetupMatch(CTIMER, CTIMER_MAT_OUT, &matchConfig);
CTIMER_StartTimer(CTIMER);
while (1)
{
#if defined(BOARD_HAS_NO_CTIMER_OUTPUT_PIN_CONNECTED_TO_LED)
/* No timer match output pin connected to a LED
* toggle LED manually according to match status
*/
if (CTIMER_GetOutputMatchStatus(CTIMER, CTIMER_EMT_OUT))
{
LED_RED1_ON();
}
else
{
LED_RED1_OFF();
}
#endif
}
}
|