Arduino IDE + аддон от stm32

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Уважаемый VE3OWW, один из вариантов Вашего кода занимает 143 строки, другой - 264. Притом, Вы сами пишете, что пытаетесь реализовать blink. Вам не кажется, что Вы что-то не то делаете?

Среда Arduino IDE сама добавляет в Ваш скетч около 15к кода инициализации - там много чего есть. Зачем пытаться по второму разу инициализировать то же самое?

Если Вы хотите непременно инициализировать МК с нуля, вряд ли Arduino IDE будет для этого подходящим инструментом.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

VE3OWW пишет:

4) Зачем у вас две функции с одним именем ? Если Вас не сильно затруднит, конкретезируйте, о каких функциях речь?

стр №№ 155 и 203ь по твоему коду. Ты клоун или тролль?

 

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Уважаемый wdrakula

Должен признать - я клоун!
 
Спасибо, что ткнули!!!!!
 
Убрал задвоение,
вот код:
 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : my_blink_HAL_001.ino
  * Description        : Main program body
  ******************************************************************************
  *
  * A blink sketch for a "Blue Pill" Board (STM32F103C8) in STM32DUINO (STM Core)
  * Arduino 1.8.16
  * 
  * TRYING LED BLINKING WITH TIMER INTERRUPT
  * https://www.mepits.com/tutorial/551/arm/how-to-interface-arm-with-led-ti...
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* 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 */
#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
TIM_HandleTypeDef htim1;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void SystemClock_Config(void);
//void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);
void TIM1_UP_IRQHandler(void);
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM1) //check if the interrupt comes from TIM1
  {
    HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
  }
}
/* USER CODE END 0 */















//void TIM3_IRQHandler(void)
//{
    /* USER CODE BEGIN TIM3_IRQn 0 */
    /* USER CODE END TIM3_IRQn 0 */
    //HAL_TIM_IRQHandler(&htim3);
    /* USER CODE BEGIN TIM3_IRQn 1 */
    //HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    /* USER CODE END TIM3_IRQn 1 */
//}





















/* System Clock Configuration */
extern "C" 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_MUL2;
  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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

    /**Enables the Clock Security System 
    */
  HAL_RCC_EnableCSS();

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

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

/* TIM1 init function */
static void MX_TIM1_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 64000;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_Base_Start_IT(&htim1); // запуск таймера
}

/*
static uint32_t counter = 0;
if (counter >= 500)
{
    //HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
    counter = 0;
 }
 counter++;
*/

