Circular buffer DMA mode in Embedded C - Mini Project: Build & Apply
buffer with size 8 to hold incoming data.Think of buffer as a row of 8 boxes to store data bytes.
buffer_size and set it to 8 to represent the size of the buffer.This variable helps us know how many bytes the buffer can hold.
i from 0 to 11. Inside the loop, write the character 'A' + i into buffer[i % buffer_size] to simulate DMA writing data circularly.Use the modulo operator % to wrap the index back to 0 when it reaches the buffer size.
j from 0 to buffer_size - 1 to print each character in buffer[j] without spaces or newlines.Printing the buffer shows the last 8 characters written, demonstrating the circular buffer behavior.
Practice
What is the main advantage of using circular buffer mode in DMA?
Solution
Step 1: Understand circular buffer mode behavior
Circular buffer mode lets DMA wrap around to the start of the buffer after reaching the end, enabling continuous data transfer.Step 2: Identify the advantage
This means data can be streamed continuously without stopping or manual buffer reset.Final Answer:
It allows continuous data transfer without stopping when the buffer is full. -> Option DQuick Check:
Circular buffer = continuous transfer [OK]
- Thinking CPU speed changes with DMA mode
- Confusing interrupt behavior with buffer mode
- Assuming buffer size is reduced automatically
Which of the following is the correct way to enable circular mode in a DMA configuration struct in embedded C?
DMA_InitTypeDef DMA_InitStructure; // ... other initializations DMA_InitStructure.Mode = ?;
Solution
Step 1: Recall DMA mode options
DMA_Mode_Circular is the standard mode to enable circular buffer operation in DMA configurations.Step 2: Match the correct mode
DMA_Mode_Normal is single transfer, others like Interrupt or OneShot are not standard DMA modes for circular buffer.Final Answer:
DMA_Mode_Circular -> Option AQuick Check:
Enable circular mode = DMA_Mode_Circular [OK]
- Using DMA_Mode_Normal instead of circular
- Confusing interrupt mode with circular mode
- Using non-existent DMA modes
Given the following code snippet configuring DMA in circular mode, what will be the value of buffer[0] after 5 DMA transfers if the peripheral sends values 10, 20, 30, 40, 50 continuously?
#define BUFFER_SIZE 4
uint8_t buffer[BUFFER_SIZE] = {0};
// DMA configured in circular mode with buffer size 4
// Peripheral sends: 10, 20, 30, 40, 50
// DMA writes each value to buffer sequentially
// After 5 transfers:Solution
Step 1: Understand circular buffer write pattern
Buffer size is 4, so DMA writes values to buffer[0..3] in order, then wraps around to buffer[0].Step 2: Track each transfer
Transfers: 1->buffer[0]=10, 2->buffer[1]=20, 3->buffer[2]=30, 4->buffer[3]=40, 5->buffer[0]=50 (overwrite).Final Answer:
50 -> Option BQuick Check:
5th write wraps to buffer[0] = 50 [OK]
- Assuming buffer[0] keeps first value
- Ignoring wrap-around overwrite
- Confusing peripheral data order
Identify the error in this DMA circular buffer setup snippet:
DMA_InitTypeDef DMA_InitStructure; uint8_t buffer[8]; DMA_InitStructure.Mode = DMA_Mode_Circular; DMA_InitStructure.BufferSize = 10; DMA_InitStructure.MemBaseAddr = (uint32_t)buffer; // Start DMA
Solution
Step 1: Compare buffer size and BufferSize parameter
Buffer array has 8 elements, but BufferSize is set to 10, which is larger than buffer length.Step 2: Understand consequences
This mismatch can cause DMA to write beyond buffer bounds, leading to overflow and undefined behavior.Final Answer:
Buffer size is larger than actual buffer, causing overflow. -> Option CQuick Check:
BufferSize must not exceed buffer length [OK]
- Setting BufferSize larger than buffer array
- Ignoring buffer overflow risks
- Assuming casting memory address fixes size mismatch
You want to use DMA in circular mode to continuously read sensor data into a buffer of size 16. However, you notice data loss when the CPU reads the buffer slower than DMA writes. What is the best way to avoid data loss?
Solution
Step 1: Understand cause of data loss
If CPU reads slower than DMA writes, new data overwrites unread data in circular buffer causing loss.Step 2: Apply solution with double buffering
Increasing buffer size and using double buffering lets CPU read one buffer while DMA writes to another, preventing overwrite.Final Answer:
Increase buffer size and use double buffering technique. -> Option AQuick Check:
Double buffering prevents overwrite in circular DMA [OK]
- Disabling circular mode loses continuous transfer benefit
- Trying to slow DMA speed which may not be possible
- Stopping DMA interrupts causes data gaps
Ready to prove it?
Pass the test and this pattern moves unknown
