ART_ME

STM32 для чайника

1 877 сообщений в этой теме

Цитата

 

Цитата

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

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

Цитата

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    45
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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 часов назад, snn_krs сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

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. Обычные битовые операции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    24
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    24
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    24

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 камнем делал, мне так удобно, чем пользоваться битовыми операциями

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    24
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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    24

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

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    217
11 час назад, Электронщик сказал:

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

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

 

1111111111.jpg

Поделиться сообщением


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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Oxford    24

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

 

Screenshot_26.jpg.edf3a7ac3c84b84ffbf8108602a07d6c.jpg

Изменено пользователем Oxford

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    217
11 час назад, Электронщик сказал:

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

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

У меня такой:

 

1111111111.jpg

Поделиться сообщением


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...