void TIM1_UP_IRQHandler(void) // Timer Interrupt Handler
{
  void timer1_init(int frequency) {              // Set up Timer (device specific)
  NVIC_SetPriority (TIM1_UP_IRQn, 1);            // Set Timer priority
  NVIC_EnableIRQ (TIM1_UP_IRQn);                 // Enable Timer Interrupt
  /* USER CODE BEGIN TIM1_UP_IRQn 0 */
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  /* USER CODE END TIM1_UP_IRQn 0 */
}


/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();  

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 - on-board LED_PIN */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

void setup() {
  // put your setup code here, to run once:
  /* 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_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_Delay(500);
  HAL_TIM_Base_Start_IT(&htim1); //START TIMER 1 IN INTERRUPT MODE
  /* USER CODE END 2 */
}

  /* Infinite loop */
void loop() {
  // put your main code here, to run repeatedly:
  //HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
  //HAL_Delay(1000);
}

 

 
но, ошибки следующие:
 
 
 
D:\Portable\arduino-1.8.16\portable\sketchbook\BLUEPILL\Blink_HAL\my_blink_HAL_001\my_blink_HAL_001.ino: In function 'void TIM1_UP_IRQHandler()':
my_blink_HAL_001:196:35: error: a function-definition is not allowed here before '{' token
  196 |   void timer1_init(int frequency) {              // Set up Timer (device specific)
      |                                   ^
my_blink_HAL_001:213:1: error: a function-definition is not allowed here before '{' token
  213 | {
      | ^
my_blink_HAL_001:229:14: error: a function-definition is not allowed here before '{' token
  229 | void setup() {
      |              ^
my_blink_HAL_001:251:13: error: a function-definition is not allowed here before '{' token
  251 | void loop() {
      |             ^
my_blink_HAL_001:255:1: error: expected '}' at end of input
  255 | }
      | ^
D:\Portable\arduino-1.8.16\portable\sketchbook\BLUEPILL\Blink_HAL\my_blink_HAL_001\my_blink_HAL_001.ino:195:1: note: to match this '{'
  195 | {
      | ^
exit status 1
a function-definition is not allowed here before '{' token
 
 
Блин, прошу понять и простить....

 

nik182
Offline
Зарегистрирован: 04.05.2015

в 195 строке убрать void и { заменить на ;

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Уважаемый andriano

Я просто пытаюсь каким-то образом разграничить (в своих итересах) Arduino IDE и STM32HAL  для своих (будущих) целей. Мне нравится среда Arduino богатством  кода и библиотек,  но есть необходимость использовать STM32... Пытаюсь совместить....

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Поменял как было посоветано:

в 195 строке убрать void и { заменить на ;

 

/* USER CODE BEGIN Header */

/**
  ******************************************************************************
  * File Name          : my_blink_HAL_001.ino
  * Description        : Main program body
  ******************************************************************************
  *
  * A blink sketch for a "Blue Pill" Board (STM32F103C8) in STM32DUINO (STM Core)
  * Arduino 1.8.16
  * 
  * TRYING LED BLINKING WITH TIMER INTERRUPT
  * https://www.mepits.com/tutorial/551/arm/how-to-interface-arm-with-led-timer-interrupt
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* 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 */
#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
TIM_HandleTypeDef htim1;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
void SystemClock_Config(void);
//void Error_Handler(void);
static void MX_GPIO_Init(void);
static void MX_TIM1_Init(void);
void TIM1_UP_IRQHandler(void);
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance == TIM1) //check if the interrupt comes from TIM1
  {
    HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
  }
}
/* USER CODE END 0 */

/* System Clock Configuration */
extern "C" 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_MUL2;
  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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

    /**Enables the Clock Security System 
    */
  HAL_RCC_EnableCSS();

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

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

/* TIM1 init function */
static void MX_TIM1_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig;
  TIM_MasterConfigTypeDef sMasterConfig;
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 64000;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 1;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_Base_Start_IT(&htim1); // запуск таймера
}

/*
static uint32_t counter = 0;
if (counter >= 500)
{
    //HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
    counter = 0;
 }
 counter++;
*/

void TIM1_UP_IRQHandler(void) // Timer Interrupt Handler
{
  timer1_init(int frequency);              // Set up Timer (device specific)
  NVIC_SetPriority (TIM1_UP_IRQn, 1);            // Set Timer priority
  NVIC_EnableIRQ (TIM1_UP_IRQn);                 // Enable Timer Interrupt
  /* USER CODE BEGIN TIM1_UP_IRQn 0 */
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  /* USER CODE END TIM1_UP_IRQn 0 */
}


/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();  

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);

  /*Configure GPIO pin : PC13 - on-board LED_PIN */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

void setup() {
  // put your setup code here, to run once:
  /* 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_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_Delay(500);
  HAL_TIM_Base_Start_IT(&htim1); //START TIMER 1 IN INTERRUPT MODE
  /* USER CODE END 2 */
}

  /* Infinite loop */
void loop() {
  // put your main code here, to run repeatedly:
  //HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_PIN);
  //HAL_Delay(1000);
}

 

ОШИБКИ КОМПИЛЯТОРА:

 
 
D:\Portable\arduino-1.8.16\portable\sketchbook\BLUEPILL\Blink_HAL\my_blink_HAL_002\my_blink_HAL_002.ino: In function 'void TIM1_UP_IRQHandler()':
my_blink_HAL_002:152:15: error: expected primary-expression before 'int'
  152 |   timer1_init(int frequency);              // Set up Timer (device specific)
      |               ^~~
my_blink_HAL_002:152:3: error: 'timer1_init' was not declared in this scope; did you mean 'timer_t'?
  152 |   timer1_init(int frequency);              // Set up Timer (device specific)
      |   ^~~~~~~~~~~
      |   timer_t
exit status 1
expected primary-expression before 'int'
 

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Строка стала 150. А что такое int frequency ? Я вообще не понимаю что эта строка делает в коде. Откуда она взялась? Это вызов подпрограммы. Нужно вставить конкретное значение. Как по мне эта строка вообще не здесь должна стоять, а там где таймер надо инициализировать. Не нахожу я в коде такой функции. Закомментируйте её.

b707
Offline
Зарегистрирован: 26.05.2017

VE3OWW пишет:

Мне нравится среда Arduino богатством  кода и библиотек,  но есть необходимость использовать STM32... Пытаюсь совместить....

блинк для стм32 в среде Ардуино занимает 6 строк. Шесть, Карл!

Ты не клоун, ты напыщенный болван. Прям сквозь интернет видно, как тебя распирает от глупой гордости, что ты пишешь для СТМ32 на HAL. А между тем по коду видно, что ты не смыслишь в этом ни черта.

Ты сначала писать на Си научись, а потом за HAL хватайся. Не надо тупить на форуме, возьми любой учебник в стиле Ардуино для чайников и читай. Все твои ошибки в коде - никакого отношения к СТМ32 не имеют, они от того что ты язык не знаешь вовсе.

 

b707
Offline
Зарегистрирован: 26.05.2017

nik182 пишет:

Строка стала 150. А что такое int frequency ? Я вообще не понимаю что эта строка делает в коде. Откуда она взялась? Это вызов подпрограммы.

да он просто СИ не знает,  тыкает строчки в код всплепую...

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

VE3OWW, вам опытные товарищи пишут мудрые вещи:

-Вот либо ты пишешь на платформе ардуино, либо на платформе stm32cube. Одно из двух. Смешивать не получится

-Если Вы хотите непременно инициализировать МК с нуля, вряд ли Arduino IDE будет для этого подходящим инструментом

-Ты сначала писать на Си научись, а потом за HAL хватайся. Все твои ошибки в коде - никакого отношения к СТМ32 не имеют, они от того что ты язык не знаешь вовсе.

Подпишусь под каждой фразой коллег.

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Всем здравствуйте. Спасибо за внимание и ответы - полезные и не очень.

Признаю свою ошибку - то, что я опубликовал - не есть код, а набор строк из разных источников. Виноват, не программист, прошу понять и простить.

Также прошу не кидатьтся выражениями - типа "напыщенный болван", это не приятно. Давайте, все же будем взаимовежливы, пожалуйста! )))

Я провел работу над ошибками, вот код, полностью рабочий для BLUE PILL и STM32DUINO (STM Official Core):

 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : HAL_blink_tim4_00.ino
  * Description        : Main program body
  ******************************************************************************
  *
  * A blink sketch for a "Blue Pill" Board (STM32F103C8) in STM32DUINO (STM Core)
  * USING STM HAL inside the Arduino IDE 1.8.16
  * IT WORKS!!!
  * 
  * TRYING LED BLINKING WITH TIMER INTERRUPT - OUTSIDE THE 'loop()' function
  * Here using Timer 4
  * Should Toggling the onboard led on PC13 every one sec.
  * 
  * Author VE3OWW - No Copyrights and no any warranty!
  * Version 00
  * Dec 24, 2021
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
TIM_HandleTypeDef htim4;
/* 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 ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
/* Timer Interrupt Handler */
extern "C" void TIM4_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim4);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
/* USER CODE END 0 */

/* System Clock Configuration */
extern "C" 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_MUL2;
  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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }

    /**Enables the Clock Security System 
    */
  HAL_RCC_EnableCSS();

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

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

/* TIM4 init function */
static void TIM4_Init(void)
{
  /* USER CODE BEGIN TIM4_Init 0 */
  __HAL_RCC_TIM4_CLK_ENABLE();
  /* 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 = 35999;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 999;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.RepetitionCounter = 0;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  HAL_TIM_Base_Init(&htim4); //////////////////
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig); //////////////////
  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 */
    NVIC_SetPriority (TIM4_IRQn, 2);            // Set Timer priority
    NVIC_EnableIRQ (TIM4_IRQn);                 // Enable Timer Interrupt
    HAL_TIM_Base_Start_IT(&htim4);              // START TIMER 4 IN INTERRUPT MODE
  /* USER CODE END TIM4_Init 2 */
}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void GPIO_Init(void)
{
  //GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();  

  /*Configure GPIO pin : PC13 - on-board LED_PIN */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  //GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  //GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

void setup() {
  // put your setup code here, to run once:
  /* 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 */
  GPIO_Init();
  TIM4_Init();
  /* USER CODE BEGIN 2 */
  HAL_Delay(100);
  /* USER CODE END 2 */
}

  /* Infinite loop */
void loop() {
  // put your main code here, to run repeatedly:
}

Все работает, как хотелось:

Arduino 1.8.16 компилирует без ошибок

Пустой цикл крутится

Светодиод блинкает....

Если у настоящих программистов вдруг появится желание подсказать, что тут можно сделать лучше - буду благодарен за советы!

Всем спасибо! С наступающими!

п.с. Чтобы работало в папке со скетчем должен также быть файл 'build_opt.h' в котором единственная строка: -DHAL_TIM_MODULE_ONLY

b707
Offline
Зарегистрирован: 26.05.2017

Я, конечно все понимаю... Инициализация стм32 требует жертв :)
но 200 строчек, чтобы по прерыванию таймера переключать пин?!

Вопрос не к ТС, а скорее к стм :)

rkit
Offline
Зарегистрирован: 23.11.2016

Куб - колоссальный кусок говна. Недокументированный, непродуманный, с кошмарными пробелами в функционале.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

VE3OWW, важно, что б вы понимали, что делает каждая строчка в программе. Ну или хотя бы основные моменты. Вот например как, имея на руках только этот ваш скетч узнать с какой частотой будет мигать светодиод? Я вот высчитал -0,2Гц. Можете сказать, как я это сделал? :)

b707
Offline
Зарегистрирован: 26.05.2017

dimax пишет:

Я вот высчитал -0,2Гц. Можете сказать, как я это сделал? :)

не согласен :) я насчитал 1 Гц

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

b707, на строчку 072 смотрел? :)

b707
Offline
Зарегистрирован: 26.05.2017

dimax пишет:
b707, на строчку 072 смотрел? :)

мне кажется, к частоте таймера это не относится, их частоты от PLL не зависят (хотя. конечно, я не слишком авторитет в этом).

Но даже если в этом я неправ - 0.2 Гц ну никак :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

b707, подождём ответа VE3OWW )

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

b707 пишет:

dimax пишет:
b707, на строчку 072 смотрел? :)

мне кажется, к частоте таймера это не относится, их частоты от PLL не зависят (хотя. конечно, я не слишком авторитет в этом).

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Спасибо за вопрос. Я рассуждал следующим образом.

Пусть мы используем Blue Pill (STM32F103C8T6) с частотой 72 Мгц.
Пусть мы используем таймер TIM2 (или TIM3, TIM4), который тактируется от шины APB1. Известно, что таймеры APB1 получают такты 36 МГц.
 
Установим значение прескалера 36000 (35999+1), тогда за секунду счетчик таймера сработает 36000000 / 36000 = 1000 раз. Значит, один тик таймера = 0,001 сек.
Установим период таймера равным 1000 (999+1), тогда таймер будет срабатывать один раз в секунду (1000 тиков = 1 сек)
 
Ошибку не исключаю. Однако, судя по частоте мигания расчет близок истине. Во всяком случае, речь наверняка идет о секундах, а не их десятых долях.
xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

VE3OWW пишет:

Спасибо за вопрос. Я рассуждал следующим образом.

Пусть мы используем Blue Pill (STM32F103C8T6) с частотой 72 Мгц.
Пусть мы используем таймер TIM2 (или TIM3, TIM4), который тактируется от шины APB1. Известно, что таймеры APB1 получают такты 36 МГц

