mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Use MP_ATOMIC_SECTION to enable/disable IRQs
This commit is contained in:
parent
d7cc41cfb0
commit
b45dec9b1a
@ -271,21 +271,21 @@ long SpiWrite(unsigned char *pUserBuffer, unsigned short usLength)
|
||||
|
||||
void SpiWriteDataSynchronous(unsigned char *data, unsigned short size)
|
||||
{
|
||||
__disable_irq();
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
if (HAL_SPI_TransmitReceive(&SPIHandle, data, data, size, SPI_TIMEOUT) != HAL_OK) {
|
||||
BREAK();
|
||||
}
|
||||
__enable_irq();
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
}
|
||||
|
||||
void SpiReadDataSynchronous(unsigned char *data, unsigned short size)
|
||||
{
|
||||
memset(data, READ, size);
|
||||
__disable_irq();
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
if (HAL_SPI_TransmitReceive(&SPIHandle, data, data, size, SPI_TIMEOUT) != HAL_OK) {
|
||||
BREAK();
|
||||
}
|
||||
__enable_irq();
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
}
|
||||
|
||||
void SpiReadPacket(void)
|
||||
|
||||
@ -24,11 +24,11 @@ static mp_int_t py_uart_read(mp_obj_t obj)
|
||||
mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_WRITE);
|
||||
}
|
||||
|
||||
__disable_irq();
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
if (HAL_UART_Receive(&UARTHandle, bufinfo.buf, bufinfo.len, UART_TIMEOUT) != HAL_OK) {
|
||||
return -1;
|
||||
}
|
||||
__enable_irq();
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
|
||||
return bufinfo.len;
|
||||
}
|
||||
@ -47,9 +47,11 @@ static mp_int_t py_uart_write(mp_obj_t obj)
|
||||
mp_get_buffer_raise(obj, &bufinfo, MP_BUFFER_READ);
|
||||
}
|
||||
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
if (HAL_UART_Transmit(&UARTHandle, bufinfo.buf, bufinfo.len, UART_TIMEOUT) != HAL_OK) {
|
||||
return -1;
|
||||
}
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
|
||||
return bufinfo.len;
|
||||
}
|
||||
|
||||
@ -69,21 +69,21 @@ void sdcard_power_off(void)
|
||||
|
||||
mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count)
|
||||
{
|
||||
__disable_irq();
|
||||
HAL_SD_ErrorTypedef err;
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
err = HAL_SD_ReadBlocks(&SDHandle, (uint32_t*)buff,
|
||||
sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count);
|
||||
__enable_irq();
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
return (err != SD_OK);
|
||||
}
|
||||
|
||||
mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t count)
|
||||
{
|
||||
__disable_irq();
|
||||
HAL_SD_ErrorTypedef err;
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
err = HAL_SD_WriteBlocks(&SDHandle, (uint32_t*)buff,
|
||||
sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count);
|
||||
__enable_irq();
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
return (err != SD_OK);
|
||||
}
|
||||
|
||||
|
||||
@ -83,22 +83,26 @@ static BYTE spi_send(BYTE out)
|
||||
if (HAL_SPI_TransmitReceive(&SPIHandle, &out, &out, 1, SPI_TIMEOUT) != HAL_OK) {
|
||||
BREAK();
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
static bool spi_send_buff(const BYTE *buff, uint32_t size)
|
||||
{
|
||||
return HAL_SPI_Transmit(&SPIHandle, (void*)buff, size, SPI_TIMEOUT)== HAL_OK;
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
bool res = (HAL_SPI_Transmit(&SPIHandle, (void*)buff, size, SPI_TIMEOUT) == HAL_OK);
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
return res;
|
||||
}
|
||||
|
||||
#define spi_recv() spi_send(0xFF)
|
||||
|
||||
static bool spi_recv_buff(BYTE *buff, uint32_t size)
|
||||
{
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
do {
|
||||
*buff++ = spi_recv();
|
||||
} while (--size);
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -323,8 +327,6 @@ mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count)
|
||||
sector *= SDCARD_BLOCK_SIZE; /* Convert to byte address if needed */
|
||||
}
|
||||
|
||||
__disable_irq();
|
||||
|
||||
if (count == 1) { /* Single block read */
|
||||
if (send_cmd(CMD17, sector) == 0) { /* READ_SINGLE_BLOCK */
|
||||
if (rcvr_datablock(buff, SDCARD_BLOCK_SIZE)) {
|
||||
@ -343,9 +345,6 @@ mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count)
|
||||
}
|
||||
}
|
||||
release_spi();
|
||||
|
||||
__enable_irq();
|
||||
|
||||
return count ? true: false;
|
||||
}
|
||||
|
||||
@ -359,8 +358,6 @@ mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t cou
|
||||
sector *= SDCARD_BLOCK_SIZE; /* Convert to byte address if needed */
|
||||
}
|
||||
|
||||
__disable_irq();
|
||||
|
||||
if (count == 1) { /* Single block write */
|
||||
if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
|
||||
&& xmit_datablock(buff, 0xFE))
|
||||
@ -380,8 +377,6 @@ mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t cou
|
||||
}
|
||||
}
|
||||
release_spi();
|
||||
|
||||
__enable_irq();
|
||||
return count ? true: false;
|
||||
}
|
||||
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include <stdbool.h>
|
||||
#include <stm32f4xx_hal.h>
|
||||
#include "soft_i2c.h"
|
||||
#include "mp.h"
|
||||
|
||||
#define I2C_PORT GPIOA
|
||||
#define I2C_SIOC_PIN GPIO_PIN_2
|
||||
@ -128,7 +129,7 @@ int soft_i2c_read_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
__disable_irq();
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
i2c_start();
|
||||
ret |= i2c_write_byte(slv_addr | 0x01);
|
||||
for (int i=0; i<len; i++) {
|
||||
@ -137,7 +138,7 @@ int soft_i2c_read_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop)
|
||||
if (stop) {
|
||||
i2c_stop();
|
||||
}
|
||||
__enable_irq();
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -145,7 +146,7 @@ int soft_i2c_write_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop)
|
||||
{
|
||||
uint8_t ret = 0;
|
||||
|
||||
__disable_irq();
|
||||
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||
i2c_start();
|
||||
ret |= i2c_write_byte(slv_addr);
|
||||
for (int i=0; i<len; i++) {
|
||||
@ -155,7 +156,7 @@ int soft_i2c_write_bytes(uint8_t slv_addr, uint8_t *buf, int len, bool stop)
|
||||
if (stop) {
|
||||
i2c_stop();
|
||||
}
|
||||
__enable_irq();
|
||||
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user