Уважаемый VE3OWW, один из вариантов Вашего кода занимает 143 строки, другой - 264. Притом, Вы сами пишете, что пытаетесь реализовать blink. Вам не кажется, что Вы что-то не то делаете?
Среда Arduino IDE сама добавляет в Ваш скетч около 15к кода инициализации - там много чего есть. Зачем пытаться по второму разу инициализировать то же самое?
Если Вы хотите непременно инициализировать МК с нуля, вряд ли Arduino IDE будет для этого подходящим инструментом.
Я просто пытаюсь каким-то образом разграничить (в своих итересах) Arduino IDE и STM32HAL для своих (будущих) целей. Мне нравится среда Arduino богатством кода и библиотек, но есть необходимость использовать STM32... Пытаюсь совместить....
Строка стала 150. А что такое int frequency ? Я вообще не понимаю что эта строка делает в коде. Откуда она взялась? Это вызов подпрограммы. Нужно вставить конкретное значение. Как по мне эта строка вообще не здесь должна стоять, а там где таймер надо инициализировать. Не нахожу я в коде такой функции. Закомментируйте её.
Мне нравится среда Arduino богатством кода и библиотек, но есть необходимость использовать STM32... Пытаюсь совместить....
блинк для стм32 в среде Ардуино занимает 6 строк. Шесть, Карл!
Ты не клоун, ты напыщенный болван. Прям сквозь интернет видно, как тебя распирает от глупой гордости, что ты пишешь для СТМ32 на HAL. А между тем по коду видно, что ты не смыслишь в этом ни черта.
Ты сначала писать на Си научись, а потом за HAL хватайся. Не надо тупить на форуме, возьми любой учебник в стиле Ардуино для чайников и читай. Все твои ошибки в коде - никакого отношения к СТМ32 не имеют, они от того что ты язык не знаешь вовсе.
-Вот либо ты пишешь на платформе ардуино, либо на платформе stm32cube. Одно из двух. Смешивать не получится
-Если Вы хотите непременно инициализировать МК с нуля, вряд ли Arduino IDE будет для этого подходящим инструментом
-Ты сначала писать на Си научись, а потом за HAL хватайся. Все твои ошибки в коде - никакого отношения к СТМ32 не имеют, они от того что ты язык не знаешь вовсе.
Всем здравствуйте. Спасибо за внимание и ответы - полезные и не очень.
Признаю свою ошибку - то, что я опубликовал - не есть код, а набор строк из разных источников. Виноват, не программист, прошу понять и простить.
Также прошу не кидатьтся выражениями - типа "напыщенный болван", это не приятно. Давайте, все же будем взаимовежливы, пожалуйста! )))
Я провел работу над ошибками, вот код, полностью рабочий для 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
VE3OWW, важно, что б вы понимали, что делает каждая строчка в программе. Ну или хотя бы основные моменты. Вот например как, имея на руках только этот ваш скетч узнать с какой частотой будет мигать светодиод? Я вот высчитал -0,2Гц. Можете сказать, как я это сделал? :)
Пусть мы используем Blue Pill (STM32F103C8T6) с частотой 72 Мгц.
Пусть мы используем таймер TIM2 (или TIM3, TIM4), который тактируется от шины APB1. Известно, что таймеры APB1 получают такты 36 МГц.
Установим значение прескалера 36000 (35999+1), тогда за секунду счетчик таймера сработает 36000000 / 36000 = 1000 раз. Значит, один тик таймера = 0,001 сек.
Установим период таймера равным 1000 (999+1), тогда таймер будет срабатывать один раз в секунду (1000 тиков = 1 сек)
Ошибку не исключаю. Однако, судя по частоте мигания расчет близок истине. Во всяком случае, речь наверняка идет о секундах, а не их десятых долях.
VE3OWW, главное xDriver уже сказал, выходит вам нужно ознакомится со смыслом строк 059-106. Кстати эта функция вызывается до setup. В строке 182 вы вызвали его повторно. Особенность Arduino) Можно вообще стереть 059-106, тогда вызовется из другого места, и будет 72МГц.
VE3OWW, главное xDriver уже сказал, выходит вам нужно ознакомится со смыслом строк 059-106. Кстати эта функция вызывается до setup. В строке 182 вы вызвали его повторно. Особенность Arduino) Можно вообще стереть 059-106, тогда вызовется из другого места, и будет 72МГц.
Спасибо, что обратили мое внимание. Попробую погуглить и поэкспериментировать! :)
Моей главной задачей в данном, конкретном примере было: перести код, сгенерированный CUBE в среду Ардуино так, чтобы он заработал. Для меня это своего рода отправная точка. Буду пытаться разбираться дальше. Еще раз спасибо!
А смысл вводить весь код из куба? Ардуина нормально инициирует много чего. Например систему тактирования, направление ног, serial over USB. Из куба можно подтянуть специфическую инициализацию какой то переферии. Этого вполне достаточно, что бы всё завелось как надо. И программа будет куда короче.
А смысл вводить весь код из куба? Ардуина нормально инициирует много чего. Например систему тактирования, направление ног, serial over USB. Из куба можно подтянуть специфическую инициализацию какой то переферии. Этого вполне достаточно, что бы всё завелось как надо. И программа будет куда короче.
Уважаемый nik182,
у меня нет такой цели - "вводить весь код из куба". Но я столкнулся с тем, что некоторые проекты Arduino для AVR не работают для STM32, к сожалению... Как актуальный для меня пример - WebServer для чипа W5500 (by Paul Stoffregen) из примеров Arduino... Он компилируется без ошибок, срабатывает один раз и останавливается... В то же время есть подобные примеры в сети, сгенерированные кубом (как правило на HAL, который мне не очень нравится) и они работают!
Я пока не знаю, как мне решить этот вопрос, поэтому решил попробовать "другой путь" - перетащить проект из куба в Ардуино, блинькание светодиодом - это первый шаг в данном направлении... :)
Ну так перетаскивайте всё что необходимо, а не всё в подряд. Это можно проверить постепенно добавляя модули. И это очень странно про срабатывает и останавливается. Как останавливается? Совсем зависает или сетевые приложения не работают?
Ну так перетаскивайте всё что необходимо, а не всё в подряд. Это можно проверить постепенно добавляя модули. И это очень странно про срабатывает и останавливается. Как останавливается? Совсем зависает или сетевые приложения не работают?
Во-первых, мне очень не хватает специальных знаний, чтобы "отделить зерна от плевел" - понять, что необходимо, а что нет. Но, я решаю это для себя путем экспериментов, почти так, как Вы и предлагаете: "постепенно убавляя модули" из рабочего проекта.
Во-вторых, что касатся примера из стандартной библиотеки Ethernet: WebServer.ino - на UNO R3 - все работает как предполагается: значения аналоговых входов микроконтроллера обновляются на Web странице с заданной частотой. При использовании этой же библиотеки в случае ядра от STM - выводится страница с показаниями аналоговых входов один раз и больше не обновляется... Не понятно - не обновляются значения аналоговых входов или сама Web страница? Предполагаю, что второе...
В случае ядра от Roger Clark стандартная библиотека Ethernet из пакета Arduino тут не работает совсем.... Есть своя библиотека Ethernet_stm32, которая работает отлично только для (Roger Clark)'s core, но она не совместима с ядром от STM! (По крайней мере, я смог проверить, что моя Blue Pill и модуль W5500 дружат друг с другом и могут работать как нужно!)
В случае ядра от Roger Clark стандартная библиотека Ethernet из пакета Arduino тут не работает совсем.... Есть своя библиотека Ethernet_stm32, которая работает отлично только для (Roger Clark)'s core, но она не совместима с ядром от STM! (По крайней мере, я смог проверить, что моя Blue Pill и модуль W5500 дружат друг с другом и могут работать как нужно!)
тогда что мешает собрать проект на ядре от Кларка и на совместимой с ним Эзернет библиотеке?
VE3OWW пишет:
что касатся примера из стандартной библиотеки Ethernet: WebServer.ino - на UNO R3 - все работает как предполагается: значения аналоговых входов микроконтроллера обновляются на Web странице с заданной частотой. При использовании этой же библиотеки в случае ядра от STM - выводится страница с показаниями аналоговых входов один раз и больше не обновляется... Не понятно - не обновляются значения аналоговых входов или сама Web страница? Предполагаю, что второе...
Вообще конечно путь решения своей проблемы вы выбрали очень странный. При том что нужный вам проект Вебсервера нормально компилируется и даже работает (хотя и нестабильно) на СТМ32 - логично было бы сосредоточить усилия на доработке этого проекта, чтобы он устойчиво работал.
Вместо этого вы зачем-то решили начать собирать подобное с нуля, хотя у вас очевидно не хватает знаний даже на небольшие правки готового кода и знания вы эти вряд ли наберете в ближайшие год-два.
Еще раз, благодарю всех за конструктивно полезные замечания!
По совету dimax из скетча убрана функция extern"C"voidSystemClock_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 пишет:
Вообще конечно путь решения своей проблемы вы выбрали очень странный. При том что нужный вам проект Вебсервера нормально компилируется и даже работает (хотя и нестабильно) на СТМ32 - логично было бы сосредоточить усилия в доработке этого проекта, чтобы он устойчиво работал.
Вместо этого вы зачем-то решили начать собирать подобное с нуля, хотя у вас очевидно не хватает знаний и знания вы эти вряд ли наберете в ближайшие год-два.
Возможно Вы - правы... И следовало бы отступиться и ждать, пока проблема разрешится сама собой... Тем более, с учетом моих "способностей..." Но для меня это не бизнес - а хобби. Поэтому буду пытаться и буду благодарен за любой совет и помощь от профессионалов!
Возможно Вы - правы... И следовало бы отступиться и ждать, пока проблема разрешится сама собой...
вы как-то странно читаете... Я разве сказал "отступиться"? - я советую сосредоточится на доведении до ума того проекта Вебсервера, который у вас запускается и работает и вся проблема только в том, что не обновляется вебстраница.
Имея некоторый опыт портирования кода между разными МК - уверен, что в вашем случае дело в какой-нить ерунде, одной строчке кода или паре несовместимых операторов.
Какой смысл в этих экспериментах, если вы тупо добавляете или убираете куски кода, не понимая, что они делают?
Хотя бы частоту точно померили в первом и во втором случае - чтобы ваше занятие не было настолько бессмысленным.
Давайте, не ленитесь, подключите осцил или логанализатор и скажите нам, какая частота была у первого кода и какая у второго. Я, может, не согласен с выводами верхних товарищей и хочу убедится на эксперименте :)
У меня нет названных Вами измерительных приборов (осцил или логанализатор) - извините... Если у Вас они есть, можете ли Вы сделать это, и результаты сообщить? Было бы очень интересно (без подвоха)!
тогда что мешает собрать проект на ядре от Кларка и на совместимой с ним Эзернет библиотеке?
Мне кажется, что это - тупиковый путь... Хотя бы потому, что ядро от Кларка более не поддкрживася...
В некотором смысле это плюс :) - зато оно не меняется каждые два месяца, можно спокойно писать код, не опасаясь. что с выходом новой версии он "устареет" :))
На самом деле ядро Кларка не умерло, оно поддерживается и развивается несколькими программистами, хотя и не так активно, как раньше. И на данный момент ядро Кларка во многих операциях быстрее СТМ-овского
У меня нет названных Вами измерительных приборов (осцил или логанализатор) - извините...
А часы у вас есть? Или смартфон? Запустите приложение "секундомер" и посчитайте, сколько раз ваш светодиод мигнет за минуту. Если обсчитаетесь на пару миганий - не беда, уж 0.2 Гц от 1 Гц мы точно сможим отличить.
Моя ставка для второго кода - 1 гц (то есть полсекунды горит, полсекунды не горит). Для первого высказывались разные версии...
Так и есть (для второго кода без extern"C"voidSystemClock_Config(void)) - (то есть полсекунды горит, полсекунды не горит)! В начальном варианте - было медленнее...
если я правильно помню арифметику - в 4.5 раза. Жалко что вы не можете померить точно.
Да, это новое знание для меня, что множители PLL влияют на частоту таймеров... хотя теперь понимаю, что это совершенно логично... без умножителя частоты выше частоты кварца не прыгнешь...
... что касатся примера из стандартной библиотеки Ethernet: WebServer.ino - на UNO R3 - все работает как предполагается: значения аналоговых входов микроконтроллера обновляются на Web странице с заданной частотой. При использовании этой же библиотеки в случае ядра от STM - выводится страница с показаниями аналоговых входов один раз и больше не обновляется... Не понятно - не обновляются значения аналоговых входов или сама Web страница? Предполагаю, что второе...
Всем здравствуйте. Arduino IDE 1.8.16 + STM32CORE by STM
Пример из стандартной библиотеки Ethernet: WebServer.ino заработал ("из коробки") почти без изменений... Единственная правка в скетче:
Моя ошибка по невнимательности - в скетче из стандартного примера для AVR в цикле считываются значения аналоговых входов A0...A5, в "голубой пилюле" STM32F103 вход A2 находится на ножке PA4, которая в моем случае является "SS" для SPI... Очевидно, что это и было проблемой....
Однако, для меня не ясно, почему эта схема работала на старом ядре от Clark? Ну да ладно... Вопрос уже не актуальный и типа риторический...
Теперь все ОК! Надеюсь, кому-то это поможет, а профи, прошу быть снисходительными и не злорадствовать... ))) Всем Добра!
Моя ошибка по невнимательности - в скетче из стандартного примера для AVR в цикле считываются значения аналоговых входов A0...A5, в "голубой пилюле" STM32F103 вход A2 находится на ножке PA4, Очевидно, что это и было проблемой....
Однако, для меня не ясно, почему эта схема работала на старом ядре от Clark?
Если вы не ошибаетесь насчет маппинга пинов в новом аддоне и вход А2 действительно находится на ножке PA4 (что звучит странно) - то это как раз обьясняет, почему у Кларка все работало - в том аддоне обращение к пинам производится по полному обозначению GPIO, то есть PA4 - это PA4
Вопрос. Плата - STM32F103C8T6 (Blue Pill), аддон - stm32duino. Как привязать обработчик прерывания для CAN? Ни void USB_LP_CAN1_RX0_IRQHandler(void), ни void CAN1_RX0_IRQHandler(void) не цепляются.
Уважаемый VE3OWW, один из вариантов Вашего кода занимает 143 строки, другой - 264. Притом, Вы сами пишете, что пытаетесь реализовать blink. Вам не кажется, что Вы что-то не то делаете?
Среда Arduino IDE сама добавляет в Ваш скетч около 15к кода инициализации - там много чего есть. Зачем пытаться по второму разу инициализировать то же самое?
Если Вы хотите непременно инициализировать МК с нуля, вряд ли Arduino IDE будет для этого подходящим инструментом.
4) Зачем у вас две функции с одним именем ? Если Вас не сильно затруднит, конкретезируйте, о каких функциях речь?
стр №№ 155 и 203ь по твоему коду. Ты клоун или тролль?
Уважаемый wdrakula
в 195 строке убрать void и { заменить на ;
Уважаемый andriano
Я просто пытаюсь каким-то образом разграничить (в своих итересах) Arduino IDE и STM32HAL для своих (будущих) целей. Мне нравится среда Arduino богатством кода и библиотек, но есть необходимость использовать STM32... Пытаюсь совместить....
Поменял как было посоветано:
в 195 строке убрать void и { заменить на ;
/* USER CODE BEGIN Header */
ОШИБКИ КОМПИЛЯТОРА:
Строка стала 150. А что такое int frequency ? Я вообще не понимаю что эта строка делает в коде. Откуда она взялась? Это вызов подпрограммы. Нужно вставить конкретное значение. Как по мне эта строка вообще не здесь должна стоять, а там где таймер надо инициализировать. Не нахожу я в коде такой функции. Закомментируйте её.
Мне нравится среда Arduino богатством кода и библиотек, но есть необходимость использовать STM32... Пытаюсь совместить....
блинк для стм32 в среде Ардуино занимает 6 строк. Шесть, Карл!
Ты не клоун, ты напыщенный болван. Прям сквозь интернет видно, как тебя распирает от глупой гордости, что ты пишешь для СТМ32 на HAL. А между тем по коду видно, что ты не смыслишь в этом ни черта.
Ты сначала писать на Си научись, а потом за HAL хватайся. Не надо тупить на форуме, возьми любой учебник в стиле Ардуино для чайников и читай. Все твои ошибки в коде - никакого отношения к СТМ32 не имеют, они от того что ты язык не знаешь вовсе.
Строка стала 150. А что такое int frequency ? Я вообще не понимаю что эта строка делает в коде. Откуда она взялась? Это вызов подпрограммы.
да он просто СИ не знает, тыкает строчки в код всплепую...
VE3OWW, вам опытные товарищи пишут мудрые вещи:
-Вот либо ты пишешь на платформе ардуино, либо на платформе stm32cube. Одно из двух. Смешивать не получится
-Если Вы хотите непременно инициализировать МК с нуля, вряд ли Arduino IDE будет для этого подходящим инструментом
-Ты сначала писать на Си научись, а потом за HAL хватайся. Все твои ошибки в коде - никакого отношения к СТМ32 не имеют, они от того что ты язык не знаешь вовсе.
Подпишусь под каждой фразой коллег.
Всем здравствуйте. Спасибо за внимание и ответы - полезные и не очень.
Признаю свою ошибку - то, что я опубликовал - не есть код, а набор строк из разных источников. Виноват, не программист, прошу понять и простить.
Также прошу не кидатьтся выражениями - типа "напыщенный болван", это не приятно. Давайте, все же будем взаимовежливы, пожалуйста! )))
Я провел работу над ошибками, вот код, полностью рабочий для BLUE PILL и STM32DUINO (STM Official Core):
Все работает, как хотелось:
Arduino 1.8.16 компилирует без ошибок
Пустой цикл крутится
Светодиод блинкает....
Если у настоящих программистов вдруг появится желание подсказать, что тут можно сделать лучше - буду благодарен за советы!
Всем спасибо! С наступающими!
п.с. Чтобы работало в папке со скетчем должен также быть файл 'build_opt.h' в котором единственная строка: -DHAL_TIM_MODULE_ONLY
Я, конечно все понимаю... Инициализация стм32 требует жертв :)
но 200 строчек, чтобы по прерыванию таймера переключать пин?!
Вопрос не к ТС, а скорее к стм :)
Куб - колоссальный кусок говна. Недокументированный, непродуманный, с кошмарными пробелами в функционале.
VE3OWW, важно, что б вы понимали, что делает каждая строчка в программе. Ну или хотя бы основные моменты. Вот например как, имея на руках только этот ваш скетч узнать с какой частотой будет мигать светодиод? Я вот высчитал -0,2Гц. Можете сказать, как я это сделал? :)
Я вот высчитал -0,2Гц. Можете сказать, как я это сделал? :)
не согласен :) я насчитал 1 Гц
b707, на строчку 072 смотрел? :)
мне кажется, к частоте таймера это не относится, их частоты от PLL не зависят (хотя. конечно, я не слишком авторитет в этом).
Но даже если в этом я неправ - 0.2 Гц ну никак :)
b707, подождём ответа VE3OWW )
мне кажется, к частоте таймера это не относится, их частоты от PLL не зависят (хотя. конечно, я не слишком авторитет в этом).
Спасибо за вопрос. Я рассуждал следующим образом.
Спасибо за вопрос. Я рассуждал следующим образом.
откуда у вас 72 Мгц? кварц на blue pill 8 Мгц вы используете его и умножение PLL на 2, все у вас тактируется от 16 Мгц
но это судя по листингу
VE3OWW, главное xDriver уже сказал, выходит вам нужно ознакомится со смыслом строк 059-106. Кстати эта функция вызывается до setup. В строке 182 вы вызвали его повторно. Особенность Arduino) Можно вообще стереть 059-106, тогда вызовется из другого места, и будет 72МГц.
VE3OWW, главное xDriver уже сказал, выходит вам нужно ознакомится со смыслом строк 059-106. Кстати эта функция вызывается до setup. В строке 182 вы вызвали его повторно. Особенность Arduino) Можно вообще стереть 059-106, тогда вызовется из другого места, и будет 72МГц.
Спасибо, что обратили мое внимание. Попробую погуглить и поэкспериментировать! :)
Моей главной задачей в данном, конкретном примере было: перести код, сгенерированный CUBE в среду Ардуино так, чтобы он заработал. Для меня это своего рода отправная точка. Буду пытаться разбираться дальше. Еще раз спасибо!
А смысл вводить весь код из куба? Ардуина нормально инициирует много чего. Например систему тактирования, направление ног, serial over USB. Из куба можно подтянуть специфическую инициализацию какой то переферии. Этого вполне достаточно, что бы всё завелось как надо. И программа будет куда короче.
Уважаемый nik182,
у меня нет такой цели - "вводить весь код из куба". Но я столкнулся с тем, что некоторые проекты Arduino для AVR не работают для STM32, к сожалению... Как актуальный для меня пример - WebServer для чипа W5500 (by Paul Stoffregen) из примеров Arduino... Он компилируется без ошибок, срабатывает один раз и останавливается... В то же время есть подобные примеры в сети, сгенерированные кубом (как правило на HAL, который мне не очень нравится) и они работают!
Я пока не знаю, как мне решить этот вопрос, поэтому решил попробовать "другой путь" - перетащить проект из куба в Ардуино, блинькание светодиодом - это первый шаг в данном направлении... :)
Ну так перетаскивайте всё что необходимо, а не всё в подряд. Это можно проверить постепенно добавляя модули. И это очень странно про срабатывает и останавливается. Как останавливается? Совсем зависает или сетевые приложения не работают?
Ну так перетаскивайте всё что необходимо, а не всё в подряд. Это можно проверить постепенно добавляя модули. И это очень странно про срабатывает и останавливается. Как останавливается? Совсем зависает или сетевые приложения не работают?
Во-первых, мне очень не хватает специальных знаний, чтобы "отделить зерна от плевел" - понять, что необходимо, а что нет. Но, я решаю это для себя путем экспериментов, почти так, как Вы и предлагаете: "постепенно убавляя модули" из рабочего проекта.
Во-вторых, что касатся примера из стандартной библиотеки Ethernet: WebServer.ino - на UNO R3 - все работает как предполагается: значения аналоговых входов микроконтроллера обновляются на Web странице с заданной частотой. При использовании этой же библиотеки в случае ядра от STM - выводится страница с показаниями аналоговых входов один раз и больше не обновляется... Не понятно - не обновляются значения аналоговых входов или сама Web страница? Предполагаю, что второе...
В случае ядра от Roger Clark стандартная библиотека Ethernet из пакета Arduino тут не работает совсем.... Есть своя библиотека Ethernet_stm32, которая работает отлично только для (Roger Clark)'s core, но она не совместима с ядром от STM! (По крайней мере, я смог проверить, что моя Blue Pill и модуль W5500 дружат друг с другом и могут работать как нужно!)
В случае ядра от Roger Clark стандартная библиотека Ethernet из пакета Arduino тут не работает совсем.... Есть своя библиотека Ethernet_stm32, которая работает отлично только для (Roger Clark)'s core, но она не совместима с ядром от STM! (По крайней мере, я смог проверить, что моя Blue Pill и модуль W5500 дружат друг с другом и могут работать как нужно!)
тогда что мешает собрать проект на ядре от Кларка и на совместимой с ним Эзернет библиотеке?
Вообще конечно путь решения своей проблемы вы выбрали очень странный. При том что нужный вам проект Вебсервера нормально компилируется и даже работает (хотя и нестабильно) на СТМ32 - логично было бы сосредоточить усилия на доработке этого проекта, чтобы он устойчиво работал.
Вместо этого вы зачем-то решили начать собирать подобное с нуля, хотя у вас очевидно не хватает знаний даже на небольшие правки готового кода и знания вы эти вряд ли наберете в ближайшие год-два.
Еще раз, благодарю всех за конструктивно полезные замечания!
По совету dimax из скетча убрана функция
extern
"C"
void
SystemClock_Config(
void
), код существнно сократился, но
работает!
только частота теперь другая...
Какой смысл в этих экспериментах, если вы тупо добавляете или убираете куски кода, не понимая, что они делают?
Хотя бы частоту точно померили в первом и во втором случае - чтобы ваше занятие не было настолько бессмысленным.
Давайте, не ленитесь, подключите осцил или логанализатор и скажите нам, какая частота была у первого кода и какая у второго. Я, может, не согласен с выводами верхних товарищей и хочу убедится на эксперименте :)
тогда что мешает собрать проект на ядре от Кларка и на совместимой с ним Эзернет библиотеке?
Мне кажется, что это - тупиковый путь... Хотя бы потому, что ядро от Кларка более не поддкрживася...
Вообще конечно путь решения своей проблемы вы выбрали очень странный. При том что нужный вам проект Вебсервера нормально компилируется и даже работает (хотя и нестабильно) на СТМ32 - логично было бы сосредоточить усилия в доработке этого проекта, чтобы он устойчиво работал.
Вместо этого вы зачем-то решили начать собирать подобное с нуля, хотя у вас очевидно не хватает знаний и знания вы эти вряд ли наберете в ближайшие год-два.
Возможно Вы - правы... И следовало бы отступиться и ждать, пока проблема разрешится сама собой... Тем более, с учетом моих "способностей..." Но для меня это не бизнес - а хобби. Поэтому буду пытаться и буду благодарен за любой совет и помощь от профессионалов!
Возможно Вы - правы... И следовало бы отступиться и ждать, пока проблема разрешится сама собой...
вы как-то странно читаете... Я разве сказал "отступиться"? - я советую сосредоточится на доведении до ума того проекта Вебсервера, который у вас запускается и работает и вся проблема только в том, что не обновляется вебстраница.
Имея некоторый опыт портирования кода между разными МК - уверен, что в вашем случае дело в какой-нить ерунде, одной строчке кода или паре несовместимых операторов.
только частота теперь другая...
Какой смысл в этих экспериментах, если вы тупо добавляете или убираете куски кода, не понимая, что они делают?
Хотя бы частоту точно померили в первом и во втором случае - чтобы ваше занятие не было настолько бессмысленным.
Давайте, не ленитесь, подключите осцил или логанализатор и скажите нам, какая частота была у первого кода и какая у второго. Я, может, не согласен с выводами верхних товарищей и хочу убедится на эксперименте :)
У меня нет названных Вами измерительных приборов (осцил или логанализатор) - извините... Если у Вас они есть, можете ли Вы сделать это, и результаты сообщить? Было бы очень интересно (без подвоха)!
тогда что мешает собрать проект на ядре от Кларка и на совместимой с ним Эзернет библиотеке?
Мне кажется, что это - тупиковый путь... Хотя бы потому, что ядро от Кларка более не поддкрживася...
В некотором смысле это плюс :) - зато оно не меняется каждые два месяца, можно спокойно писать код, не опасаясь. что с выходом новой версии он "устареет" :))
На самом деле ядро Кларка не умерло, оно поддерживается и развивается несколькими программистами, хотя и не так активно, как раньше. И на данный момент ядро Кларка во многих операциях быстрее СТМ-овского
У меня нет названных Вами измерительных приборов (осцил или логанализатор) - извините...
А часы у вас есть? Или смартфон? Запустите приложение "секундомер" и посчитайте, сколько раз ваш светодиод мигнет за минуту. Если обсчитаетесь на пару миганий - не беда, уж 0.2 Гц от 1 Гц мы точно сможим отличить.
Моя ставка для второго кода - 1 гц (то есть полсекунды горит, полсекунды не горит). Для первого высказывались разные версии...
Моя ставка для второго кода - 1 гц (то есть полсекунды горит, полсекунды не горит). Для первого высказывались разные версии...
Так и есть (для второго кода без
extern
"C"
void
SystemClock_Config(
void
)
) - (то есть полсекунды горит, полсекунды не горит)! В начальном варианте - было медленнее...В начальнма варианте - было медленнее...
если я правильно помню арифметику - в 4.5 раза. Жалко что вы не можете померить точно.
Да, это новое знание для меня, что множители PLL влияют на частоту таймеров... хотя теперь понимаю, что это совершенно логично... без умножителя частоты выше частоты кварца не прыгнешь...
У меня нет названных Вами измерительных приборов (осцил или логанализатор) - извините...
Может, тогда имеет смысл отложить Ваши "эксперименты" до того момента, пока появятся?
(извините, в отсутствие указанных приборов не могу написать слово "эксперименты" иначе как в кавычках)
... что касатся примера из стандартной библиотеки 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? Ну да ладно... Вопрос уже не актуальный и типа риторический...
Теперь все ОК! Надеюсь, кому-то это поможет, а профи, прошу быть снисходительными и не злорадствовать... ))) Всем Добра!
Моя ошибка по невнимательности - в скетче из стандартного примера для AVR в цикле считываются значения аналоговых входов A0...A5, в "голубой пилюле" STM32F103 вход A2 находится на ножке PA4, Очевидно, что это и было проблемой....
Однако, для меня не ясно, почему эта схема работала на старом ядре от Clark?
Если вы не ошибаетесь насчет маппинга пинов в новом аддоне и вход А2 действительно находится на ножке PA4 (что звучит странно) - то это как раз обьясняет, почему у Кларка все работало - в том аддоне обращение к пинам производится по полному обозначению GPIO, то есть PA4 - это PA4
Вопрос. Плата - STM32F103C8T6 (Blue Pill), аддон - stm32duino. Как привязать обработчик прерывания для CAN? Ни void USB_LP_CAN1_RX0_IRQHandler(void), ни void CAN1_RX0_IRQHandler(void) не цепляются.