Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32F103C8 перенос таблицы прерываний

Пн окт 29, 2018 15:12:42

Что находится в STM32F103C8 по адресу 0x3FF0?
Флеш начинается с 0x08000000.

на 0х08000000 вообще ничего нет.

Re: STM32F103C8 перенос таблицы прерываний

Пн окт 29, 2018 15:16:56

Тогда привет тебе от бутлоадера)

Добавлено after 2 minutes 21 second:
Заливай бутлоадер, и снова делай дамп тогда

Re: STM32F103C8 перенос таблицы прерываний

Пн окт 29, 2018 15:20:57

Тогда привет тебе от бутлоадера)

Добавлено after 2 minutes 21 second:
Заливай бутлоадер, и снова делай дамп тогда

я протупил, в программаторе просто не пишется 0х800, но подразумевается.
Пишется с 0х8004000, все ок
Приложу хекс файл еще http://rgho.st/8NNVJfX5K

Re: STM32F103C8 перенос таблицы прерываний

Пн окт 29, 2018 15:50:34

Написал два скетча, пробуй.

https://yadi.sk/d/R_o1KuuOAoNSaQ
https://yadi.sk/d/fHssRYf43igznw

1. Грузи сперва бутлоадер с вытиранием всего флэша
2. Грузи основную прогу с вытиранием только секторов загрузки (по картинке 5)

3. Подключай к USART-USB PA2 - TX (параметры связи 115к, 8 , 1, нет)

4. При включении МК вылетит сообщение "Hello, this is main programm!" - это значит, что МК прыгнул в основную прогу
5. Замкни PB9 на GND, держи замкнутым и тыцни на ресет, должно вылететь "Programming mode. Erease firmware? Y/N"

Ждём результатов.

P.S. Проверил у себя в железе.

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 30, 2018 07:39:33

Написал два скетча, пробуй.

https://yadi.sk/d/R_o1KuuOAoNSaQ
https://yadi.sk/d/fHssRYf43igznw

1. Грузи сперва бутлоадер с вытиранием всего флэша
2. Грузи основную прогу с вытиранием только секторов загрузки (по картинке 5)

3. Подключай к USART-USB PA2 - TX (параметры связи 115к, 8 , 1, нет)

4. При включении МК вылетит сообщение "Hello, this is main programm!" - это значит, что МК прыгнул в основную прогу
5. Замкни PB9 на GND, держи замкнутым и тыцни на ресет, должно вылететь "Programming mode. Erease firmware? Y/N"

Ждём результатов.

P.S. Проверил у себя в железе.

Вообщем то работает, только сообщение о том что мы в главной программе не вылетает.

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 30, 2018 07:43:32

А что из этого тогда работает?

Добавлено after 2 minutes 3 seconds:
Хочу видеть полный дамп двух последних залитых прошивок с адреса 0x8000000 и схему подключения boot0, boot1.

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 30, 2018 07:43:36

А что из этого тогда работает?

1,2 и 5 пункты. При замыкании PB9 выдает на экран сообщение которые вы написали.

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 30, 2018 07:47:13

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

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 30, 2018 07:55:24

http://rgho.st/7rXr4J8XT вот такая плата, МК stm32f103c8, то же самое что вы прислали

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 30, 2018 08:03:43

Можно в моём проекте поменять ещё девайс на stm32f103c8, у меня под cb скомпилен, но это скорее всего не поможет, у них отличия, насколько помню, только в объёме флэша. Надо дампы сравнивать.

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 30, 2018 09:40:50

Можно в моём проекте поменять ещё девайс на stm32f103c8, у меня под cb скомпилен, но это скорее всего не поможет, у них отличия, насколько помню, только в объёме флэша. Надо дампы сравнивать.

Проект который вы скинули работает, проблема была с ST-Link, но понимаете я делал подобный проект сам и переносил его на другой адрес, он работал, но когда я добавлял прерывание, оно не срабатывало при переносе, главная проблема в этом. Вы мне прислали проект, где нет прерывания.

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 30, 2018 14:34:54

Вечером скину с прерыванием, не перенёс этот проект вчера на ЯД.

Добавлено after 1 minute 13 seconds:
А вообще, попробуй добавить прерывание прямо в мой проект)

Например, по тому же приёму байта в прерывании от ЮСАРТ отсылай его назад

Добавлено after 4 hours 47 minutes 5 seconds:
Обновил файлы основной программы по ссылке на Я.Диске, добавил прерывание от ЮСАРТА2 на приём, данные возвращаются корректно => таблица прерываний на месте. Всё работает. Проверяй у себя, потом дальше будем разбираться.

Re: STM32F103C8 перенос таблицы прерываний

Ср окт 31, 2018 08:29:20

Вечером скину с прерыванием, не перенёс этот проект вчера на ЯД.

Добавлено after 1 minute 13 seconds:
А вообще, попробуй добавить прерывание прямо в мой проект)

Например, по тому же приёму байта в прерывании от ЮСАРТ отсылай его назад

Добавлено after 4 hours 47 minutes 5 seconds:
Обновил файлы основной программы по ссылке на Я.Диске, добавил прерывание от ЮСАРТА2 на приём, данные возвращаются корректно => таблица прерываний на месте. Всё работает. Проверяй у себя, потом дальше будем разбираться.

Да все работает.

Re: STM32F103C8 перенос таблицы прерываний

Ср окт 31, 2018 08:31:12

С EXTI разберёшься или нужна помощь?

Re: STM32F103C8 перенос таблицы прерываний

Ср окт 31, 2018 08:35:16

С EXTI разберёшься или нужна помощь?

Пока сам попробую, если что то не получиться, обращусь к вам, спасибо за помощь)

Re: STM32F103C8 перенос таблицы прерываний

Пн окт 28, 2019 20:52:37

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

Два пустых проекта уже создал один светодиодом дрыгает, второй просто вызывает первый, все настроил а вызова нет, прыжок в никуда... Собственно вот оба проекта: https://yadi.sk/d/yNoaSm-SbkeSAA они под Atollic TrueSTUDIO. Шью каждый отдельно они каждый занимает по сектору.

В проекте который должен вызвать другой проект все настройки умолчальные, в майне код:
Код:
#define APPLICATION_ADDRESS    0x08004000
uint32_t app_jump_address;
typedef void(*pFunction)(void);
pFunction Jump_To_Application;
__disable_irq();
app_jump_address = *( uint32_t*) (APPLICATION_ADDRESS + 4);
Jump_To_Application = (pFunction)app_jump_address;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
Jump_To_Application();
У второго настройки изменены, в system_stm32f4xx.c:
#define VECT_TAB_OFFSET 0x4000 /*!< Vector Table base offset field.
This value must be a multiple of 0x200. */


stm32_flash.ld:
/* Specify the memory areas */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x8004000, LENGTH = 2032K
}


Вроде все указал ничего не забыл, а нет, не работает...

Re: STM32F103C8 перенос таблицы прерываний

Вт окт 29, 2019 11:49:56

Решение нашел. Проблема была в том что перед прыжком на новый код прерывания я запрещал, а после не разрешал, ну вот не думал я что код который фактически с нуля инициализирует все переменные и периферию требует этого... Ошибся..

Спойлер
Код:
/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ----------*/
#include "main.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 ----------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes ----------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
/* 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 */

  __enable_irq();

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

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */

   
   HAL_Delay(50);
   HAL_GPIO_TogglePin(LD4_GPIO_Port, LD4_Pin);
   //HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);


  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);
  /** Initializes the CPU, AHB and APB busses clocks
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 50;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  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_DIV8;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4;

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

/**
  * @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_GPIOG_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOG, LD3_Pin|LD4_Pin, GPIO_PIN_RESET);


  /*Configure GPIO pins : LD3_Pin LD4_Pin */
  GPIO_InitStruct.Pin = LD3_Pin|LD4_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);



}

/* USER CODE BEGIN 4 */


/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */

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


Просто в начале майна добавил разрешение:
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */

__enable_irq();

/* USER CODE END 1 */

Re: STM32F103C8 перенос таблицы прерываний

Сб дек 25, 2021 14:26:00

Решение нашел

Спасибо! Допустил ту же ошибку. Даже не подумал бы на глобальный запрет прерываний.
Особенно вводит в ступор то, что действие ассемблерной вставки __enable_irq(); и __disable_irq(); никак не видно из отладчика.

Re: STM32F103C8 перенос таблицы прерываний

Сб дек 25, 2021 16:13:09

Особенно вводит в ступор то, что действие ассемблерной вставки __enable_irq(); и __disable_irq(); никак не видно из отладчика.
Не знаю про какой отладчик речь, но в IAR-овском прекрасно видно.

Re: STM32F103C8 перенос таблицы прерываний

Сб дек 25, 2021 19:29:57

Особенно если знать где смотреть :)
Ответить