File indexing completed on 2025-05-11 08:23:09
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
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140 #include "stm32h7xx_hal.h"
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152 #ifdef HAL_USART_MODULE_ENABLED
0153
0154
0155
0156
0157
0158
0159
0160 #define USART_DUMMY_DATA ((uint16_t) 0xFFFF)
0161 #define USART_TEACK_REACK_TIMEOUT 1000U
0162 #define USART_CR1_FIELDS ((uint32_t)(USART_CR1_M | USART_CR1_PCE | USART_CR1_PS | \
0163 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8 | \
0164 USART_CR1_FIFOEN ))
0165
0166 #define USART_CR2_FIELDS ((uint32_t)(USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_CLKEN | \
0167 USART_CR2_LBCL | USART_CR2_STOP | USART_CR2_SLVEN | \
0168 USART_CR2_DIS_NSS))
0169
0170 #define USART_CR3_FIELDS ((uint32_t)(USART_CR3_TXFTCFG | USART_CR3_RXFTCFG ))
0171
0172 #define USART_BRR_MIN 0x10U
0173 #define USART_BRR_MAX 0xFFFFU
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
0185 void USART_InitCallbacksToDefault(USART_HandleTypeDef *husart);
0186 #endif
0187 static void USART_EndTransfer(USART_HandleTypeDef *husart);
0188 static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma);
0189 static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma);
0190 static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma);
0191 static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma);
0192 static void USART_DMAError(DMA_HandleTypeDef *hdma);
0193 static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma);
0194 static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma);
0195 static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma);
0196 static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status,
0197 uint32_t Tickstart, uint32_t Timeout);
0198 static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart);
0199 static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart);
0200 static void USART_TxISR_8BIT(USART_HandleTypeDef *husart);
0201 static void USART_TxISR_16BIT(USART_HandleTypeDef *husart);
0202 static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart);
0203 static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart);
0204 static void USART_EndTransmit_IT(USART_HandleTypeDef *husart);
0205 static void USART_RxISR_8BIT(USART_HandleTypeDef *husart);
0206 static void USART_RxISR_16BIT(USART_HandleTypeDef *husart);
0207 static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart);
0208 static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart);
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 HAL_StatusTypeDef HAL_USART_Init(USART_HandleTypeDef *husart)
0281 {
0282
0283 if (husart == NULL)
0284 {
0285 return HAL_ERROR;
0286 }
0287
0288
0289 assert_param(IS_USART_INSTANCE(husart->Instance));
0290
0291 if (husart->State == HAL_USART_STATE_RESET)
0292 {
0293
0294 husart->Lock = HAL_UNLOCKED;
0295
0296 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
0297 USART_InitCallbacksToDefault(husart);
0298
0299 if (husart->MspInitCallback == NULL)
0300 {
0301 husart->MspInitCallback = HAL_USART_MspInit;
0302 }
0303
0304
0305 husart->MspInitCallback(husart);
0306 #else
0307
0308 HAL_USART_MspInit(husart);
0309 #endif
0310 }
0311
0312 husart->State = HAL_USART_STATE_BUSY;
0313
0314
0315 __HAL_USART_DISABLE(husart);
0316
0317
0318 if (USART_SetConfig(husart) == HAL_ERROR)
0319 {
0320 return HAL_ERROR;
0321 }
0322
0323
0324
0325
0326
0327 husart->Instance->CR2 &= ~USART_CR2_LINEN;
0328 husart->Instance->CR3 &= ~(USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN);
0329
0330
0331 __HAL_USART_ENABLE(husart);
0332
0333
0334 return (USART_CheckIdleState(husart));
0335 }
0336
0337
0338
0339
0340
0341
0342 HAL_StatusTypeDef HAL_USART_DeInit(USART_HandleTypeDef *husart)
0343 {
0344
0345 if (husart == NULL)
0346 {
0347 return HAL_ERROR;
0348 }
0349
0350
0351 assert_param(IS_USART_INSTANCE(husart->Instance));
0352
0353 husart->State = HAL_USART_STATE_BUSY;
0354
0355 husart->Instance->CR1 = 0x0U;
0356 husart->Instance->CR2 = 0x0U;
0357 husart->Instance->CR3 = 0x0U;
0358
0359 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
0360 if (husart->MspDeInitCallback == NULL)
0361 {
0362 husart->MspDeInitCallback = HAL_USART_MspDeInit;
0363 }
0364
0365 husart->MspDeInitCallback(husart);
0366 #else
0367
0368 HAL_USART_MspDeInit(husart);
0369 #endif
0370
0371 husart->ErrorCode = HAL_USART_ERROR_NONE;
0372 husart->State = HAL_USART_STATE_RESET;
0373
0374
0375 __HAL_UNLOCK(husart);
0376
0377 return HAL_OK;
0378 }
0379
0380 #ifndef __rtems__
0381
0382
0383
0384
0385
0386 __weak void HAL_USART_MspInit(USART_HandleTypeDef *husart)
0387 {
0388
0389 UNUSED(husart);
0390
0391
0392
0393
0394 }
0395 #endif
0396
0397
0398
0399
0400
0401
0402 __weak void HAL_USART_MspDeInit(USART_HandleTypeDef *husart)
0403 {
0404
0405 UNUSED(husart);
0406
0407
0408
0409
0410 }
0411
0412 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435 HAL_StatusTypeDef HAL_USART_RegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID,
0436 pUSART_CallbackTypeDef pCallback)
0437 {
0438 HAL_StatusTypeDef status = HAL_OK;
0439
0440 if (pCallback == NULL)
0441 {
0442
0443 husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK;
0444
0445 return HAL_ERROR;
0446 }
0447
0448 if (husart->State == HAL_USART_STATE_READY)
0449 {
0450 switch (CallbackID)
0451 {
0452 case HAL_USART_TX_HALFCOMPLETE_CB_ID :
0453 husart->TxHalfCpltCallback = pCallback;
0454 break;
0455
0456 case HAL_USART_TX_COMPLETE_CB_ID :
0457 husart->TxCpltCallback = pCallback;
0458 break;
0459
0460 case HAL_USART_RX_HALFCOMPLETE_CB_ID :
0461 husart->RxHalfCpltCallback = pCallback;
0462 break;
0463
0464 case HAL_USART_RX_COMPLETE_CB_ID :
0465 husart->RxCpltCallback = pCallback;
0466 break;
0467
0468 case HAL_USART_TX_RX_COMPLETE_CB_ID :
0469 husart->TxRxCpltCallback = pCallback;
0470 break;
0471
0472 case HAL_USART_ERROR_CB_ID :
0473 husart->ErrorCallback = pCallback;
0474 break;
0475
0476 case HAL_USART_ABORT_COMPLETE_CB_ID :
0477 husart->AbortCpltCallback = pCallback;
0478 break;
0479
0480 case HAL_USART_RX_FIFO_FULL_CB_ID :
0481 husart->RxFifoFullCallback = pCallback;
0482 break;
0483
0484 case HAL_USART_TX_FIFO_EMPTY_CB_ID :
0485 husart->TxFifoEmptyCallback = pCallback;
0486 break;
0487
0488 case HAL_USART_MSPINIT_CB_ID :
0489 husart->MspInitCallback = pCallback;
0490 break;
0491
0492 case HAL_USART_MSPDEINIT_CB_ID :
0493 husart->MspDeInitCallback = pCallback;
0494 break;
0495
0496 default :
0497
0498 husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK;
0499
0500
0501 status = HAL_ERROR;
0502 break;
0503 }
0504 }
0505 else if (husart->State == HAL_USART_STATE_RESET)
0506 {
0507 switch (CallbackID)
0508 {
0509 case HAL_USART_MSPINIT_CB_ID :
0510 husart->MspInitCallback = pCallback;
0511 break;
0512
0513 case HAL_USART_MSPDEINIT_CB_ID :
0514 husart->MspDeInitCallback = pCallback;
0515 break;
0516
0517 default :
0518
0519 husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK;
0520
0521
0522 status = HAL_ERROR;
0523 break;
0524 }
0525 }
0526 else
0527 {
0528
0529 husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK;
0530
0531
0532 status = HAL_ERROR;
0533 }
0534
0535 return status;
0536 }
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559 HAL_StatusTypeDef HAL_USART_UnRegisterCallback(USART_HandleTypeDef *husart, HAL_USART_CallbackIDTypeDef CallbackID)
0560 {
0561 HAL_StatusTypeDef status = HAL_OK;
0562
0563 if (HAL_USART_STATE_READY == husart->State)
0564 {
0565 switch (CallbackID)
0566 {
0567 case HAL_USART_TX_HALFCOMPLETE_CB_ID :
0568 husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback;
0569 break;
0570
0571 case HAL_USART_TX_COMPLETE_CB_ID :
0572 husart->TxCpltCallback = HAL_USART_TxCpltCallback;
0573 break;
0574
0575 case HAL_USART_RX_HALFCOMPLETE_CB_ID :
0576 husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback;
0577 break;
0578
0579 case HAL_USART_RX_COMPLETE_CB_ID :
0580 husart->RxCpltCallback = HAL_USART_RxCpltCallback;
0581 break;
0582
0583 case HAL_USART_TX_RX_COMPLETE_CB_ID :
0584 husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback;
0585 break;
0586
0587 case HAL_USART_ERROR_CB_ID :
0588 husart->ErrorCallback = HAL_USART_ErrorCallback;
0589 break;
0590
0591 case HAL_USART_ABORT_COMPLETE_CB_ID :
0592 husart->AbortCpltCallback = HAL_USART_AbortCpltCallback;
0593 break;
0594
0595 case HAL_USART_RX_FIFO_FULL_CB_ID :
0596 husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback;
0597 break;
0598
0599 case HAL_USART_TX_FIFO_EMPTY_CB_ID :
0600 husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback;
0601 break;
0602
0603 case HAL_USART_MSPINIT_CB_ID :
0604 husart->MspInitCallback = HAL_USART_MspInit;
0605 break;
0606
0607 case HAL_USART_MSPDEINIT_CB_ID :
0608 husart->MspDeInitCallback = HAL_USART_MspDeInit;
0609 break;
0610
0611 default :
0612
0613 husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK;
0614
0615
0616 status = HAL_ERROR;
0617 break;
0618 }
0619 }
0620 else if (HAL_USART_STATE_RESET == husart->State)
0621 {
0622 switch (CallbackID)
0623 {
0624 case HAL_USART_MSPINIT_CB_ID :
0625 husart->MspInitCallback = HAL_USART_MspInit;
0626 break;
0627
0628 case HAL_USART_MSPDEINIT_CB_ID :
0629 husart->MspDeInitCallback = HAL_USART_MspDeInit;
0630 break;
0631
0632 default :
0633
0634 husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK;
0635
0636
0637 status = HAL_ERROR;
0638 break;
0639 }
0640 }
0641 else
0642 {
0643
0644 husart->ErrorCode |= HAL_USART_ERROR_INVALID_CALLBACK;
0645
0646
0647 status = HAL_ERROR;
0648 }
0649
0650 return status;
0651 }
0652 #endif
0653
0654
0655
0656
0657
0658
0659
0660
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
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751 HAL_StatusTypeDef HAL_USART_Transmit(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size,
0752 uint32_t Timeout)
0753 {
0754 const uint8_t *ptxdata8bits;
0755 const uint16_t *ptxdata16bits;
0756 uint32_t tickstart;
0757
0758 if (husart->State == HAL_USART_STATE_READY)
0759 {
0760 if ((pTxData == NULL) || (Size == 0U))
0761 {
0762 return HAL_ERROR;
0763 }
0764
0765
0766 __HAL_LOCK(husart);
0767
0768 husart->ErrorCode = HAL_USART_ERROR_NONE;
0769 husart->State = HAL_USART_STATE_BUSY_TX;
0770
0771
0772 tickstart = HAL_GetTick();
0773
0774 husart->TxXferSize = Size;
0775 husart->TxXferCount = Size;
0776
0777
0778 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
0779 {
0780 ptxdata8bits = NULL;
0781 ptxdata16bits = (const uint16_t *) pTxData;
0782 }
0783 else
0784 {
0785 ptxdata8bits = pTxData;
0786 ptxdata16bits = NULL;
0787 }
0788
0789
0790 while (husart->TxXferCount > 0U)
0791 {
0792 if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
0793 {
0794 return HAL_TIMEOUT;
0795 }
0796 if (ptxdata8bits == NULL)
0797 {
0798 husart->Instance->TDR = (uint16_t)(*ptxdata16bits & 0x01FFU);
0799 ptxdata16bits++;
0800 }
0801 else
0802 {
0803 husart->Instance->TDR = (uint8_t)(*ptxdata8bits & 0xFFU);
0804 ptxdata8bits++;
0805 }
0806
0807 husart->TxXferCount--;
0808 }
0809
0810 if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TC, RESET, tickstart, Timeout) != HAL_OK)
0811 {
0812 return HAL_TIMEOUT;
0813 }
0814
0815
0816 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF);
0817
0818
0819 __HAL_USART_CLEAR_OREFLAG(husart);
0820 __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
0821 __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
0822
0823
0824 husart->State = HAL_USART_STATE_READY;
0825
0826
0827 __HAL_UNLOCK(husart);
0828
0829 return HAL_OK;
0830 }
0831 else
0832 {
0833 return HAL_BUSY;
0834 }
0835 }
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849 HAL_StatusTypeDef HAL_USART_Receive(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
0850 {
0851 uint8_t *prxdata8bits;
0852 uint16_t *prxdata16bits;
0853 uint16_t uhMask;
0854 uint32_t tickstart;
0855
0856 if (husart->State == HAL_USART_STATE_READY)
0857 {
0858 if ((pRxData == NULL) || (Size == 0U))
0859 {
0860 return HAL_ERROR;
0861 }
0862
0863
0864 __HAL_LOCK(husart);
0865
0866 husart->ErrorCode = HAL_USART_ERROR_NONE;
0867 husart->State = HAL_USART_STATE_BUSY_RX;
0868
0869
0870 tickstart = HAL_GetTick();
0871
0872 husart->RxXferSize = Size;
0873 husart->RxXferCount = Size;
0874
0875
0876 USART_MASK_COMPUTATION(husart);
0877 uhMask = husart->Mask;
0878
0879
0880 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
0881 {
0882 prxdata8bits = NULL;
0883 prxdata16bits = (uint16_t *) pRxData;
0884 }
0885 else
0886 {
0887 prxdata8bits = pRxData;
0888 prxdata16bits = NULL;
0889 }
0890
0891
0892 while (husart->RxXferCount > 0U)
0893 {
0894 if (husart->SlaveMode == USART_SLAVEMODE_DISABLE)
0895 {
0896
0897
0898
0899
0900 if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
0901 {
0902 return HAL_TIMEOUT;
0903 }
0904 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x0FF);
0905 }
0906
0907
0908 if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
0909 {
0910 return HAL_TIMEOUT;
0911 }
0912
0913 if (prxdata8bits == NULL)
0914 {
0915 *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask);
0916 prxdata16bits++;
0917 }
0918 else
0919 {
0920 *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU));
0921 prxdata8bits++;
0922 }
0923
0924 husart->RxXferCount--;
0925
0926 }
0927
0928
0929 if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
0930 {
0931 __HAL_USART_CLEAR_UDRFLAG(husart);
0932 __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
0933 }
0934
0935
0936 husart->State = HAL_USART_STATE_READY;
0937
0938
0939 __HAL_UNLOCK(husart);
0940
0941 return HAL_OK;
0942 }
0943 else
0944 {
0945 return HAL_BUSY;
0946 }
0947 }
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961 HAL_StatusTypeDef HAL_USART_TransmitReceive(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData,
0962 uint16_t Size, uint32_t Timeout)
0963 {
0964 uint8_t *prxdata8bits;
0965 uint16_t *prxdata16bits;
0966 const uint8_t *ptxdata8bits;
0967 const uint16_t *ptxdata16bits;
0968 uint16_t uhMask;
0969 uint16_t rxdatacount;
0970 uint32_t tickstart;
0971
0972 if (husart->State == HAL_USART_STATE_READY)
0973 {
0974 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
0975 {
0976 return HAL_ERROR;
0977 }
0978
0979
0980 __HAL_LOCK(husart);
0981
0982 husart->ErrorCode = HAL_USART_ERROR_NONE;
0983 husart->State = HAL_USART_STATE_BUSY_RX;
0984
0985
0986 tickstart = HAL_GetTick();
0987
0988 husart->RxXferSize = Size;
0989 husart->TxXferSize = Size;
0990 husart->TxXferCount = Size;
0991 husart->RxXferCount = Size;
0992
0993
0994 USART_MASK_COMPUTATION(husart);
0995 uhMask = husart->Mask;
0996
0997
0998 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
0999 {
1000 prxdata8bits = NULL;
1001 ptxdata8bits = NULL;
1002 ptxdata16bits = (const uint16_t *) pTxData;
1003 prxdata16bits = (uint16_t *) pRxData;
1004 }
1005 else
1006 {
1007 prxdata8bits = pRxData;
1008 ptxdata8bits = pTxData;
1009 ptxdata16bits = NULL;
1010 prxdata16bits = NULL;
1011 }
1012
1013 if ((husart->TxXferCount == 0x01U) || (husart->SlaveMode == USART_SLAVEMODE_ENABLE))
1014 {
1015
1016 if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
1017 {
1018 return HAL_TIMEOUT;
1019 }
1020 if (ptxdata8bits == NULL)
1021 {
1022 husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask);
1023 ptxdata16bits++;
1024 }
1025 else
1026 {
1027 husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU));
1028 ptxdata8bits++;
1029 }
1030
1031 husart->TxXferCount--;
1032 }
1033
1034
1035
1036 rxdatacount = husart->RxXferCount;
1037 while ((husart->TxXferCount > 0U) || (rxdatacount > 0U))
1038 {
1039 if (husart->TxXferCount > 0U)
1040 {
1041
1042 if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK)
1043 {
1044 return HAL_TIMEOUT;
1045 }
1046 if (ptxdata8bits == NULL)
1047 {
1048 husart->Instance->TDR = (uint16_t)(*ptxdata16bits & uhMask);
1049 ptxdata16bits++;
1050 }
1051 else
1052 {
1053 husart->Instance->TDR = (uint8_t)(*ptxdata8bits & (uint8_t)(uhMask & 0xFFU));
1054 ptxdata8bits++;
1055 }
1056
1057 husart->TxXferCount--;
1058 }
1059
1060 if (husart->RxXferCount > 0U)
1061 {
1062
1063 if (USART_WaitOnFlagUntilTimeout(husart, USART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
1064 {
1065 return HAL_TIMEOUT;
1066 }
1067
1068 if (prxdata8bits == NULL)
1069 {
1070 *prxdata16bits = (uint16_t)(husart->Instance->RDR & uhMask);
1071 prxdata16bits++;
1072 }
1073 else
1074 {
1075 *prxdata8bits = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU));
1076 prxdata8bits++;
1077 }
1078
1079 husart->RxXferCount--;
1080 }
1081 rxdatacount = husart->RxXferCount;
1082 }
1083
1084
1085 husart->State = HAL_USART_STATE_READY;
1086
1087
1088 __HAL_UNLOCK(husart);
1089
1090 return HAL_OK;
1091 }
1092 else
1093 {
1094 return HAL_BUSY;
1095 }
1096 }
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108 HAL_StatusTypeDef HAL_USART_Transmit_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size)
1109 {
1110 if (husart->State == HAL_USART_STATE_READY)
1111 {
1112 if ((pTxData == NULL) || (Size == 0U))
1113 {
1114 return HAL_ERROR;
1115 }
1116
1117
1118 __HAL_LOCK(husart);
1119
1120 husart->pTxBuffPtr = pTxData;
1121 husart->TxXferSize = Size;
1122 husart->TxXferCount = Size;
1123 husart->TxISR = NULL;
1124
1125 husart->ErrorCode = HAL_USART_ERROR_NONE;
1126 husart->State = HAL_USART_STATE_BUSY_TX;
1127
1128
1129
1130
1131
1132
1133
1134
1135 if (husart->FifoMode == USART_FIFOMODE_ENABLE)
1136 {
1137
1138 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1139 {
1140 husart->TxISR = USART_TxISR_16BIT_FIFOEN;
1141 }
1142 else
1143 {
1144 husart->TxISR = USART_TxISR_8BIT_FIFOEN;
1145 }
1146
1147
1148 __HAL_UNLOCK(husart);
1149
1150
1151 __HAL_USART_ENABLE_IT(husart, USART_IT_TXFT);
1152 }
1153 else
1154 {
1155
1156 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1157 {
1158 husart->TxISR = USART_TxISR_16BIT;
1159 }
1160 else
1161 {
1162 husart->TxISR = USART_TxISR_8BIT;
1163 }
1164
1165
1166 __HAL_UNLOCK(husart);
1167
1168
1169 __HAL_USART_ENABLE_IT(husart, USART_IT_TXE);
1170 }
1171
1172 return HAL_OK;
1173 }
1174 else
1175 {
1176 return HAL_BUSY;
1177 }
1178 }
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191 HAL_StatusTypeDef HAL_USART_Receive_IT(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)
1192 {
1193 uint16_t nb_dummy_data;
1194
1195 if (husart->State == HAL_USART_STATE_READY)
1196 {
1197 if ((pRxData == NULL) || (Size == 0U))
1198 {
1199 return HAL_ERROR;
1200 }
1201
1202
1203 __HAL_LOCK(husart);
1204
1205 husart->pRxBuffPtr = pRxData;
1206 husart->RxXferSize = Size;
1207 husart->RxXferCount = Size;
1208 husart->RxISR = NULL;
1209
1210 USART_MASK_COMPUTATION(husart);
1211
1212 husart->ErrorCode = HAL_USART_ERROR_NONE;
1213 husart->State = HAL_USART_STATE_BUSY_RX;
1214
1215
1216 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1217
1218
1219 if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess))
1220 {
1221
1222 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1223 {
1224 husart->RxISR = USART_RxISR_16BIT_FIFOEN;
1225 }
1226 else
1227 {
1228 husart->RxISR = USART_RxISR_8BIT_FIFOEN;
1229 }
1230
1231
1232 __HAL_UNLOCK(husart);
1233
1234
1235 if (husart->Init.Parity != USART_PARITY_NONE)
1236 {
1237 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1238 }
1239 SET_BIT(husart->Instance->CR3, USART_CR3_RXFTIE);
1240 }
1241 else
1242 {
1243
1244 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1245 {
1246 husart->RxISR = USART_RxISR_16BIT;
1247 }
1248 else
1249 {
1250 husart->RxISR = USART_RxISR_8BIT;
1251 }
1252
1253
1254 __HAL_UNLOCK(husart);
1255
1256
1257 if (husart->Init.Parity != USART_PARITY_NONE)
1258 {
1259 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
1260 }
1261 else
1262 {
1263 SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
1264 }
1265 }
1266
1267 if (husart->SlaveMode == USART_SLAVEMODE_DISABLE)
1268 {
1269
1270
1271
1272
1273 if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess))
1274 {
1275 for (nb_dummy_data = husart->NbRxDataToProcess ; nb_dummy_data > 0U ; nb_dummy_data--)
1276 {
1277 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
1278 }
1279 }
1280 else
1281 {
1282 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
1283 }
1284 }
1285
1286 return HAL_OK;
1287 }
1288 else
1289 {
1290 return HAL_BUSY;
1291 }
1292 }
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305 HAL_StatusTypeDef HAL_USART_TransmitReceive_IT(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData,
1306 uint16_t Size)
1307 {
1308
1309 if (husart->State == HAL_USART_STATE_READY)
1310 {
1311 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
1312 {
1313 return HAL_ERROR;
1314 }
1315
1316
1317 __HAL_LOCK(husart);
1318
1319 husart->pRxBuffPtr = pRxData;
1320 husart->RxXferSize = Size;
1321 husart->RxXferCount = Size;
1322 husart->pTxBuffPtr = pTxData;
1323 husart->TxXferSize = Size;
1324 husart->TxXferCount = Size;
1325
1326
1327 USART_MASK_COMPUTATION(husart);
1328
1329 husart->ErrorCode = HAL_USART_ERROR_NONE;
1330 husart->State = HAL_USART_STATE_BUSY_TX_RX;
1331
1332
1333 if ((husart->FifoMode == USART_FIFOMODE_ENABLE) && (Size >= husart->NbRxDataToProcess))
1334 {
1335
1336 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1337 {
1338 husart->TxISR = USART_TxISR_16BIT_FIFOEN;
1339 husart->RxISR = USART_RxISR_16BIT_FIFOEN;
1340 }
1341 else
1342 {
1343 husart->TxISR = USART_TxISR_8BIT_FIFOEN;
1344 husart->RxISR = USART_RxISR_8BIT_FIFOEN;
1345 }
1346
1347
1348 __HAL_UNLOCK(husart);
1349
1350
1351 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1352
1353 if (husart->Init.Parity != USART_PARITY_NONE)
1354 {
1355
1356 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1357 }
1358
1359
1360 SET_BIT(husart->Instance->CR3, (USART_CR3_TXFTIE | USART_CR3_RXFTIE));
1361 }
1362 else
1363 {
1364 if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
1365 {
1366 husart->TxISR = USART_TxISR_16BIT;
1367 husart->RxISR = USART_RxISR_16BIT;
1368 }
1369 else
1370 {
1371 husart->TxISR = USART_TxISR_8BIT;
1372 husart->RxISR = USART_RxISR_8BIT;
1373 }
1374
1375
1376 __HAL_UNLOCK(husart);
1377
1378
1379 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1380
1381
1382 if (husart->Init.Parity != USART_PARITY_NONE)
1383 {
1384 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE | USART_CR1_RXNEIE_RXFNEIE);
1385 }
1386 else
1387 {
1388 SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
1389 }
1390
1391
1392 SET_BIT(husart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
1393 }
1394
1395 return HAL_OK;
1396 }
1397 else
1398 {
1399 return HAL_BUSY;
1400 }
1401 }
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413 HAL_StatusTypeDef HAL_USART_Transmit_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint16_t Size)
1414 {
1415 HAL_StatusTypeDef status = HAL_OK;
1416 const uint32_t *tmp;
1417
1418 if (husart->State == HAL_USART_STATE_READY)
1419 {
1420 if ((pTxData == NULL) || (Size == 0U))
1421 {
1422 return HAL_ERROR;
1423 }
1424
1425
1426 __HAL_LOCK(husart);
1427
1428 husart->pTxBuffPtr = pTxData;
1429 husart->TxXferSize = Size;
1430 husart->TxXferCount = Size;
1431
1432 husart->ErrorCode = HAL_USART_ERROR_NONE;
1433 husart->State = HAL_USART_STATE_BUSY_TX;
1434
1435 if (husart->hdmatx != NULL)
1436 {
1437
1438 husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt;
1439
1440
1441 husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt;
1442
1443
1444 husart->hdmatx->XferErrorCallback = USART_DMAError;
1445
1446
1447 tmp = (const uint32_t *)&pTxData;
1448 status = HAL_DMA_Start_IT(husart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size);
1449 }
1450
1451 if (status == HAL_OK)
1452 {
1453
1454 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF);
1455
1456
1457 __HAL_UNLOCK(husart);
1458
1459
1460
1461 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1462
1463 return HAL_OK;
1464 }
1465 else
1466 {
1467
1468 husart->ErrorCode = HAL_USART_ERROR_DMA;
1469
1470
1471 __HAL_UNLOCK(husart);
1472
1473
1474 husart->State = HAL_USART_STATE_READY;
1475
1476 return HAL_ERROR;
1477 }
1478 }
1479 else
1480 {
1481 return HAL_BUSY;
1482 }
1483 }
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498 HAL_StatusTypeDef HAL_USART_Receive_DMA(USART_HandleTypeDef *husart, uint8_t *pRxData, uint16_t Size)
1499 {
1500 HAL_StatusTypeDef status = HAL_OK;
1501 uint32_t *tmp = (uint32_t *)&pRxData;
1502
1503
1504 if (husart->State == HAL_USART_STATE_READY)
1505 {
1506 if ((pRxData == NULL) || (Size == 0U))
1507 {
1508 return HAL_ERROR;
1509 }
1510
1511
1512 __HAL_LOCK(husart);
1513
1514 husart->pRxBuffPtr = pRxData;
1515 husart->RxXferSize = Size;
1516 husart->pTxBuffPtr = pRxData;
1517 husart->TxXferSize = Size;
1518
1519 husart->ErrorCode = HAL_USART_ERROR_NONE;
1520 husart->State = HAL_USART_STATE_BUSY_RX;
1521
1522 if (husart->hdmarx != NULL)
1523 {
1524
1525 husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt;
1526
1527
1528 husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt;
1529
1530
1531 husart->hdmarx->XferErrorCallback = USART_DMAError;
1532
1533
1534 status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(uint32_t *)tmp, Size);
1535 }
1536
1537 if ((status == HAL_OK) &&
1538 (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
1539 {
1540
1541
1542
1543
1544
1545 if (husart->hdmatx != NULL)
1546 {
1547 husart->hdmatx->XferErrorCallback = NULL;
1548 husart->hdmatx->XferHalfCpltCallback = NULL;
1549 husart->hdmatx->XferCpltCallback = NULL;
1550 status = HAL_DMA_Start_IT(husart->hdmatx, *(uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size);
1551 }
1552 }
1553
1554 if (status == HAL_OK)
1555 {
1556
1557 __HAL_UNLOCK(husart);
1558
1559 if (husart->Init.Parity != USART_PARITY_NONE)
1560 {
1561
1562 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1563 }
1564
1565
1566 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1567
1568
1569
1570 SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1571
1572
1573
1574 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1575
1576 return HAL_OK;
1577 }
1578 else
1579 {
1580 if (husart->hdmarx != NULL)
1581 {
1582 status = HAL_DMA_Abort(husart->hdmarx);
1583 }
1584
1585
1586 UNUSED(status);
1587
1588
1589 husart->ErrorCode = HAL_USART_ERROR_DMA;
1590
1591
1592 __HAL_UNLOCK(husart);
1593
1594
1595 husart->State = HAL_USART_STATE_READY;
1596
1597 return HAL_ERROR;
1598 }
1599 }
1600 else
1601 {
1602 return HAL_BUSY;
1603 }
1604 }
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618 HAL_StatusTypeDef HAL_USART_TransmitReceive_DMA(USART_HandleTypeDef *husart, const uint8_t *pTxData, uint8_t *pRxData,
1619 uint16_t Size)
1620 {
1621 HAL_StatusTypeDef status;
1622 const uint32_t *tmp;
1623
1624 if (husart->State == HAL_USART_STATE_READY)
1625 {
1626 if ((pTxData == NULL) || (pRxData == NULL) || (Size == 0U))
1627 {
1628 return HAL_ERROR;
1629 }
1630
1631
1632 __HAL_LOCK(husart);
1633
1634 husart->pRxBuffPtr = pRxData;
1635 husart->RxXferSize = Size;
1636 husart->pTxBuffPtr = pTxData;
1637 husart->TxXferSize = Size;
1638
1639 husart->ErrorCode = HAL_USART_ERROR_NONE;
1640 husart->State = HAL_USART_STATE_BUSY_TX_RX;
1641
1642 if ((husart->hdmarx != NULL) && (husart->hdmatx != NULL))
1643 {
1644
1645 husart->hdmarx->XferCpltCallback = USART_DMAReceiveCplt;
1646
1647
1648 husart->hdmarx->XferHalfCpltCallback = USART_DMARxHalfCplt;
1649
1650
1651 husart->hdmatx->XferCpltCallback = USART_DMATransmitCplt;
1652
1653
1654 husart->hdmatx->XferHalfCpltCallback = USART_DMATxHalfCplt;
1655
1656
1657 husart->hdmatx->XferErrorCallback = USART_DMAError;
1658
1659
1660 husart->hdmarx->XferErrorCallback = USART_DMAError;
1661
1662
1663 tmp = (uint32_t *)&pRxData;
1664 status = HAL_DMA_Start_IT(husart->hdmarx, (uint32_t)&husart->Instance->RDR, *(const uint32_t *)tmp, Size);
1665
1666
1667 if (status == HAL_OK)
1668 {
1669 tmp = (const uint32_t *)&pTxData;
1670 status = HAL_DMA_Start_IT(husart->hdmatx, *(const uint32_t *)tmp, (uint32_t)&husart->Instance->TDR, Size);
1671 }
1672 }
1673 else
1674 {
1675 status = HAL_ERROR;
1676 }
1677
1678 if (status == HAL_OK)
1679 {
1680
1681 __HAL_UNLOCK(husart);
1682
1683 if (husart->Init.Parity != USART_PARITY_NONE)
1684 {
1685
1686 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1687 }
1688
1689
1690 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1691
1692
1693 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_TCF);
1694
1695
1696
1697 SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1698
1699
1700
1701 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1702
1703 return HAL_OK;
1704 }
1705 else
1706 {
1707 if (husart->hdmarx != NULL)
1708 {
1709 status = HAL_DMA_Abort(husart->hdmarx);
1710 }
1711
1712
1713 UNUSED(status);
1714
1715
1716 husart->ErrorCode = HAL_USART_ERROR_DMA;
1717
1718
1719 __HAL_UNLOCK(husart);
1720
1721
1722 husart->State = HAL_USART_STATE_READY;
1723
1724 return HAL_ERROR;
1725 }
1726 }
1727 else
1728 {
1729 return HAL_BUSY;
1730 }
1731 }
1732
1733
1734
1735
1736
1737
1738 HAL_StatusTypeDef HAL_USART_DMAPause(USART_HandleTypeDef *husart)
1739 {
1740 const HAL_USART_StateTypeDef state = husart->State;
1741
1742
1743 __HAL_LOCK(husart);
1744
1745 if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT)) &&
1746 (state == HAL_USART_STATE_BUSY_TX))
1747 {
1748
1749 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1750 }
1751 else if ((state == HAL_USART_STATE_BUSY_RX) ||
1752 (state == HAL_USART_STATE_BUSY_TX_RX))
1753 {
1754 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
1755 {
1756
1757 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1758 }
1759 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
1760 {
1761
1762 CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1763 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
1764
1765
1766 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1767 }
1768 }
1769 else
1770 {
1771
1772 }
1773
1774
1775 __HAL_UNLOCK(husart);
1776
1777 return HAL_OK;
1778 }
1779
1780
1781
1782
1783
1784
1785 HAL_StatusTypeDef HAL_USART_DMAResume(USART_HandleTypeDef *husart)
1786 {
1787 const HAL_USART_StateTypeDef state = husart->State;
1788
1789
1790 __HAL_LOCK(husart);
1791
1792 if (state == HAL_USART_STATE_BUSY_TX)
1793 {
1794
1795 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1796 }
1797 else if ((state == HAL_USART_STATE_BUSY_RX) ||
1798 (state == HAL_USART_STATE_BUSY_TX_RX))
1799 {
1800
1801 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF);
1802
1803
1804 if (husart->Init.Parity != USART_PARITY_NONE)
1805 {
1806 SET_BIT(husart->Instance->CR1, USART_CR1_PEIE);
1807 }
1808 SET_BIT(husart->Instance->CR3, USART_CR3_EIE);
1809
1810
1811 SET_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1812
1813
1814 SET_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1815 }
1816 else
1817 {
1818
1819 }
1820
1821
1822 __HAL_UNLOCK(husart);
1823
1824 return HAL_OK;
1825 }
1826
1827
1828
1829
1830
1831
1832 HAL_StatusTypeDef HAL_USART_DMAStop(USART_HandleTypeDef *husart)
1833 {
1834
1835
1836
1837
1838
1839
1840
1841
1842 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1843 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1844
1845
1846 if (husart->hdmatx != NULL)
1847 {
1848 if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK)
1849 {
1850 if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1851 {
1852
1853 husart->ErrorCode = HAL_USART_ERROR_DMA;
1854
1855 return HAL_TIMEOUT;
1856 }
1857 }
1858 }
1859
1860 if (husart->hdmarx != NULL)
1861 {
1862 if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK)
1863 {
1864 if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1865 {
1866
1867 husart->ErrorCode = HAL_USART_ERROR_DMA;
1868
1869 return HAL_TIMEOUT;
1870 }
1871 }
1872 }
1873
1874 USART_EndTransfer(husart);
1875 husart->State = HAL_USART_STATE_READY;
1876
1877 return HAL_OK;
1878 }
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892 HAL_StatusTypeDef HAL_USART_Abort(USART_HandleTypeDef *husart)
1893 {
1894
1895 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE |
1896 USART_CR1_TCIE));
1897 CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
1898
1899
1900 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
1901 {
1902
1903 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
1904
1905
1906 if (husart->hdmatx != NULL)
1907 {
1908
1909
1910 husart->hdmatx->XferAbortCallback = NULL;
1911
1912 if (HAL_DMA_Abort(husart->hdmatx) != HAL_OK)
1913 {
1914 if (HAL_DMA_GetError(husart->hdmatx) == HAL_DMA_ERROR_TIMEOUT)
1915 {
1916
1917 husart->ErrorCode = HAL_USART_ERROR_DMA;
1918
1919 return HAL_TIMEOUT;
1920 }
1921 }
1922 }
1923 }
1924
1925
1926 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
1927 {
1928
1929 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
1930
1931
1932 if (husart->hdmarx != NULL)
1933 {
1934
1935
1936 husart->hdmarx->XferAbortCallback = NULL;
1937
1938 if (HAL_DMA_Abort(husart->hdmarx) != HAL_OK)
1939 {
1940 if (HAL_DMA_GetError(husart->hdmarx) == HAL_DMA_ERROR_TIMEOUT)
1941 {
1942
1943 husart->ErrorCode = HAL_USART_ERROR_DMA;
1944
1945 return HAL_TIMEOUT;
1946 }
1947 }
1948 }
1949 }
1950
1951
1952 husart->TxXferCount = 0U;
1953 husart->RxXferCount = 0U;
1954
1955
1956 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
1957
1958
1959 if (husart->FifoMode == USART_FIFOMODE_ENABLE)
1960 {
1961 __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
1962 }
1963
1964
1965 __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
1966
1967
1968 husart->State = HAL_USART_STATE_READY;
1969
1970
1971 husart->ErrorCode = HAL_USART_ERROR_NONE;
1972
1973 return HAL_OK;
1974 }
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990 HAL_StatusTypeDef HAL_USART_Abort_IT(USART_HandleTypeDef *husart)
1991 {
1992 uint32_t abortcplt = 1U;
1993
1994
1995 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE |
1996 USART_CR1_TCIE));
1997 CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
1998
1999
2000
2001
2002 if (husart->hdmatx != NULL)
2003 {
2004
2005
2006 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
2007 {
2008 husart->hdmatx->XferAbortCallback = USART_DMATxAbortCallback;
2009 }
2010 else
2011 {
2012 husart->hdmatx->XferAbortCallback = NULL;
2013 }
2014 }
2015
2016 if (husart->hdmarx != NULL)
2017 {
2018
2019
2020 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
2021 {
2022 husart->hdmarx->XferAbortCallback = USART_DMARxAbortCallback;
2023 }
2024 else
2025 {
2026 husart->hdmarx->XferAbortCallback = NULL;
2027 }
2028 }
2029
2030
2031 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAT))
2032 {
2033
2034 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
2035
2036
2037 if (husart->hdmatx != NULL)
2038 {
2039
2040
2041
2042
2043 if (HAL_DMA_Abort_IT(husart->hdmatx) != HAL_OK)
2044 {
2045 husart->hdmatx->XferAbortCallback = NULL;
2046 }
2047 else
2048 {
2049 abortcplt = 0U;
2050 }
2051 }
2052 }
2053
2054
2055 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
2056 {
2057
2058 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
2059
2060
2061 if (husart->hdmarx != NULL)
2062 {
2063
2064
2065
2066
2067 if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK)
2068 {
2069 husart->hdmarx->XferAbortCallback = NULL;
2070 abortcplt = 1U;
2071 }
2072 else
2073 {
2074 abortcplt = 0U;
2075 }
2076 }
2077 }
2078
2079
2080 if (abortcplt == 1U)
2081 {
2082
2083 husart->TxXferCount = 0U;
2084 husart->RxXferCount = 0U;
2085
2086
2087 husart->ErrorCode = HAL_USART_ERROR_NONE;
2088
2089
2090 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
2091
2092
2093 if (husart->FifoMode == USART_FIFOMODE_ENABLE)
2094 {
2095 __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
2096 }
2097
2098
2099 __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
2100
2101
2102 husart->State = HAL_USART_STATE_READY;
2103
2104
2105 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2106
2107 husart->AbortCpltCallback(husart);
2108 #else
2109
2110 HAL_USART_AbortCpltCallback(husart);
2111 #endif
2112 }
2113
2114 return HAL_OK;
2115 }
2116
2117
2118
2119
2120
2121
2122 void HAL_USART_IRQHandler(USART_HandleTypeDef *husart)
2123 {
2124 uint32_t isrflags = READ_REG(husart->Instance->ISR);
2125 uint32_t cr1its = READ_REG(husart->Instance->CR1);
2126 uint32_t cr3its = READ_REG(husart->Instance->CR3);
2127
2128 uint32_t errorflags;
2129 uint32_t errorcode;
2130
2131
2132 errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF |
2133 USART_ISR_UDR));
2134 if (errorflags == 0U)
2135 {
2136
2137 if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
2138 && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
2139 || ((cr3its & USART_CR3_RXFTIE) != 0U)))
2140 {
2141 if (husart->RxISR != NULL)
2142 {
2143 husart->RxISR(husart);
2144 }
2145 return;
2146 }
2147 }
2148
2149
2150 if ((errorflags != 0U)
2151 && (((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)
2152 || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U)))
2153 {
2154
2155 if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
2156 {
2157 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_PEF);
2158
2159 husart->ErrorCode |= HAL_USART_ERROR_PE;
2160 }
2161
2162
2163 if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2164 {
2165 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_FEF);
2166
2167 husart->ErrorCode |= HAL_USART_ERROR_FE;
2168 }
2169
2170
2171 if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2172 {
2173 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_NEF);
2174
2175 husart->ErrorCode |= HAL_USART_ERROR_NE;
2176 }
2177
2178
2179 if (((isrflags & USART_ISR_ORE) != 0U)
2180 && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) ||
2181 ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)))
2182 {
2183 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_OREF);
2184
2185 husart->ErrorCode |= HAL_USART_ERROR_ORE;
2186 }
2187
2188
2189 if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U))
2190 {
2191 __HAL_USART_CLEAR_IT(husart, USART_CLEAR_RTOF);
2192
2193 husart->ErrorCode |= HAL_USART_ERROR_RTO;
2194 }
2195
2196
2197 if (((isrflags & USART_ISR_UDR) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
2198 {
2199
2200 if (husart->State == HAL_USART_STATE_BUSY_RX)
2201 {
2202 __HAL_USART_CLEAR_UDRFLAG(husart);
2203 return;
2204 }
2205 else
2206 {
2207 __HAL_USART_CLEAR_UDRFLAG(husart);
2208 husart->ErrorCode |= HAL_USART_ERROR_UDR;
2209 }
2210 }
2211
2212
2213 if (husart->ErrorCode != HAL_USART_ERROR_NONE)
2214 {
2215
2216 if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
2217 && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
2218 || ((cr3its & USART_CR3_RXFTIE) != 0U)))
2219 {
2220 if (husart->RxISR != NULL)
2221 {
2222 husart->RxISR(husart);
2223 }
2224 }
2225
2226
2227
2228 errorcode = husart->ErrorCode & HAL_USART_ERROR_ORE;
2229 if ((HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR)) ||
2230 (errorcode != 0U))
2231 {
2232
2233
2234
2235 USART_EndTransfer(husart);
2236
2237
2238 if (HAL_IS_BIT_SET(husart->Instance->CR3, USART_CR3_DMAR))
2239 {
2240
2241 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR | USART_CR3_DMAR);
2242
2243
2244 if (husart->hdmatx != NULL)
2245 {
2246
2247
2248 husart->hdmatx->XferAbortCallback = NULL;
2249
2250
2251 (void)HAL_DMA_Abort_IT(husart->hdmatx);
2252 }
2253
2254
2255 if (husart->hdmarx != NULL)
2256 {
2257
2258
2259 husart->hdmarx->XferAbortCallback = USART_DMAAbortOnError;
2260
2261
2262 if (HAL_DMA_Abort_IT(husart->hdmarx) != HAL_OK)
2263 {
2264
2265 husart->hdmarx->XferAbortCallback(husart->hdmarx);
2266 }
2267 }
2268 else
2269 {
2270
2271 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2272
2273 husart->ErrorCallback(husart);
2274 #else
2275
2276 HAL_USART_ErrorCallback(husart);
2277 #endif
2278 }
2279 }
2280 else
2281 {
2282
2283 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2284
2285 husart->ErrorCallback(husart);
2286 #else
2287
2288 HAL_USART_ErrorCallback(husart);
2289 #endif
2290 }
2291 }
2292 else
2293 {
2294
2295
2296 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2297
2298 husart->ErrorCallback(husart);
2299 #else
2300
2301 HAL_USART_ErrorCallback(husart);
2302 #endif
2303 husart->ErrorCode = HAL_USART_ERROR_NONE;
2304 }
2305 }
2306 return;
2307
2308 }
2309
2310
2311
2312 if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)
2313 && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)
2314 || ((cr3its & USART_CR3_TXFTIE) != 0U)))
2315 {
2316 if (husart->TxISR != NULL)
2317 {
2318 husart->TxISR(husart);
2319 }
2320 return;
2321 }
2322
2323
2324 if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
2325 {
2326 USART_EndTransmit_IT(husart);
2327 return;
2328 }
2329
2330
2331 if (((isrflags & USART_ISR_TXFE) != 0U) && ((cr1its & USART_CR1_TXFEIE) != 0U))
2332 {
2333 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2334
2335 husart->TxFifoEmptyCallback(husart);
2336 #else
2337
2338 HAL_USARTEx_TxFifoEmptyCallback(husart);
2339 #endif
2340 return;
2341 }
2342
2343
2344 if (((isrflags & USART_ISR_RXFF) != 0U) && ((cr1its & USART_CR1_RXFFIE) != 0U))
2345 {
2346 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2347
2348 husart->RxFifoFullCallback(husart);
2349 #else
2350
2351 HAL_USARTEx_RxFifoFullCallback(husart);
2352 #endif
2353 return;
2354 }
2355 }
2356
2357
2358
2359
2360
2361
2362 __weak void HAL_USART_TxCpltCallback(USART_HandleTypeDef *husart)
2363 {
2364
2365 UNUSED(husart);
2366
2367
2368
2369
2370 }
2371
2372
2373
2374
2375
2376
2377 __weak void HAL_USART_TxHalfCpltCallback(USART_HandleTypeDef *husart)
2378 {
2379
2380 UNUSED(husart);
2381
2382
2383
2384
2385 }
2386
2387
2388
2389
2390
2391
2392 __weak void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
2393 {
2394
2395 UNUSED(husart);
2396
2397
2398
2399
2400 }
2401
2402
2403
2404
2405
2406
2407 __weak void HAL_USART_RxHalfCpltCallback(USART_HandleTypeDef *husart)
2408 {
2409
2410 UNUSED(husart);
2411
2412
2413
2414
2415 }
2416
2417
2418
2419
2420
2421
2422 __weak void HAL_USART_TxRxCpltCallback(USART_HandleTypeDef *husart)
2423 {
2424
2425 UNUSED(husart);
2426
2427
2428
2429
2430 }
2431
2432
2433
2434
2435
2436
2437 __weak void HAL_USART_ErrorCallback(USART_HandleTypeDef *husart)
2438 {
2439
2440 UNUSED(husart);
2441
2442
2443
2444
2445 }
2446
2447
2448
2449
2450
2451
2452 __weak void HAL_USART_AbortCpltCallback(USART_HandleTypeDef *husart)
2453 {
2454
2455 UNUSED(husart);
2456
2457
2458
2459
2460 }
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490 HAL_USART_StateTypeDef HAL_USART_GetState(const USART_HandleTypeDef *husart)
2491 {
2492 return husart->State;
2493 }
2494
2495
2496
2497
2498
2499
2500
2501 uint32_t HAL_USART_GetError(const USART_HandleTypeDef *husart)
2502 {
2503 return husart->ErrorCode;
2504 }
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2525 void USART_InitCallbacksToDefault(USART_HandleTypeDef *husart)
2526 {
2527
2528 husart->TxHalfCpltCallback = HAL_USART_TxHalfCpltCallback;
2529 husart->TxCpltCallback = HAL_USART_TxCpltCallback;
2530 husart->RxHalfCpltCallback = HAL_USART_RxHalfCpltCallback;
2531 husart->RxCpltCallback = HAL_USART_RxCpltCallback;
2532 husart->TxRxCpltCallback = HAL_USART_TxRxCpltCallback;
2533 husart->ErrorCallback = HAL_USART_ErrorCallback;
2534 husart->AbortCpltCallback = HAL_USART_AbortCpltCallback;
2535 husart->RxFifoFullCallback = HAL_USARTEx_RxFifoFullCallback;
2536 husart->TxFifoEmptyCallback = HAL_USARTEx_TxFifoEmptyCallback;
2537 }
2538 #endif
2539
2540
2541
2542
2543
2544
2545 static void USART_EndTransfer(USART_HandleTypeDef *husart)
2546 {
2547
2548 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE | USART_CR1_TXEIE_TXFNFIE |
2549 USART_CR1_TCIE));
2550 CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE | USART_CR3_TXFTIE));
2551
2552
2553 husart->State = HAL_USART_STATE_READY;
2554 }
2555
2556
2557
2558
2559
2560
2561 static void USART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
2562 {
2563 USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2564
2565
2566 if (hdma->Init.Mode != DMA_CIRCULAR)
2567 {
2568 husart->TxXferCount = 0U;
2569
2570 if (husart->State == HAL_USART_STATE_BUSY_TX)
2571 {
2572
2573
2574 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
2575
2576
2577 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
2578 }
2579 }
2580
2581 else
2582 {
2583 if (husart->State == HAL_USART_STATE_BUSY_TX)
2584 {
2585 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2586
2587 husart->TxCpltCallback(husart);
2588 #else
2589
2590 HAL_USART_TxCpltCallback(husart);
2591 #endif
2592 }
2593 }
2594 }
2595
2596
2597
2598
2599
2600
2601 static void USART_DMATxHalfCplt(DMA_HandleTypeDef *hdma)
2602 {
2603 USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2604
2605 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2606
2607 husart->TxHalfCpltCallback(husart);
2608 #else
2609
2610 HAL_USART_TxHalfCpltCallback(husart);
2611 #endif
2612 }
2613
2614
2615
2616
2617
2618
2619 static void USART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
2620 {
2621 USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2622
2623
2624 if (hdma->Init.Mode != DMA_CIRCULAR)
2625 {
2626 husart->RxXferCount = 0U;
2627
2628
2629 CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
2630 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
2631
2632
2633
2634 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAR);
2635
2636
2637 CLEAR_BIT(husart->Instance->CR3, USART_CR3_DMAT);
2638
2639 if (husart->State == HAL_USART_STATE_BUSY_RX)
2640 {
2641 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2642
2643 husart->RxCpltCallback(husart);
2644 #else
2645
2646 HAL_USART_RxCpltCallback(husart);
2647 #endif
2648 }
2649
2650 else
2651 {
2652 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2653
2654 husart->TxRxCpltCallback(husart);
2655 #else
2656
2657 HAL_USART_TxRxCpltCallback(husart);
2658 #endif
2659 }
2660 husart->State = HAL_USART_STATE_READY;
2661 }
2662
2663 else
2664 {
2665 if (husart->State == HAL_USART_STATE_BUSY_RX)
2666 {
2667 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2668
2669 husart->RxCpltCallback(husart);
2670 #else
2671
2672 HAL_USART_RxCpltCallback(husart);
2673 #endif
2674 }
2675
2676 else
2677 {
2678 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2679
2680 husart->TxRxCpltCallback(husart);
2681 #else
2682
2683 HAL_USART_TxRxCpltCallback(husart);
2684 #endif
2685 }
2686 }
2687 }
2688
2689
2690
2691
2692
2693
2694 static void USART_DMARxHalfCplt(DMA_HandleTypeDef *hdma)
2695 {
2696 USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2697
2698 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2699
2700 husart->RxHalfCpltCallback(husart);
2701 #else
2702
2703 HAL_USART_RxHalfCpltCallback(husart);
2704 #endif
2705 }
2706
2707
2708
2709
2710
2711
2712 static void USART_DMAError(DMA_HandleTypeDef *hdma)
2713 {
2714 USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2715
2716 husart->RxXferCount = 0U;
2717 husart->TxXferCount = 0U;
2718 USART_EndTransfer(husart);
2719
2720 husart->ErrorCode |= HAL_USART_ERROR_DMA;
2721 husart->State = HAL_USART_STATE_READY;
2722
2723 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2724
2725 husart->ErrorCallback(husart);
2726 #else
2727
2728 HAL_USART_ErrorCallback(husart);
2729 #endif
2730 }
2731
2732
2733
2734
2735
2736
2737
2738 static void USART_DMAAbortOnError(DMA_HandleTypeDef *hdma)
2739 {
2740 USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2741 husart->RxXferCount = 0U;
2742 husart->TxXferCount = 0U;
2743
2744 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2745
2746 husart->ErrorCallback(husart);
2747 #else
2748
2749 HAL_USART_ErrorCallback(husart);
2750 #endif
2751 }
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761 static void USART_DMATxAbortCallback(DMA_HandleTypeDef *hdma)
2762 {
2763 USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2764
2765 husart->hdmatx->XferAbortCallback = NULL;
2766
2767
2768 if (husart->hdmarx != NULL)
2769 {
2770 if (husart->hdmarx->XferAbortCallback != NULL)
2771 {
2772 return;
2773 }
2774 }
2775
2776
2777 husart->TxXferCount = 0U;
2778 husart->RxXferCount = 0U;
2779
2780
2781 husart->ErrorCode = HAL_USART_ERROR_NONE;
2782
2783
2784 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
2785
2786
2787 husart->State = HAL_USART_STATE_READY;
2788
2789
2790 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2791
2792 husart->AbortCpltCallback(husart);
2793 #else
2794
2795 HAL_USART_AbortCpltCallback(husart);
2796 #endif
2797
2798 }
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809 static void USART_DMARxAbortCallback(DMA_HandleTypeDef *hdma)
2810 {
2811 USART_HandleTypeDef *husart = (USART_HandleTypeDef *)(hdma->Parent);
2812
2813 husart->hdmarx->XferAbortCallback = NULL;
2814
2815
2816 if (husart->hdmatx != NULL)
2817 {
2818 if (husart->hdmatx->XferAbortCallback != NULL)
2819 {
2820 return;
2821 }
2822 }
2823
2824
2825 husart->TxXferCount = 0U;
2826 husart->RxXferCount = 0U;
2827
2828
2829 husart->ErrorCode = HAL_USART_ERROR_NONE;
2830
2831
2832 __HAL_USART_CLEAR_FLAG(husart, USART_CLEAR_OREF | USART_CLEAR_NEF | USART_CLEAR_PEF | USART_CLEAR_FEF);
2833
2834
2835 husart->State = HAL_USART_STATE_READY;
2836
2837
2838 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
2839
2840 husart->AbortCpltCallback(husart);
2841 #else
2842
2843 HAL_USART_AbortCpltCallback(husart);
2844 #endif
2845 }
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858 static HAL_StatusTypeDef USART_WaitOnFlagUntilTimeout(USART_HandleTypeDef *husart, uint32_t Flag, FlagStatus Status,
2859 uint32_t Tickstart, uint32_t Timeout)
2860 {
2861
2862 while ((__HAL_USART_GET_FLAG(husart, Flag) ? SET : RESET) == Status)
2863 {
2864
2865 if (Timeout != HAL_MAX_DELAY)
2866 {
2867 if (((HAL_GetTick() - Tickstart) > Timeout) || (Timeout == 0U))
2868 {
2869 husart->State = HAL_USART_STATE_READY;
2870
2871
2872 __HAL_UNLOCK(husart);
2873
2874 return HAL_TIMEOUT;
2875 }
2876 }
2877 }
2878 return HAL_OK;
2879 }
2880
2881
2882
2883
2884
2885
2886 static HAL_StatusTypeDef USART_SetConfig(USART_HandleTypeDef *husart)
2887 {
2888 uint32_t tmpreg;
2889 USART_ClockSourceTypeDef clocksource;
2890 HAL_StatusTypeDef ret = HAL_OK;
2891 uint16_t brrtemp;
2892 uint32_t usartdiv = 0x00000000;
2893 PLL2_ClocksTypeDef pll2_clocks;
2894 PLL3_ClocksTypeDef pll3_clocks;
2895 uint32_t pclk;
2896
2897
2898 assert_param(IS_USART_POLARITY(husart->Init.CLKPolarity));
2899 assert_param(IS_USART_PHASE(husart->Init.CLKPhase));
2900 assert_param(IS_USART_LASTBIT(husart->Init.CLKLastBit));
2901 assert_param(IS_USART_BAUDRATE(husart->Init.BaudRate));
2902 assert_param(IS_USART_WORD_LENGTH(husart->Init.WordLength));
2903 assert_param(IS_USART_STOPBITS(husart->Init.StopBits));
2904 assert_param(IS_USART_PARITY(husart->Init.Parity));
2905 assert_param(IS_USART_MODE(husart->Init.Mode));
2906 assert_param(IS_USART_PRESCALER(husart->Init.ClockPrescaler));
2907
2908
2909
2910
2911
2912
2913
2914
2915 tmpreg = (uint32_t)husart->Init.WordLength | husart->Init.Parity | husart->Init.Mode | USART_CR1_OVER8;
2916 MODIFY_REG(husart->Instance->CR1, USART_CR1_FIELDS, tmpreg);
2917
2918
2919
2920
2921
2922
2923
2924 tmpreg = (uint32_t)(USART_CLOCK_ENABLE);
2925 tmpreg |= (uint32_t)husart->Init.CLKLastBit;
2926 tmpreg |= ((uint32_t)husart->Init.CLKPolarity | (uint32_t)husart->Init.CLKPhase);
2927 tmpreg |= (uint32_t)husart->Init.StopBits;
2928 MODIFY_REG(husart->Instance->CR2, USART_CR2_FIELDS, tmpreg);
2929
2930
2931
2932
2933 MODIFY_REG(husart->Instance->PRESC, USART_PRESC_PRESCALER, husart->Init.ClockPrescaler);
2934
2935
2936
2937 USART_GETCLOCKSOURCE(husart, clocksource);
2938
2939 switch (clocksource)
2940 {
2941 case USART_CLOCKSOURCE_D2PCLK1:
2942 pclk = HAL_RCC_GetPCLK1Freq();
2943 usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler));
2944 break;
2945 case USART_CLOCKSOURCE_D2PCLK2:
2946 pclk = HAL_RCC_GetPCLK2Freq();
2947 usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pclk, husart->Init.BaudRate, husart->Init.ClockPrescaler));
2948 break;
2949 case USART_CLOCKSOURCE_PLL2:
2950 HAL_RCCEx_GetPLL2ClockFreq(&pll2_clocks);
2951 usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pll2_clocks.PLL2_Q_Frequency, husart->Init.BaudRate,
2952 husart->Init.ClockPrescaler));
2953 break;
2954 case USART_CLOCKSOURCE_PLL3:
2955 HAL_RCCEx_GetPLL3ClockFreq(&pll3_clocks);
2956 usartdiv = (uint32_t)(USART_DIV_SAMPLING8(pll3_clocks.PLL3_Q_Frequency, husart->Init.BaudRate,
2957 husart->Init.ClockPrescaler));
2958 break;
2959 case USART_CLOCKSOURCE_HSI:
2960 if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIDIV) != 0U)
2961 {
2962 usartdiv = (uint32_t)(USART_DIV_SAMPLING8((HSI_VALUE >> (__HAL_RCC_GET_HSI_DIVIDER() >> 3U)),
2963 husart->Init.BaudRate, husart->Init.ClockPrescaler));
2964 }
2965 else
2966 {
2967 usartdiv = (uint32_t)(USART_DIV_SAMPLING8(HSI_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler));
2968 }
2969 break;
2970 case USART_CLOCKSOURCE_CSI:
2971 usartdiv = (uint32_t)(USART_DIV_SAMPLING8(CSI_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler));
2972 break;
2973 case USART_CLOCKSOURCE_LSE:
2974 usartdiv = (uint32_t)(USART_DIV_SAMPLING8(LSE_VALUE, husart->Init.BaudRate, husart->Init.ClockPrescaler));
2975 break;
2976 default:
2977 ret = HAL_ERROR;
2978 break;
2979 }
2980
2981
2982 if ((usartdiv >= USART_BRR_MIN) && (usartdiv <= USART_BRR_MAX))
2983 {
2984 brrtemp = (uint16_t)(usartdiv & 0xFFF0U);
2985 brrtemp |= (uint16_t)((usartdiv & (uint16_t)0x000FU) >> 1U);
2986 husart->Instance->BRR = brrtemp;
2987 }
2988 else
2989 {
2990 ret = HAL_ERROR;
2991 }
2992
2993
2994 husart->NbTxDataToProcess = 1U;
2995 husart->NbRxDataToProcess = 1U;
2996
2997
2998 husart->RxISR = NULL;
2999 husart->TxISR = NULL;
3000
3001 return ret;
3002 }
3003
3004
3005
3006
3007
3008
3009 static HAL_StatusTypeDef USART_CheckIdleState(USART_HandleTypeDef *husart)
3010 {
3011 uint32_t tickstart;
3012
3013
3014 husart->ErrorCode = HAL_USART_ERROR_NONE;
3015
3016
3017 tickstart = HAL_GetTick();
3018
3019
3020 if ((husart->Instance->CR1 & USART_CR1_TE) == USART_CR1_TE)
3021 {
3022
3023 if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_TEACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK)
3024 {
3025
3026 return HAL_TIMEOUT;
3027 }
3028 }
3029
3030 if ((husart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE)
3031 {
3032
3033 if (USART_WaitOnFlagUntilTimeout(husart, USART_ISR_REACK, RESET, tickstart, USART_TEACK_REACK_TIMEOUT) != HAL_OK)
3034 {
3035
3036 return HAL_TIMEOUT;
3037 }
3038 }
3039
3040
3041 husart->State = HAL_USART_STATE_READY;
3042
3043
3044 __HAL_UNLOCK(husart);
3045
3046 return HAL_OK;
3047 }
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059 static void USART_TxISR_8BIT(USART_HandleTypeDef *husart)
3060 {
3061 const HAL_USART_StateTypeDef state = husart->State;
3062
3063
3064 if ((state == HAL_USART_STATE_BUSY_TX) ||
3065 (state == HAL_USART_STATE_BUSY_TX_RX))
3066 {
3067 if (husart->TxXferCount == 0U)
3068 {
3069
3070 __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
3071
3072
3073 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
3074 }
3075 else
3076 {
3077 husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF);
3078 husart->pTxBuffPtr++;
3079 husart->TxXferCount--;
3080 }
3081 }
3082 }
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094 static void USART_TxISR_16BIT(USART_HandleTypeDef *husart)
3095 {
3096 const HAL_USART_StateTypeDef state = husart->State;
3097 const uint16_t *tmp;
3098
3099 if ((state == HAL_USART_STATE_BUSY_TX) ||
3100 (state == HAL_USART_STATE_BUSY_TX_RX))
3101 {
3102 if (husart->TxXferCount == 0U)
3103 {
3104
3105 __HAL_USART_DISABLE_IT(husart, USART_IT_TXE);
3106
3107
3108 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
3109 }
3110 else
3111 {
3112 tmp = (const uint16_t *) husart->pTxBuffPtr;
3113 husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU);
3114 husart->pTxBuffPtr += 2U;
3115 husart->TxXferCount--;
3116 }
3117 }
3118 }
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130 static void USART_TxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart)
3131 {
3132 const HAL_USART_StateTypeDef state = husart->State;
3133 uint16_t nb_tx_data;
3134
3135
3136 if ((state == HAL_USART_STATE_BUSY_TX) ||
3137 (state == HAL_USART_STATE_BUSY_TX_RX))
3138 {
3139 for (nb_tx_data = husart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
3140 {
3141 if (husart->TxXferCount == 0U)
3142 {
3143
3144 __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT);
3145
3146
3147 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
3148
3149 break;
3150 }
3151 else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET)
3152 {
3153 husart->Instance->TDR = (uint8_t)(*husart->pTxBuffPtr & (uint8_t)0xFF);
3154 husart->pTxBuffPtr++;
3155 husart->TxXferCount--;
3156 }
3157 else
3158 {
3159
3160 }
3161 }
3162 }
3163 }
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175 static void USART_TxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart)
3176 {
3177 const HAL_USART_StateTypeDef state = husart->State;
3178 const uint16_t *tmp;
3179 uint16_t nb_tx_data;
3180
3181
3182 if ((state == HAL_USART_STATE_BUSY_TX) ||
3183 (state == HAL_USART_STATE_BUSY_TX_RX))
3184 {
3185 for (nb_tx_data = husart->NbTxDataToProcess ; nb_tx_data > 0U ; nb_tx_data--)
3186 {
3187 if (husart->TxXferCount == 0U)
3188 {
3189
3190 __HAL_USART_DISABLE_IT(husart, USART_IT_TXFT);
3191
3192
3193 __HAL_USART_ENABLE_IT(husart, USART_IT_TC);
3194
3195 break;
3196 }
3197 else if (__HAL_USART_GET_FLAG(husart, USART_FLAG_TXFNF) == SET)
3198 {
3199 tmp = (const uint16_t *) husart->pTxBuffPtr;
3200 husart->Instance->TDR = (uint16_t)(*tmp & 0x01FFU);
3201 husart->pTxBuffPtr += 2U;
3202 husart->TxXferCount--;
3203 }
3204 else
3205 {
3206
3207 }
3208 }
3209 }
3210 }
3211
3212
3213
3214
3215
3216
3217
3218 static void USART_EndTransmit_IT(USART_HandleTypeDef *husart)
3219 {
3220
3221 __HAL_USART_DISABLE_IT(husart, USART_IT_TC);
3222
3223
3224 __HAL_USART_DISABLE_IT(husart, USART_IT_ERR);
3225
3226
3227 husart->TxISR = NULL;
3228
3229 if (husart->State == HAL_USART_STATE_BUSY_TX)
3230 {
3231
3232 __HAL_USART_CLEAR_OREFLAG(husart);
3233 __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
3234
3235
3236 husart->State = HAL_USART_STATE_READY;
3237
3238 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3239
3240 husart->TxCpltCallback(husart);
3241 #else
3242
3243 HAL_USART_TxCpltCallback(husart);
3244 #endif
3245 }
3246 else if (husart->RxXferCount == 0U)
3247 {
3248
3249 husart->State = HAL_USART_STATE_READY;
3250
3251 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3252
3253 husart->TxRxCpltCallback(husart);
3254 #else
3255
3256 HAL_USART_TxRxCpltCallback(husart);
3257 #endif
3258 }
3259 else
3260 {
3261
3262 }
3263 }
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275 static void USART_RxISR_8BIT(USART_HandleTypeDef *husart)
3276 {
3277 const HAL_USART_StateTypeDef state = husart->State;
3278 uint16_t txdatacount;
3279 uint16_t uhMask = husart->Mask;
3280 uint32_t txftie;
3281
3282 if ((state == HAL_USART_STATE_BUSY_RX) ||
3283 (state == HAL_USART_STATE_BUSY_TX_RX))
3284 {
3285 *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)uhMask);
3286 husart->pRxBuffPtr++;
3287 husart->RxXferCount--;
3288
3289 if (husart->RxXferCount == 0U)
3290 {
3291
3292 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3293
3294
3295 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
3296
3297
3298 husart->RxISR = NULL;
3299
3300
3301 txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE);
3302 txdatacount = husart->TxXferCount;
3303
3304 if (state == HAL_USART_STATE_BUSY_RX)
3305 {
3306
3307 if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
3308 {
3309 __HAL_USART_CLEAR_UDRFLAG(husart);
3310 __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
3311 }
3312
3313
3314 husart->State = HAL_USART_STATE_READY;
3315
3316 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3317
3318 husart->RxCpltCallback(husart);
3319 #else
3320
3321 HAL_USART_RxCpltCallback(husart);
3322 #endif
3323 }
3324 else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3325 (txftie != USART_CR3_TXFTIE) &&
3326 (txdatacount == 0U))
3327 {
3328
3329 husart->State = HAL_USART_STATE_READY;
3330
3331 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3332
3333 husart->TxRxCpltCallback(husart);
3334 #else
3335
3336 HAL_USART_TxRxCpltCallback(husart);
3337 #endif
3338 }
3339 else
3340 {
3341
3342 }
3343 }
3344 else if ((state == HAL_USART_STATE_BUSY_RX) &&
3345 (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3346 {
3347
3348 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3349 }
3350 else
3351 {
3352
3353 }
3354 }
3355 }
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366 static void USART_RxISR_16BIT(USART_HandleTypeDef *husart)
3367 {
3368 const HAL_USART_StateTypeDef state = husart->State;
3369 uint16_t txdatacount;
3370 uint16_t *tmp;
3371 uint16_t uhMask = husart->Mask;
3372 uint32_t txftie;
3373
3374 if ((state == HAL_USART_STATE_BUSY_RX) ||
3375 (state == HAL_USART_STATE_BUSY_TX_RX))
3376 {
3377 tmp = (uint16_t *) husart->pRxBuffPtr;
3378 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
3379 husart->pRxBuffPtr += 2U;
3380 husart->RxXferCount--;
3381
3382 if (husart->RxXferCount == 0U)
3383 {
3384
3385 CLEAR_BIT(husart->Instance->CR1, (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE));
3386
3387
3388 CLEAR_BIT(husart->Instance->CR3, USART_CR3_EIE);
3389
3390
3391 husart->RxISR = NULL;
3392
3393
3394 txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE);
3395 txdatacount = husart->TxXferCount;
3396
3397 if (state == HAL_USART_STATE_BUSY_RX)
3398 {
3399
3400 if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
3401 {
3402 __HAL_USART_CLEAR_UDRFLAG(husart);
3403 __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
3404 }
3405
3406
3407 husart->State = HAL_USART_STATE_READY;
3408
3409 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3410
3411 husart->RxCpltCallback(husart);
3412 #else
3413
3414 HAL_USART_RxCpltCallback(husart);
3415 #endif
3416 }
3417 else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3418 (txftie != USART_CR3_TXFTIE) &&
3419 (txdatacount == 0U))
3420 {
3421
3422 husart->State = HAL_USART_STATE_READY;
3423
3424 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3425
3426 husart->TxRxCpltCallback(husart);
3427 #else
3428
3429 HAL_USART_TxRxCpltCallback(husart);
3430 #endif
3431 }
3432 else
3433 {
3434
3435 }
3436 }
3437 else if ((state == HAL_USART_STATE_BUSY_RX) &&
3438 (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3439 {
3440
3441 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3442 }
3443 else
3444 {
3445
3446 }
3447 }
3448 }
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459 static void USART_RxISR_8BIT_FIFOEN(USART_HandleTypeDef *husart)
3460 {
3461 HAL_USART_StateTypeDef state = husart->State;
3462 uint16_t txdatacount;
3463 uint16_t rxdatacount;
3464 uint16_t uhMask = husart->Mask;
3465 uint16_t nb_rx_data;
3466 uint32_t txftie;
3467
3468
3469 if ((state == HAL_USART_STATE_BUSY_RX) ||
3470 (state == HAL_USART_STATE_BUSY_TX_RX))
3471 {
3472 for (nb_rx_data = husart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
3473 {
3474 if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET)
3475 {
3476 *husart->pRxBuffPtr = (uint8_t)(husart->Instance->RDR & (uint8_t)(uhMask & 0xFFU));
3477 husart->pRxBuffPtr++;
3478 husart->RxXferCount--;
3479
3480 if (husart->RxXferCount == 0U)
3481 {
3482
3483 CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
3484
3485
3486
3487 CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
3488
3489
3490 husart->RxISR = NULL;
3491
3492
3493 txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE);
3494 txdatacount = husart->TxXferCount;
3495
3496 if (state == HAL_USART_STATE_BUSY_RX)
3497 {
3498
3499 if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
3500 {
3501 __HAL_USART_CLEAR_UDRFLAG(husart);
3502 __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
3503 }
3504
3505
3506 husart->State = HAL_USART_STATE_READY;
3507 state = HAL_USART_STATE_READY;
3508
3509 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3510
3511 husart->RxCpltCallback(husart);
3512 #else
3513
3514 HAL_USART_RxCpltCallback(husart);
3515 #endif
3516 }
3517 else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3518 (txftie != USART_CR3_TXFTIE) &&
3519 (txdatacount == 0U))
3520 {
3521
3522 husart->State = HAL_USART_STATE_READY;
3523 state = HAL_USART_STATE_READY;
3524
3525 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3526
3527 husart->TxRxCpltCallback(husart);
3528 #else
3529
3530 HAL_USART_TxRxCpltCallback(husart);
3531 #endif
3532 }
3533 else
3534 {
3535
3536 }
3537 }
3538 else if ((state == HAL_USART_STATE_BUSY_RX) &&
3539 (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3540 {
3541
3542 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3543 }
3544 else
3545 {
3546
3547 }
3548 }
3549 }
3550
3551
3552
3553
3554
3555 rxdatacount = husart->RxXferCount;
3556 if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess))
3557 {
3558
3559 CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE);
3560
3561
3562 husart->RxISR = USART_RxISR_8BIT;
3563
3564
3565 SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
3566
3567 if ((husart->TxXferCount == 0U) &&
3568 (state == HAL_USART_STATE_BUSY_TX_RX) &&
3569 (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3570 {
3571
3572 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3573 }
3574 }
3575 }
3576 else
3577 {
3578
3579 __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
3580 }
3581 }
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592 static void USART_RxISR_16BIT_FIFOEN(USART_HandleTypeDef *husart)
3593 {
3594 HAL_USART_StateTypeDef state = husart->State;
3595 uint16_t txdatacount;
3596 uint16_t rxdatacount;
3597 uint16_t *tmp;
3598 uint16_t uhMask = husart->Mask;
3599 uint16_t nb_rx_data;
3600 uint32_t txftie;
3601
3602
3603 if ((state == HAL_USART_STATE_BUSY_RX) ||
3604 (state == HAL_USART_STATE_BUSY_TX_RX))
3605 {
3606 for (nb_rx_data = husart->NbRxDataToProcess ; nb_rx_data > 0U ; nb_rx_data--)
3607 {
3608 if (__HAL_USART_GET_FLAG(husart, USART_FLAG_RXFNE) == SET)
3609 {
3610 tmp = (uint16_t *) husart->pRxBuffPtr;
3611 *tmp = (uint16_t)(husart->Instance->RDR & uhMask);
3612 husart->pRxBuffPtr += 2U;
3613 husart->RxXferCount--;
3614
3615 if (husart->RxXferCount == 0U)
3616 {
3617
3618 CLEAR_BIT(husart->Instance->CR1, USART_CR1_PEIE);
3619
3620
3621
3622 CLEAR_BIT(husart->Instance->CR3, (USART_CR3_EIE | USART_CR3_RXFTIE));
3623
3624
3625 husart->RxISR = NULL;
3626
3627
3628 txftie = READ_BIT(husart->Instance->CR3, USART_CR3_TXFTIE);
3629 txdatacount = husart->TxXferCount;
3630
3631 if (state == HAL_USART_STATE_BUSY_RX)
3632 {
3633
3634 if (husart->SlaveMode == USART_SLAVEMODE_ENABLE)
3635 {
3636 __HAL_USART_CLEAR_UDRFLAG(husart);
3637 __HAL_USART_SEND_REQ(husart, USART_TXDATA_FLUSH_REQUEST);
3638 }
3639
3640
3641 husart->State = HAL_USART_STATE_READY;
3642 state = HAL_USART_STATE_READY;
3643
3644 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3645
3646 husart->RxCpltCallback(husart);
3647 #else
3648
3649 HAL_USART_RxCpltCallback(husart);
3650 #endif
3651 }
3652 else if ((READ_BIT(husart->Instance->CR1, USART_CR1_TCIE) != USART_CR1_TCIE) &&
3653 (txftie != USART_CR3_TXFTIE) &&
3654 (txdatacount == 0U))
3655 {
3656
3657 husart->State = HAL_USART_STATE_READY;
3658 state = HAL_USART_STATE_READY;
3659
3660 #if (USE_HAL_USART_REGISTER_CALLBACKS == 1)
3661
3662 husart->TxRxCpltCallback(husart);
3663 #else
3664
3665 HAL_USART_TxRxCpltCallback(husart);
3666 #endif
3667 }
3668 else
3669 {
3670
3671 }
3672 }
3673 else if ((state == HAL_USART_STATE_BUSY_RX) &&
3674 (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3675 {
3676
3677 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3678 }
3679 else
3680 {
3681
3682 }
3683 }
3684 }
3685
3686
3687
3688
3689
3690 rxdatacount = husart->RxXferCount;
3691 if (((rxdatacount != 0U)) && (rxdatacount < husart->NbRxDataToProcess))
3692 {
3693
3694 CLEAR_BIT(husart->Instance->CR3, USART_CR3_RXFTIE);
3695
3696
3697 husart->RxISR = USART_RxISR_16BIT;
3698
3699
3700 SET_BIT(husart->Instance->CR1, USART_CR1_RXNEIE_RXFNEIE);
3701
3702 if ((husart->TxXferCount == 0U) &&
3703 (state == HAL_USART_STATE_BUSY_TX_RX) &&
3704 (husart->SlaveMode == USART_SLAVEMODE_DISABLE))
3705 {
3706
3707 husart->Instance->TDR = (USART_DUMMY_DATA & (uint16_t)0x00FF);
3708 }
3709 }
3710 }
3711 else
3712 {
3713
3714 __HAL_USART_SEND_REQ(husart, USART_RXDATA_FLUSH_REQUEST);
3715 }
3716 }
3717
3718
3719
3720
3721
3722 #endif
3723
3724
3725
3726
3727
3728
3729
3730