SciFi (12.12.2017 16:12 - 16:15, просмотров: 2809)
Из любопытства включил уровень оптимизации gcc -O3. Код для работы с SPI флешкой перестал работать. Понаставил кучу задержек в разных местах, пока не задышало. Причём убираю любую задержку - и снова глючит. Чудеса! STM32F407
static void
send_bytes(int len)
{
DMA1_Stream7->M0AR = (int)dmabuf;
DMA1_Stream7->PAR = (int)&SPI3->DR;
DMA1_Stream7->NDTR = len;
DMA1_Stream7->CR = (0 * DMA_SxCR_CHSEL_0) // select channel 0
| DMA_SxCR_DIR_0 // memory to peripheral
| DMA_SxCR_MINC; // memory increment mode
DMA1_Stream7->CR |= DMA_SxCR_EN; // enable stream
DELAY_1US();
while ((DMA1->HISR & DMA_HISR_TCIF7) == 0) { /* wait for DMA TCIF */ }
DELAY_1US();
while ((SPI3->SR & SPI_SR_TXE) == 0) { /* wait for TXE */ }
DELAY_1US();
while ((SPI3->SR & SPI_SR_BSY) != 0) { /* wait for !BUSY */ }
DELAY_1US();
/* clear OVR flag */
(void)SPI3->DR;
(void)SPI3->SR;
DMA1->HIFCR = DMA_HIFCR_CTCIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTEIF7;
}
static void
read_bytes(int len)
{
static uint8_t dummy;
DMA1_Stream0->M0AR = (int)dmabuf;
DMA1_Stream7->M0AR = (int)&dummy;
DMA1_Stream0->PAR = (int)&SPI3->DR;
DMA1_Stream7->PAR = (int)&SPI3->DR;
DMA1_Stream0->NDTR = len;
DMA1_Stream7->NDTR = len;
DMA1_Stream0->CR = (0 * DMA_SxCR_CHSEL_0) // select channel 0
| DMA_SxCR_MINC; // memory increment mode
DMA1_Stream0->CR |= DMA_SxCR_EN; // enable stream
DMA1_Stream7->CR = (0 * DMA_SxCR_CHSEL_0) // select channel 0
| DMA_SxCR_DIR_0; // memory to peripheral
DMA1_Stream7->CR |= DMA_SxCR_EN; // enable stream
DELAY_1US();
while ((DMA1->LISR & DMA_LISR_TCIF0) == 0) { /* wait for DMA TCIF */ }
DELAY_1US();
while ((SPI3->SR & SPI_SR_TXE) == 0) { /* wait for TXE */ }
DELAY_1US();
while ((SPI3->SR & SPI_SR_BSY) != 0) { /* wait for !BUSY */ }
DELAY_1US();
DMA1_Stream0->CR = 0;
DMA1_Stream7->CR = 0;
DELAY_1US();
DMA1->LIFCR = DMA_LIFCR_CTCIF0 | DMA_LIFCR_CHTIF0 | DMA_LIFCR_CTEIF0;
DMA1->HIFCR = DMA_HIFCR_CTCIF7 | DMA_HIFCR_CHTIF7 | DMA_HIFCR_CTEIF7;
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้