откуда у вас 72 Мгц? кварц на blue pill 8 Мгц вы используете его и умножение PLL  на 2, все у вас тактируется от 16 Мгц

но это судя по листингу

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

VE3OWW, главное xDriver уже сказал, выходит вам нужно ознакомится со смыслом строк 059-106. Кстати эта функция вызывается до setup. В строке 182 вы вызвали его повторно. Особенность Arduino) Можно вообще стереть 059-106, тогда вызовется из другого места, и будет 72МГц.

VE3OWW
Offline
Зарегистрирован: 14.12.2021

dimax пишет:

VE3OWW, главное xDriver уже сказал, выходит вам нужно ознакомится со смыслом строк 059-106. Кстати эта функция вызывается до setup. В строке 182 вы вызвали его повторно. Особенность Arduino) Можно вообще стереть 059-106, тогда вызовется из другого места, и будет 72МГц.

Спасибо, что обратили мое внимание. Попробую погуглить и поэкспериментировать! :)

Моей главной задачей в данном, конкретном примере было: перести код, сгенерированный CUBE в среду Ардуино так, чтобы он заработал. Для меня это своего рода отправная точка. Буду пытаться разбираться дальше. Еще раз спасибо!

 

nik182
Offline
Зарегистрирован: 04.05.2015

А смысл вводить весь код из куба? Ардуина нормально инициирует много чего. Например систему тактирования, направление ног, serial over USB. Из куба можно подтянуть специфическую инициализацию какой то переферии. Этого вполне достаточно, что бы всё завелось как надо. И программа будет куда короче.

VE3OWW
Offline
Зарегистрирован: 14.12.2021

nik182 пишет:
А смысл вводить весь код из куба? Ардуина нормально инициирует много чего. Например систему тактирования, направление ног, serial over USB. Из куба можно подтянуть специфическую инициализацию какой то переферии. Этого вполне достаточно, что бы всё завелось как надо. И программа будет куда короче.

Уважаемый nik182,

у меня нет такой цели - "вводить весь код из куба". Но я столкнулся с тем, что некоторые проекты Arduino для AVR не работают для STM32, к сожалению... Как актуальный для меня пример - WebServer для чипа W5500 (by Paul Stoffregen) из примеров Arduino... Он компилируется без ошибок, срабатывает один раз и останавливается... В то же время есть подобные примеры в сети, сгенерированные кубом (как правило на HAL, который мне не очень нравится) и они работают!

Я пока не знаю, как мне решить этот вопрос, поэтому решил попробовать "другой путь" - перетащить проект из куба в Ардуино, блинькание светодиодом - это первый шаг в данном направлении... :)

nik182
Offline
Зарегистрирован: 04.05.2015

Ну так перетаскивайте всё что необходимо, а не всё в подряд. Это можно проверить постепенно добавляя модули. И это очень странно про срабатывает и останавливается. Как останавливается? Совсем зависает или сетевые приложения не работают?

VE3OWW
Offline
Зарегистрирован: 14.12.2021

nik182 пишет:

Ну так перетаскивайте всё что необходимо, а не всё в подряд. Это можно проверить постепенно добавляя модули. И это очень странно про срабатывает и останавливается. Как останавливается? Совсем зависает или сетевые приложения не работают?

Во-первых, мне очень не хватает специальных знаний, чтобы "отделить  зерна от плевел" - понять, что необходимо, а что нет. Но, я решаю это для себя путем экспериментов, почти так, как Вы и предлагаете: "постепенно убавляя модули" из рабочего проекта.

Во-вторых, что касатся примера из стандартной библиотеки Ethernet: WebServer.ino - на UNO R3 - все работает как предполагается: значения аналоговых входов микроконтроллера обновляются на Web странице с заданной частотой. При использовании этой же библиотеки в случае ядра от STM  - выводится страница с показаниями аналоговых входов один раз и больше не обновляется... Не понятно - не обновляются значения аналоговых входов или сама Web страница? Предполагаю, что второе...

В случае ядра от Roger Clark стандартная библиотека Ethernet из пакета Arduino  тут не работает совсем.... Есть своя библиотека Ethernet_stm32, которая работает отлично только для (Roger Clark)'s core, но она не совместима с ядром от STM! (По крайней мере, я смог проверить, что моя Blue Pill и модуль W5500 дружат друг с другом и могут работать как нужно!)

 

b707
Offline
Зарегистрирован: 26.05.2017

VE3OWW пишет:

В случае ядра от Roger Clark стандартная библиотека Ethernet из пакета Arduino  тут не работает совсем.... Есть своя библиотека Ethernet_stm32, которая работает отлично только для (Roger Clark)'s core, но она не совместима с ядром от STM! (По крайней мере, я смог проверить, что моя Blue Pill и модуль W5500 дружат друг с другом и могут работать как нужно!)

 

тогда что мешает собрать проект на ядре от Кларка и на совместимой с ним Эзернет библиотеке?

VE3OWW пишет:
что касатся примера из стандартной библиотеки Ethernet: WebServer.ino - на UNO R3 - все работает как предполагается: значения аналоговых входов микроконтроллера обновляются на Web странице с заданной частотой. При использовании этой же библиотеки в случае ядра от STM  - выводится страница с показаниями аналоговых входов один раз и больше не обновляется... Не понятно - не обновляются значения аналоговых входов или сама Web страница? Предполагаю, что второе...

Вообще конечно путь решения своей проблемы вы выбрали очень странный. При том что нужный вам проект Вебсервера нормально компилируется и даже работает (хотя и нестабильно) на СТМ32 - логично было бы сосредоточить усилия на доработке этого проекта, чтобы он устойчиво работал.

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

 

VE3OWW
Offline
Зарегистрирован: 14.12.2021

Еще раз, благодарю всех за конструктивно полезные замечания!

По совету dimax из скетча убрана функция extern "C" void SystemClock_Config(void), код существнно сократился, но

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : HAL_blink_tim4_01.ino
  * Description        : Main program body
  ******************************************************************************
  *
  * A blink sketch for a "Blue Pill" Board (STM32F103C8) in STM32DUINO (STM Core)
  * Using STM HAL inside the Arduino IDE 1.8.16
  * In this sketch Timer 4 is used.
  * Should Toggling the onboard led on PC13 once a sec.
  * 
  * TRYING LED BLINKING WITH TIMER INTERRUPT - OUTSIDE THE 'loop()' function
  * IT WORKS!!!
  * 
  * Author VE3OWW - No Copyrights and no any warranty!
  * Version 01
  * Dec 25, 2021
  * 
  * This sketch requires a 'build_opt.h' file in the sketch folder
  * The 'build_opt.h' should contains the only string: -DHAL_TIM_MODULE_ONLY
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
TIM_HandleTypeDef htim4;
/* 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 ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
/* Timer Interrupt Handler */
extern "C" void TIM4_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim4);
    HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
}
/* USER CODE END 0 */

/* TIM4 init function */
static void TIM4_Init(void)
{
  /* USER CODE BEGIN TIM4_Init 0 */
  __HAL_RCC_TIM4_CLK_ENABLE();
  /* 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 = 35999;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 999;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.RepetitionCounter = 0;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  HAL_TIM_Base_Init(&htim4); //////////////////
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig); //////////////////
  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 */
    NVIC_SetPriority (TIM4_IRQn, 2);            // Set Timer priority
    NVIC_EnableIRQ (TIM4_IRQn);                 // Enable Timer Interrupt
    HAL_TIM_Base_Start_IT(&htim4);              // START TIMER 4 IN INTERRUPT MODE
  /* USER CODE END TIM4_Init 2 */
}

/**
  * @brief TIM4 Initialization Function
  * @param None
  * @retval None
  */
static void GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  
  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();  

  /*Configure GPIO pin : PC13 - on-board LED_PIN */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

