File indexing completed on 2025-05-11 08:23:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #if defined(USE_FULL_LL_DRIVER) || defined(__rtems__)
0019
0020
0021 #include "stm32h7xx_ll_usart.h"
0022 #include "stm32h7xx_ll_rcc.h"
0023 #include "stm32h7xx_ll_bus.h"
0024 #ifdef USE_FULL_ASSERT
0025 #include "stm32_assert.h"
0026 #else
0027 #define assert_param(expr) ((void)0U)
0028 #endif
0029
0030
0031
0032
0033
0034 #if defined(USART1) || defined(USART2) || defined(USART3) || defined(USART6) \
0035 || defined(UART4) || defined(UART5) || defined(UART7) || defined(UART8) || defined(UART9) || defined(USART10)
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 #define USART_DEFAULT_BAUDRATE (9600U)
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 #define IS_LL_USART_PRESCALER(__VALUE__) (((__VALUE__) == LL_USART_PRESCALER_DIV1) \
0061 || ((__VALUE__) == LL_USART_PRESCALER_DIV2) \
0062 || ((__VALUE__) == LL_USART_PRESCALER_DIV4) \
0063 || ((__VALUE__) == LL_USART_PRESCALER_DIV6) \
0064 || ((__VALUE__) == LL_USART_PRESCALER_DIV8) \
0065 || ((__VALUE__) == LL_USART_PRESCALER_DIV10) \
0066 || ((__VALUE__) == LL_USART_PRESCALER_DIV12) \
0067 || ((__VALUE__) == LL_USART_PRESCALER_DIV16) \
0068 || ((__VALUE__) == LL_USART_PRESCALER_DIV32) \
0069 || ((__VALUE__) == LL_USART_PRESCALER_DIV64) \
0070 || ((__VALUE__) == LL_USART_PRESCALER_DIV128) \
0071 || ((__VALUE__) == LL_USART_PRESCALER_DIV256))
0072
0073
0074
0075 #define IS_LL_USART_BAUDRATE(__BAUDRATE__) ((__BAUDRATE__) <= 12500000U)
0076
0077
0078 #define IS_LL_USART_BRR_MIN(__VALUE__) ((__VALUE__) >= 16U)
0079
0080 #define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \
0081 || ((__VALUE__) == LL_USART_DIRECTION_RX) \
0082 || ((__VALUE__) == LL_USART_DIRECTION_TX) \
0083 || ((__VALUE__) == LL_USART_DIRECTION_TX_RX))
0084
0085 #define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \
0086 || ((__VALUE__) == LL_USART_PARITY_EVEN) \
0087 || ((__VALUE__) == LL_USART_PARITY_ODD))
0088
0089 #define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_7B) \
0090 || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \
0091 || ((__VALUE__) == LL_USART_DATAWIDTH_9B))
0092
0093 #define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \
0094 || ((__VALUE__) == LL_USART_OVERSAMPLING_8))
0095
0096 #define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \
0097 || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT))
0098
0099 #define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \
0100 || ((__VALUE__) == LL_USART_PHASE_2EDGE))
0101
0102 #define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \
0103 || ((__VALUE__) == LL_USART_POLARITY_HIGH))
0104
0105 #define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \
0106 || ((__VALUE__) == LL_USART_CLOCK_ENABLE))
0107
0108 #define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \
0109 || ((__VALUE__) == LL_USART_STOPBITS_1) \
0110 || ((__VALUE__) == LL_USART_STOPBITS_1_5) \
0111 || ((__VALUE__) == LL_USART_STOPBITS_2))
0112
0113 #define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \
0114 || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \
0115 || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \
0116 || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS))
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140 ErrorStatus LL_USART_DeInit(const USART_TypeDef *USARTx)
0141 {
0142 ErrorStatus status = SUCCESS;
0143
0144
0145 assert_param(IS_UART_INSTANCE(USARTx));
0146
0147 if (USARTx == USART1)
0148 {
0149
0150 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_USART1);
0151
0152
0153 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_USART1);
0154 }
0155 else if (USARTx == USART2)
0156 {
0157
0158 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART2);
0159
0160
0161 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART2);
0162 }
0163 else if (USARTx == USART3)
0164 {
0165
0166 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_USART3);
0167
0168
0169 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_USART3);
0170 }
0171 else if (USARTx == UART4)
0172 {
0173
0174 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART4);
0175
0176
0177 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART4);
0178 }
0179 else if (USARTx == UART5)
0180 {
0181
0182 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART5);
0183
0184
0185 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART5);
0186 }
0187 else if (USARTx == USART6)
0188 {
0189
0190 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_USART6);
0191
0192
0193 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_USART6);
0194 }
0195 else if (USARTx == UART7)
0196 {
0197
0198 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART7);
0199
0200
0201 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART7);
0202 }
0203 else if (USARTx == UART8)
0204 {
0205
0206 LL_APB1_GRP1_ForceReset(LL_APB1_GRP1_PERIPH_UART8);
0207
0208
0209 LL_APB1_GRP1_ReleaseReset(LL_APB1_GRP1_PERIPH_UART8);
0210 }
0211 #if defined(UART9)
0212 else if (USARTx == UART9)
0213 {
0214
0215 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_UART9);
0216
0217
0218 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_UART9);
0219 }
0220 #endif
0221 #if defined(USART10)
0222 else if (USARTx == USART10)
0223 {
0224
0225 LL_APB2_GRP1_ForceReset(LL_APB2_GRP1_PERIPH_USART10);
0226
0227
0228 LL_APB2_GRP1_ReleaseReset(LL_APB2_GRP1_PERIPH_USART10);
0229 }
0230 #endif
0231 else
0232 {
0233 status = ERROR;
0234 }
0235
0236 return (status);
0237 }
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253 ErrorStatus LL_USART_Init(USART_TypeDef *USARTx, const LL_USART_InitTypeDef *USART_InitStruct)
0254 {
0255 ErrorStatus status = ERROR;
0256 uint32_t periphclk = LL_RCC_PERIPH_FREQUENCY_NO;
0257
0258
0259 assert_param(IS_UART_INSTANCE(USARTx));
0260 assert_param(IS_LL_USART_PRESCALER(USART_InitStruct->PrescalerValue));
0261 assert_param(IS_LL_USART_BAUDRATE(USART_InitStruct->BaudRate));
0262 assert_param(IS_LL_USART_DATAWIDTH(USART_InitStruct->DataWidth));
0263 assert_param(IS_LL_USART_STOPBITS(USART_InitStruct->StopBits));
0264 assert_param(IS_LL_USART_PARITY(USART_InitStruct->Parity));
0265 assert_param(IS_LL_USART_DIRECTION(USART_InitStruct->TransferDirection));
0266 assert_param(IS_LL_USART_HWCONTROL(USART_InitStruct->HardwareFlowControl));
0267 assert_param(IS_LL_USART_OVERSAMPLING(USART_InitStruct->OverSampling));
0268
0269
0270
0271 if (LL_USART_IsEnabled(USARTx) == 0U)
0272 {
0273
0274
0275
0276
0277
0278
0279
0280 MODIFY_REG(USARTx->CR1,
0281 (USART_CR1_M | USART_CR1_PCE | USART_CR1_PS |
0282 USART_CR1_TE | USART_CR1_RE | USART_CR1_OVER8),
0283 (USART_InitStruct->DataWidth | USART_InitStruct->Parity |
0284 USART_InitStruct->TransferDirection | USART_InitStruct->OverSampling));
0285
0286
0287
0288
0289
0290
0291 LL_USART_SetStopBitsLength(USARTx, USART_InitStruct->StopBits);
0292
0293
0294
0295
0296
0297
0298 LL_USART_SetHWFlowCtrl(USARTx, USART_InitStruct->HardwareFlowControl);
0299
0300
0301
0302
0303 if (USARTx == USART1)
0304 {
0305 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART16_CLKSOURCE);
0306 }
0307 else if (USARTx == USART2)
0308 {
0309 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART234578_CLKSOURCE);
0310 }
0311 else if (USARTx == USART3)
0312 {
0313 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART234578_CLKSOURCE);
0314 }
0315 else if (USARTx == UART4)
0316 {
0317 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART234578_CLKSOURCE);
0318 }
0319 else if (USARTx == UART5)
0320 {
0321 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART234578_CLKSOURCE);
0322 }
0323 else if (USARTx == USART6)
0324 {
0325 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART16_CLKSOURCE);
0326 }
0327 else if (USARTx == UART7)
0328 {
0329 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART234578_CLKSOURCE);
0330 }
0331 else if (USARTx == UART8)
0332 {
0333 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART234578_CLKSOURCE);
0334 }
0335 #if defined(UART9)
0336 else if (USARTx == UART9)
0337 {
0338 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART16_CLKSOURCE);
0339 }
0340 #endif
0341 #if defined(USART10)
0342 else if (USARTx == USART10)
0343 {
0344 periphclk = LL_RCC_GetUSARTClockFreq(LL_RCC_USART16_CLKSOURCE);
0345 }
0346 #endif
0347 else
0348 {
0349
0350 }
0351
0352
0353
0354
0355
0356
0357 if ((periphclk != LL_RCC_PERIPH_FREQUENCY_NO)
0358 && (USART_InitStruct->BaudRate != 0U))
0359 {
0360 status = SUCCESS;
0361 LL_USART_SetBaudRate(USARTx,
0362 periphclk,
0363 USART_InitStruct->PrescalerValue,
0364 USART_InitStruct->OverSampling,
0365 USART_InitStruct->BaudRate);
0366
0367
0368 assert_param(IS_LL_USART_BRR_MIN(USARTx->BRR));
0369 }
0370
0371
0372
0373
0374
0375 LL_USART_SetPrescaler(USARTx, USART_InitStruct->PrescalerValue);
0376 }
0377
0378
0379 return (status);
0380 }
0381
0382
0383
0384
0385
0386
0387
0388
0389 void LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct)
0390 {
0391
0392 USART_InitStruct->PrescalerValue = LL_USART_PRESCALER_DIV1;
0393 USART_InitStruct->BaudRate = USART_DEFAULT_BAUDRATE;
0394 USART_InitStruct->DataWidth = LL_USART_DATAWIDTH_8B;
0395 USART_InitStruct->StopBits = LL_USART_STOPBITS_1;
0396 USART_InitStruct->Parity = LL_USART_PARITY_NONE ;
0397 USART_InitStruct->TransferDirection = LL_USART_DIRECTION_TX_RX;
0398 USART_InitStruct->HardwareFlowControl = LL_USART_HWCONTROL_NONE;
0399 USART_InitStruct->OverSampling = LL_USART_OVERSAMPLING_16;
0400 }
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416 ErrorStatus LL_USART_ClockInit(USART_TypeDef *USARTx, const LL_USART_ClockInitTypeDef *USART_ClockInitStruct)
0417 {
0418 ErrorStatus status = SUCCESS;
0419
0420
0421 assert_param(IS_UART_INSTANCE(USARTx));
0422 assert_param(IS_LL_USART_CLOCKOUTPUT(USART_ClockInitStruct->ClockOutput));
0423
0424
0425
0426 if (LL_USART_IsEnabled(USARTx) == 0U)
0427 {
0428
0429 assert_param(IS_USART_INSTANCE(USARTx));
0430
0431
0432 assert_param(IS_LL_USART_CLOCKPOLARITY(USART_ClockInitStruct->ClockPolarity));
0433 assert_param(IS_LL_USART_CLOCKPHASE(USART_ClockInitStruct->ClockPhase));
0434 assert_param(IS_LL_USART_LASTBITCLKOUTPUT(USART_ClockInitStruct->LastBitClockPulse));
0435
0436
0437
0438
0439
0440
0441
0442
0443 MODIFY_REG(USARTx->CR2,
0444 USART_CR2_CLKEN | USART_CR2_CPHA | USART_CR2_CPOL | USART_CR2_LBCL,
0445 USART_ClockInitStruct->ClockOutput | USART_ClockInitStruct->ClockPolarity |
0446 USART_ClockInitStruct->ClockPhase | USART_ClockInitStruct->LastBitClockPulse);
0447 }
0448
0449 else
0450 {
0451 status = ERROR;
0452 }
0453
0454 return (status);
0455 }
0456
0457
0458
0459
0460
0461
0462
0463 void LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct)
0464 {
0465
0466 USART_ClockInitStruct->ClockOutput = LL_USART_CLOCK_DISABLE;
0467 USART_ClockInitStruct->ClockPolarity = LL_USART_POLARITY_LOW;
0468
0469 USART_ClockInitStruct->ClockPhase = LL_USART_PHASE_1EDGE;
0470
0471 USART_ClockInitStruct->LastBitClockPulse = LL_USART_LASTCLKPULSE_NO_OUTPUT;
0472
0473 }
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487 #endif
0488
0489
0490
0491
0492
0493 #endif
0494
0495