156
156
/* Includes ------------------------------------------------------------------*/
157
157
#include "stm32f4xx_hal.h"
158
158
159
+ // MicroPython: Use bit-banding to avoid race condition where an interrupt that
160
+ // modifies a register can happen while a register is being modified in an IT
161
+ // or DMA start or stop function.
162
+
163
+ #define PERIPH_BB_REG_ADDR (reg , bit_pos ) (__IO uint32_t *)(PERIPH_BB_BASE + ((const uintptr_t)(&(reg)) - PERIPH_BASE) * 32 + (bit_pos) * 4)
164
+
165
+ // These are a near-drop-in replacement for SET_BIT and CLEAR_BIT except they can only handle one bit
166
+ #define SET_BIT_PERIPH_BB (reg , bit ) (*(PERIPH_BB_REG_ADDR((reg), (bit##_Pos))) = 1)
167
+ #define CLEAR_BIT_PERIPH_BB (reg , bit ) (*(PERIPH_BB_REG_ADDR((reg), (bit##_Pos))) = 0)
168
+
159
169
/** @addtogroup STM32F4xx_HAL_Driver
160
170
* @{
161
171
*/
@@ -809,7 +819,7 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData
809
819
__HAL_UNLOCK (huart );
810
820
811
821
/* Enable the UART Transmit data register empty Interrupt */
812
- SET_BIT (huart -> Instance -> CR1 , USART_CR1_TXEIE );
822
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TXEIE );
813
823
814
824
return HAL_OK ;
815
825
}
@@ -851,10 +861,11 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData,
851
861
__HAL_UNLOCK (huart );
852
862
853
863
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
854
- SET_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
864
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
855
865
856
866
/* Enable the UART Parity Error and Data Register not empty Interrupts */
857
- SET_BIT (huart -> Instance -> CR1 , USART_CR1_PEIE | USART_CR1_RXNEIE );
867
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
868
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_RXNEIE );
858
869
859
870
return HAL_OK ;
860
871
}
@@ -918,7 +929,7 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat
918
929
919
930
/* Enable the DMA transfer for transmit request by setting the DMAT bit
920
931
in the UART CR3 register */
921
- SET_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
932
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
922
933
923
934
return HAL_OK ;
924
935
}
@@ -985,14 +996,14 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData
985
996
__HAL_UNLOCK (huart );
986
997
987
998
/* Enable the UART Parity Error Interrupt */
988
- SET_BIT (huart -> Instance -> CR1 , USART_CR1_PEIE );
999
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
989
1000
990
1001
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
991
- SET_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
1002
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
992
1003
993
1004
/* Enable the DMA transfer for the receiver request by setting the DMAR bit
994
1005
in the UART CR3 register */
995
- SET_BIT (huart -> Instance -> CR3 , USART_CR3_DMAR );
1006
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAR );
996
1007
997
1008
return HAL_OK ;
998
1009
}
@@ -1018,17 +1029,17 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart)
1018
1029
if ((huart -> gState == HAL_UART_STATE_BUSY_TX ) && dmarequest )
1019
1030
{
1020
1031
/* Disable the UART DMA Tx request */
1021
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
1032
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
1022
1033
}
1023
1034
dmarequest = HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAR );
1024
1035
if ((huart -> RxState == HAL_UART_STATE_BUSY_RX ) && dmarequest )
1025
1036
{
1026
1037
/* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1027
- CLEAR_BIT (huart -> Instance -> CR1 , USART_CR1_PEIE );
1028
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
1038
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
1039
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
1029
1040
1030
1041
/* Disable the UART DMA Rx request */
1031
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAR );
1042
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAR );
1032
1043
}
1033
1044
1034
1045
/* Process Unlocked */
@@ -1051,7 +1062,7 @@ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
1051
1062
if (huart -> gState == HAL_UART_STATE_BUSY_TX )
1052
1063
{
1053
1064
/* Enable the UART DMA Tx request */
1054
- SET_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
1065
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
1055
1066
}
1056
1067
if (huart -> RxState == HAL_UART_STATE_BUSY_RX )
1057
1068
{
@@ -1063,11 +1074,11 @@ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart)
1063
1074
}
1064
1075
1065
1076
/* Reenable PE and ERR (Frame error, noise error, overrun error) interrupts */
1066
- SET_BIT (huart -> Instance -> CR1 , USART_CR1_PEIE );
1067
- SET_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
1077
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
1078
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
1068
1079
1069
1080
/* Enable the UART DMA Rx request */
1070
- SET_BIT (huart -> Instance -> CR3 , USART_CR3_DMAR );
1081
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAR );
1071
1082
}
1072
1083
1073
1084
/* Process Unlocked */
@@ -1095,7 +1106,7 @@ HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
1095
1106
dmarequest = HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAT );
1096
1107
if ((huart -> gState == HAL_UART_STATE_BUSY_TX ) && dmarequest )
1097
1108
{
1098
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
1109
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
1099
1110
1100
1111
/* Abort the UART DMA Tx channel */
1101
1112
if (huart -> hdmatx != NULL )
@@ -1109,7 +1120,7 @@ HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
1109
1120
dmarequest = HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAR );
1110
1121
if ((huart -> RxState == HAL_UART_STATE_BUSY_RX ) && dmarequest )
1111
1122
{
1112
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAR );
1123
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAR );
1113
1124
1114
1125
/* Abort the UART DMA Rx channel */
1115
1126
if (huart -> hdmarx != NULL )
@@ -1137,13 +1148,16 @@ HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart)
1137
1148
HAL_StatusTypeDef HAL_UART_Abort (UART_HandleTypeDef * huart )
1138
1149
{
1139
1150
/* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1140
- CLEAR_BIT (huart -> Instance -> CR1 , (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE ));
1141
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
1151
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_RXNEIE );
1152
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
1153
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TXEIE );
1154
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
1155
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
1142
1156
1143
1157
/* Disable the UART DMA Tx request if enabled */
1144
1158
if (HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAT ))
1145
1159
{
1146
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
1160
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
1147
1161
1148
1162
/* Abort the UART DMA Tx channel: use blocking DMA Abort API (no callback) */
1149
1163
if (huart -> hdmatx != NULL )
@@ -1159,7 +1173,7 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart)
1159
1173
/* Disable the UART DMA Rx request if enabled */
1160
1174
if (HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAR ))
1161
1175
{
1162
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAR );
1176
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAR );
1163
1177
1164
1178
/* Abort the UART DMA Rx channel: use blocking DMA Abort API (no callback) */
1165
1179
if (huart -> hdmarx != NULL )
@@ -1201,12 +1215,13 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart)
1201
1215
HAL_StatusTypeDef HAL_UART_AbortTransmit (UART_HandleTypeDef * huart )
1202
1216
{
1203
1217
/* Disable TXEIE and TCIE interrupts */
1204
- CLEAR_BIT (huart -> Instance -> CR1 , (USART_CR1_TXEIE | USART_CR1_TCIE ));
1218
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TXEIE );
1219
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
1205
1220
1206
1221
/* Disable the UART DMA Tx request if enabled */
1207
1222
if (HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAT ))
1208
1223
{
1209
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
1224
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
1210
1225
1211
1226
/* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */
1212
1227
if (huart -> hdmatx != NULL )
@@ -1243,13 +1258,14 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart)
1243
1258
HAL_StatusTypeDef HAL_UART_AbortReceive (UART_HandleTypeDef * huart )
1244
1259
{
1245
1260
/* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1246
- CLEAR_BIT (huart -> Instance -> CR1 , (USART_CR1_RXNEIE | USART_CR1_PEIE ));
1247
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
1261
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_RXNEIE );
1262
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
1263
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
1248
1264
1249
1265
/* Disable the UART DMA Rx request if enabled */
1250
1266
if (HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAR ))
1251
1267
{
1252
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAR );
1268
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAR );
1253
1269
1254
1270
/* Abort the UART DMA Rx channel : use blocking DMA Abort API (no callback) */
1255
1271
if (huart -> hdmarx != NULL )
@@ -1290,8 +1306,11 @@ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart)
1290
1306
uint32_t AbortCplt = 0x01U ;
1291
1307
1292
1308
/* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
1293
- CLEAR_BIT (huart -> Instance -> CR1 , (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE | USART_CR1_TCIE ));
1294
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
1309
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
1310
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
1311
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TXEIE );
1312
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
1313
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
1295
1314
1296
1315
/* If DMA Tx and/or DMA Rx Handles are associated to UART Handle, DMA Abort complete callbacks should be initialised
1297
1316
before any call to DMA Abort functions */
@@ -1328,7 +1347,7 @@ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart)
1328
1347
if (HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAT ))
1329
1348
{
1330
1349
/* Disable DMA Tx at UART level */
1331
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
1350
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
1332
1351
1333
1352
/* Abort the UART DMA Tx channel : use non blocking DMA Abort API (callback) */
1334
1353
if (huart -> hdmatx != NULL )
@@ -1410,12 +1429,13 @@ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart)
1410
1429
HAL_StatusTypeDef HAL_UART_AbortTransmit_IT (UART_HandleTypeDef * huart )
1411
1430
{
1412
1431
/* Disable TXEIE and TCIE interrupts */
1413
- CLEAR_BIT (huart -> Instance -> CR1 , (USART_CR1_TXEIE | USART_CR1_TCIE ));
1432
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TXEIE );
1433
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
1414
1434
1415
1435
/* Disable the UART DMA Tx request if enabled */
1416
1436
if (HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAT ))
1417
1437
{
1418
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
1438
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
1419
1439
1420
1440
/* Abort the UART DMA Tx channel : use blocking DMA Abort API (no callback) */
1421
1441
if (huart -> hdmatx != NULL )
@@ -1599,7 +1619,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
1599
1619
/* Disable the UART DMA Rx request if enabled */
1600
1620
if (HAL_IS_BIT_SET (huart -> Instance -> CR3 , USART_CR3_DMAR ))
1601
1621
{
1602
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAR );
1622
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAR );
1603
1623
1604
1624
/* Abort the UART DMA Rx channel */
1605
1625
if (huart -> hdmarx != NULL )
@@ -1808,7 +1828,7 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart)
1808
1828
huart -> gState = HAL_UART_STATE_BUSY ;
1809
1829
1810
1830
/* Send break characters */
1811
- SET_BIT (huart -> Instance -> CR1 , USART_CR1_SBK );
1831
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_SBK );
1812
1832
1813
1833
huart -> gState = HAL_UART_STATE_READY ;
1814
1834
@@ -1835,7 +1855,7 @@ HAL_StatusTypeDef HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)
1835
1855
huart -> gState = HAL_UART_STATE_BUSY ;
1836
1856
1837
1857
/* Enable the USART mute mode by setting the RWU bit in the CR1 register */
1838
- SET_BIT (huart -> Instance -> CR1 , USART_CR1_RWU );
1858
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_RWU );
1839
1859
1840
1860
huart -> gState = HAL_UART_STATE_READY ;
1841
1861
@@ -1862,7 +1882,7 @@ HAL_StatusTypeDef HAL_MultiProcessor_ExitMuteMode(UART_HandleTypeDef *huart)
1862
1882
huart -> gState = HAL_UART_STATE_BUSY ;
1863
1883
1864
1884
/* Disable the USART mute mode by clearing the RWU bit in the CR1 register */
1865
- CLEAR_BIT (huart -> Instance -> CR1 , USART_CR1_RWU );
1885
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_RWU );
1866
1886
1867
1887
huart -> gState = HAL_UART_STATE_READY ;
1868
1888
@@ -2009,10 +2029,10 @@ static void UART_DMATransmitCplt(DMA_HandleTypeDef *hdma)
2009
2029
2010
2030
/* Disable the DMA transfer for transmit request by setting the DMAT bit
2011
2031
in the UART CR3 register */
2012
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAT );
2032
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAT );
2013
2033
2014
2034
/* Enable the UART Transmit Complete Interrupt */
2015
- SET_BIT (huart -> Instance -> CR1 , USART_CR1_TCIE );
2035
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
2016
2036
2017
2037
}
2018
2038
/* DMA Circular mode */
@@ -2049,12 +2069,12 @@ static void UART_DMAReceiveCplt(DMA_HandleTypeDef *hdma)
2049
2069
huart -> RxXferCount = 0U ;
2050
2070
2051
2071
/* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2052
- CLEAR_BIT (huart -> Instance -> CR1 , USART_CR1_PEIE );
2053
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
2072
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
2073
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
2054
2074
2055
2075
/* Disable the DMA transfer for the receiver request by setting the DMAR bit
2056
2076
in the UART CR3 register */
2057
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_DMAR );
2077
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_DMAR );
2058
2078
2059
2079
/* At end of Rx process, restore huart->RxState to Ready */
2060
2080
huart -> RxState = HAL_UART_STATE_READY ;
@@ -2151,7 +2171,8 @@ static HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart,
2151
2171
static void UART_EndTxTransfer (UART_HandleTypeDef * huart )
2152
2172
{
2153
2173
/* Disable TXEIE and TCIE interrupts */
2154
- CLEAR_BIT (huart -> Instance -> CR1 , (USART_CR1_TXEIE | USART_CR1_TCIE ));
2174
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TXEIE );
2175
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
2155
2176
2156
2177
/* At end of Tx process, restore huart->gState to Ready */
2157
2178
huart -> gState = HAL_UART_STATE_READY ;
@@ -2165,8 +2186,9 @@ static void UART_EndTxTransfer(UART_HandleTypeDef *huart)
2165
2186
static void UART_EndRxTransfer (UART_HandleTypeDef * huart )
2166
2187
{
2167
2188
/* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
2168
- CLEAR_BIT (huart -> Instance -> CR1 , (USART_CR1_RXNEIE | USART_CR1_PEIE ));
2169
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
2189
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_RXNEIE );
2190
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
2191
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
2170
2192
2171
2193
/* At end of Rx process, restore huart->RxState to Ready */
2172
2194
huart -> RxState = HAL_UART_STATE_READY ;
@@ -2339,10 +2361,10 @@ static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
2339
2361
if (-- huart -> TxXferCount == 0U )
2340
2362
{
2341
2363
/* Disable the UART Transmit Complete Interrupt */
2342
- CLEAR_BIT (huart -> Instance -> CR1 , USART_CR1_TXEIE );
2364
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TXEIE );
2343
2365
2344
2366
/* Enable the UART Transmit Complete Interrupt */
2345
- SET_BIT (huart -> Instance -> CR1 , USART_CR1_TCIE );
2367
+ SET_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
2346
2368
}
2347
2369
return HAL_OK ;
2348
2370
}
@@ -2361,7 +2383,7 @@ static HAL_StatusTypeDef UART_Transmit_IT(UART_HandleTypeDef *huart)
2361
2383
static HAL_StatusTypeDef UART_EndTransmit_IT (UART_HandleTypeDef * huart )
2362
2384
{
2363
2385
/* Disable the UART Transmit Complete Interrupt */
2364
- CLEAR_BIT (huart -> Instance -> CR1 , USART_CR1_TCIE );
2386
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_TCIE );
2365
2387
2366
2388
/* Tx process is ended, restore huart->gState to Ready */
2367
2389
huart -> gState = HAL_UART_STATE_READY ;
@@ -2413,10 +2435,11 @@ static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
2413
2435
if (-- huart -> RxXferCount == 0U )
2414
2436
{
2415
2437
/* Disable the UART Parity Error Interrupt and RXNE interrupt*/
2416
- CLEAR_BIT (huart -> Instance -> CR1 , (USART_CR1_RXNEIE | USART_CR1_PEIE ));
2438
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_RXNEIE );
2439
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR1 , USART_CR1_PEIE );
2417
2440
2418
2441
/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
2419
- CLEAR_BIT (huart -> Instance -> CR3 , USART_CR3_EIE );
2442
+ CLEAR_BIT_PERIPH_BB (huart -> Instance -> CR3 , USART_CR3_EIE );
2420
2443
2421
2444
/* Rx process is completed, restore huart->RxState to Ready */
2422
2445
huart -> RxState = HAL_UART_STATE_READY ;
0 commit comments