void setup() {
  // put your setup code here, to run once:
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  
  /* Initialize all configured peripherals */
  GPIO_Init();
  TIM4_Init();
  /* USER CODE BEGIN 2 */
  HAL_Delay(100);
  /* USER CODE END 2 */
}

  /* Infinite loop */
void loop() {
  // put your main code here, to run repeatedly:
}

работает!

 

 

 

 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

только частота теперь другая...

Какой смысл в этих экспериментах, если вы тупо добавляете или убираете куски кода, не понимая, что они делают?

Хотя бы частоту точно померили в первом и во втором случае - чтобы ваше занятие не было настолько бессмысленным.

Давайте, не ленитесь, подключите осцил или логанализатор и скажите нам, какая частота была у первого кода и какая у второго. Я, может, не согласен с выводами верхних товарищей и хочу убедится на эксперименте :)

 

VE3OWW
Offline
Зарегистрирован: 14.12.2021

b707 пишет:

тогда что мешает собрать проект на ядре от Кларка и на совместимой с ним Эзернет библиотеке?

Мне кажется, что это - тупиковый путь...  Хотя бы потому, что ядро от Кларка более не поддкрживася...

b707 пишет:

Вообще конечно путь решения своей проблемы вы выбрали очень странный. При том что нужный вам проект Вебсервера нормально компилируется и даже работает (хотя и нестабильно) на СТМ32 - логично было бы сосредоточить усилия в доработке этого проекта, чтобы он устойчиво работал.

Вместо этого вы зачем-то решили начать собирать подобное с нуля, хотя у вас очевидно не хватает знаний и знания вы эти вряд ли наберете в ближайшие год-два.

Возможно Вы - правы... И следовало бы отступиться и ждать, пока проблема разрешится сама собой... Тем более, с учетом моих "способностей..." Но для меня это не бизнес - а хобби. Поэтому буду пытаться и буду благодарен за любой совет и помощь от профессионалов!

 

b707
Offline
Зарегистрирован: 26.05.2017

VE3OWW пишет:

Возможно Вы - правы... И следовало бы отступиться и ждать, пока проблема разрешится сама собой...

вы как-то странно читаете... Я разве сказал "отступиться"? - я советую сосредоточится на доведении до ума того проекта Вебсервера, который у вас запускается и работает и вся проблема только в том, что не обновляется вебстраница.

Имея некоторый опыт портирования кода между разными МК - уверен, что в вашем случае дело в какой-нить ерунде, одной строчке кода или паре несовместимых операторов.

VE3OWW
Offline
Зарегистрирован: 14.12.2021

b707 пишет:

только частота теперь другая...

Какой смысл в этих экспериментах, если вы тупо добавляете или убираете куски кода, не понимая, что они делают?

Хотя бы частоту точно померили в первом и во втором случае - чтобы ваше занятие не было настолько бессмысленным.

Давайте, не ленитесь, подключите осцил или логанализатор и скажите нам, какая частота была у первого кода и какая у второго. Я, может, не согласен с выводами верхних товарищей и хочу убедится на эксперименте :)

 

У меня нет названных Вами измерительных приборов (осцил или логанализатор) - извините... Если у Вас они есть, можете ли Вы сделать это, и результаты сообщить? Было бы очень интересно (без подвоха)!

b707
Offline
Зарегистрирован: 26.05.2017

VE3OWW пишет:

b707 пишет:

тогда что мешает собрать проект на ядре от Кларка и на совместимой с ним Эзернет библиотеке?

Мне кажется, что это - тупиковый путь...  Хотя бы потому, что ядро от Кларка более не поддкрживася...

В некотором смысле это плюс :) - зато оно не меняется каждые два месяца, можно спокойно писать код, не опасаясь. что с выходом новой версии он "устареет" :))

На самом деле ядро Кларка не умерло, оно поддерживается и развивается несколькими программистами, хотя и не так активно, как раньше. И на данный момент ядро Кларка во многих операциях быстрее СТМ-овского

b707
Offline
Зарегистрирован: 26.05.2017

VE3OWW пишет:

У меня нет названных Вами измерительных приборов (осцил или логанализатор) - извините...

