Кто любит RISC в жизни, заходим, не стесняемся.
Пн дек 17, 2018 19:42:07
Прошивка STM32F105RBT6 не стартует без отладчика.
Заливаю прошивку через Keil 5.26 - если через Strl+F5 (старт отладки)
то всё работает, но самостоятельно после ресета не стартует, заливка
через ST-LINK Utility - заливается но не стартует!
Проект:
https://yadi.sk/d/WBUiXEM3IqI6Ww(Никакого отношения к заливке в RAM из другой темы, этот проект не имеет)
Пн дек 17, 2018 20:08:15
Бууууты?????!!!!!!
Пн дек 17, 2018 20:22:35
На земле сидят, как положено.
Пн дек 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");}
}
///////////////////////////////////////////////////////////////
}
Есть же ШИМ, но нет, нужно все сделать программно. Изучение AVR пошло во вред, а не на пользу.
Теперь о том где виснет. Может повиснуть например здесь.
- Код:
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 раз(а).
Пн дек 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
Пн дек 17, 2018 21:06:38
DENIS451 писал(а):Я думаю что такое поведение не может быть из-за того что линии BOOT0 / BOOT1 притягиваются к земле или +3,3v через резисторы 100ком?
Это мало, нужно не меньше 100 ГОм.
Пн дек 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 страницу)
Пн дек 17, 2018 23:29:33
Изучение AVR пошло во вред, а не на пользу.
а то типа в AVR нету аппаратного ШИМ-а) это скорее "изучение" такое вот было
Вт дек 18, 2018 00:08:13
Соединение BOOT0 с землёй даже вообще без резистора проблему не решает.
Я думаю, писатели библиотек проверяют свой код не во всех возможных настройках разных версий компиляторов,
а только на тех что по умолчанию ( "Oz image size" - это по умолчанию), и возможно только на компиляторе v5, отсюда такие чудеса!
Вт дек 18, 2018 06:15:23
Как удобно, виноваты все - и писатели библиотек, и компиляторы, но только не ты.
Вт дек 18, 2018 06:22:13
DENIS451, как же ты тогда в RAM попадаешь? Смотри где натыкал, а лучше проект с нуля создать.
Вт дек 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() все частоты уже установились как надо.
Вт дек 18, 2018 08:25:49
VladislavS , вот именно . А попадает в RAM. Или с бутами накосячил или отладка в RAM.
Гы , и все таки с бутами наверняка, было бы что с отладкой в RAM то был бы код а не данные..
Вт дек 18, 2018 09:09:46
У меня всегда недоумение вызывала возможность BOOTx выставить старт из RAM. Вот откуда там код может взяться при включении?
Гы , и все таки с бутами наверняка, было бы что с отладкой в RAM то был бы код а не данные..
Так у него там как раз таки код. Это не могут быть огрызки FlashLoader? Ну потому что в прошивке у него такого не может быть.
Спойлер
Вт дек 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 делает невозможной запуск прошивки из флэша кроме как из под отладчика.
Вт дек 18, 2018 11:05:49
DENIS451, галку RESET and RUN снова забыл поставить...
Вт дек 18, 2018 11:55:54
Это где такие галки?
Вт дек 18, 2018 12:07:44
Как где, все там же...
- R2R.png
- (44.96 KiB) Скачиваний: 338
Вт дек 18, 2018 12:49:25
Проверил, установка этой галки на проблему не влияет.
При создании нового проекта с нуля, её там и нет, включая проекты для STM32F103C6 и STM32F103C8.
Вт дек 18, 2018 13:15:46
DENIS451, и что-что ее там с нуля нет, без нее прошивка не будет стартовать . И нужно будет ручками ресет давить.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.