Перейти к содержанию

STM32 для чайника


ART_ME

Рекомендуемые сообщения

Цитата

 

Цитата

Все обозначения типа OSPEEDER, прописываются не в мануале, а в подключаемых файлах типа stm32f4x_gpio.h. Если хитите их использовать, подключите их в свой проект.

 Так это ж тоже что куб прописывает, а если без библиотек

Цитата

Я  сейчас, конечно, получу ведро слюны в свой адрес, но посмотри что генерирует Куб для твоего случая

Та с кубом все просто. Может и придется смотреть что оно там генерирует по регистрам в stm32f4x_gpio.h

Думал может кто сталкивался.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

3 hours ago, Электронщик said:

а если без библиотек

Тогда самостоятельно пишем, чтото типа

#define GPIO_AF_USART1        ((uint8_t)0x07)  /* USART1 Alternate Function mapping */
#define GPIO_AF_USART2        ((uint8_t)0x07)  /* USART2 Alternate Function mapping */
#define GPIO_AF_USART3        ((uint8_t)0x07)  /* USART3 Alternate Function mapping */

Это из Кейла. Таких строк прийдется писать очень много. Подключая файлы *.h вы не увеличиваете размер кода, зато пользуетесь всеми определениями типа GPIO_AF_USART1.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

7 часов назад, snn_krs сказал:

Все обозначения типа OSPEEDER, прописываются не в мануале, а в подключаемых файлах типа stm32f4x_gpio.h. Если хитите их использовать, подключите их в свой проект.

уж точно не там, а в CMSIS.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

8 часов назад, Darth_Vader сказал:

Я  сейчас, конечно, получу ведро слюны в свой адрес, но посмотри что генерирует Куб для твоего случая :)

не переживай все на easyelectronics сидят.

Ссылка на комментарий
Поделиться на другие сайты

Цитата

 

Цитата

GPIOA->OSPEEDR = GPIO_OSPEEDER_OSPEEDR0_0; 

Так я ж так и написал, но в мануале про лишнюю букву E ни слова

Цитата

AFR не имеет именованных бит, потому что не нужно.

А в мануале тогда GPIOx_AFR биты имеют же на наименовение, допустим полубайт для 9ноги имеет биты как и остальные полубайт 3-0.

Вообщем запишу как я рассчитал, в первом посте по этой теме, думаю правильно GPIOA->AFR [1]=0x770

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

красивее так (и понятнее) GPIOA->AFR[0] = (3 << 0) | (2 << 12); и т.д. Описание регистров периферии тут: stm32f4xx.h

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

Можно же так как и я писал? Мне по моему понятнее, а ты же используешь побитовый сдвиг, а он для меня как темный лес, как я понял в 3-й бит записываешь 0, плюс 2*2^12, или как это правильно, с побитовый сдвигом только с регистрами AVR работал, не пойму как правильно это расшифровать?

Может так можно записать GPIOD->AFR[1] = (0xA<<0x7)|(0x9<<0x7); тупо в AFRH10 и  AFRH9 записать по 0111, то есть в шестнадцатиричной форме 0x7 ? 

Изменено пользователем Электронщик
Ссылка на комментарий
Поделиться на другие сайты

Ну это удобнее для работы с группами бит. Вот AFR 8 групп по 4 бита (0 - 15). например для записи AFRL7  нужно сдвигать значение на 28 бит, а для AFRL3 - на 12, имеем ... = (3 << 28) | (1 << 12);  AFRL7 = 3, AFRL3 = 1. Обычные битовые операции.

Ссылка на комментарий
Поделиться на другие сайты

14 часа назад, Электронщик сказал:

Проблема такая, прикупил f407 камень и начал изучать, и все вроде ничего, но вот с ЮАРТ проблема появилась, а именно не могу настроить альтернативные функции на PA9 PA10, для ЮАРТ    

IAR ругается на такую запись GPIO_AFR_AFRH9_2, находил в нете где просто присваивают значение всему регистру, типа что-то такого GPIOA->AFR [1]=0x00077, но тут не могу понять как его правильно записывать, если остальные ноги порта мне не нужно назначать как альтернативные функции то пишем нули?, тогда получается для PA9 PA10, нужна 7-я альтернативная функция - это 2-й 1-й и 0-й биты по 1,

