Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Видео уроки по программированию STM32F4.

Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение admin » 03 фев 2016, 13:07

Тема для комментариев, вопросов, предложений навеянных данной статьей
admin
Администратор
 
Сообщения: 41
Зарегистрирован: 07 июн 2014, 12:03

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение Alexfire » 17 фев 2016, 22:19

Привет. Подскажите новичку пример реализации функции unsigned short int filter_sred(unsigned short int ADC_val, unsigned short int* buf, FILTER_REG* filter_reg) в main.c
Вместо unsigned short int ADC_val подставляем переменную с мгновенным значением ацп, а вот дальше....?
И ещё: назначение переменной unsigned int Val в typedef union? она нигде не используется...
Alexfire
 
Сообщения: 3
Зарегистрирован: 17 фев 2016, 22:01

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение admin » 18 фев 2016, 17:53

Alexfire писал(а):Привет. Подскажите новичку пример реализации функции unsigned short int filter_sred(unsigned short int ADC_val, unsigned short int* buf, FILTER_REG* filter_reg) в main.c
Вместо unsigned short int ADC_val подставляем переменную с мгновенным значением ацп, а вот дальше....?
И ещё: назначение переменной unsigned int Val в typedef union? она нигде не используется...

Здравствуйте! Пример реализации, показан в статье.
Код: Выделить всё
filter_13=filter_sred(ADC13,buf_13,&F13);

после unsigned short int ADC_val, дальше необходимо указать буфер, содержащие предыдущие значения, для фильтра, а также указываем структуру, в которой хранится промежуточная сумма элементов и текущее положение индекса массива.
unsigned int Val обращается к структуре как к 32 битной переменной, например для первоначального обнуления. Ведь обнулять по очереди все переменные входящие в структуру не удобно.
admin
Администратор
 
Сообщения: 41
Зарегистрирован: 07 июн 2014, 12:03

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение Alexfire » 18 фев 2016, 18:12

Как правильно объявить третий аргумент функции в main.c, т.е. структуру?
В вашем примере это F13
Alexfire
 
Сообщения: 3
Зарегистрирован: 17 фев 2016, 22:01

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение Alexfire » 18 фев 2016, 18:17

Ответ нашел в Вашем проекте. Спасибо! Вопрос закрыт.
Alexfire
 
Сообщения: 3
Зарегистрирован: 17 фев 2016, 22:01

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение Khludenkov » 31 мар 2016, 14:11

Работает только половина каналов (делал и 3 и 4).

keil v5, куб тоже свежий.
Где закомментить

Лирическое отступление.
При выполнении функции HAL_ADC_Start_DMA включаются все возможные прерывания от ДМА, по окончанию транзакции, по заполнению половины буфера, при возникших ошибках. Нам прерывание от заполнения половины буфера не нужно, поэтому вопреки КУБа, запретим данное прерывание.


Нашёл в файле

stm32xx_hal_dma_ex.c

Строка 201:


/* Enable the Half transfer interrupt */
// __HAL_DMA_ENABLE_IT(hdma, DMA_IT_HT);



Может ещё в каком месте?
Khludenkov
 
Сообщения: 4
Зарегистрирован: 31 мар 2016, 13:56

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение admin » 31 мар 2016, 17:21

Здравствуйте! Приведите пожалуйста код запуска считывания значений с АЦП по четырем канал через ДМА?
Запретить прерывание ДМА при заполнении половины буфера необходимо в файле stm32xx_hal_dma.c строка 410:
Код: Выделить всё
  /* Enable the Half transfer complete interrupt */
  __HAL_DMA_ENABLE_IT(hdma, DMA_IT_HT); 
admin
Администратор
 
Сообщения: 41
Зарегистрирован: 07 июн 2014, 12:03

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение Khludenkov » 31 мар 2016, 17:36

Я здесь оставил только часть АЦП и ДМА:

Код: Выделить всё


#include "stm32f4xx_hal.h"
#include "adc.h"
#include "dma.h"
#include "gpio.h"


uint32_t cnt = 0;

volatile uint8_t flag_sys;
uint16_t ADC11, ADC12, ADC13, ADC14;
uint16_t ADC_value[4];
volatile uint8_t flag_adc_dma;
void SystemClock_Config(void);


uint32_t a = 0;

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC1_Init();

   

  while (1)
  {
      __asm("nop");
     if (++a > 1000000)
      {
         a = 0;
        HAL_ADC_Start_DMA(&hadc1, (uint32_t *) &ADC_value, 4);
     }

      __asm("nop");

     if (flag_adc_dma){
        flag_adc_dma=0;
        HAL_ADC_Stop_DMA(&hadc1);
        ADC14 = ADC_value[3];
        ADC13 = ADC_value[2];
        ADC12 = ADC_value[1];
        ADC11 = ADC_value[0];
     }

      __asm("nop");

   }
}


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_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 5;
  RCC_OscInitStruct.PLL.PLLN = 210;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);

  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

Khludenkov
 
Сообщения: 4
Зарегистрирован: 31 мар 2016, 13:56

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение Khludenkov » 31 мар 2016, 17:40

Наверное у меня другая версия этого файла:

Код: Выделить всё
  * @file    stm32f4xx_hal_dma.c
  * @author  MCD Application Team
  * @version V1.4.4
  * @date    22-January-2016
  * @brief   DMA HAL module driver.



Код: Выделить всё
/**
  * @brief  Start the DMA Transfer with interrupt enabled.
  * @param  hdma:       pointer to a DMA_HandleTypeDef structure that contains
  *                     the configuration information for the specified DMA Stream. 
  * @param  SrcAddress: The source memory Buffer address
  * @param  DstAddress: The destination memory Buffer address
  * @param  DataLength: The length of data to be transferred from source to destination
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
{
  /* Process locked */
  __HAL_LOCK(hdma);

  /* Change DMA peripheral state */
  hdma->State = HAL_DMA_STATE_BUSY;

   /* Check the parameters */
  assert_param(IS_DMA_BUFFER_SIZE(DataLength));

  /* Disable the peripheral */
  __HAL_DMA_DISABLE(hdma);

  /* Configure the source, destination address and the data length */
  DMA_SetConfig(hdma, SrcAddress, DstAddress, DataLength);

  /* Enable all interrupts */
  hdma->Instance->CR  |= DMA_IT_TC | DMA_IT_HT | DMA_IT_TE | DMA_IT_DME;
  hdma->Instance->FCR |= DMA_IT_FE;

   /* Enable the Peripheral */
  __HAL_DMA_ENABLE(hdma);

  return HAL_OK;
}
Khludenkov
 
Сообщения: 4
Зарегистрирован: 31 мар 2016, 13:56

Re: Программирование STM32F4. Урок №5. АЦП+ДМА+фильтр.

Сообщение admin » 31 мар 2016, 17:53

Вам в файле stm32xx_hal_dma.c в функции:
Код: Выделить всё
HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)


Там где у ВАС включаются прерывания:
Код: Выделить всё
hdma->Instance->CR  |= DMA_IT_TC | DMA_IT_HT | DMA_IT_TE | DMA_IT_DME;

Убрать прерывание от заполнения половины буфера. То есть оставить такую строку:
Код: Выделить всё
Instance->CR  |= DMA_IT_TC | DMA_IT_TE | DMA_IT_DME;
admin
Администратор
 
Сообщения: 41
Зарегистрирован: 07 июн 2014, 12:03

След.

Вернуться в Программирование STM32F4. Уроки.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron