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

Не работает ШИМ


DrobyshevAlex

Рекомендуемые сообщения

Подскажите что я делаю не так? Создал в кубе проект, настроил ШИМ на таймере 4 на канале 1.

Подсветилась ножка PB6. Но код для настройки GPIO данной ноги не появился.

Вот код

Скрытый текст

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether 
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * Copyright (c) 2019 STMicroelectronics International N.V. 
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without 
  * modification, are permitted, provided that the following conditions are met:
  *
  * 1. Redistribution of source code must retain the above copyright notice, 
  *    this list of conditions and the following disclaimer.
  * 2. Redistributions in binary form must reproduce the above copyright notice,
  *    this list of conditions and the following disclaimer in the documentation
  *    and/or other materials provided with the distribution.
  * 3. Neither the name of STMicroelectronics nor the names of other 
  *    contributors to this software may be used to endorse or promote products 
  *    derived from this software without specific written permission.
  * 4. This software, including modifications and/or derivative works of this 
  *    software, must execute solely and exclusively on microcontroller or
  *    microprocessor devices manufactured by or for STMicroelectronics.
  * 5. Redistribution and use of this software other than as permitted under 
  *    this license is void and will automatically terminate your rights under 
  *    this license. 
  *
  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* 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 ---------------------------------------------------------*/
TIM_HandleTypeDef htim4;

osThreadId defaultTaskHandle;
/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_TIM4_Init(void);
void StartDefaultTask(void const * argument);

/* USER CODE BEGIN PFP */

/* 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_TIM4_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */
 

  /* Start scheduler */
  osKernelStart();
  
  /* We should never get here as control is now taken by the scheduler */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* 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};

  /**Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /**Initializes the CPU, AHB and APB busses 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_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @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_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {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 = 1000;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_OC_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_ACTIVE;
  sConfigOC.Pulse = 500;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_OC_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM4_Init 2 */

  /* USER CODE END TIM4_Init 2 */
  HAL_TIM_MspPostInit(&htim4);

}

/**
  * @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_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14, GPIO_PIN_SET);

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11, GPIO_PIN_SET);

  /*Configure GPIO pins : PB12 PB13 PB14 */
  GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /*Configure GPIO pins : PA8 PA9 PA10 PA11 */
  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used 
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{

  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END 5 */ 
}

/**
  * @brief  Period elapsed callback in non blocking mode
  * @note   This function is called  when TIM1 interrupt took place, inside
  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  * a global variable "uwTick" used as application time base.
  * @param  htim : TIM handle
  * @retval None
  */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  /* USER CODE BEGIN Callback 0 */

  /* USER CODE END Callback 0 */
  if (htim->Instance == TIM1) {
    HAL_IncTick();
  }
  /* USER CODE BEGIN Callback 1 */

  /* USER CODE END Callback 1 */
}