А часы у вас есть? Или смартфон? Запустите приложение "секундомер" и посчитайте, сколько раз ваш светодиод мигнет за минуту. Если обсчитаетесь на пару миганий - не беда, уж 0.2 Гц от 1 Гц мы точно сможим отличить.

b707
Offline
Зарегистрирован: 26.05.2017

Моя ставка для второго кода - 1 гц (то есть полсекунды горит, полсекунды не горит). Для первого высказывались разные версии...

VE3OWW
Offline
Зарегистрирован: 14.12.2021

b707 пишет:

Моя ставка для второго кода - 1 гц (то есть полсекунды горит, полсекунды не горит). Для первого высказывались разные версии...

Так и есть (для второго кода без extern "C" void SystemClock_Config(void)) - (то есть полсекунды горит, полсекунды не горит)! В начальном варианте - было медленнее...

 

b707
Offline
Зарегистрирован: 26.05.2017

VE3OWW пишет:

В начальнма варианте - было медленнее...

если я правильно помню арифметику - в 4.5 раза. Жалко что вы не можете померить точно.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

VE3OWW пишет:

У меня нет названных Вами измерительных приборов (осцил или логанализатор) - извините...

Может, тогда имеет смысл отложить Ваши "эксперименты" до того момента, пока появятся?

(извините, в отсутствие указанных приборов не могу написать слово "эксперименты" иначе как в кавычках)

VE3OWW
Offline
Зарегистрирован: 14.12.2021

VE3OWW пишет:

... что касатся примера из стандартной библиотеки Ethernet: WebServer.ino - на UNO R3 - все работает как предполагается: значения аналоговых входов микроконтроллера обновляются на Web странице с заданной частотой. При использовании этой же библиотеки в случае ядра от STM  - выводится страница с показаниями аналоговых входов один раз и больше не обновляется... Не понятно - не обновляются значения аналоговых входов или сама Web страница? Предполагаю, что второе...

Всем здравствуйте. Arduino IDE 1.8.16 + STM32CORE by STM

Пример из стандартной библиотеки Ethernet: WebServer.ino заработал ("из коробки") почти без изменений... Единственная правка в скетче:

Строчку "for (int analogChannel = 0; analogChannel < 6; analogChannel++) {"

чуть поправил: "for (int analogChannel = 0; analogChannel < 2; analogChannel++) {"

и все стало работать как нужно...

Моя ошибка по невнимательности - в скетче из стандартного примера для AVR в цикле считываются значения аналоговых входов A0...A5, в "голубой пилюле" STM32F103  вход A2 находится на ножке PA4, которая в моем случае является "SS" для SPI... Очевидно, что это и было проблемой....

Однако, для меня не ясно, почему эта схема работала на старом ядре от Clark? Ну да ладно... Вопрос уже не актуальный и типа риторический...

Теперь все ОК! Надеюсь, кому-то это поможет, а профи, прошу быть снисходительными и не злорадствовать... ))) Всем Добра!

b707
Offline
Зарегистрирован: 26.05.2017

VE3OWW пишет:

Моя ошибка по невнимательности - в скетче из стандартного примера для AVR в цикле считываются значения аналоговых входов A0...A5, в "голубой пилюле" STM32F103  вход A2 находится на ножке PA4,  Очевидно, что это и было проблемой....

Однако, для меня не ясно, почему эта схема работала на старом ядре от Clark?

Если вы не ошибаетесь насчет маппинга пинов в новом аддоне  и вход А2 действительно находится на ножке PA4 (что звучит странно) - то это как раз обьясняет, почему у Кларка все работало - в том аддоне обращение к пинам производится по полному обозначению GPIO, то есть PA4 - это PA4

_Igor_
Offline
Зарегистрирован: 10.01.2022

Вопрос. Плата - STM32F103C8T6 (Blue Pill), аддон - stm32duino. Как привязать обработчик прерывания для CAN? Ни void USB_LP_CAN1_RX0_IRQHandler(void), ни void CAN1_RX0_IRQHandler(void) не цепляются.