Kinetisソフトウェア開発キット(KSDK)は、Kinetisマイクロコントローラ上でアプリケーションを開発するためのソフトウェア・フレームワークです。フレームワークのソフトウェアコンポーネントには、ペリフェラルドライバー、ミドルウェア、およびリアルタイムオペレーティングシステムが含まれます。
KSDKはFreeRTOS OSを提供し、選択されたドライバーは追加のレイヤーの形でFreeRTOSサポートを提供します。このソリューションにより、RTOSベースのアプリケーションへのドライバ統合が容易になります。
FreeRTOS レイヤーを持つドライバーは次のとおりです。
• UART / LPUART / LPSCI
• I2C / LPI2C
• SPI / LPSPI
FreeRTOS OS のドライバーは、標準の KSDK 周辺機器ドライバーの上に構築されたレイヤーで、マルチスレッド (RTOS) 認識を実現します。ラッパーは、I/O 操作が完了するまで呼び出し元のタスクをブロックし、他のタスクをバックグラウンドで実行できるようにする API を提供します。これは、基になるドライバーの非同期 API と RTOS タスク同期オブジェクトを使用して実現されます。基盤となるドライバーは、適切に動作するために有効な割り込みを必要とします。
さらに、KSDKベアメタルドライバーを使用することも可能です。このドキュメントでは、FreeRTOS および SDK 2.0 プロジェクトで LPTMR ドライバーを使用する方法について説明します。この例では、SDK 2.0、FRDMK64F、および FreeRTOS を使用しています。
FreeRTOSプロジェクトを使用して新しいSDK 2.0を作成する方法を知りたい場合は、以下のリンクを確認してください https://community.freescale.com/docs/DOC-330183
GPIOとLPTMRの例:
はじめに
この例では、青色の LED を 1 秒ごとに切り替えます。この例では、Timer Compare Flagビットをチェックし、このフラグが設定されると青色LEDのステータスが変わります。
サンプルコードの記述
https://community.freescale.com/docs/DOC-330183
2.新しいプロジェクトを作成したら、pin_mux.c を開きますポートクロックを有効にし、必要なピンをGPIOとして構成するためのファイル(FRDM-K64Fの場合、RGB LEDはGPIO信号を介して接続されます:赤からPTB22、青からPTB21、緑からPTE26)。
3.さらに、pin_mux.c で lptmr モジュールのクロックを有効にする必要がありますファイル。
4.main.c でファイルには fsl_lptmr.h を含める必要がありますとfsl_gpio.h.
5.main 関数で、新しいタスクを作成します。このタスクは、LPTMR ドライバーと GPIO ドライバーを初期化します。この例では、新しいタスク関数の名前は task_init です。
/* RTOSタスクを作成 */
xTaskCreate(
task_init、
"Task_Init"、
configMINIMAL_STACK_SIZE、
ヌル
task_PRIORITY、
NULL);
6.task_init関数コードを記述します。
ある。KSDK GPIO ドライバーの使用:
GPIO を初期化するには、ユーザー ファイルでピン構成 (入力または出力) を定義します。次に、 GPIO_PinInit() 関数を呼び出します。
今回は青色LEDが接続されているピンPTB21を出力として設定しました。
gpio_pin_config_t ledB_config = {kGPIO_DigitalOutput, 0,};
GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PIN, &ledB_config);
GPIO ピンをコンフィギュレーションすると、次の GPIO 操作を使用できます。
GPIO出力操作。
GPIO_WritePinOutput (GPIO_Type *base, uint32_t pin, uint8_t output)
GPIO_SetPinsOutput(GPIO_Type ※ベース、uint32_tマスク)
GPIO_ClearPinsOutput(GPIO_Type ※ベース、uint32_tマスク)
GPIO_TogglePinsOutput(GPIO_Type ※ベース、uint32_tマスク)
GPIO 入力操作。
GPIO_ReadPinInput (GPIO_Type ※ベース、uint32_tピン)
board.h ファイルには、この操作の定義が含まれています。例えば:
/*!< ターゲットLED_BLUEの切り替え */
#define LED_BLUE_TOGGLE() \
GPIO_TogglePinsOutput(BOARD_LED_BLUE_GPIO、1U<< BOARD_LED_BLUE_GPIO_PIN)
b.KSDK LPTMR ドライバーを使用する場合:
LPTMR_Init () は、アプリケーションの先頭で LPTMR ドライバーを使用して呼び出す必要があります。この関数は lptmr_config_t 構造体を初期化し、この構造体は LPTMR 周辺機器の構成設定を保持します。この構造体を適切な既定値に初期化するには、LPTMR_GetDefaultConfig() 関数を呼び出し、構成構造体インスタンスへのポインターを渡します。config構造体は、フラッシュに存在するようにconstにすることができます。
デフォルト値は次のとおりです。
config->timerMode = kLPTMR_TimerModeTimeCounter;
config->pinSelect = kLPTMR_PinSelectInput_0;
config->pinPolarity = kLPTMR_PinPolarityActiveHigh;
config->enableFreeRunning = false;
config->bypassPrescaler = true;
config->prescalerClockSource = kLPTMR_PrescalerClock_1;
config->value = kLPTMR_Prescale_Glitch_0;
LPTMRを設定した後、タイマー期間を設定する必要があります。LPTMR_SetTimerPeriod() は、タイマーが 0 からここで設定されたカウント値と等しくなるまでカウントします。カウント値はCMRレジスタに書き込まれます。
最後に、LPTMR_StarTimer () を使用してタイマーを開始します。この関数を呼び出した後、タイマーはCMRレジスタ値までカウントアップします。タイマがCMR値に達してからインクリメントするたびに、トリガパルスが生成され、タイムアウト割込みフラグが設定されます。タイマー割り込みが有効になっている場合も、割り込みがトリガーされます。
この例では、次の行で LPTMR を構成して開始します。
/* LPTMR の設定 */
LPTMR_GetDefaultConfig(&lptmrConfig);
/* LPTMR を初期化します */
LPTMR_Init(LPTMR0, &lptmrConfig);
/* タイマー周期を設定 */
LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(1000000U, LPTMR_SOURCE_CLOCK));
/* カウント開始 */
LPTMR_StartTimer(LPTMR0);
c.この例では、Timer Compare Flagビットをチェックし、このフラグが設定されると青色LEDのステータスが変わります。したがって、無限ループでは、LPTMR_GetStatusFlags()関数がチェックします
ステータスフラグ (このフラグが設定されている場合は、LED を切り替えて、LPTMR_ClearStatusFlags() 関数を使用してフラグをクリアします。
(1) ながら
{
if (LPTMR_GetStatusFlags(LPTMR0) )
{
LED_BLUE_TOGGLE(); LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag); }
}
7.この時点で、サンプルをビルドしてデバッグできます。
完全なコード GPIO と LPTMR の例
#include
#include「ボード.h」
#include「pin_mux.h」
#include 「clock_config.h」
#include「fsl_debug_console.h」
#include 「fsl_device_registers.h」
#include 「fsl_lptmr.h」
#include 「fsl_gpio.h」
/* FreeRTOS カーネルには以下が含まれます。*/
#include「FreeRTOS.h」
#include「task.h」
#include「queue.h」
#include「timers.h」
/* タスクの優先順位。*/
#define task_PRIORITY (configMAX_PRIORITIES-1)
/*******************************************************************************
*定義
******************************************************************************/
/* LPTMR ドライバーのソースクロックを取得 */
#define LPTMR_SOURCE_CLOCK CLOCK_GetFreq(kCLOCK_LpoClk)
static void task_init(void *pvParameters);
/*******************************************************************************
* Variables
******************************************************************************/
volatile uint32_t lptmrCounter = 0U;
int main(void) {
/* ボード ハードウェアを初期化 します。*/
BOARD_InitPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
/* ここにコードを追加 */
/* RTOSタスクを作成 */
xTaskCreate(
task_init、
"Task_Init"、
configMINIMAL_STACK_SIZE、
ヌル
task_PRIORITY、
NULL);
vTaskStartScheduler();
for(;;){ /* メイン関数から離れないようにするための無限ループ */
__asm(「NOP」); /* ループ中のブレークポイント停止として使用するもの */
}
}
static void task_init(void *pvParameters) {
for (;;){
lptmr_config_t lptmrConfig;
PRINTF("初期化タスクを実行しています。\r\n");
/* イニット 出力LEDGPIO。*/
gpio_pin_config_t ledB_config = {kGPIO_DigitalOutput, 0,};
GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PIN, &ledB_config);
PRINTF("LED BLUE 初期化済み \r\n");
/* LPTMR の設定 */
/*
* lptmrConfig.timerMode = kLPTMR_TimerModeTimeCounter;
* lptmrConfig.pinSelect = kLPTMR_PinSelectInput_0;
* lptmrConfig.pinPolarity = kLPTMR_PinPolarityActiveHigh;
* lptmrConfig.enableFreeRunning= false;
* lptmrConfig.bypassPrescaler = true;
* lptmrConfig.prescalerClockSource= kLPTMR_PrescalerClock_1;
* lptmrConfig.value = kLPTMR_Prescale_Glitch_0;
*/
LPTMR_GetDefaultConfig(&lptmrConfig);
/* LPTMR を初期化します */
LPTMR_Init(LPTMR0, &lptmrConfig);
/* タイマー周期を設定 */
LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(1000000U, LPTMR_SOURCE_CLOCK));
PRINTF("低電力タイマー モジュールが初期化されました \r\n");
/* カウント開始 */
LPTMR_StartTimer(LPTMR0);
(1) ながら
{
if (LPTMR_GetStatusFlags(LPTMR0) )
{
lptmrCounter ++;
LED_BLUE_TOGGLE();
LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);
}
}
}
}