И не понятно почему я не могу таким образом записать это побитно, так:

GPIOA->AFR |=GPIO_AFR_AFRH9_2|GPIO_AFR_AFRH9_1|GPIO_AFR_AFRH9_0|GPIO_AFR_AFRH10_2|GPIO_AFR_AFRH10_1|GPIO_AFR_AFRH10_0 ;//назначение альтернативных функций

Почему IAR пишет что не знает такого?

И еще вопрос почему при назначении скорости в регистре  GPIOx_OSPEEDR , если я напишу  GPIO_OSPEEDR- без буквы E между D  и R( вот так выделил красным где должна быть буква E:  GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR14_1, в слове OSPEEDER, то IAR ругается, а если с этой буквой все хавает, ведь в мануале, нигде об этом не написано, это ошибка разработчиков, или компилятора, или что- то другое?

Вот так без проблем работает:
 GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14_1;//   GPIO_OSPEEDER-должна быть буква E между D  и R, в слове OSPEEDER

И еще вопрос на 103 камень нужно включать тактирование альтернативных функций, на 407 не нужно? Если я правильно понял.

 

 

1. c 8 по 15 название другое, вместо GPIO_AFR_AFRH9_0 идет GPIO_AFRH_AFSEL9_0 или GPIO_AFRH_AFRH1_0

//USART1_TX PA9
GPIOA->AFR[1] |= GPIO_AFRH_AFSEL9_0 | GPIO_AFRH_AFSEL9_1 | GPIO_AFRH_AFSEL9_2;
//USART1_RX PA10
GPIOA->AFR[1] |= GPIO_AFRH_AFSEL10_0 | GPIO_AFRH_AFSEL10_1 | GPIO_AFRH_AFSEL10_2;

 

2. GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14_1; и GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEED14_1;  оба варианта рабочие (Legacy defines)

3. GPIO_OSPEEDR_OSPEED14_1 и GPIO_OSPEEDER_OSPEEDR14_1 оба варианта рабочие (Legacy defines)

4. Тактирование в 407 включать не нужно.

 

тогда так что ли  GPIOA->AFR [1]=0b00000000000000000000011101110000, или GPIOA->AFR [1]=0x770  ? Присваивать напрямую можно только если значение регистра было нулевым,  но есть состояние сброса где не нули, в противном случае вы получите ошибку. Поэтому категорически такие записи не допускаются, только через оператор |

 

Screenshot_5.thumb.jpg.47bcdb81be9076584d528f96073cedba.jpg

 

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

13 часа назад, Darth_Vader сказал:

Я  сейчас, конечно, получу ведро слюны в свой адрес, но посмотри что генерирует Куб для твоего случая :)

Еще раз услышу про калокуб...за яйки подвешаю.

Ссылка на комментарий
Поделиться на другие сайты

Цитата

1. c 8 по 15 название другое, вместо GPIO_AFR_AFRH9_0 идет GPIO_AFRH_AFSEL9_0 или GPIO_AFRH_AFRH1_0

//USART1_TX PA9
GPIOA->AFR[1] |= GPIO_AFRH_AFSEL9_0 | GPIO_AFRH_AFSEL9_1 | GPIO_AFRH_AFSEL9_2;
//USART1_RX PA10
GPIOA->AFR[1] |= GPIO_AFRH_AFSEL10_0 | GPIO_AFRH_AFSEL10_1 | GPIO_AFRH_AFSEL10_2;

Как раз так и хотел, Спасибо!!! только в мануале, я не видел чтобы так были указаны биты как AFSEL, я иногда удивляюсь названиям битов из мануала, а в компиляторе нужно прописывать другие названия, но компилятор хавает, а GPIO_AFRH_AFRH1_0 - ругается, да и так понятнее по битам настраивать, открыл табличку по битам посмотрел и все ясно, , лучше чем присваивать число всему регистру, ну и раз указывают в мануале, то почему не юзать эти биты, ну и второй вариант как я высчитал до этого с оператором или). GPIOA->AFR [1] |=0x770

Цитата

 

2. GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14_1; и GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEED14_1;  оба варианта рабочие (Legacy defines)

