I am currently working on Nucleo F401RE and Bluetooth expansion Board(IDB05A1) of ST microelectronics. I have to frame code in such a way that i have to pass four parameters values to the mobile through an android app. So i configured an ADC with four channels with DMA access. According to that i wrote code i am not getting output as i expected.
I have used Cube MX for code generation and Keil version5 IDE for my coding.I have configured DMA global interrupt, ADC four channels, Baud rate:9600 bits/s, and RCC to ceramic.As a first part i did coding for only ADC. I am not getting any errors but the output is not as i expected. Can anyone go through and figure out what mistake i made Thanking you.
/* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ uint16_t ADC_RESULT[4]; uint16_t FINAL_VALUE[4],COUNT; uint32_t RESULT[4]; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_DMA_Init(void); static void MX_ADC1_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); /* USER CODE BEGIN 2 */ HAL_ADC_Start_DMA(&hadc1, (uint32_t*) ADC_RESULT, 4); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Configuration */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = 16; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PLLM = 16; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; RCC_OscInitStruct.PLL.PLLQ = 7; HAL_RCC_OscConfig(&RCC_OscInitStruct); RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); /* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /* ADC1 init function */ void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig; /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) */ hadc1.Instance = ADC1; hadc1.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4; hadc1.Init.Resolution = ADC_RESOLUTION12b; hadc1.Init.ScanConvMode = DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = ENABLE; hadc1.Init.NbrOfDiscConversion = 1; hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.EOCSelection = EOC_SINGLE_CONV; HAL_ADC_Init(&hadc1); /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */ sConfig.Channel = ADC_CHANNEL_0; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; HAL_ADC_ConfigChannel(&hadc1, &sConfig); } /** * Enable DMA controller clock */ void MX_DMA_Init(void) { /* DMA controller clock enable */ __DMA2_CLK_ENABLE(); /* DMA interrupt init */ HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); } void MX_GPIO_Init(void) { /* GPIO Ports Clock Enable */ __GPIOH_CLK_ENABLE(); __GPIOA_CLK_ENABLE(); } /* USER CODE BEGIN 4 */ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc1) { if(COUNT<800) { COUNT++; RESULT[0] = RESULT[0] + ADC_RESULT[0]; RESULT[1] = RESULT[1] + ADC_RESULT[1]; RESULT[2] = RESULT[2] + ADC_RESULT[2]; RESULT[3] = RESULT[3] + ADC_RESULT[3]; } else { FINAL_VALUE[0] = RESULT[0]/800; FINAL_VALUE[1] = RESULT[1]/800; FINAL_VALUE[2] = RESULT[2]/800; FINAL_VALUE[3] = RESULT[3]/800; COUNT = 0; RESULT[0] = RESULT[1] = RESULT[2] = RESULT[3] = 0; } //ADC_READ_RESULT = ADC_RESULT; HAL_ADC_Start_DMA(hadc1, (uint32_t*) ADC_RESULT,4); //ADC_READ_RESULT = ADC_RESULT ; } /* USER CODE END 4 */ #ifdef USE_FULL_ASSERT void assert_failed(uint8_t* file, uint32_t line) { /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* USER CODE END 6 */ } #endif
Didn't you already ask this? http://www.keil.com/forum/62374/
The data is wrong how? Detail The code doesn't show any initialization of the pins or peripherals, just some top level stuff that won't actually build/function. The DMA array should probably be volatile, but not sure that's the issue.
Present more actual detail rather than post the same material twice...
Hi Westonsupermare Pier First thanks for your Response. Actually for the first post i didn't selected the tool for that reason i selected toolset and again i posted sorry for that. I have used CubeMX for my code generation the pin intializations and selecting interrupts configuring the clock everything is carried out in the CubeMX software. so no need to specify again in the code i thought. I am using stm32f401re microcontroller(Nucleo F401RE board) for the first time so i have carried out with the softwares given in the st websites. The initializations i have specified in the message of my previous post. If you have any idea regarding establishing communication between adc and uart will you please help me out in this regard.
Regards Lohitha D