Disable UART IRQs during sensor readout

This commit is contained in:
Duke NUCem 2021-10-20 18:14:13 +02:00
parent 3abe7568b0
commit a290f52d4d
4 changed files with 34 additions and 7 deletions

View File

@ -75,6 +75,8 @@ extern "C" {
void Error_Handler(void);
/* USER CODE BEGIN EFP */
int8_t uart_disable_interrupts(void);
int8_t uart_enable_interrupts(void);
/* USER CODE END EFP */

View File

@ -269,15 +269,17 @@ int main(void)
if (baudrate_changed)
{
while (!LL_LPUART_IsActiveFlag_TXE(LPUART1));
LL_LPUART_Disable(LPUART1);
LL_LPUART_DisableIT_IDLE(LPUART1);
LL_LPUART_EnableIT_RXNE(LPUART1);
uart_disable_interrupts();
// LL_LPUART_Disable(LPUART1);
// LL_LPUART_DisableIT_IDLE(LPUART1);
// LL_LPUART_EnableIT_RXNE(LPUART1);
LL_LPUART_SetBaudRate(LPUART1, SYSTICK_FREQ_HZ, config_baudrates[sensor_config.baudrate_index]);
LL_LPUART_Enable(LPUART1);
LL_LPUART_EnableIT_IDLE(LPUART1);
LL_LPUART_EnableIT_RXNE(LPUART1);
// LL_LPUART_Enable(LPUART1);
// LL_LPUART_EnableIT_IDLE(LPUART1);
// LL_LPUART_EnableIT_RXNE(LPUART1);
uart_enable_interrupts();
LL_LPUART_EnableDirectionRx(LPUART1);
LL_LPUART_EnableDirectionTx(LPUART1);
baudrate_changed = 0;
@ -645,6 +647,24 @@ void LPUART1_TX_Buffer(uint8_t* buffer_tx, uint16_t buffer_tx_len)
__enable_irq();
}
int8_t uart_disable_interrupts(void)
{
LL_LPUART_Disable(LPUART1);
LL_LPUART_DisableIT_IDLE(LPUART1);
LL_LPUART_EnableIT_RXNE(LPUART1);
return 0;
}
int8_t uart_enable_interrupts(void)
{
LL_LPUART_Enable(LPUART1);
LL_LPUART_EnableIT_IDLE(LPUART1);
LL_LPUART_EnableIT_RXNE(LPUART1);
return 0;
}
int8_t modbus_slave_callback(modbus_transaction_t *transaction)
{
uint16_t register_number = transaction->register_number;

View File

@ -6,6 +6,7 @@
*/
#include "scd4x.h"
#include "main.h" /* for uart_disable_interrupts() */
int8_t scd4x_send_cmd(scd4x_cmd_t cmd)
{
@ -74,8 +75,9 @@ int8_t scd4x_read_measurement(uint16_t * co2, int16_t *temperature, uint16_t *re
/*if (result != I2C_OK) {
return SCD4X_ERROR;
}*/
uart_disable_interrupts();
LL_mDelay(1); // 10 ms should be enough
uart_enable_interrupts();
// read out
result = i2c_receive(SCD4X_I2C_ADDRESS<<1, buffer, 9);
if (result != I2C_OK)

View File

@ -6,6 +6,7 @@
*/
#include "sht4x.h"
#include "main.h" /* for uart_disable_interrupts() */
int8_t sht4x_send_cmd(sht4x_cmd_t cmd)
{
@ -30,7 +31,9 @@ int8_t sht4x_measure(int16_t *temperature, uint16_t *relative_humidity)
if (result != I2C_OK) {
return SHT4X_ERROR;
}*/
uart_disable_interrupts();
LL_mDelay(10); // 10 ms should be enough
uart_enable_interrupts();
// read out
result = i2c_receive(SHT4X_I2C_ADDRESS<<1, buffer, 6);
if (result != I2C_OK) {