[HAL][CRYP] Update Crypt/Decrypt IT processes to avoid Computation Completed IRQ fires before the DINR pointer increment
diff --git a/Src/stm32l0xx_hal_cryp.c b/Src/stm32l0xx_hal_cryp.c
index 4ca4430..b8aa102 100644
--- a/Src/stm32l0xx_hal_cryp.c
+++ b/Src/stm32l0xx_hal_cryp.c
@@ -822,7 +822,13 @@
/* Get the last input data address */
inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
-
+
+ /* Increment the pointer before writing the input block in the IN FIFO to make sure that
+ when Computation Completed IRQ fires, the hcryp->CrypInCount has always a consistent value
+ and it is ready for the next operation. */
+ hcryp->pCrypInBuffPtr += 16U;
+ hcryp->CrypInCount -= 16U;
+
/* Write the Input block in the Data Input register */
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
@@ -831,9 +837,7 @@
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
- hcryp->pCrypInBuffPtr += 16U;
- hcryp->CrypInCount -= 16U;
-
+
/* Return function status */
return HAL_OK;
}
@@ -911,7 +915,13 @@
/* Get the last input data address */
inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
-
+
+ /* Increment the pointer before writing the input block in the IN FIFO to make sure that
+ when Computation Completed IRQ fires, the hcryp->CrypInCount has always a consistent value
+ and it is ready for the next operation. */
+ hcryp->pCrypInBuffPtr += 16U;
+ hcryp->CrypInCount -= 16U;
+
/* Write the Input block in the Data Input register */
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
@@ -920,9 +930,7 @@
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
- hcryp->pCrypInBuffPtr += 16U;
- hcryp->CrypInCount -= 16U;
-
+
/* Return function status */
return HAL_OK;
}
@@ -1000,7 +1008,13 @@
/* Get the last input data address */
inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
-
+
+ /* Increment the pointer before writing the input block in the IN FIFO to make sure that
+ when Computation Completed IRQ fires, the hcryp->CrypInCount has always a consistent value
+ and it is ready for the next operation. */
+ hcryp->pCrypInBuffPtr += 16U;
+ hcryp->CrypInCount -= 16U;
+
/* Write the Input block in the Data Input register */
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
@@ -1009,9 +1023,7 @@
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
- hcryp->pCrypInBuffPtr += 16U;
- hcryp->CrypInCount -= 16U;
-
+
/* Return function status */
return HAL_OK;
}
@@ -1086,7 +1098,13 @@
/* Get the last input data address */
inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
-
+
+ /* Increment the pointer before writing the input block in the IN FIFO to make sure that
+ when Computation Completed IRQ fires, the hcryp->CrypInCount has always a consistent value
+ and it is ready for the next operation. */
+ hcryp->pCrypInBuffPtr += 16U;
+ hcryp->CrypInCount -= 16U;
+
/* Write the Input block in the Data Input register */
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
@@ -1095,9 +1113,7 @@
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
- hcryp->pCrypInBuffPtr += 16U;
- hcryp->CrypInCount -= 16U;
-
+
/* Return function status */
return HAL_OK;
}
@@ -1175,7 +1191,13 @@
/* Get the last input data address */
inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
-
+
+ /* Increment the pointer before writing the input block in the IN FIFO to make sure that
+ when Computation Completed IRQ fires, the hcryp->CrypInCount has always a consistent value
+ and it is ready for the next operation. */
+ hcryp->pCrypInBuffPtr += 16U;
+ hcryp->CrypInCount -= 16U;
+
/* Write the Input block in the Data Input register */
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
@@ -1184,9 +1206,7 @@
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
- hcryp->pCrypInBuffPtr += 16U;
- hcryp->CrypInCount -= 16U;
-
+
/* Return function status */
return HAL_OK;
}
@@ -1264,7 +1284,13 @@
/* Get the last input data address */
inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
-
+
+ /* Increment the pointer before writing the input block in the IN FIFO to make sure that
+ when Computation Completed IRQ fires, the hcryp->CrypInCount has always a consistent value
+ and it is ready for the next operation. */
+ hcryp->pCrypInBuffPtr += 16U;
+ hcryp->CrypInCount -= 16U;
+
/* Write the Input block in the Data Input register */
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
@@ -1272,10 +1298,8 @@
inputaddr+=4U;
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
- hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
- hcryp->pCrypInBuffPtr += 16U;
- hcryp->CrypInCount -= 16U;
-
+ hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
+
/* Return function status */
return HAL_OK;
}
@@ -1921,7 +1945,13 @@
{
/* Get the last Input data address */
inputaddr = (uint32_t)hcryp->pCrypInBuffPtr;
-
+
+ /* Increment the pointer before writing the input block in the IN FIFO to make sure that
+ when Computation Completed IRQ fires, the hcryp->CrypInCount has always a consistent value
+ and it is ready for the next operation. */
+ hcryp->pCrypInBuffPtr += 16U;
+ hcryp->CrypInCount -= 16U;
+
/* Write the Input block in the Data Input register */
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
@@ -1930,8 +1960,6 @@
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
inputaddr+=4U;
hcryp->Instance->DINR = *(uint32_t*)(inputaddr);
- hcryp->pCrypInBuffPtr += 16U;
- hcryp->CrypInCount -= 16U;
}
return HAL_OK;
}