/**
  * @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 */

  /* 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,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 

Пробовал вручную дописать 

    GPIO_InitStruct.Pin = GPIO_PIN_6;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

эффекта 0. на ноге всегда 0.1В

Ссылка на комментарий
Поделиться на другие сайты

Что то ничего это не дало. Там 1 урок по PWM. Я включил прерывания, дописал сам

HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);

Ничего не изменилось :)

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Есть же мануал по HAL  читайте или предлагаете нам читать за вас и потом рассказать чтобы вы время не тратили свое драгоценное?

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

1 час назад, Oxford сказал:

Есть же мануал по HAL 

Я уже 50 уроков прочел, во всех одно и то же и должно работать, в комментах пишут работает. Но не работает у меня! Я уе таймер перенес на другой канал на другую ногу. На первой был всегда 0 на второй всегда 3.5В.

1 час назад, Oxford сказал:

чтобы вы время не тратили свое драгоценное?

Ни в коем случае, никогда не тратье на меня свое время! И сами не тратье время других своими ответами :)

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

Ну и добавлял строку как писал выше

HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);

 

pwm1.jpg

Ссылка на комментарий
Поделиться на другие сайты

а может все работает, просто частота конская? Либо наоборот, раз в 5 лет тикает

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

16 минут назад, mail_robot сказал:

а может все работает, просто частота конская? Либо наоборот, раз в 5 лет тикает

Частота 72 МГц. Дело в том что  ставлю хоть 0 хоть 1000 хоть 65000 на ноге ПБ6 с таймером 4 всегда 0. Меняю таймер на 2 на ногу ПА0 там при тех же настройках всегда 3.5. :)

 

Ссылка на комментарий
Поделиться на другие сайты

27 минут назад, DrobyshevAlex сказал:

Меняю таймер на 2 на ногу ПА0 там при тех же настройках всегда 3.5. :)

Вру. Там 3.5 если генерить только кубом, если добавить вручную настройку порта как я показал выше то там 0.

Ссылка на комментарий
Поделиться на другие сайты

Блин, я уже куб обновил, keil запустил, настроил все что можно, уже какой только код не пробовал - не  работает шим вообще! Светодиод никогда не горит.

Просто перевожу ногу в выход и подаю на нее 1 он горит, то етсь нога целая.

Ссылка на комментарий
Поделиться на другие сайты

Так, выкинул HAL, заработало... Теперь вопрос как работать с даташит?)

Если в авр все просто, открыл даташит и поиском нашел регистр нужный то тут пытаюсь найти OC2M или CCMR1 в даташит 0 совпадений...

Ссылка на комментарий
Поделиться на другие сайты

Вот рабочий код

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

GPIO_InitTypeDef PORT;

	  PORT.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1);

	  PORT.GPIO_Mode = GPIO_Mode_AF_PP;
	  PORT.GPIO_Speed = GPIO_Speed_50MHz;
	  GPIO_Init(GPIOA, &PORT);

	  TIM2->CCER |= (TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E);

	  TIM2->CCMR1|=(TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);

	  TIM2->CR1 |= TIM_CR1_CEN;

	  TIM2->CCR1 = 3000;
	  TIM2->CCR2 = 1000;

а вот этот не работает

TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM2_Init 1 */

  /* USER CODE END TIM2_Init 1 */
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 65535;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 63000;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.Pulse = 1000;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM2_Init 2 */

  /* USER CODE END TIM2_Init 2 */
  HAL_TIM_MspPostInit(&htim2);



GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);



	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Start(&htim2, TIM_CHANNEL_1);
	HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
	HAL_TIMEx_PWMN_Start(&htim2, TIM_CHANNEL_2);

		  TIM2->CCER |= (TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E);

		  TIM2->CCMR1|=(TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2);

		  TIM2->CR1 |= TIM_CR1_CEN;

		  TIM2->CCR1 = 3000;
		  TIM2->CCR2 = 1000;

 

Что не так с халом) я пчти все перенес кроме двух строк RCC 

например эта  

TIM2->CCER |= (TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E);

я так понимаю и в хале есть вот тут

sConfigOC.OCMode = TIM_OCMODE_PWM1;

ибо

#define TIM_OCMODE_PWM1                     (TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2)

 

11 минуту назад, Oxford сказал:

Открой референс мануал,

я загуглил stm32f103c8t6 datasheet

по первой же ссылке пдф как обычно

Но в нем нефига нет) Ну я нашел кое как где есть, но как то странно это)

Ссылка на комментарий
Поделиться на другие сайты

Так надо не гуглить, а зайти на сайт ST найти свой МК https://www.st.com/en/microcontrollers/stm32f103c8.html

Затем ниже будет Resources, листаем до Reference Manuals, качаем доку RM0008

 

Нужно понимать что такое даташит и референс мануал, есть еще апноуты, еррата, программинг мануал и другие ресурсы.

 

У вас проблемы возникают потому что вы программируете на авось без знания аппаратуры микроконтроллера.

Даже HAL требует изучения мануала.Если хотите научиться программировать STM32 без геморроя, то нужно программировать его через CMSIS изучая аппаратуру, вы должны знать что делает каждый бит в регистре. Периферия МК состоит из регистров, есть статусные, конфигурационные, данные, прерывания...через них вы общаетесь с периферией и она с вами. Ну и дальше по мануалу. В референс мануале расписаны режимы периферии, как настраивать тот или иной режим.

 

На Youtube найдите уроки по CMSIS и вашему МК.

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Oxford сказал:

Так надо не гуглить, а зайти на сайт ST

Гугл и дал ссылку на сайт ST.

1 час назад, Oxford сказал:

Нужно понимать что такое даташит и референс мануал

Ну ц атмела проблем не было)

1 час назад, Oxford сказал:

Если хотите научиться программировать STM32 без геморроя, то нужно программировать его через CMSIS изучая аппаратуру, вы должны знать что делает каждый бит в регистре.

Вот Вы если мне не изменяет память были в моей соседней теме про компиляцию под стм32 где я именно это и написал.

Я полностью согласен, именно по этому и загуглил даташит) Ибо ответа на форуме толкового не добиться, либо модераторы похамят типа вот ты нуб а я крутой такой лет 50 занимаюсь этим, либо просто мусор напишут)

 

Ссылка на комментарий
Поделиться на другие сайты

@MasterElectric спасибо за ссылку, но, как я написал выше я без ХАЛа разобрался. А вот в ХАЛ не фига не работает.

Все работает если добавить эти строки

  RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;

  TIM2->PSC = 72;
  TIM2->ARR = 1000;

  TIM2->CCER |= TIM_CCER_CC2E | TIM_CCER_CC1E;
  TIM2->BDTR |= TIM_BDTR_MOE;

  TIM2->CCMR1 |= TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2;

  TIM2->CR1 |= TIM_CR1_CEN;

  TIM2->CCR1 = 900;
  TIM2->CCR2 = 50;

Выкинув любую из строк - ШИМ не работает.

Хотя перед этим кодом все это прописано ХАЛом

static void MX_TIM2_Init(void)
{

  /* USER CODE BEGIN TIM2_Init 0 */

  /* USER CODE END TIM2_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  /* USER CODE BEGIN TIM2_Init 1 */

  /* USER CODE END TIM2_Init 1 */
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 72;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 1000;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 900;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.Pulse = 50;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM2_Init 2 */

  /* USER CODE END TIM2_Init 2 */
  HAL_TIM_MspPostInit(&htim2);

}

Проходил дебагом, в Errror_Handler не падает. Но если убрать например TIM2->CCR2 = 50; - то светодиод не работает, то есть этот код

  sConfigOC.Pulse = 50;
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)

 не играет роли

Прав был @BARS_ когда говорил что HAL плохая штука :D А ХАЛоводы налетевшие на него видимо зазнались и не могут спустится с небес что бы помочь простым смертным. Ну не могут же они просто не знать? :)

Ссылка на комментарий
Поделиться на другие сайты

Вообщем разобрался.

до этой строки

RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;

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

откопал что в HAL есть аналог 

__HAL_RCC_TIM2_CLK_ENABLE();

Остался вопрос, как видно на скрине, там у меня тактирование в кубе выбрано, то есть настроено же. И ноги настроены. Почему тогда не генерируется код, ъотя бы в комментариях что настройте ноги и включите тактирование вручную?

То есть куб сгенерировал функцию инициализации портов, таймера и тактирования, и вставил вызов этих функций. Но функцию вызывать до включения тактирования бессмысленно. То есть программисты куба этого не знают? Ибо если бы знали то они бы не вызывали код инициализации таймера до включения тактирования имхо)

То есть можно сказать типа сам допиши... Но почему тогда для портов тактирование они включают сами?

  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

эти строки были вставлены автоматически.

ну и кода для инициализации порта вывода шима  не появляется, я в кубе настраиваю его на HIGH скорость, или на любую другую, появляется галочка что модифицировано, но при генерации кода не появляется и дебагер показывает что настройки порта нет пока я в ручную не пропишу ее хотя на скрине видно что порт подсветился...

Ссылка на комментарий
Поделиться на другие сайты

Завязывай ты так изучать. Есть рабочий код на CMSIS сиди и хотя бы пошагово разбирай что происходит читая Reference manual там описано абсолютно все.

Ты не дал проект, а дал кусок кода так сложнее понять где ошибка. На st.com есть полный спектр документации качай изучай. Сравнивать почему работает так, а так не работает наверное никто не будет. Прикладывай максимум усилий в обучении. Успехов. 

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

51 минуту назад, MasterElectric сказал:

дал кусок кода

Это полный код что дал КубМХ

51 минуту назад, MasterElectric сказал:

хотя бы пошагово разбирай что происходит

 

52 минуты назад, MasterElectric сказал:

код на CMSIS сиди и хотя бы пошагово разбирай

Ну так я без ХАЛа прекрасно понимаю что происходит что там разбирать?)