3. GPIO_OSPEEDR_OSPEED14_1 и GPIO_OSPEEDER_OSPEEDR14_1 оба варианта рабочие (Legacy defines)

 

Оно то рабочие, только вот в мануале написано что биты имеют название  допустим OSPEEDR14_1, почему тогда компилятор хавает GPIO_OSPEEDR_OSPEED14_1;, почему в мануале не пишут что так нужно прописывать биты, или тот вариант как GPIOB->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR14_1 Как это понимать по мануалу? Или методом тыка пробовать?

Вот из мануала, вот где тут написано как правильно писать биты в компиляторе, сдлелали бы так, разработчикам было бы легче,  вот на те же АВР, и даже примеры кусков кода есть, а тут хотя бы написали как правильно называть все это в компиляторах?Screenshot_2.png.b06a6791c1494f4ab291bc6ed66dadaf.pngScreenshot_3.png.3c8831e30cec4e453b57819b939ef017.png

 

Ссылка на комментарий
Поделиться на другие сайты

Где вы это все берете? AFR вообще не описан в "stm32f4xx.h". В нем 8 групп значений по 4 бита в каждом, ясное дело что удобно работать так GPIOA->AFR[0] = (3 << 0) | (2 << 12); С OSPEEDER такая  же фигня, ну придумайте 4 наименования для всевозможных значений для 1 груммы бит, а дальше сдвигом. Из HAL наверное выдрать можно названия. Проявите смекалку)

В твоем случае так: GPIOA->AFR[1] = (7 << 4) | (7 << 8);

Ссылка на комментарий
Поделиться на другие сайты

как вариант:

#define GPIO_OSPEEDR_LOW     0
#define GPIO_OSPEEDR_MED     1
#define GPIO_OSPEEDR_HIGH    2
#define GPIO_OSPEEDR_VERY    3

  GPIOA->OSPEEDR = (GPIO_OSPEEDR_VERY << 18) | (GPIO_OSPEEDR_VERY << 20);

А лучше всего напишите свою библиотеку, вот как я настраиваю пины:

  TGPIO::SetMode(PA2, (gpAlternateMode | gpSpeedHigh | gpAF1));
  TGPIO::SetMode(PA3, (gpAlternateMode | gpSpeedHigh | gpAF1));

но тут уж как кому удбнее.

Ссылка на комментарий
Поделиться на другие сайты

ну отлично, только описание регистров тут stm32f4xx.h Если группа регистров принимает значения например от 0 до 15, нафига битики выставлять, если можно записать как есть от 0 до 15. Например регистры DMA совсем отличаються (названием) от описания в мануале и построены иначе, и ничего разобраться можно все есть тут stm32f4xx.h.

Изменено пользователем MasterElectric
Ссылка на комментарий
Поделиться на другие сайты

MasterElectric ваш поток слов не понятен мне. 

В 23.09.2018 в 14:48, MasterElectric сказал:

как вариант:


#define GPIO_OSPEEDR_LOW     0
#define GPIO_OSPEEDR_MED     1
#define GPIO_OSPEEDR_HIGH    2
#define GPIO_OSPEEDR_VERY    3

  GPIOA->OSPEEDR = (GPIO_OSPEEDR_VERY << 18) | (GPIO_OSPEEDR_VERY << 20);

А лучше всего напишите свою библиотеку, вот как я настраиваю пины:

  TGPIO::SetMode(PA2, (gpAlternateMode | gpSpeedHigh | gpAF1));
  TGPIO::SetMode(PA3, (gpAlternateMode | gpSpeedHigh | gpAF1));

но тут уж как кому удбнее.

Это делается гораздо проще все, обертки не нужны.

GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEED2_1 | GPIO_OSPEEDR_OSPEED3_1;
GPIOA->MODER |= GPIO_MODER_MODE2_1 | GPIO_MODER_MODE3_1;
GPIOA->AFR[0] |= GPIO_AFRL_AFSEL2_0 | GPIO_AFRL_AFSEL3_0;

 

 

Электронщик вы все поняли, есть еще вопросы?

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

Цитата

 

