Перейти к содержанию

MechanicV

Members
  • Постов

    108
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные MechanicV

  1. Вроде сконфил DMA под АЦП но при попытки запуска потока DMA устанавливает флаг ошибки передачи потока

    Прерывание тоже от DMA не проходит.

    sbit LCD_RS at GPIOB_ODR.B4;
    sbit LCD_EN at GPIOB_ODR.B5;
    sbit LCD_D4 at GPIOB_ODR.B6;
    sbit LCD_D5 at GPIOB_ODR.B7;
    sbit LCD_D6 at GPIOB_ODR.B8;
    sbit LCD_D7 at GPIOB_ODR.B9;
    
    int adc_res_0[11], adc_res_1[11];
    char txt[11];
    short i=0, t=0, k=0;
    void main()
    {
    RCC_APB2ENR.B8=1;              // ADC1EN: синхронизация АЦП1 включена
    RCC_AHB1ENR.B0=1;              // GPIOAEN: часы порта IO включаются
    RCC_AHB1ENR.B22=1;            // DMA2EN: часы DMA2 включены
    GPIOA_MODER.B4=1;             // : Режим вывода общего назначения порт PA2
    GPIOA_MODER.B5=0;  
    GPIOA_OTYPER.B2=0;  //
    GPIOA_OSPEEDR.B4=1;   
    GPIOA_OSPEEDR.B5=1;
    
    GPIOA_MODER.B0=1;           // Аналоговый режим порт PA0
    GPIOA_MODER.B1=1;
    GPIOA_OSPEEDR.B0=1;
    GPIOA_OSPEEDR.B1=1;
    
    GPIOA_MODER.B2=1;          // Аналоговый режим порт PA1
    GPIOA_MODER.B3=1;
    GPIOA_OSPEEDR.B2=1;
    GPIOA_OSPEEDR.B3=1;
    
    EN_bit =0;                            // Если поток включен, отключите его, сбросив бит EN в регистр DMA_SxCR
    
    DMA2_LIFCR=1;                  // Все потоковые выделенные биты, очищены
    DMA2_HIFCR=1;
    
    DMA2_S0PAR=(int)&ADC1_DR;               // адрес регистра периферийного порта в регистре DMA_SxPAR
    DMA2_S0M0AR=(int)&adc_res_0;           // адрес памяти в регистре DMA_SxMA0R
    DMA2_S0NDTR =10;
    
    CHSEL0_bit =0;                                          // канал DMA2 канал0 (запрос) с помощью CHSEL [2: 0] в регистре DMA_SxCR
    CHSEL1_bit =0;
    CHSEL2_bit =0;
    
    PL0_bit =1;                         // приоритет потока наивысший
    PL1_bit =1;
    
    MSIZE0_bit =1;                   // Размер данных памяти 16 бита
    MSIZE1_bit =0;
    
    PSIZE0_DMA2_S0CR_bit =1;         // Размер периферийных данных 16 бит
    PSIZE1_DMA2_S0CR_bit =0;
    
    MINC_bit =1;                                  // Указатель адреса памяти увеличивается после каждой передачи данных 
                                                                    //(приращение выполняется в соответствии с MSIZE)
    
    DIR0_bit =0;                                    //Направление передачи данных Эти биты устанавливаются и сбрасываются программно.
    DIR1_bit =0;                                        // : Периферийное в память
    
    //PFCTRL_bit =1;                              //
    
    
    
    EnableInterrupts();
    NVIC_IntEnable(IVT_INT_DMA2_Stream0);  // разрешение прерывания при завершении передачи
    TCIE_DMA2_S0CR_bit =1;                                // разрешение прерывания при завершении передачи
    
    
    DMA_bit =1;                              // режим прямого доступа к памяти АЦП
    
    SMPx_x0_ADC1_SMPR2_bit  =1;         
    SMPx_x1_ADC1_SMPR2_bit  =0;
    SMPx_x2_ADC1_SMPR2_bit  =0;
    
    ADCPRE0_bit =1;    //
    ADCPRE1_bit =0;
    
    ADON_bit =1;             //вкл модуля АЦП
    SWSTART_bit =1;      //старт преобразования АЦП
    
    EN_bit =1;                   //запуск потока DMA
    
    Lcd_Init();
    Lcd_Cmd(_LCD_CURSOR_OFF);
    Lcd_Cmd(_LCD_CLEAR);
    while(1)
    {
    if(TCIF0_bit )      // Флаг прерывания завершения передачи потока
    {
    t=11;
    }
    else if(HTIF0_bit )    // Флаг прерывания половинной передачи потока
    {
    t=22;
    }
    else if(TEIF0_bit )      // Флаг прерывания ошибки передачи потока
    {
    t=33;
    }
    else if(DMEIF0_bit )   // Флаг прерывания из-за ошибки прямого режима потока
    {
    t=44;
    }
    WordToStr(t, txt);
    Lcd_Out(1, 1, txt);
    }
    }
    
    
    void DMA_INT_2() iv IVT_INT_DMA2_Stream0 ics ICS_AUTO     // прерывания при завершении передачи
    {
    CTEIF0_bit =1;
    ADC1_SQR3.B0=i;
    EN_bit =1;
    SWSTART_bit =1;
    i++;
    }

     

  2. 5 минут назад, BARS_ сказал:

    Я ведь уже расписал почему не будет быстрее.

    Так ведь если что то писать дальше что нибудь то выходит остальной код будет обрабатываться с частотой 1.5 МГц? ЧТо то это совсем мало.

    Просто хочу понять это норма для такого МК?

  3. Ладно спрошу по другому вот настрою я тактовый генератор на 100 МГц затактирую из периферии только PORTA и буду изменять состояние всего регистра  GPIOA->ODR=~GPIOA->ODR как на коде ниже порты настрою на GPIO_SPEED_FREQ_HIGHT 

    int main()
    {
    while(1)
    {
    GPIOA->ODR=~GPIOA->ODR;
    }
    }

    какую я частоту получу на портах A?

  4. Всем здрасти.
    Накидал код обработки двух каналов АЦП одного регулярного одного инжекторного. Решил посмотреть сколько тиков мне останется после чтения из регистров АЦП данные тиков вывожу на вывод PA0 и вижу что осталось на остальные нужды всего 1,563 МГц из 100 МГц тактового генератора. Почему так мало? МК подделка?
    АЦП настроен в автоматическом перезапуски.

    1450236291_.GIF.796d1b318d40c896aea1269a41a51ded.GIF

    /* USER CODE BEGIN Header */
    /**
      ******************************************************************************
      * @file           : main.c
      * @brief          : Main program body
      ******************************************************************************
      * @attention
      *
      * Copyright (c) 2022 STMicroelectronics.
      * All rights reserved.
      *
      * This software is licensed under terms that can be found in the LICENSE file
      * in the root directory of this software component.
      * If no LICENSE file comes with this software, it is provided AS-IS.
      *
      ******************************************************************************
      */
    /* USER CODE END Header */
    /* Includes ------------------------------------------------------------------*/
    #include "main.h"
     
    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "hd44780.h"
    /* USER CODE END Includes */
     
    /* Private typedef -----------------------------------------------------------*/
    /* USER CODE BEGIN PTD */
     
    /* USER CODE END PTD */
     
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    /* USER CODE END PD */
     
    /* Private macro -------------------------------------------------------------*/
    /* USER CODE BEGIN PM */
     
    /* USER CODE END PM */
     
    /* Private variables ---------------------------------------------------------*/
     ADC_HandleTypeDef hadc1;
     
    TIM_HandleTypeDef htim4;
     
    /* USER CODE BEGIN PV */
     
    /* USER CODE END PV */
     
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_ADC1_Init(void);
    static void MX_TIM4_Init(void);
    /* USER CODE BEGIN PFP */
    uint16_t cout_adc_r=0, cout_adc_i=0;
    char txt[20];
    /* USER CODE END PFP */
     
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
     
    /* USER CODE END 0 */
     
    /**
      * @brief  The application entry point.
      * @retval int
      */
    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_ADC1_Init();
      MX_TIM4_Init();
      /* USER CODE BEGIN 2 */
      HAL_ADC_Start(&hadc1);
      HAL_ADCEx_InjectedStart(&hadc1);
      lcd_init();
      lcd_clear();
      //lcd_out_txt(0,0,"HALLO");
      /* USER CODE END 2 */
     
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
          cout_adc_r=ADC1->DR;
     
          cout_adc_i=ADC1->JDR1;
     
          GPIOA->ODR=~GPIOA->ODR;
        /* USER CODE END WHILE */
     
        /* USER CODE BEGIN 3 */
      }
      /* USER CODE END 3 */
    }
     
    /**
      * @brief System Clock Configuration
      * @retval None
      */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
     
      /** Configure the main internal regulator output voltage
      */
      __HAL_RCC_PWR_CLK_ENABLE();
      __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
     
      /** Initializes the RCC Oscillators according to the specified parameters
      * in the RCC_OscInitTypeDef structure.
      */
      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 = 12;
      RCC_OscInitStruct.PLL.PLLN = 96;
      RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
      RCC_OscInitStruct.PLL.PLLQ = 4;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
     
      /** Initializes the CPU, AHB and APB buses clocks
      */
      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_DIV2;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
     
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
      {
        Error_Handler();
      }
    }
     
    /**
      * @brief ADC1 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_ADC1_Init(void)
    {
     
      /* USER CODE BEGIN ADC1_Init 0 */
     
      /* USER CODE END ADC1_Init 0 */
     
      ADC_ChannelConfTypeDef sConfig = {0};
      ADC_InjectionConfTypeDef sConfigInjected = {0};
     
      /* USER CODE BEGIN ADC1_Init 1 */
     
      /* USER CODE END ADC1_Init 1 */
     
      /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
      */
      hadc1.Instance = ADC1;
      hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
      hadc1.Init.Resolution = ADC_RESOLUTION_12B;
      hadc1.Init.ScanConvMode = ENABLE;
      hadc1.Init.ContinuousConvMode = ENABLE;
      hadc1.Init.DiscontinuousConvMode = DISABLE;
      hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
      hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
      hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
      hadc1.Init.NbrOfConversion = 1;
      hadc1.Init.DMAContinuousRequests = DISABLE;
      hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
      if (HAL_ADC_Init(&hadc1) != HAL_OK)
      {
        Error_Handler();
      }
     
      /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
      */
      sConfig.Channel = ADC_CHANNEL_1;
      sConfig.Rank = 1;
      sConfig.SamplingTime = ADC_SAMPLETIME_144CYCLES;
      if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
      {
        Error_Handler();
      }
     
      /** Configures for the selected ADC injected channel its corresponding rank in the sequencer and its sample time
      */
      sConfigInjected.InjectedChannel = ADC_CHANNEL_2;
      sConfigInjected.InjectedRank = 1;
      sConfigInjected.InjectedNbrOfConversion = 1;
      sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_144CYCLES;
      sConfigInjected.ExternalTrigInjecConvEdge = ADC_EXTERNALTRIGINJECCONVEDGE_NONE;
      sConfigInjected.ExternalTrigInjecConv = ADC_INJECTED_SOFTWARE_START;
      sConfigInjected.AutoInjectedConv = ENABLE;
      sConfigInjected.InjectedDiscontinuousConvMode = DISABLE;
      sConfigInjected.InjectedOffset = 0;
      if (HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN ADC1_Init 2 */
     
      /* USER CODE END ADC1_Init 2 */
     
    }
     
    /**
      * @brief TIM4 Initialization Function
      * @param None
      * @retval None
      */
    static void MX_TIM4_Init(void)
    {
     
      /* USER CODE BEGIN TIM4_Init 0 */
     
      /* USER CODE END TIM4_Init 0 */
     
      TIM_ClockConfigTypeDef sClockSourceConfig = {0};
      TIM_MasterConfigTypeDef sMasterConfig = {0};
     
      /* USER CODE BEGIN TIM4_Init 1 */
     
      /* USER CODE END TIM4_Init 1 */
      htim4.Instance = TIM4;
      htim4.Init.Prescaler = 0;
      htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim4.Init.Period = 65535;
      htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
      {
        Error_Handler();
      }
      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
      if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
      {
        Error_Handler();
      }
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
      /* USER CODE BEGIN TIM4_Init 2 */
     
      /* USER CODE END TIM4_Init 2 */
     
    }
     
    /**
      * @brief GPIO Initialization Function
      * @param None
      * @retval None
      */
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
     
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOH_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();
     
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
     
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6
                              |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_RESET);
     
      /*Configure GPIO pin : PA0 */
      GPIO_InitStruct.Pin = GPIO_PIN_0;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
     
      /*Configure GPIO pins : PB3 PB4 PB5 PB6
                               PB7 PB8 PB9 */
      GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6
                              |GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
     
    }
     
    /* USER CODE BEGIN 4 */
     
    /* USER CODE END 4 */
     
    /**
      * @brief  This function is executed in case of error occurrence.
      * @retval None
      */
    void Error_Handler(void)
    {
      /* USER CODE BEGIN Error_Handler_Debug */
      /* User can add his own implementation to report the HAL error return state */
      __disable_irq();
      while (1)
      {
      }
      /* USER CODE END Error_Handler_Debug */
    }
     
    #ifdef  USE_FULL_ASSERT
    /**
      * @brief  Reports the name of the source file and the source line number
      *         where the assert_param error has occurred.
      * @param  file: pointer to the source file name
      * @param  line: assert_param error line source number
      * @retval None
      */
    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 /* USE_FULL_ASSERT */

     

  5. В 08.10.2022 в 12:27, TaxMen сказал:

    ... вот один из...

    Епцтедей у дураков мысли сходятся. Сейчас делаю диплом и тоже дежурку на трансе 50 Гц и GDT и ТТ всё похоже.

  6. В 22.09.2022 в 21:23, drubtsow сказал:

    14.5х2=29

    Вы такие тупые советы не слушайте. А почему на два может на 1000000000000000000000 нужно умножить. У вас скорей всего дело в управлении и транзюки открываются на встречу друг другу получается высокий сквозной ток.

  7. Всем привет.
    Есть такой вопрос.
    Почему выход 3.3 Вольта собирают в комповых БП отдельной схемой преобразователя?
    Почему бы не включить эти 3.3 Вольта в дроссель групповой стабилизации ну соответственно так же добавить отдельную обмотку и отдельный выпрямитель для линии 3,3 Вольта.
    pm230w_lp-8.thumb.gif.920cced4efaf16714e38363e132fff3c.gif

  8. В 19.09.2022 в 12:15, Гость_Григорий_Т. сказал:

    это защита ключей по току.

    Интересный подход а шунты то я и проморгал. Ну и как работает такой способ?

    Так то вроде всё не плохо с этой IR2153 позволяет в короткие сроки экстренно построить питальник малых габаритов и получить кучу выходных напряжений НО вот этот нагрев сердечника, почему греется?

  9. А думаешь если задействуешь USART то что то изменится? Всё равно придётся слать данные и получать в прерывании и это же прерывание будет мешать я уже пробовал у хвалёных STM на 100 МГц сил не хватает.

  10. 4 часа назад, BARS_ сказал:

    Да он для всего вреден:crazy:

    Не соглашусь, хотя бы фирма сделала себе рекламу с лёгким стартом в мир stm32.

    Это отступление от темы.

    Если сравнивать с PIC18 и его USART то там всё просто когда буфер приёма полон то тогда прерывание и не каких компромисов, поэтому очень легко и надёжно контролировать массив данных.

  11. HAL для USART не очень полезен.

    https://istarik.ru/blog/stm32/120.html

    Вообще как то странно организованно нужно с начало определить сколько будет принято байт и ждать пока они все прилетят только тогда будет прерывание но если не дойдут байты то прерывание не будет.

  12. 12 часов назад, Kraftverk сказал:

    /////////////

    Это естественно что шим контролеру силу не стоит приближать речь о длинных проводниках от силы до транса и от транса до диодного моста.

  13. В 22.08.2022 в 11:35, ummagumma сказал:

    там дорожка слишком длиная всё взорвёца из-за этого ой!

    Проводил иксперемент подключал трансформатор к полумосту через метровые провода, нагружал выход до 500 Ватт, козу вешал и не чего. Осциллограммы по выходу как были что при включении трансформатора в плотную к полумосту что через метровые провода. Тоже тут писак начитался всяких мол топологию плат нужно прям супер пупер такую только гении смогут, а потом вообще на многодыре стал питальники паять.

  14. В 19.08.2022 в 09:23, ummagumma сказал:

    умиляют эти ламёрские измышленья типа мощ полумоста ограничена 2 000 ватт. всё думаю и не могу понять, откуда этот мусор в ихних головах?

    Да не ограничена 2000 КВт но вот амплитуда тока первичной обмотки у моста ниже а у полумоста выше в два раза. Правда на что это влияет я не знаю. 

×
×
  • Создать...