Skip to content

Особенности работы железа STM32

Konata Izumi edited this page Jun 10, 2017 · 2 revisions

Чтенние/запись SD-карты

Чтенние/запись SD-карты для STM32F2/F4 корректно работает только при вот таких настройках. В остальных случаях последние 16 или 12 байт данных будут повреждены. В документации и еррате это никак не указано. Возможно, это побочный результат описанного в еррате бага с HW flow control.

    nvic_enable_irq(NVIC_DMA2_STREAM3_IRQ);
    dma_stream_reset(DMA2, DMA_STREAM3);
    dma_set_transfer_mode(DMA2, DMA_STREAM3, DMA_SxCR_DIR_PERIPHERAL_TO_MEM);
    dma_set_priority(DMA2,  DMA_STREAM3, DMA_SxCR_PL_HIGH);
    dma_set_memory_size(DMA2, DMA_STREAM3, DMA_SxCR_MSIZE_32BIT);
    dma_set_peripheral_size(DMA2, DMA_STREAM3, DMA_SxCR_PSIZE_32BIT);
    dma_enable_memory_increment_mode(DMA2, DMA_STREAM3);
    dma_set_peripheral_address(DMA2, DMA_STREAM3, (u32) &SDIO_FIFO);
    dma_channel_select(DMA2, DMA_STREAM3, DMA_SxCR_CHSEL_4);
    dma_set_memory_address(DMA2, DMA_STREAM3, (u32) buffer);
    dma_set_number_of_data(DMA2, DMA_STREAM3, 128);
    dma_enable_fifo_mode (DMA2, DMA_STREAM3);
    dma_set_peripheral_flow_control(DMA2, DMA_STREAM3);
    dma_set_fifo_threshold(DMA2, DMA_STREAM3, DMA_SxFCR_FTH_4_4_FULL);
    dma_set_memory_burst(DMA2, DMA_STREAM3, DMA_SxCR_MBURST_INCR4);
    dma_set_peripheral_burst(DMA2, DMA_STREAM3, DMA_SxCR_PBURST_INCR4);
    dma_disable_fifo_error_interrupt(DMA2, DMA_STREAM3);
    dma_disable_half_transfer_interrupt(DMA2, DMA_STREAM3);
    dma_enable_transfer_complete_interrupt(DMA2, DMA_STREAM3);
    dma_enable_transfer_error_interrupt(DMA2,    DMA_STREAM3);
    dma_enable_transfer_complete_interrupt(DMA2, DMA_STREAM3);
    dma_enable_stream(DMA2, DMA_STREAM3);

Ужасный I2C

Я думал в ардуино реализация i2c не очень - но нет, можно сделать еще хуже. Всё очень, очень криво. На корректное заведение fm24cl16 я потратил 2 дня,и код выглядит очень странно, но только так он работает. Трогать задержки в процедуре записи не советую, будет или зависание, или потеря последнего байта.

От ATSHA204A пришлось отказаться совсем - она требует каких-то своих правил обращения с ней (а их обеспечить можно только в режиме polling, у меня же все на прерываниях и dma), и должна висеть на отдельном канале i2c.