Кроме того что, я выше ответил Вам, откуда брать название AFSEL, и т.д., если они в мануале не прописаны? Смотреть в stm32f4xx.h ? И нормально ли так по битам это настраивать? Я так и со 103 камнем делал, мне так удобно, чем пользоваться битовыми операциями

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Электронщик сказал:

Кроме того что, я выше ответил Вам, откуда брать название AFSEL, и т.д., если они в мануале не прописаны? Смотреть в stm32f4xx.h ? И нормально ли так по битам это настраивать? Я так и со 103 камнем делал, мне так удобно, чем пользоваться битовыми операциями

Описания в CMSIS хедере могут меняться в зависимости от версии CMSIS (поэтому описания регистров могут иметь поддержку наследования старых версий не пугайтесь). Нужно активно работать с текущим API файлом stm32f4xx.h. Когда вы пишите в редакторе вам вылазит подсказка там смотрите что доступно. Определения битов хорошо описаны,откройте файл и пролистайте посмотрите для регистра описание битов и все станет ясно, в референс мануале вам надо смотреть какие биты выставлять и в какой регистр и читать как работает периферия.

В основном описание битов идет так ПЕРИФЕРИЯ_РЕГИСТР_БЛОКБИТОВ_НОМЕРБИТА

Весь API это структуры периферии и описание битов для регистров. В файле есть комментарии.

Работать с битами это правильно, в регистре смотрите какие биты выставить и пишите нужные. Если в блоке выставлены все биты, есть определение одной записью где все биты выставлены, чтобы не писать несколько.

Например надо выставить два бит 0 и 1 биты, вместо GPIO_OSPEEDER_OSPEEDR0_0 | GPIO_OSPEEDER_OSPEEDR0_1 лучше писать просто GPIO_OSPEEDER_OSPEEDR0;

Например. Смотрим мануал и там написано что для выставления альтернативной функции AF1 нужно выставить 0 бит (0001: AF1)  значит запрограммируем 0 бит для 2 ножки в порту A GPIOA->AFR[0] |= GPIO_AFRL_AFSEL2_0;

Screenshot_7.jpg.87d4fd9b39b648751287e7dbda8eedde.jpgScreenshot_8.jpg.87afb9a09fb1fd64ee259d89fd24cdc0.jpg

Screenshot_9.jpg.a12fa4224b307b1efd011cb659db6257.jpgScreenshot_10.jpg.783385a4af2f0e7aff882346a6dfdf2c.jpgScreenshot_11.jpg.0e7f812ac8fd5dc6da928700726e7e99.jpg

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

По IAR не подскажу. Специализируюсь по KEIL. CTRL + ПРОБЕЛ попробуйте нажать. когда пишите код, у KEIL она так вызывается.

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

11 час назад, Электронщик сказал:

Жаль только в IAR таких подсказок по регистрам я не видел

Если вы их не видели это не значит что их там нет, настраивать ничего не нужно все там есть.

 

1111111111.jpg

Сергей.

Ссылка на комментарий
Поделиться на другие сайты

Optima, а как их включить эти подсказки в IAR? У меня не показывает так, при нажатии CTRL+пробел иногда выскакивает, а так в основном пишет слово working? Ну и даже это не то как  у Oxford у него в Keil, подчеркивает что бит регистра не так называется и выдает подсказку нужного бита, это лучше чем в IAR где ты из кучи регистров при нажатии на CTRL+пробел который почему-то срабатывает не понятно как, должен выбрать сам нужный регистр, или биты регистров, так еще и не подчеркивает что не так он называется в компиляторе как в Keil. 

Ссылка на комментарий
Поделиться на другие сайты

Ну подчеркивание это в редакторе KEIL реализовано, называется эта плюшка динамическая проверка синтаксиса. Если неправильно пишешь он сразу подчеркивает и подсказки может написать что ему не нравиться.

 

Screenshot_26.jpg.edf3a7ac3c84b84ffbf8108602a07d6c.jpg

Изменено пользователем Oxford
Ссылка на комментарий
Поделиться на другие сайты

11 час назад, Электронщик сказал:

как их включить эти подсказки в IAR?

Они должны быть автоматом, какой версии у вас IAR?

У меня такой:

 

1111111111.jpg

Сергей.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...