Asstr Stm Cheer
⚡ 👉🏻👉🏻👉🏻 INFORMATION AVAILABLE CLICK HERE 👈🏻👈🏻👈🏻
Запомнить меня Не рекомендуется на общедоступных компьютерах
Главная
Сайт и форум
└─ Новости и обсуждения сайта и форума
└─ Замечания и предложения по новому форуму
└─ Другие известные форумы и сайты по электронике
└─ Магазины
└─ Форумы и конференции
└─ Производители
└─ Информационные ресурсы
└─ Поисковики
└─ FTP-серверы
└─ В помощь начинающему
└─ ARM, 32bit
└─ MCS51, AVR, PIC, STM8, 8bit
└─ Программирование
└─ Схемотехника
└─ Интерфейсы
└─ International Forum
└─ Образование в области электроники
└─ Решение задач
└─ Обучающие видео-материалы и обмен опытом
Cистемный уровень проектирования
└─ Вопросы системного уровня проектирования
└─ Математика и Физика
└─ Операционные системы
└─ Программирование
└─ Linux
└─ uC/OS-II
└─ scmRTOS
└─ FreeRTOS
└─ Android
└─ Документация
└─ Системы CAD/CAM/CAE/PLM
└─ Разработка цифровых, аналоговых, аналого-цифровых ИС
└─ Электробезопасность и ЭМС
└─ ЭМС
└─ Электробезопасность
└─ Управление проектами
└─ Нейронные сети и машинное обучение (NN/ML)
Программируемая логика ПЛИС (FPGA,CPLD, PLD)
└─ Среды разработки - обсуждаем САПРы
└─ Работаем с ПЛИС, области применения, выбор
└─ Языки проектирования на ПЛИС (FPGA)
└─ Системы на ПЛИС - System on a Programmable Chip (SoPC)
Цифровая обработка сигналов - ЦОС (DSP)
└─ Сигнальные процессоры и их программирование - DSP
└─ Алгоритмы ЦОС (DSP)
Микроконтроллеры (MCs)
└─ Cредства разработки для МК
└─ IAR
└─ Keil
└─ GNU/OpenSource средства разработки
└─ ARM
└─ STM
└─ NXP
└─ Microchip (Atmel)
└─ TI, Allwinner, Nordic Semiconductor, Espressif Systems и другие
└─ AVR
└─ MSP430
└─ Все остальные микроконтроллеры
└─ PIC
└─ MCS51
└─ PowerQUICC
└─ HC(S)08
└─ AVR32
└─ STM8
└─ MIPS
└─ Отладочные платы
└─ Arduino
└─ Raspberry Pi
└─ Rainbow
└─ Siberia
└─ EVMxxxx
Печатные платы (PCB)
└─ Разрабатываем ПП в САПР - PCB development
└─ Библиотеки компонентов
└─ Altium Designer, DXP, Protel
└─ P-CAD 200x howto
└─ Эремекс, Delta Design
└─ Cadence
└─ Примеры
└─ Zuken CADSTAR
└─ Mentor Xpedition Enterprise, PADS
└─ KiCAD
└─ Работаем с трассировкой
└─ Примеры плат
└─ Изготовление ПП - PCB manufacturing
└─ ПСБ Технолоджи
└─ ТеПро
└─ PS-Electro
└─ Резонит
└─ Компри-М
└─ PCB Professional
└─ Абрис
└─ ОАО "НИЦЭВТ"
└─ ООО "М-Плата"
└─ в домашних условиях
Сборка РЭУ
└─ Пайка и монтаж
└─ Корпуса
└─ Вопросы надежности и испытаний
└─ Спецфакторы и радиационная стойкость
Аналоговая и цифровая техника, прикладная электроника
└─ Вопросы аналоговой техники
└─ Операционные усилители и АЦП
└─ Цифровые схемы, высокоскоростные ЦС
└─ Rf & Microwave Design
└─ Метрология, датчики, измерительная техника
└─ Оптика и оптоэлектроника
└─ АВТО электроника
└─ Умный дом
└─ 3D печать
└─ Робототехника
└─ Ремонт и отладка
Силовая Электроника - Power Electronics
└─ Силовая Преобразовательная Техника
└─ Обратная Связь, Стабилизация, Регулирование, Компенсация
└─ Первичные и Вторичные Химические Источники Питания
└─ Высоковольтные Устройства - High-Voltage
└─ Электрические машины, Электропривод и Управление
└─ Индукционный Нагрев - Induction Heating
└─ Системы Охлаждения, Тепловой Расчет – Cooling Systems
└─ Моделирование и Анализ Силовых Устройств – Power Supply Simulation
└─ Компоненты Силовой Электроники - Parts for Power Supply Design
Интерфейсы
└─ Форумы по интерфейсам
└─ ISDN/G.703/E1
└─ ISA/PCI/PCI-X/PCI Express
└─ Wireless/Optic
└─ RS232/LPT/USB/PCMCIA/FireWire
└─ Fast Ethernet/Gigabit Ethernet/FibreChannel
└─ Интерфейсы для "интеллектуального дома"
└─ от ТТЛ до LVDS здесь
└─ IDE/ATA/SATA/SAS/SCSI/CF
└─ Аудио/Видео интерфейсы
└─ Сотовая связь и ее приложения
└─ FAQ по XPort/WiPort
└─ Controller Area Network (CAN)
Поставщики компонентов для электроники
└─ Поставщики всего остального
└─ Компоненты
└─ Тех. документация
└─ Микросхемы
└─ Транзисторы
└─ Диоды
└─ Резисторы
└─ Средства индикации
Майнеры криптовалют и их разработка, BitCoin, LightCoin, Dash, Zcash, Эфир
└─ Обсуждение Майнеров, их поставки и производства
Дополнительные разделы - Additional sections
└─ Встречи и поздравления
└─ Ищу работу
└─ Предлагаю работу
└─ Куплю
└─ Продам
└─ Объявления пользователей
└─ Общение заказчиков и потребителей электронных разработок
bolmoe 0
Частый гость
Свой
0
125 публикаций
Город:Рязань
Регистрация: 05.04.2006
Попытался разместить стек и кучу в ССМ памяти. Делал все через скаттер файл.
В отладке вижу, что стек лег по нужному адресу.
А вот с heap проблемы. Первый же вызов malloc() и программа сваливается в HardFault_Handler().
Попробовал heap вернуть по адресу внутренней RAM 0х20000000 - все ОК.
Изменено 24 мая 2017 пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
x893 0
Гуру
Свой
0
2 599 публикаций
Город:Планета Земля
Регистрация: 27.10.2008
*((uint32_t *)address_from_malloc) = 0xDEADBEEF;
*((uint8_t *)address_from_malloc) = 0xDE;
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
jcxz 0
Гуру
Свой
0
9 369 публикаций
Город:Рига
Регистрация: 03.07.2008
Расположение объектов в памяти смотрят не по main(), а по .map-файлу.
ЗЫ: В хорошо написанной embedded-программе не должно быть кучи (чего угодно ;)
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
bolmoe 0
Частый гость
Свой
0
125 публикаций
Город:Рязань
Регистрация: 05.04.2006
ЗЫ: В хорошо написанной embedded-программе не должно быть кучи (чего угодно ;)
Image$$ARM_LIB_HEAP$$ZI$$Base 0x01000000 Number 0 anon$$obj.o(ARM_LIB_HEAP.bss)
Image$$ARM_LIB_HEAP$$ZI$$Limit 0x01000800 Number 0 anon$$obj.o(ARM_LIB_HEAP.bss)
Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00000d5c, Max: 0x00080000, ABSOLUTE)
Execution Region ARM_LIB_HEAP (Base: 0x01000000, Size: 0x00000800, Max: 0x00000800, ABSOLUTE, UNINIT)
Base Addr Size Type Attr Idx E Section Name Object
0x01000000 0x00000800 Zero RW 2 ARM_LIB_HEAP.bss anon$$obj.o
а в main() я смотрел через debugger, который доходит до malloc() и сваливается в hardfault...
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
Сергей Борщ 0
Гуру
Модераторы
0
9 562 публикации
Город:Рига, Латвия
Регистрация: 15.05.2006
Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить?
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
scifi 0
Гуру
Свой
0
3 085 публикаций
Регистрация: 07.02.2007
а в main() я смотрел через debugger, который доходит до malloc() и сваливается в hardfault...
Кстати, можно и поотлаживать Hard Fault, хоть и в дизассемблере. Сдаётся мне, что причина быстро обнаружится.
Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить?
Он уже включен после сброса, ЕМНИП.
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
bolmoe 0
Частый гость
Свой
0
125 публикаций
Город:Рязань
Регистрация: 05.04.2006
*((uint32_t *)address_from_malloc) = 0xDEADBEEF;
*((uint8_t *)address_from_malloc) = 0xDE;
malloc ничего не возвращает, в "режиме отладки" доходит до выделения памяти и в самом malloc() при выполнении
0x08000CBE E9C02400 STRD r2,r4,[r0,#0] следующим шагом в HardFault_Handler(void)
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
jcxz 0
Гуру
Свой
0
9 369 публикаций
Город:Рига
Регистрация: 03.07.2008
0x08000CBE E9C02400 STRD r2,r4,[r0,#0] следующим шагом в HardFault_Handler(void)
Очевидно что в этом месте в R0 - недопустимое значение. Приведите его.
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
bolmoe 0
Частый гость
Свой
0
125 публикаций
Город:Рязань
Регистрация: 05.04.2006
Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить?
__HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED();
Очевидно что в этом месте в R0 - недопустимое значение. Приведите его.
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
jcxz 0
Гуру
Свой
0
9 369 публикаций
Город:Рига
Регистрация: 03.07.2008
Ну вот и ответ. Сравните с тем, что Вы писали в первом сообщении. Для стека и для кучи.
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
bolmoe 0
Частый гость
Свой
0
125 публикаций
Город:Рязань
Регистрация: 05.04.2006
СПАСИБО за ответы, я сам отчудил. Извините ....
адрес для HEAP указал 0х0100 0000 вместо 0x1000 0000
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
jcxz 0
Гуру
Свой
0
9 369 публикаций
Город:Рига
Регистрация: 03.07.2008
СПАСИБО за ответы, я сам отчудил. Извините ....
вот для чего полезно иметь в проге обработчик HF...
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
x893 0
Гуру
Свой
0
2 599 публикаций
Город:Планета Земля
Регистрация: 27.10.2008
А еще полезнее уметь находить решение таких простых проблем
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
× Вставлено в виде отформатированного текста. Вставить в виде обычного текста
× Ваша ссылка была автоматически встроена. Отобразить как ссылку
× Ваш предыдущий контент был восстановлен. Очистить редактор
× Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.
Удаленная работа для IT-специалистов
Уже, наверное, прошло время религиозных войн AVR против STM, но нет-нет да наблюдаются вспышки столкновений двух лагерей. Практически у любой публикации на тему поделок на AVR обязательно будет каммент вроде «Да сколько уже можно лохматить бабушку, давно пора перейти на STM», дальше вариации на тему цены, количества ног и таймеров. Если STMщик более продвинут, обязательно будет указание, что DMA в AVR нет и не будет, по этому AVR должна умереть. Зачем простому блинку-вольтметру-градуснику DMA, гора 16 разрядных таймеров, 100 ног и 12 битный АЦП никто как правило не объясняет. Зачем нужен такой комбайн в устройстве, которое легко вывозит Tiny13, которая при этом не загружена даже на треть своих ресурсов никто не будет разбираться. Просто надо переходить на STM32, и баста. Ибо вот.
И надо сказать, есть у людей тяга к новизне. А действительно, может попробовать? А вдруг понравится? Вот только Референс Мануал на популярный STM32F103C8T6, на котором основана самая массовая Голубая таблетка в 1126 страниц что-то как-то не очень располагает к «быстрому старту». Даже отдельную утилиту, так ненавидимый аксакалами «калокуб», и ту надо изучать, что там к чему. Да и вникнув в Cube, стартовать за 5 минут вряд ли получится, генерируемая им портянка не самое доступное чтиво на ночь, просто «в лоб» врубиться, о чём там речь получится не у каждого.
Отдельной беседы заслуживают многочисленные статьи, похожие на эту, про быстрый и лёгкий старт в STM. У всех подобных статей меня первое время очень смущало одно обстоятельство. Нигде не присутствует подробное объяснение, а что мы тут собственно пишем. Куча скриншотов как создать проект, потом сразу стена кода-делай вот так! А что там, для чего там, почему именно так, откуда взять все эти вроде и понятные слова, никто не вникает, ибо силы кончились при написании мануала по установке Кейла и Куба, и по запуску проекта. Только спустя какое-то время, индивидуальное для каждого, приходит понимание, что происходит и зачем. В свою очередь, я предлагаю способ стартовать не с начала, как все, а с конца. Сейчас мы будем делать всё наоборот, не настраивать контроллер, писать код и дебажить его, а сразу перейдём к дебагу, и запротоколируем наши действия в виде кода.
Итак, устанавливаем Keil, как бесплатную (до 32КБ кода) среду. Описывать сие действо не будем, этого есть в интернетах, да и степ-бай-степ установщика должен осилить человек, который идёт в STM. Запускаем проект: Project-New uVision Project, создаём папку и файл проекта. Открывается окно выбора контроллера, в поиск вводим модель 103C8 и соглашаемся на единственную отобранную модель.
Далее попадаем в окно выбора библиотек:
Здесь ставим три галки: CMSIS-CORE, Device-Startup и Device-GPIO. Этого набора вполне хватит, чтобы подрыгать ножкой, зажигая светодиодик. Дальше придётся-таки понастраивать, никуда от этого не денешься. Alt+F7 запускают окно настроек, расположенное Project-Options for Target, где на вкладке «Output» надо поставить галку «Create HEX-File», чтобы создался файл прошивки, которую мы будем загружать в контроллер. Далее, во вкладке «Debug» мы выберем ST-Link, которым, собственно, и будем загружать прошивку и дебажить:
По кнопке «Setting» рядом с окошком выбора программатора попадаем в окно «Cortex-M Target Driver Setup», где во вкладке «Flash Download» ставим галку «Reset and Run».
В дереве проекта ткнём правой кнопкой в папку «Source Group 1», в открывшемся визарде создадим файл main.c, в который скоро будем писать код. В открывшемся main.c по правой кнопке вставляем самый первый и самый важный инклюд:
Дописываем код, состоящий из main и бесконечного while:
#include "stm32f10x.h" // Device header
int main(){
while(1){
}
}
Как ни странно, это всё на сей момент, это уже готовая и понятная программа, которая корректно компилируется и загружается в контроллер. Нажимаем F7 и видим, что прошивка удачно собрана, ошибок и варнингов нет.
С этого момента нам полностью доступен контроллер, мы можем войти в него под линии дебага и крутить-вертеть его во все стороны, а он будет откликаться.
Клавиши Ctrl+F5 ведут нас в дебаг, а кнопка «System Viewer Windows» позволяет запустить окошки контроля регистров тактирования и управления ногами GPIO.
Далее предлагаю всё-таки воспользоваться Reference Manual, тем более, что его даже скачивать не надо, он доступен по клику во вкладке «Books» меню «View»:
Теперь предлагаю воспользоваться следующим рассуждением. Из распиновки на Голубую Таблетку видно, что светодиод висит на ноге 13 порта С. Многочисленные инет-ресурсы и обсуждения всегда упоминают, что прежде, чем что-то сделать в STM, это что-то надо включить, иначе-подать тактирование. Не мудрствуя лукаво, пишем в окно поиска pdf-читалки то, что нам надо, а именно-включить порт C: «PORT C CLOCK ENABLE». Получаем во такую картину:
Отсюда можно сделать вывод, что включение тактирования порта С осуществляется в регистре IOPCEN. С этим знанием идём во вкладку RCC в режиме дебага, и вписываем это название в строку поиска:
Помечаем требуемый чекбокс галочкой, и с этого момента считаем порт С включенным.
Теперь, вспомная многострадальный AVR, будем искать настройку собственно пина. Для того, чтобы он заработал, надо объяснить, что именно мы от него хотим. А хотим мы подрыгать ногой номер 13 порта С, для этого надо задать режим её работы. В строке поиска в Referense Manual вбиваем «Port bit configuration», чем выразим своё желание прочитать, где же спрятаны настройки ножки. Поиск приводит нас к таблице, из которой следует, что для того, чтобы назначить ногу выходом, требуется сконфигурировать регистры MODE и CNF:
Из таблицы №20 видно, что для назначения ножки выходом Push-Pull надо сбросить регистры CNF0 и CNF1, а состояние пары MODE0 и MODE1 описано в таблице №21, я выберу верхний вариант, до 10MHz, MODE0=1, MODE1=0. Это я и проделаю в окне GPIOC для регистров CNF13 и MODE13
Теперь у нас настроено тактирование и режим работы порта. Самое время узнать, как именно дрыгнуть ножкой. По английски установить бит порта пишется как «Port bit set», эту фразу и будем искать в мануале:
Поиск приводит нас на страницу с таблицей, из которой явно видно, что за установку состояния ножки порта отвечает регистр BSRR, состоящий из пар BS и BR, Bit set и Bit reset соответственно. Находим эти регистры в окне GPIOC в режиме дебага и наслаждаемся управлением ногой №13 напрямую, тыкая мышкой галки в соответствующие чекбоксы:
Светодиод на плате голубой пилюли висит между ногой и VCC, по этому управление им обратно названию регистров. Bit Set (регистр BS13) тушит его, а Bit Reset (регистр BR13) зажигает. Это регистры атомарных операций, они сбрасываются после установки чекбокса. Есть возможность управлять ногой через регистр ODR, (пункт 9.2.4 Port output data register (GPIOx_ODR) в референс мануале), там наглядно видно, к чему приводит установка и сброс галки.
Горящий и тухнущий зелёный светодиод показывает, что всё работает верно. Остаётся только записать всё это в виде кода в файл main.c. Вот тут и появляется самый изюм, который отличает этот способ постижения контроллера STM через дебаг от остальных, которыми завален весь интернет. Я предлагаю просто переписать то, что видим в окне дебага в код. Пример:
Задали режим работы порта и включили тактирование;
Включили ножку порта, подождали, выключили и так далее:
#include "stm32f10x.h" // Device header
int main(){
RCC->APB2ENR=0x00000010; // включили тактирование
GPIOC->CRH=0x44144444; // задали режим Push-Pull до 10MHz
int i; // переменная для задания задержки вкл/выкл светодиода
while(1){
GPIOC->ODR=0x00002000; // выключаем LED, по ламерски дёргая весь порт целиком
i=2000000; // взводим переменную для паузы
while (i) i--; // ждём
GPIOC->ODR=0x00000000; // включаем LED
i=2000000; // снова ждём
while (i) i--;
}
}
Само собой, данный способ далеко не лучший и не правильный, но по моему мнению наиболее понятный и простой. К тому же, он приобщает к работе с даташитом (референс мануалом) и не отпугивает, как чтение манов и написание многостраничных портянок кода для Блинка. Да, здесь нет наслоений абстракций, упущено многое, но за элементарность старта я думаю можно это простить. Чтение мана и правильная работа с регистрами это потом, сейчас у нас моргает светодиод и нам в принципе понятно, как и что мы сделали, а самое главное, откуда взялись все эти аббревиатуры. Если бы мне показали такой способ изучения STM раньше, возможно я бы не собирал over 9000 разных программаторов для AVR в которых так и не было дебага, а взялся бы сразу за Кортексы. Ведь в AVR так и нет внятного и доступного дебага, но всё равно, забывать Tiny13 пока рано. Свои задачи она вывозит.
Укажите причину минуса, чтобы автор поработал над ошибками
Присылаем лучшие статьи раз в месяц
Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.
Инженер-электронщик (программист микроконтроллеров, embedded)
Программист встроенных систем (С/С++, Junior/Middle)
Программист C/C++ (протоколы мобильной связи 4G/5G)
до 150 000 ПроВайд Лабс Новосибирск Можно удаленно
Преподаватель в КиберШколу (Программирование) в выходные дни
AdBlock похитил этот баннер, но баннеры не зубы — отрастут
Подробнее
Контроллеры мощнее, а подходы к программированию все те же. Какие-то битики, какие-то регистры. Нафига это все? Следующих шаг от 8-битных МК должен быть переход к более высокому уровню абстракции, когда пофиг сколько там таймеров и есть или нет ДМА. Т.е. к ОС. Без ОС между AVR и ARM нет никакой принципиальной разницы.
FreeRTOS, mbedOS и иже с ними. Это есть. AVR редко используется(во всяком случае мной), зачастую 32 битный STM.
И абстракция есть, HAL называется…
С такой абстракцией никакие враги не нужны. И человек немного путает ОС и ОСРВ, никакая ОСРВ в обозримом будущем не будет заниматься организацией работы с DMA в независимом от разработчика режиме.
Предлагаете для моргания светодиодом использовать Raspberry Pi с каким-нибудь модным фреймворком? :)
В кокосе в свое время можно было выбрать контроллер и создать проект прям в несколько кликов. Если не путаю.
А сейчас все что может само генерировать проект выдает чудовищные простыни с HAL через которые новичку пробраться к железу гораздо сложнее. Хотя
USART stm 32 HAL / STM32 / stD
STM Урок 182. CMSIS. STM32F1. USART. Приём данных | | Программирование...
STM 32F407 CCM RAM STACK HEAP - STM - Форум ELECTRONIX
Наилегчайший старт в STM через «одно место» / Хабр
STM Cheer 2011 - YouTube
STM Cheerleading (@STMCheer) | Твиттер
Установка ПО для работы с STM 8 / STM8 / Сообщество EasyElectronics.ru
Обвязка STM32 | Главы из будущей книги|Блог — Студия Все Мое
STM32 от Булкина. Урок 1: Вводный, где мы немножко похулиганим. | Пикабу
Изучаем STM32. Маленький урок по программатору — DRIVE2
Микроконтроллеры STM8 «с нуля»
STM32 тактирование. » Хабстаб
Программирование STM 32. Часть 2. Система тактирования STM32
STM8. Урок 1. Настройки среды ST Visual Develop
Как прошить чип STM32 | Многобукфф
Feeding Daughter Cum
Ebony Butt
Piss Drinking Videos
Asstr Stm Cheer