Просто на хале не стартовало. А в ХАЛе разбирать, ну я попытался, часов 10 убил на то что бы перелапатить кучу статей и исходников ХАЛа в надежде найти где же беда. И Оказалось что нигде не вызывалось __HAL_RCC_TIM2_CLK_ENABLE() то есть для ног они вызвали сами, но ногу не настроили одну, хотя в кубе пометилось что будет ее настройка а код не генерит. Нашел аж на зарубежных форумах, что хал не фига не генерит код, именно это толкнуло на мысль, что нужно что то допилить.

То есть куб говорит что я настроил
Сгенерил код натсройки таймера
Скомпилилось без ошибок.
Но код выполняется бзе тактирования таймера то есть ничего ен делая. Где логика?

 

56 минут назад, MasterElectric сказал:

Сравнивать почему работает так, а так не работает наверное никто не будет.

Я сравнил сам, просто если, допустим я любитель хала и юзаю его, то мне не трудно глянуть на код и сказать что не хватает чего то. А это не просто чего то а настройка ноги и включение тактирования.

 

Ссылка на комментарий
Поделиться на другие сайты

Последняя программа куба это п...ц какой то, что они там принимали когда делали интерфейс такой. В предыдущих версиях кроме строчки HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); ничего не надо было делать, я потому и говорил , что на народстрим пример рабочий.

Ссылка на комментарий
Поделиться на другие сайты

46 минут назад, elki сказал:

В предыдущих версиях кроме строчки HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); ничего не надо было делать

Ну тут понятно, запустить например не сразу надо. Но вот включения тактового сигнала и настройка портов странно почему не генерится :)

Ссылка на комментарий
Поделиться на другие сайты

Это очень хорошо что ты понимаешь. Зачем тогда тебе ХАЛ? ты же видишь что то что на CMSIS делаеться за одну строку в ХАЛ налеплено целых функций кучу, ну и размер кода сравни. Не трать время на этот КАЛ. Кортексы очень навороченные ядра там много чего интересного есть, ну и стм32 тоже по периферии очень богаты и интересны. Можно очень красиво и качественно решать любые задачи. Например твой индикатор может работать практически в "фоне".  Зная все возможности аппаратной части ты уже сможешь качественно решать задачи, а не писать не лучше чем ардуинщики.

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, MasterElectric сказал:

Зачем тогда тебе ХАЛ?

Если Вы прочтете соседнюю тему про компиляцию, то там убеждали меня что ХАЛ это круто) Все кроме барса емнип.

Ну и тут такая штука, что я с компиляторами разирался. После Атмелстудии сложно. Я там создал проект, вписал include "avr/delay.h" вот тебе задержка "interrupt.h" вот тебе прерывания и тд. А тут я не понимаю где файлы брать) Ну сейчас уже немного разобрался, и к Кеил и в Кокосе как подключить. Тепреь разоратся с конфигом кварца и в целом все. Но куб удобен что бы лянуть быстро на какой ноге что. Блин я цитирую @BARS_ :D

3 минуты назад, MasterElectric сказал:

ты же видишь что то что на CMSIS делаеться за одну строку в ХАЛ налеплено целых функций кучу, ну и размер кода сравни.

Ну я к такому выводи и пришел, особенно с ХАЛом даташит не совместим))

7 минут назад, MasterElectric сказал:

работать практически в "фоне"

Да, я читал про DMA. Пока я подключил  lcd 128x160, и1602a. Теперь на очереди DHT-11 и AM2320. Разберусь и тогда начну изучать DMA и прочие фишки которых не было в атмеге8 :) Раскидываю по папкам что бы потом что надо, быстро открыл посмотрел как работает не читать опять мануалы и статьи) Мне надо инкубатор к весне сделать)) Заказал шаговые двигатели и вот из алюминия делаю поворотный механизм сижу :D

В планах было еще прилепить nrf24l01+ для того что бы индикатор вообще в доме поставить) Что бы видеть влажность и температуру. Вот надо еще ее под нее набросать код.

15 минут назад, MasterElectric сказал:

ардуинщики.

Ну я ардуино в глаза не видел) Я под атмеги писал и аттини, не вижу смысла в плате на тех. Мне хватало протеуса потестить если уж очень надо. Тут посложней мк и я решил купить за 100р отладочную плату на ф103

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...