Все, я окончательно запутался. У меня не работает примитивный код на BluePill.
Я написал минимальный пример, в котором проверяется ногодрыг на ножках:
Порт A - нога A0
Порт C - нога C13 (встроенный светодиод),
Порт C - нога C14 - для сравнения с C13, мало ли
Порт B - нога B3
Порт B - нога B4
Проблема в том, что ногодрыг работает на ножках портов A и C, но не работает на ножках порта B.
Я не могу понять почему. Все три порта инитятся одинаково. Ноги дрыгаются тоже абсолютно одинаково абсолютно одинаковым кодом. Но на порту B ногодрыг не работает. Я переткнул три STM платы, везде одно и тоже.
Вот код:
Код:
int main(void) { // Начальные инициализации оборудования STM32 clockInit();
Читаем мануал RM0008, раздел GPIO, таблицу JTAG/SWD. Ваши PB3, PB4 заняты под JTAG, и его надо отключить в регистре AFIO->MAPR, биты SWJ_CFG = 010. Да, и не забудьте включить тактирования AFIO в регистра RCC, прежде мем записывать регистры AFIO.
И по коду. Функция clockInit() излишняя, поскольку все настройки частот выполняются ранее, ещё до входа в main. Полистайте файлы проекта, найдёте функцию SystemInit(), в которой уже выполняется настройка частоты. Если нужна другая частота, прям в этой функции и пишите то, что надо
Читаем мануал RM0008, раздел GPIO, таблицу JTAG/SWD. Ваши PB3, PB4 заняты под JTAG, и его надо отключить в регистре AFIO->MAPR, биты SWJ_CFG = 010. Да, и не забудьте включить тактирования AFIO в регистра RCC, прежде мем записывать регистры AFIO.
И по коду. Функция clockInit() излишняя, поскольку все настройки частот выполняются ранее, ещё до входа в main. Полистайте файлы проекта, найдёте функцию SystemInit(), в которой уже выполняется настройка частоты. Если нужна другая частота, прям в этой функции и пишите то, что надо
Что-то я посмотрел CMSIS, нету там такой функции. Я, если что в PlatformIO работаю под Linux. Вы может думали что в Cube проект сделан, там возможно и есть такое. Но мне Cube не подошел, он напроч отказывается работать с китайскими STM32, которые раньше маркировались CS32, а потом стали маркироваться как и оригинал. Все эти пляски с правкой ChipID в разных местах Cube ни к чему не привели - видимо все рецепты для более старых версий, поэтому среды OpenSource наше все.
И по коду. Функция clockInit() излишняя, поскольку все настройки частот выполняются ранее, ещё до входа в main. Полистайте файлы проекта, найдёте функцию SystemInit(), в которой уже выполняется настройка частоты. Если нужна другая частота, прям в этой функции и пишите то, что надо
Файл исходника называется system_stm32f10x.c. Про PlatformIO не знаю, может он не создает таких файлов и работает по иному шаблону. Ну а в CubeIDE этот файл функцией SystemInit() хоть и создается, но остается практически пустым, а настройка частот вынесена в другое место. В принципе, единых правил нет, это всего лишь рекомендация.
Да, я тоже нашел. Midnight Commander что-то затупил, бывает у него такое. И при поиске по файлам, и при поиске в просмотре файла тупо не находит то, что реально есть.
Только в моем случае файл называется ./CMSIS/Include/system_stm32f1xx.h
Да, я тоже нашел. Midnight Commander что-то затупил, бывает у него такое. И при поиске по файлам, и при поиске в просмотре файла тупо не находит то, что реально есть.
Только в моем случае файл называется ./CMSIS/Include/system_stm32f1xx.h
Но я не увидел там настройку на 72MHz и делителей для Flash. Вроде как есть инициализация кварца, но не боле того - просто выставили регистры настроек и все, ни тебе ожидания инициализации, ни ожидания переключения в режим. Странно.
Все эти вещи нужно самому делать: CMSIS без понятия, что у тебя за МК, нужны еще заголовочники ST'шные + свои стартап и т.п. Я вот так сделал: вызываю функцию StartHSE(), если мне нужен HSE, а при включении можно sysreset() вызвать (но обычно это не требуется).
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
[uquote="MLX90640",url="/forum/viewtopic.php?p=4302979#p4302979"]Читаем мануал RM0008, раздел GPIO, таблицу JTAG/SWD. Ваши PB3, PB4 заняты под JTAG, и его надо отключить в регистре AFIO->MAPR, биты SWJ_CFG = 010. Да, и не забудьте включить тактирования AFIO в регистра RCC, прежде мем записывать регистры AFIO.
В общем, всё верно, только наоборот. Строчки местами поменять. В RCC разрешается тактирование, то есть доступ к регистрам AFIO в целом, чтобы их модно было перезаписать. Я ж там и написал - тактирование включить ПЕРЕД, а не после.
В общем, всё верно, только наоборот. Строчки местами поменять. В RCC разрешается тактирование, то есть доступ к регистрам AFIO в целом, чтобы их модно было перезаписать. Я ж там и написал - тактирование включить ПЕРЕД, а не после.
Благодарю, вот так заработало (я не понял что такое "мем", думал какая-то память, а это было "чем"):
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения