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

Прошивка STM32F105RBT6 не стартует без отладчика.

Пн дек 17, 2018 19:42:07

Прошивка STM32F105RBT6 не стартует без отладчика.

Заливаю прошивку через Keil 5.26 - если через Strl+F5 (старт отладки)
то всё работает, но самостоятельно после ресета не стартует, заливка
через ST-LINK Utility - заливается но не стартует!

Проект: https://yadi.sk/d/WBUiXEM3IqI6Ww

(Никакого отношения к заливке в RAM из другой темы, этот проект не имеет)

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Пн дек 17, 2018 20:08:15

Бууууты?????!!!!!!

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Пн дек 17, 2018 20:22:35

На земле сидят, как положено.

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Пн дек 17, 2018 21:01:32

DENIS451 писал(а):Проект
Код:
void _delay_us(uint16_t us)
{
//////////////////////////////////////////////////////////////////////////////////////////////   
uint32_t period = 0;
if (0x00 == us)   return;
period = ((F_CPU/5733333)*us)-6; //подобранные коэфициенты в ѕротеусе дл¤ STM32F103C6 72м√ц ¤дро, 50м√ц порт    
for (unsigned int q = 0; q <= period; q++){}      
//////////////////////////////////////////////////////////////////////////////////////////////
}
Разве это AVR?
Вот первых частота может быть изменена во время работы программы и нужно использовать SystemCoreClock перед этим вызвать SystemCoreClockUpdate();.
Во вторых, такая задержка будет неточной. В STM32F105 есть DWT.
Код:
extern uint32_t SystemCoreClock;
static uint32_t Delay_us, Delay_ms;


void DWT_Init(void)
{
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
    Delay_ms = SystemCoreClock / 1000;    // Число тактов ядра за миллисекунду.
    Delay_us = SystemCoreClock / 1000000; // Число тактов ядра за микросекунду.
}

void DWT_Delay_sec(uint32_t sec) // В секундах.
{
    uint32_t Count = DWT->CYCCNT;
    sec *=  SystemCoreClock;
    while((DWT->CYCCNT - Count) < sec);
}

void DWT_Delay_ms(uint32_t ms) // В миллисекундах
{
    uint32_t Count = DWT->CYCCNT;
    ms *=  Delay_ms;
    while((DWT->CYCCNT - Count) < ms);
}

void DWT_Delay_us(uint32_t us) // В микросекундах.
{
    uint32_t Count = DWT->CYCCNT;
    us *=  Delay_us;
    while((DWT->CYCCNT - Count) < us);
}



Код:
TIM_Cmd(TIM2, ENABLE);
NVIC_EnableIRQ(TIM2_IRQn);
 
    /* NVIC Configuration */
    /* Enable the TIM2_IRQn Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);   
Зачем дублировать настройку прерываний? Типа что-то да сработает?
Код:
void bibip (uint32_t time_ms, uint32_t freq_hz) //пишание пьезодинамиком на PA1 (врем¤ в милисекундах, частота а √ерцах)
{
//////////////////////////////////////////////////////////////
uint32_t cycles = 0;
uint32_t period = 0;
period = F_CPU / (12 * freq_hz); //12- подобранный коэфициент в ѕротеусе дл¤ STM32F103C6 72м√ц ¤дро, 50м√ц порт
cycles = (5960 * time_ms)/period; //5960 - подобранный коэфициент в ѕротеусе дл¤ дл¤ STM32F103C6 72м√ц ¤дро, 50м√ц порт
for (uint32_t i =0; i <= cycles; i++)
  {
  GPIO_SetBits(GPIOC, GPIO_Pin_13);    //высокий уровень
  for (uint32_t q = 0; q <= period; q++){asm("nop");}      
  GPIO_ResetBits(GPIOC, GPIO_Pin_13);  //низкий уровень
  for (uint32_t q = 0; q <= period; q++){asm("nop");}                  
  }
///////////////////////////////////////////////////////////////
}
:facepalm: Есть же ШИМ, но нет, нужно все сделать программно. Изучение AVR пошло во вред, а не на пользу. :dont_know:

Теперь о том где виснет. Может повиснуть например здесь.
Код:
  while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} /* Ждем пока PLL будет готов */
  RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK); /* Переключаем системное тактирование на PLL */
  while (RCC_GetSYSCLKSource() != 0x08) {}  /* Ждем пока переключитьс¤ */
  }
else  /* Проблемы с HSE. Тут можно написать свой код, если надо что-то делать когда микроконтроллер не смог перейти на работу с внешним кварцом */
    {
      
    while (1) {}  /* Пока тут заглушка - вечный цикл*/
    }
Запускаете программу без отладчика, а потом во время работы подключаете отладчик например как написано здесь и выясняете где виснет.
Последний раз редактировалось Мурик Пн дек 17, 2018 21:04:47, всего редактировалось 2 раз(а).

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Пн дек 17, 2018 21:05:37

Обнаружил кое что не понятное - компилирую компиляторм V6.10.1 оптимизация "O0" проблема есть,

выбираю оптимизацию Oz image size проблема исчезает!

Также проблема исчезает если выбрать компилятор V5 (но мне надо обязательно V6).

Я думаю что такое поведение не может быть из-за того что линии BOOT0 / BOOT1 притягиваются к земле или +3,3v через резисторы 100ком?

Добавлено after 3 minutes 54 seconds:
Где виснет уже даже скрин сделал:

https://electronix.ru/forum/index.php?a ... &id=150072

