File indexing completed on 2025-05-11 08:23:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120 #include "stm32h7xx_hal.h"
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130 #ifdef HAL_EXTI_MODULE_ENABLED
0131
0132
0133
0134
0135
0136
0137
0138 #define EXTI_MODE_OFFSET 0x04U
0139 #define EXTI_CONFIG_OFFSET 0x08U
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171 HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig)
0172 {
0173 __IO uint32_t *regaddr;
0174 uint32_t regval;
0175 uint32_t linepos;
0176 uint32_t maskline;
0177 uint32_t offset;
0178 uint32_t pcrlinepos;
0179
0180
0181 if ((hexti == NULL) || (pExtiConfig == NULL))
0182 {
0183 return HAL_ERROR;
0184 }
0185
0186
0187 assert_param(IS_EXTI_LINE(pExtiConfig->Line));
0188 assert_param(IS_EXTI_MODE(pExtiConfig->Mode));
0189
0190
0191 hexti->Line = pExtiConfig->Line;
0192
0193
0194 offset = ((pExtiConfig->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);
0195 linepos = (pExtiConfig->Line & EXTI_PIN_MASK);
0196 maskline = (1UL << linepos);
0197
0198
0199 if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00U)
0200 {
0201 assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger));
0202
0203
0204 regaddr = (__IO uint32_t *)(&EXTI->RTSR1 + (EXTI_CONFIG_OFFSET * offset));
0205 regval = *regaddr;
0206
0207
0208 if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00U)
0209 {
0210 regval |= maskline;
0211 }
0212 else
0213 {
0214 regval &= ~maskline;
0215 }
0216
0217
0218 *regaddr = regval;
0219
0220
0221 regaddr = (__IO uint32_t *)(&EXTI->FTSR1 + (EXTI_CONFIG_OFFSET * offset));
0222 regval = *regaddr;
0223
0224
0225 if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00U)
0226 {
0227 regval |= maskline;
0228 }
0229 else
0230 {
0231 regval &= ~maskline;
0232 }
0233
0234
0235 *regaddr = regval;
0236
0237
0238 if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO)
0239 {
0240 assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel));
0241 assert_param(IS_EXTI_GPIO_PIN(linepos));
0242
0243 regval = SYSCFG->EXTICR[(linepos >> 2U) & 0x03UL];
0244 regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03U)));
0245 regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03U)));
0246 SYSCFG->EXTICR[(linepos >> 2U) & 0x03UL] = regval;
0247 }
0248 }
0249
0250
0251 regaddr = (__IO uint32_t *)(&EXTI->IMR1 + (EXTI_MODE_OFFSET * offset));
0252 regval = *regaddr;
0253
0254
0255 if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00U)
0256 {
0257 regval |= maskline;
0258 }
0259 else
0260 {
0261 regval &= ~maskline;
0262 }
0263
0264
0265 *regaddr = regval;
0266
0267
0268 assert_param(((pExtiConfig->Line & EXTI_EVENT) == EXTI_EVENT) || ((pExtiConfig->Mode & EXTI_MODE_EVENT) != EXTI_MODE_EVENT));
0269
0270
0271 regaddr = (__IO uint32_t *)(&EXTI->EMR1 + (EXTI_MODE_OFFSET * offset));
0272 regval = *regaddr;
0273
0274
0275 if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00U)
0276 {
0277 regval |= maskline;
0278 }
0279 else
0280 {
0281 regval &= ~maskline;
0282 }
0283
0284
0285 *regaddr = regval;
0286
0287 #if defined (DUAL_CORE)
0288
0289 regaddr = (__IO uint32_t *)(&EXTI->C2IMR1 + (EXTI_MODE_OFFSET * offset));
0290 regval = *regaddr;
0291
0292
0293 if ((pExtiConfig->Mode & EXTI_MODE_CORE2_INTERRUPT) != 0x00U)
0294 {
0295 regval |= maskline;
0296 }
0297 else
0298 {
0299 regval &= ~maskline;
0300 }
0301
0302
0303 *regaddr = regval;
0304
0305
0306 assert_param(((pExtiConfig->Line & EXTI_EVENT) == EXTI_EVENT) || ((pExtiConfig->Mode & EXTI_MODE_CORE2_EVENT) != EXTI_MODE_CORE2_EVENT));
0307
0308
0309 regaddr = (__IO uint32_t *)(&EXTI->C2EMR1 + (EXTI_MODE_OFFSET * offset));
0310 regval = *regaddr;
0311
0312
0313 if ((pExtiConfig->Mode & EXTI_MODE_CORE2_EVENT) != 0x00U)
0314 {
0315 regval |= maskline;
0316 }
0317 else
0318 {
0319 regval &= ~maskline;
0320 }
0321
0322
0323 *regaddr = regval;
0324 #endif
0325
0326
0327 if ((pExtiConfig->Line & EXTI_TARGET_MASK) == EXTI_TARGET_MSK_ALL)
0328 {
0329 assert_param(IS_EXTI_D3_PENDCLR_SRC(pExtiConfig->PendClearSource));
0330
0331
0332 regaddr = (__IO uint32_t *)(&EXTI->D3PMR1 + (EXTI_CONFIG_OFFSET * offset));
0333 regval = *regaddr;
0334
0335 if(pExtiConfig->PendClearSource == EXTI_D3_PENDCLR_SRC_NONE)
0336 {
0337
0338 regval &= ~maskline;
0339
0340 *regaddr = regval;
0341 }
0342 else
0343 {
0344
0345 regval |= maskline;
0346
0347 *regaddr = regval;
0348
0349 if(linepos < 16UL)
0350 {
0351 regaddr = (__IO uint32_t *)(&EXTI->D3PCR1L + (EXTI_CONFIG_OFFSET * offset));
0352 pcrlinepos = 1UL << linepos;
0353 }
0354 else
0355 {
0356 regaddr = (__IO uint32_t *)(&EXTI->D3PCR1H + (EXTI_CONFIG_OFFSET * offset));
0357 pcrlinepos = 1UL << (linepos - 16UL);
0358 }
0359
0360 regval = (*regaddr & (~(pcrlinepos * pcrlinepos * 3UL))) | (pcrlinepos * pcrlinepos * (pExtiConfig->PendClearSource - 1UL));
0361 *regaddr = regval;
0362 }
0363 }
0364
0365 return HAL_OK;
0366 }
0367
0368
0369
0370
0371
0372
0373
0374
0375 HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig)
0376 {
0377 __IO uint32_t *regaddr;
0378 uint32_t regval;
0379 uint32_t linepos;
0380 uint32_t maskline;
0381 uint32_t offset;
0382 uint32_t pcrlinepos;
0383
0384
0385 if ((hexti == NULL) || (pExtiConfig == NULL))
0386 {
0387 return HAL_ERROR;
0388 }
0389
0390
0391 assert_param(IS_EXTI_LINE(hexti->Line));
0392
0393
0394 pExtiConfig->Line = hexti->Line;
0395
0396
0397 offset = ((pExtiConfig->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);
0398 linepos = (pExtiConfig->Line & EXTI_PIN_MASK);
0399 maskline = (1UL << linepos);
0400
0401
0402 regaddr = (__IO uint32_t *)(&EXTI->IMR1 + (EXTI_MODE_OFFSET * offset));
0403 regval = *regaddr;
0404
0405 pExtiConfig->Mode = EXTI_MODE_NONE;
0406
0407
0408 if ((regval & maskline) != 0x00U)
0409 {
0410 pExtiConfig->Mode = EXTI_MODE_INTERRUPT;
0411 }
0412
0413
0414 regaddr = (__IO uint32_t *)(&EXTI->EMR1 + (EXTI_MODE_OFFSET * offset));
0415 regval = *regaddr;
0416
0417
0418 if ((regval & maskline) != 0x00U)
0419 {
0420 pExtiConfig->Mode |= EXTI_MODE_EVENT;
0421 }
0422 #if defined (DUAL_CORE)
0423 regaddr = (__IO uint32_t *)(&EXTI->C2IMR1 + (EXTI_MODE_OFFSET * offset));
0424 regval = *regaddr;
0425
0426
0427 if ((regval & maskline) != 0x00U)
0428 {
0429 pExtiConfig->Mode = EXTI_MODE_CORE2_INTERRUPT;
0430 }
0431
0432
0433 regaddr = (__IO uint32_t *)(&EXTI->C2EMR1 + (EXTI_MODE_OFFSET * offset));
0434 regval = *regaddr;
0435
0436
0437 if ((regval & maskline) != 0x00U)
0438 {
0439 pExtiConfig->Mode |= EXTI_MODE_CORE2_EVENT;
0440 }
0441 #endif
0442
0443
0444 pExtiConfig->Trigger = EXTI_TRIGGER_NONE;
0445 pExtiConfig->GPIOSel = 0x00U;
0446
0447
0448 if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00U)
0449 {
0450 regaddr = (__IO uint32_t *)(&EXTI->RTSR1 + (EXTI_CONFIG_OFFSET * offset));
0451 regval = *regaddr;
0452
0453
0454 if ((regval & maskline) != 0x00U)
0455 {
0456 pExtiConfig->Trigger = EXTI_TRIGGER_RISING;
0457 }
0458
0459
0460 regaddr = (__IO uint32_t *)(&EXTI->FTSR1 + (EXTI_CONFIG_OFFSET * offset));
0461 regval = *regaddr;
0462
0463
0464 if ((regval & maskline) != 0x00U)
0465 {
0466 pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING;
0467 }
0468
0469
0470 if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO)
0471 {
0472 assert_param(IS_EXTI_GPIO_PIN(linepos));
0473
0474 regval = SYSCFG->EXTICR[(linepos >> 2U) & 0x03UL];
0475 pExtiConfig->GPIOSel = (regval >> (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))) & SYSCFG_EXTICR1_EXTI0;
0476 }
0477 }
0478
0479
0480 pExtiConfig->PendClearSource = EXTI_D3_PENDCLR_SRC_NONE;
0481
0482
0483 if ((pExtiConfig->Line & EXTI_TARGET_MASK) == EXTI_TARGET_MSK_ALL)
0484 {
0485 regaddr = (__IO uint32_t *)(&EXTI->D3PMR1 + (EXTI_CONFIG_OFFSET * offset));
0486 if(((*regaddr) & linepos) != 0UL)
0487 {
0488
0489 if(linepos < 16UL)
0490 {
0491 regaddr = (__IO uint32_t *)(&EXTI->D3PCR1L + (EXTI_CONFIG_OFFSET * offset));
0492 pcrlinepos = 1UL << linepos;
0493 }
0494 else
0495 {
0496 regaddr = (__IO uint32_t *)(&EXTI->D3PCR1H + (EXTI_CONFIG_OFFSET * offset));
0497 pcrlinepos = 1UL << (linepos - 16UL);
0498 }
0499
0500 pExtiConfig->PendClearSource = 1UL + ((*regaddr & (pcrlinepos * pcrlinepos * 3UL)) / (pcrlinepos * pcrlinepos));
0501 }
0502 }
0503
0504 return HAL_OK;
0505 }
0506
0507
0508
0509
0510
0511
0512
0513 HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti)
0514 {
0515 __IO uint32_t *regaddr;
0516 uint32_t regval;
0517 uint32_t linepos;
0518 uint32_t maskline;
0519 uint32_t offset;
0520 uint32_t pcrlinepos;
0521
0522
0523 if (hexti == NULL)
0524 {
0525 return HAL_ERROR;
0526 }
0527
0528
0529 assert_param(IS_EXTI_LINE(hexti->Line));
0530
0531
0532 offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);
0533 linepos = (hexti->Line & EXTI_PIN_MASK);
0534 maskline = (1UL << linepos);
0535
0536
0537 regaddr = (__IO uint32_t *)(&EXTI->IMR1 + (EXTI_MODE_OFFSET * offset));
0538 regval = (*regaddr & ~maskline);
0539 *regaddr = regval;
0540
0541
0542 regaddr = (__IO uint32_t *)(&EXTI->EMR1 + (EXTI_MODE_OFFSET * offset));
0543 regval = (*regaddr & ~maskline);
0544 *regaddr = regval;
0545
0546 #if defined (DUAL_CORE)
0547
0548 regaddr = (__IO uint32_t *)(&EXTI->C2IMR1 + (EXTI_MODE_OFFSET * offset));
0549 regval = (*regaddr & ~maskline);
0550 *regaddr = regval;
0551
0552
0553 regaddr = (__IO uint32_t *)(&EXTI->C2EMR1 + (EXTI_MODE_OFFSET * offset));
0554 regval = (*regaddr & ~maskline);
0555 *regaddr = regval;
0556 #endif
0557
0558
0559 if ((hexti->Line & EXTI_CONFIG) != 0x00U)
0560 {
0561 regaddr = (__IO uint32_t *)(&EXTI->RTSR1 + (EXTI_CONFIG_OFFSET * offset));
0562 regval = (*regaddr & ~maskline);
0563 *regaddr = regval;
0564
0565 regaddr = (__IO uint32_t *)(&EXTI->FTSR1 + (EXTI_CONFIG_OFFSET * offset));
0566 regval = (*regaddr & ~maskline);
0567 *regaddr = regval;
0568
0569
0570 if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO)
0571 {
0572 assert_param(IS_EXTI_GPIO_PIN(linepos));
0573
0574 regval = SYSCFG->EXTICR[(linepos >> 2U) & 0x03UL];
0575 regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03UL)));
0576 SYSCFG->EXTICR[(linepos >> 2U) & 0x03UL] = regval;
0577 }
0578 }
0579
0580
0581 if ((hexti->Line & EXTI_TARGET_MASK) == EXTI_TARGET_MSK_ALL)
0582 {
0583 regaddr = (__IO uint32_t *)(&EXTI->D3PMR1 + (EXTI_CONFIG_OFFSET * offset));
0584 *regaddr = (*regaddr & ~maskline);
0585
0586 if(linepos < 16UL)
0587 {
0588 regaddr = (__IO uint32_t *)(&EXTI->D3PCR1L + (EXTI_CONFIG_OFFSET * offset));
0589 pcrlinepos = 1UL << linepos;
0590 }
0591 else
0592 {
0593 regaddr = (__IO uint32_t *)(&EXTI->D3PCR1H + (EXTI_CONFIG_OFFSET * offset));
0594 pcrlinepos = 1UL << (linepos - 16UL);
0595 }
0596
0597
0598 *regaddr &= (~(pcrlinepos * pcrlinepos * 3UL));
0599 }
0600
0601 return HAL_OK;
0602 }
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613 HAL_StatusTypeDef HAL_EXTI_RegisterCallback(EXTI_HandleTypeDef *hexti, EXTI_CallbackIDTypeDef CallbackID, void (*pPendingCbfn)(void))
0614 {
0615 HAL_StatusTypeDef status = HAL_OK;
0616
0617
0618 if (hexti == NULL)
0619 {
0620 return HAL_ERROR;
0621 }
0622
0623 switch (CallbackID)
0624 {
0625 case HAL_EXTI_COMMON_CB_ID:
0626 hexti->PendingCallback = pPendingCbfn;
0627 break;
0628
0629 default:
0630 status = HAL_ERROR;
0631 break;
0632 }
0633
0634 return status;
0635 }
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645 HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLine)
0646 {
0647
0648 assert_param(IS_EXTI_LINE(ExtiLine));
0649
0650
0651 if (hexti == NULL)
0652 {
0653 return HAL_ERROR;
0654 }
0655 else
0656 {
0657
0658 hexti->Line = ExtiLine;
0659
0660 return HAL_OK;
0661 }
0662 }
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686 void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti)
0687 {
0688 __IO uint32_t *regaddr;
0689 uint32_t regval;
0690 uint32_t maskline;
0691 uint32_t offset;
0692
0693
0694 offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);
0695 maskline = (1UL << (hexti->Line & EXTI_PIN_MASK));
0696
0697 #if defined(DUAL_CORE)
0698 if (HAL_GetCurrentCPUID() == CM7_CPUID)
0699 {
0700
0701 regaddr = (__IO uint32_t *)(&EXTI->PR1 + (EXTI_MODE_OFFSET * offset));
0702 }
0703 else
0704 {
0705
0706 regaddr = (__IO uint32_t *)(&EXTI->C2PR1 + (EXTI_MODE_OFFSET * offset));
0707 }
0708 #else
0709 regaddr = (__IO uint32_t *)(&EXTI->PR1 + (EXTI_MODE_OFFSET * offset));
0710 #endif
0711
0712
0713 regval = (*regaddr & maskline);
0714
0715 if (regval != 0x00U)
0716 {
0717
0718 *regaddr = maskline;
0719
0720
0721 if (hexti->PendingCallback != NULL)
0722 {
0723 hexti->PendingCallback();
0724 }
0725 }
0726 }
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738 uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge)
0739 {
0740 __IO uint32_t *regaddr;
0741 uint32_t regval;
0742 uint32_t linepos;
0743 uint32_t maskline;
0744 uint32_t offset;
0745
0746
0747 UNUSED(Edge);
0748
0749
0750 assert_param(IS_EXTI_LINE(hexti->Line));
0751 assert_param(IS_EXTI_CONFIG_LINE(hexti->Line));
0752 assert_param(IS_EXTI_PENDING_EDGE(Edge));
0753
0754
0755 offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);
0756 linepos = (hexti->Line & EXTI_PIN_MASK);
0757 maskline = (1UL << linepos);
0758
0759 #if defined(DUAL_CORE)
0760 if (HAL_GetCurrentCPUID() == CM7_CPUID)
0761 {
0762
0763 regaddr = (__IO uint32_t *)(&EXTI->PR1 + (EXTI_MODE_OFFSET * offset));
0764 }
0765 else
0766 {
0767
0768 regaddr = (__IO uint32_t *)(&EXTI->C2PR1 + (EXTI_MODE_OFFSET * offset));
0769 }
0770 #else
0771 regaddr = (__IO uint32_t *)(&EXTI->PR1 + (EXTI_MODE_OFFSET * offset));
0772 #endif
0773
0774
0775 regval = ((*regaddr & maskline) >> linepos);
0776 return regval;
0777 }
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789 void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge)
0790 {
0791 __IO uint32_t *regaddr;
0792 uint32_t maskline;
0793 uint32_t offset;
0794
0795
0796 UNUSED(Edge);
0797
0798
0799 assert_param(IS_EXTI_LINE(hexti->Line));
0800 assert_param(IS_EXTI_CONFIG_LINE(hexti->Line));
0801 assert_param(IS_EXTI_PENDING_EDGE(Edge));
0802
0803
0804 offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);
0805 maskline = (1UL << (hexti->Line & EXTI_PIN_MASK));
0806
0807 #if defined(DUAL_CORE)
0808 if (HAL_GetCurrentCPUID() == CM7_CPUID)
0809 {
0810
0811 regaddr = (__IO uint32_t *)(&EXTI->PR1 + (EXTI_MODE_OFFSET * offset));
0812 }
0813 else
0814 {
0815
0816 regaddr = (__IO uint32_t *)(&EXTI->C2PR1 + (EXTI_MODE_OFFSET * offset));
0817 }
0818 #else
0819 regaddr = (__IO uint32_t *)(&EXTI->PR1 + (EXTI_MODE_OFFSET * offset));
0820 #endif
0821
0822
0823 *regaddr = maskline;
0824 }
0825
0826
0827
0828
0829
0830
0831 void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti)
0832 {
0833 __IO uint32_t *regaddr;
0834 uint32_t maskline;
0835 uint32_t offset;
0836
0837
0838 assert_param(IS_EXTI_LINE(hexti->Line));
0839 assert_param(IS_EXTI_CONFIG_LINE(hexti->Line));
0840
0841
0842 offset = ((hexti->Line & EXTI_REG_MASK) >> EXTI_REG_SHIFT);
0843 maskline = (1UL << (hexti->Line & EXTI_PIN_MASK));
0844
0845 regaddr = (__IO uint32_t *)(&EXTI->SWIER1 + (EXTI_CONFIG_OFFSET * offset));
0846 *regaddr = maskline;
0847 }
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858 #endif
0859
0860
0861
0862
0863
0864
0865
0866