Skip to main content
Explorer
April 12, 2024
Question

SSD1306 stop working while DMA Mode enabled to read ADC.

  • April 12, 2024
  • 1 reply
  • 1311 views

I am trying to read 4-20mA Transducer using ADC and DMA Enabled. Normally OLED works fine.

 

But when i enabled DMA, OLED is blank. What could be wrong ?

 

 

 

int main(void)
{
 /* USER CODE BEGIN 1 */

 /* USER CODE END 1 */

 /* MCU Configuration--------------------------------------------------------*/

 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 HAL_Init();

 /* USER CODE BEGIN Init */

 /* USER CODE END Init */

 /* Configure the system clock */
 SystemClock_Config();

 /* USER CODE BEGIN SysInit */

 /* USER CODE END SysInit */

 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 MX_DMA_Init();
 MX_I2C1_Init();
 MX_ADC1_Init();
 /* USER CODE BEGIN 2 */

 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buf, ADC_BUF_LEN); // start the adc in dma mode


 ssd1306_Init();
 // here value is the buffer, where the adc values are going to store
 // 3 is the number of values going to store == no. of channels we are using


 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
	// HAL_ADC_Start_DMA(&hadc1, value, 2); // start the adc in dma mode
	//ssd1306_TestFPS();
	//ssd1306_TestAll();
	// ssd1306_TestFonts22();
	 // Example loop to demonstrate the counter increment
	 for (int i = 0; i < 1000; i++) {
	 //	adc1x = value[0];
	 ssd1306_TestFonts22(); // Display the current counter value
	 incrementCounter(); // Increment the counter
	 // HAL_Delay(50);
	 }
 }
 /* USER CODE END 3 */
}


void ssd1306_TestFonts22() {
#ifdef SSD1306_INCLUDE_FONT_16x24
 uint8_t x1, y1, x2, y2;

 // Convert the float counter value to a string
 // char counter_str[6]; // Assuming the format is XX.XX
 // snprintf(counter_str, 5, "%2.2f", counter);

 char float_str[10]; // Assuming the format is XX.XX
 snprintf(float_str, 10, "%02.2f" "%%rH", counter);

 // char decimal_str[10]; // Assuming the format is XX.XX
 // snprintf(decimal_str, 10, "%4d", adc1x);

 ssd1306_Fill(Black);

 // Display the counter value
 ssd1306_SetCursor(0, 4);
 ssd1306_WriteString(float_str, Font_16x24, White);

 // Other text
 // ssd1306_SetCursor(0, 4+24+8);
 // ssd1306_WriteString(decimal_str, Font_16x24, White);

 // Underline
 x1 = 6*16;
 y1 = 4+24+8+24;
 x2 = x1+16;
 y2 = y1+2;
 ssd1306_FillRectangle(x1, y1, x2, y2, White);

 ssd1306_UpdateScreen();
#endif
}

 

 

 

 
    This topic has been closed for replies.

    1 reply

    Super User
    April 12, 2024

    >But when i enabled DMA, OLED is blank. What could be wrong ?

    Something in your program...!  :)

     

    Check where DMA is writing to and size of target area - really in the array you set ?

     

    btw

    I made a small DSO , using F103 + SSD1306 ; no problems . Used u8g lib (see on github).