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)
|
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) {
|
if (HAL_SPI_TransmitReceive(&SPIHandle, data, data, size, SPI_TIMEOUT) != HAL_OK) {
|
||||||
BREAK();
|
BREAK();
|
||||||
}
|
}
|
||||||
__enable_irq();
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpiReadDataSynchronous(unsigned char *data, unsigned short size)
|
void SpiReadDataSynchronous(unsigned char *data, unsigned short size)
|
||||||
{
|
{
|
||||||
memset(data, READ, 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) {
|
if (HAL_SPI_TransmitReceive(&SPIHandle, data, data, size, SPI_TIMEOUT) != HAL_OK) {
|
||||||
BREAK();
|
BREAK();
|
||||||
}
|
}
|
||||||
__enable_irq();
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpiReadPacket(void)
|
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);
|
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) {
|
if (HAL_UART_Receive(&UARTHandle, bufinfo.buf, bufinfo.len, UART_TIMEOUT) != HAL_OK) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
__enable_irq();
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
|
|
||||||
return bufinfo.len;
|
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_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) {
|
if (HAL_UART_Transmit(&UARTHandle, bufinfo.buf, bufinfo.len, UART_TIMEOUT) != HAL_OK) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
|
|
||||||
return bufinfo.len;
|
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)
|
mp_uint_t sdcard_read_blocks(uint8_t *buff, uint32_t sector, uint32_t count)
|
||||||
{
|
{
|
||||||
__disable_irq();
|
|
||||||
HAL_SD_ErrorTypedef err;
|
HAL_SD_ErrorTypedef err;
|
||||||
|
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||||
err = HAL_SD_ReadBlocks(&SDHandle, (uint32_t*)buff,
|
err = HAL_SD_ReadBlocks(&SDHandle, (uint32_t*)buff,
|
||||||
sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count);
|
sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count);
|
||||||
__enable_irq();
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
return (err != SD_OK);
|
return (err != SD_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t count)
|
mp_uint_t sdcard_write_blocks(const uint8_t *buff, uint32_t sector, uint32_t count)
|
||||||
{
|
{
|
||||||
__disable_irq();
|
|
||||||
HAL_SD_ErrorTypedef err;
|
HAL_SD_ErrorTypedef err;
|
||||||
|
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||||
err = HAL_SD_WriteBlocks(&SDHandle, (uint32_t*)buff,
|
err = HAL_SD_WriteBlocks(&SDHandle, (uint32_t*)buff,
|
||||||
sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count);
|
sector * SDCARD_BLOCK_SIZE, SDCARD_BLOCK_SIZE, count);
|
||||||
__enable_irq();
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
return (err != SD_OK);
|
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) {
|
if (HAL_SPI_TransmitReceive(&SPIHandle, &out, &out, 1, SPI_TIMEOUT) != HAL_OK) {
|
||||||
BREAK();
|
BREAK();
|
||||||
}
|
}
|
||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool spi_send_buff(const BYTE *buff, uint32_t size)
|
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)
|
#define spi_recv() spi_send(0xFF)
|
||||||
|
|
||||||
static bool spi_recv_buff(BYTE *buff, uint32_t size)
|
static bool spi_recv_buff(BYTE *buff, uint32_t size)
|
||||||
{
|
{
|
||||||
|
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||||
do {
|
do {
|
||||||
*buff++ = spi_recv();
|
*buff++ = spi_recv();
|
||||||
} while (--size);
|
} while (--size);
|
||||||
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
return true;
|
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 */
|
sector *= SDCARD_BLOCK_SIZE; /* Convert to byte address if needed */
|
||||||
}
|
}
|
||||||
|
|
||||||
__disable_irq();
|
|
||||||
|
|
||||||
if (count == 1) { /* Single block read */
|
if (count == 1) { /* Single block read */
|
||||||
if (send_cmd(CMD17, sector) == 0) { /* READ_SINGLE_BLOCK */
|
if (send_cmd(CMD17, sector) == 0) { /* READ_SINGLE_BLOCK */
|
||||||
if (rcvr_datablock(buff, SDCARD_BLOCK_SIZE)) {
|
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();
|
release_spi();
|
||||||
|
|
||||||
__enable_irq();
|
|
||||||
|
|
||||||
return count ? true: false;
|
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 */
|
sector *= SDCARD_BLOCK_SIZE; /* Convert to byte address if needed */
|
||||||
}
|
}
|
||||||
|
|
||||||
__disable_irq();
|
|
||||||
|
|
||||||
if (count == 1) { /* Single block write */
|
if (count == 1) { /* Single block write */
|
||||||
if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
|
if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */
|
||||||
&& xmit_datablock(buff, 0xFE))
|
&& 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();
|
release_spi();
|
||||||
|
|
||||||
__enable_irq();
|
|
||||||
return count ? true: false;
|
return count ? true: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -9,6 +9,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stm32f4xx_hal.h>
|
#include <stm32f4xx_hal.h>
|
||||||
#include "soft_i2c.h"
|
#include "soft_i2c.h"
|
||||||
|
#include "mp.h"
|
||||||
|
|
||||||
#define I2C_PORT GPIOA
|
#define I2C_PORT GPIOA
|
||||||
#define I2C_SIOC_PIN GPIO_PIN_2
|
#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;
|
int ret = 0;
|
||||||
|
|
||||||
__disable_irq();
|
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||||
i2c_start();
|
i2c_start();
|
||||||
ret |= i2c_write_byte(slv_addr | 0x01);
|
ret |= i2c_write_byte(slv_addr | 0x01);
|
||||||
for (int i=0; i<len; i++) {
|
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) {
|
if (stop) {
|
||||||
i2c_stop();
|
i2c_stop();
|
||||||
}
|
}
|
||||||
__enable_irq();
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
return ret;
|
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;
|
uint8_t ret = 0;
|
||||||
|
|
||||||
__disable_irq();
|
mp_uint_t atomic_state = MICROPY_BEGIN_ATOMIC_SECTION();
|
||||||
i2c_start();
|
i2c_start();
|
||||||
ret |= i2c_write_byte(slv_addr);
|
ret |= i2c_write_byte(slv_addr);
|
||||||
for (int i=0; i<len; i++) {
|
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) {
|
if (stop) {
|
||||||
i2c_stop();
|
i2c_stop();
|
||||||
}
|
}
|
||||||
__enable_irq();
|
MICROPY_END_ATOMIC_SECTION(atomic_state);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user