File indexing completed on 2025-05-11 08:22:59
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _FSL_GPT_H_
0010 #define _FSL_GPT_H_
0011
0012 #include "fsl_common.h"
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025 #define FSL_GPT_DRIVER_VERSION (MAKE_VERSION(2, 0, 4))
0026
0027
0028
0029
0030
0031
0032 typedef enum _gpt_clock_source
0033 {
0034 kGPT_ClockSource_Off = 0U,
0035 kGPT_ClockSource_Periph = 1U,
0036 kGPT_ClockSource_HighFreq = 2U,
0037 kGPT_ClockSource_Ext = 3U,
0038 kGPT_ClockSource_LowFreq = 4U,
0039 kGPT_ClockSource_Osc = 5U,
0040 } gpt_clock_source_t;
0041
0042
0043 typedef enum _gpt_input_capture_channel
0044 {
0045 kGPT_InputCapture_Channel1 = 0U,
0046 kGPT_InputCapture_Channel2 = 1U,
0047 } gpt_input_capture_channel_t;
0048
0049
0050 typedef enum _gpt_input_operation_mode
0051 {
0052 kGPT_InputOperation_Disabled = 0U,
0053 kGPT_InputOperation_RiseEdge = 1U,
0054 kGPT_InputOperation_FallEdge = 2U,
0055 kGPT_InputOperation_BothEdge = 3U,
0056 } gpt_input_operation_mode_t;
0057
0058
0059 typedef enum _gpt_output_compare_channel
0060 {
0061 kGPT_OutputCompare_Channel1 = 0U,
0062 kGPT_OutputCompare_Channel2 = 1U,
0063 kGPT_OutputCompare_Channel3 = 2U,
0064 } gpt_output_compare_channel_t;
0065
0066
0067 typedef enum _gpt_output_operation_mode
0068 {
0069 kGPT_OutputOperation_Disconnected = 0U,
0070 kGPT_OutputOperation_Toggle = 1U,
0071 kGPT_OutputOperation_Clear = 2U,
0072 kGPT_OutputOperation_Set = 3U,
0073 kGPT_OutputOperation_Activelow = 4U,
0074 } gpt_output_operation_mode_t;
0075
0076
0077 typedef enum _gpt_interrupt_enable
0078 {
0079 kGPT_OutputCompare1InterruptEnable = GPT_IR_OF1IE_MASK,
0080 kGPT_OutputCompare2InterruptEnable = GPT_IR_OF2IE_MASK,
0081 kGPT_OutputCompare3InterruptEnable = GPT_IR_OF3IE_MASK,
0082 kGPT_InputCapture1InterruptEnable = GPT_IR_IF1IE_MASK,
0083 kGPT_InputCapture2InterruptEnable = GPT_IR_IF2IE_MASK,
0084 kGPT_RollOverFlagInterruptEnable = GPT_IR_ROVIE_MASK,
0085 } gpt_interrupt_enable_t;
0086
0087
0088 typedef enum _gpt_status_flag
0089 {
0090 kGPT_OutputCompare1Flag = GPT_SR_OF1_MASK,
0091 kGPT_OutputCompare2Flag = GPT_SR_OF2_MASK,
0092 kGPT_OutputCompare3Flag = GPT_SR_OF3_MASK,
0093 kGPT_InputCapture1Flag = GPT_SR_IF1_MASK,
0094 kGPT_InputCapture2Flag = GPT_SR_IF2_MASK,
0095 kGPT_RollOverFlag = GPT_SR_ROV_MASK,
0096 } gpt_status_flag_t;
0097
0098
0099 typedef struct _gpt_init_config
0100 {
0101 gpt_clock_source_t clockSource;
0102 uint32_t divider;
0103 bool enableFreeRun;
0104 bool enableRunInWait;
0105 bool enableRunInStop;
0106 bool enableRunInDoze;
0107 bool enableRunInDbg;
0108 bool enableMode;
0109
0110 } gpt_config_t;
0111
0112
0113
0114
0115
0116 #if defined(__cplusplus)
0117 extern "C" {
0118 #endif
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131 void GPT_Init(GPT_Type *base, const gpt_config_t *initConfig);
0132
0133
0134
0135
0136
0137
0138 void GPT_Deinit(GPT_Type *base);
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156 void GPT_GetDefaultConfig(gpt_config_t *config);
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168 static inline void GPT_SoftwareReset(GPT_Type *base)
0169 {
0170 base->CR |= GPT_CR_SWR_MASK;
0171
0172 while ((base->CR & GPT_CR_SWR_MASK) == GPT_CR_SWR_MASK)
0173 {
0174 }
0175 }
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188 static inline void GPT_SetClockSource(GPT_Type *base, gpt_clock_source_t gptClkSource)
0189 {
0190 if (gptClkSource == kGPT_ClockSource_Osc)
0191 {
0192 base->CR = (base->CR & ~GPT_CR_CLKSRC_MASK) | GPT_CR_EN_24M_MASK | GPT_CR_CLKSRC(gptClkSource);
0193 }
0194 else
0195 {
0196 base->CR = (base->CR & ~(GPT_CR_CLKSRC_MASK | GPT_CR_EN_24M_MASK)) | GPT_CR_CLKSRC(gptClkSource);
0197 }
0198 }
0199
0200
0201
0202
0203
0204
0205
0206 static inline gpt_clock_source_t GPT_GetClockSource(GPT_Type *base)
0207 {
0208 return (gpt_clock_source_t)(uint8_t)((base->CR & GPT_CR_CLKSRC_MASK) >> GPT_CR_CLKSRC_SHIFT);
0209 }
0210
0211
0212
0213
0214
0215
0216
0217 static inline void GPT_SetClockDivider(GPT_Type *base, uint32_t divider)
0218 {
0219 assert(divider - 1U <= GPT_PR_PRESCALER_MASK);
0220
0221 base->PR = (base->PR & ~GPT_PR_PRESCALER_MASK) | GPT_PR_PRESCALER(divider - 1U);
0222 }
0223
0224
0225
0226
0227
0228
0229
0230 static inline uint32_t GPT_GetClockDivider(GPT_Type *base)
0231 {
0232 return ((base->PR & GPT_PR_PRESCALER_MASK) >> GPT_PR_PRESCALER_SHIFT) + 1U;
0233 }
0234
0235
0236
0237
0238
0239
0240
0241 static inline void GPT_SetOscClockDivider(GPT_Type *base, uint32_t divider)
0242 {
0243 assert(divider - 1U <= (GPT_PR_PRESCALER24M_MASK >> GPT_PR_PRESCALER24M_SHIFT));
0244
0245 base->PR = (base->PR & ~GPT_PR_PRESCALER24M_MASK) | GPT_PR_PRESCALER24M(divider - 1U);
0246 }
0247
0248
0249
0250
0251
0252
0253
0254 static inline uint32_t GPT_GetOscClockDivider(GPT_Type *base)
0255 {
0256 return ((base->PR & GPT_PR_PRESCALER24M_MASK) >> GPT_PR_PRESCALER24M_SHIFT) + 1U;
0257 }
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270 static inline void GPT_StartTimer(GPT_Type *base)
0271 {
0272 base->CR |= GPT_CR_EN_MASK;
0273 }
0274
0275
0276
0277
0278
0279
0280 static inline void GPT_StopTimer(GPT_Type *base)
0281 {
0282 base->CR &= ~GPT_CR_EN_MASK;
0283 }
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296 static inline uint32_t GPT_GetCurrentTimerCount(GPT_Type *base)
0297 {
0298 return base->CNT;
0299 }
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315 static inline void GPT_SetInputOperationMode(GPT_Type *base,
0316 gpt_input_capture_channel_t channel,
0317 gpt_input_operation_mode_t mode)
0318 {
0319 assert(channel <= kGPT_InputCapture_Channel2);
0320
0321 base->CR =
0322 (base->CR & ~(GPT_CR_IM1_MASK << ((uint32_t)channel * 2UL))) | (GPT_CR_IM1(mode) << ((uint32_t)channel * 2UL));
0323 }
0324
0325
0326
0327
0328
0329
0330
0331
0332 static inline gpt_input_operation_mode_t GPT_GetInputOperationMode(GPT_Type *base, gpt_input_capture_channel_t channel)
0333 {
0334 assert(channel <= kGPT_InputCapture_Channel2);
0335
0336 return (gpt_input_operation_mode_t)(uint8_t)((base->CR >> (GPT_CR_IM1_SHIFT + (uint32_t)channel * 2UL)) &
0337 (GPT_CR_IM1_MASK >> GPT_CR_IM1_SHIFT));
0338 }
0339
0340
0341
0342
0343
0344
0345
0346
0347 static inline uint32_t GPT_GetInputCaptureValue(GPT_Type *base, gpt_input_capture_channel_t channel)
0348 {
0349 assert(channel <= kGPT_InputCapture_Channel2);
0350
0351 return base->ICR[(uint32_t)channel];
0352 }
0353
0354
0355
0356
0357
0358
0359
0360
0361 static inline void GPT_SetOutputOperationMode(GPT_Type *base,
0362 gpt_output_compare_channel_t channel,
0363 gpt_output_operation_mode_t mode)
0364 {
0365 assert(channel <= kGPT_OutputCompare_Channel3);
0366
0367 base->CR =
0368 (base->CR & ~(GPT_CR_OM1_MASK << ((uint32_t)channel * 3UL))) | (GPT_CR_OM1(mode) << ((uint32_t)channel * 3UL));
0369 }
0370
0371
0372
0373
0374
0375
0376
0377
0378 static inline gpt_output_operation_mode_t GPT_GetOutputOperationMode(GPT_Type *base,
0379 gpt_output_compare_channel_t channel)
0380 {
0381 assert(channel <= kGPT_OutputCompare_Channel3);
0382
0383 return (gpt_output_operation_mode_t)(uint8_t)((base->CR >> (GPT_CR_OM1_SHIFT + (uint32_t)channel * 3UL)) &
0384 (GPT_CR_OM1_MASK >> GPT_CR_OM1_SHIFT));
0385 }
0386
0387
0388
0389
0390
0391
0392
0393
0394 static inline void GPT_SetOutputCompareValue(GPT_Type *base, gpt_output_compare_channel_t channel, uint32_t value)
0395 {
0396 assert(channel <= kGPT_OutputCompare_Channel3);
0397
0398 base->OCR[(uint32_t)channel] = value;
0399 }
0400
0401
0402
0403
0404
0405
0406
0407
0408 static inline uint32_t GPT_GetOutputCompareValue(GPT_Type *base, gpt_output_compare_channel_t channel)
0409 {
0410 assert(channel <= kGPT_OutputCompare_Channel3);
0411
0412 return base->OCR[(uint32_t)channel];
0413 }
0414
0415
0416
0417
0418
0419
0420
0421 static inline void GPT_ForceOutput(GPT_Type *base, gpt_output_compare_channel_t channel)
0422 {
0423 assert(channel <= kGPT_OutputCompare_Channel3);
0424
0425 base->CR |= (GPT_CR_FO1_MASK << (uint32_t)channel);
0426 }
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442 static inline void GPT_EnableInterrupts(GPT_Type *base, uint32_t mask)
0443 {
0444 base->IR |= mask;
0445 }
0446
0447
0448
0449
0450
0451
0452
0453
0454 static inline void GPT_DisableInterrupts(GPT_Type *base, uint32_t mask)
0455 {
0456 base->IR &= ~mask;
0457 }
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467 static inline uint32_t GPT_GetEnabledInterrupts(GPT_Type *base)
0468 {
0469 return (base->IR & (GPT_IR_OF1IE_MASK | GPT_IR_OF2IE_MASK | GPT_IR_OF3IE_MASK | GPT_IR_IF1IE_MASK |
0470 GPT_IR_IF2IE_MASK | GPT_IR_ROVIE_MASK));
0471 }
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485 static inline uint32_t GPT_GetStatusFlags(GPT_Type *base, gpt_status_flag_t flags)
0486 {
0487 return base->SR & (uint32_t)flags;
0488 }
0489
0490
0491
0492
0493
0494
0495
0496 static inline void GPT_ClearStatusFlags(GPT_Type *base, gpt_status_flag_t flags)
0497 {
0498 base->SR = (uint32_t)flags;
0499 }
0500
0501
0502
0503 #if defined(__cplusplus)
0504 }
0505 #endif
0506
0507
0508
0509 #endif