Все уверены на BOOT0 / BOOT1

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Пн дек 17, 2018 21:06:38

DENIS451 писал(а):Я думаю что такое поведение не может быть из-за того что линии BOOT0 / BOOT1 притягиваются к земле или +3,3v через резисторы 100ком?
Это мало, нужно не меньше 100 ГОм. :))) :)))

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Пн дек 17, 2018 22:20:57

Убирание кода clock_ini() на проблему не влияет, зато частота ядра падает до 24мГц.

Добавлено after 7 minutes 45 seconds:
Резисторы скопировал со схемы "голубой таблетки" на STM32F103C8C6 там 100к!

А какие вы резисторы ставите на BOOT0 / BOOT1 ?

На BOOT1 надо хотя бы 165ом повесить, его можно не чайно на выход включить, что б ток не превысил 20ма.

Добавлено after 1 hour 4 minutes:
Кстати, у официального производителя чипа есть отладочная плата на STM32F107 и там эти самые резисторы по 10к

https://www.st.com/content/ccc/resource ... 212441.pdf

(см. 34 страницу)

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Пн дек 17, 2018 23:29:33

Изучение AVR пошло во вред, а не на пользу. :dont_know:

а то типа в AVR нету аппаратного ШИМ-а) это скорее "изучение" такое вот было :facepalm:

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 00:08:13

Соединение BOOT0 с землёй даже вообще без резистора проблему не решает.

Я думаю, писатели библиотек проверяют свой код не во всех возможных настройках разных версий компиляторов,
а только на тех что по умолчанию ( "Oz image size" - это по умолчанию), и возможно только на компиляторе v5, отсюда такие чудеса!

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 06:15:23

Как удобно, виноваты все - и писатели библиотек, и компиляторы, но только не ты.

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 06:22:13

DENIS451, как же ты тогда в RAM попадаешь? Смотри где натыкал, а лучше проект с нуля создать.

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 07:00:07

Я бы на map взглянул, интересно как у него мёртвый цикл в начале RAM оказался.

Кто-то конкретно "лохматит бабушку". По адресу 0x20000000 лежит глобальная переменная volatile uint8_t n_led = 1;. Нет там никакого кода.
Спойлер
Код:
    Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x08000a38, Size: 0x00000670, Max: 0x00010000, ABSOLUTE)

    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x20000000   0x08000a38   0x00000001   Data   RW           17    .data.n_led         main.o
    0x20000001   0x08000a39   0x00000007   PAD
    0x20000008        -       0x00000060   Zero   RW          663    .bss                c_w.l(libspace.o)
    0x20000068        -       0x00000004   Zero   RW           16    .bss.GPIO_InitStructure  main.o
    0x2000006c        -       0x00000004   Zero   RW           18    .bss.stethik_kn     main.o
    0x20000070        -       0x00000200   Zero   RW          469    HEAP                startup_stm32f10x_cl.o
    0x20000270        -       0x00000400   Zero   RW          468    STACK               startup_stm32f10x_cl.o



DENIS451, объясни нам, какого лешего ты повторно RCC конфигуришь? У тебя в SystemInit() все частоты уже установились как надо.

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 08:25:49

VladislavS , вот именно . А попадает в RAM. Или с бутами накосячил или отладка в RAM.

Гы , и все таки с бутами наверняка, было бы что с отладкой в RAM то был бы код а не данные..

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 09:09:46

У меня всегда недоумение вызывала возможность BOOTx выставить старт из RAM. Вот откуда там код может взяться при включении?

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

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 10:49:38

Выкинул из проекта всё лишнее, вот что осталось:

Спойлер//*******************************************************************************
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
//*******************************************************************************
GPIO_InitTypeDef GPIO_InitStructure; //структурная переменная
//*******************************************************************************
int main(void)
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
volatile int i;
//******************************************************************************************************************************
{ //настройка портов
//----------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //включаем тактирование

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_5; //светодиоды D1, D2, D3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //обычный выход
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//----------
}
while (1)
{
//----------
GPIO_SetBits(GPIOB, GPIO_Pin_0); //высокий уровень
for(i=0;i<0x5AE8BA;i++); //delay
GPIO_ResetBits(GPIOB, GPIO_Pin_0); //низкий уровень

GPIO_SetBits(GPIOB, GPIO_Pin_1);
for(i=0;i<0x5AE8BA;i++); //delay
GPIO_ResetBits(GPIOB, GPIO_Pin_1);

GPIO_SetBits(GPIOB, GPIO_Pin_5);
for(i=0;i<0x5AE8BA;i++); //delay
GPIO_ResetBits(GPIOB, GPIO_Pin_5);
//----------
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}

(зажигаем три светодиода по кругу на 2 сек.)

проект целиком: https://yadi.sk/d/nN9qjF5aeXpbpg

проблема осталась - включение уровня оптимизации "O0" (фактически отключенная оптимизация) вместо "Oz image size" (которая по умолчанию)
в компиляторе v6 делает невозможной запуск прошивки из флэша кроме как из под отладчика.

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 11:05:49

DENIS451, галку RESET and RUN снова забыл поставить...

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 11:55:54

Это где такие галки?

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 12:07:44

Как где, все там же...


R2R.png
(44.96 KiB) Скачиваний: 338

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 12:49:25

Проверил, установка этой галки на проблему не влияет.
При создании нового проекта с нуля, её там и нет, включая проекты для STM32F103C6 и STM32F103C8.

Re: Прошивка STM32F105RBT6 не стартует без отладчика.

Вт дек 18, 2018 13:15:46

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