|
Щупаю HAL библиотеку. Групповое управление выводами?, С пинами понятно.А как для шин,когда в этом порту есть независим пины? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 26)
|
Jul 12 2015, 12:55
|

Знающий
   
Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847

|
Цитата(Defin @ Jul 12 2015, 14:51)  HAL от ST я так понимаю? Для такой задачи он не нужен, можно просто выставлять биты в регистре BSRR порта GPIO. Можно как задавать выводы для установки, так и для снятия. Спасибо! Да! STM32... Сам HAL это использует... Цитата /** * @brief Sets or clears the selected data port bit. * * @note This function uses GPIOx_BSRR register to allow atomic read/modify * accesses. In this way, there is no risk of an IRQ occurring between * the read and the modify access. * * @param GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral * @param GPIO_Pin: specifies the port bit to be written. * This parameter can be one of GPIO_PIN_x where x can be (0..15). * @param PinState: specifies the value to be written to the selected bit. * This parameter can be one of the GPIO_PinState enum values: * @arg GPIO_BIT_RESET: to clear the port pin * @arg GPIO_BIT_SET: to set the port pin * @retval None */ void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) { /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); assert_param(IS_GPIO_PIN_ACTION(PinState));
if(PinState != GPIO_PIN_RESET) { GPIOx->BSRR = GPIO_Pin; } else { GPIOx->BSRR = (uint32_t)GPIO_Pin << 16; } } Побитно это уместно. Но на 8 бит лаконично не получится...
|
|
|
|
|
Jul 12 2015, 13:33
|

Знающий
   
Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847

|
Цитата(Defin @ Jul 12 2015, 16:20)  Этот регистр принимает маску.
GPIOx->BSRR = (маска_пинов_для_установки_в_1) | (маска_пинов_для_установки_в_0 << 16);
Например есть порт GPIOA. Пины 0 - 7 используются для вывода на шину 1 байта. А Пины 8-15 для каких-либо других целей. Допустим управляют светодиодами. И вот в шину понадобилось вывести значение 0xA1, при этом светодиоды не должны изменить своего состояния.
Делается просто:
void setByte(uint16_t value) { GPIOx->BSRR = (0xFF & value) | ((0xFF & (~value)) << 16 ); }
После вызова setByte(0xA1); в порте будут выставлены нужные биты. Ну да!.. Непосредственно в регистр.. "Лучшее - враг хорошего!"(HAL ориентирован на биты) Проще не бывает!.. Я ожидал от HAL боле изящных ходов... Спасибо!
|
|
|
|
|
Jul 12 2015, 20:43
|
Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 26-12-11
Из: Казань
Пользователь №: 69 101

|
Цитата(Nixon @ Jul 12 2015, 21:12)  Кто вам мешает делать вызов HAL_GPIO_WritePin с параметрами в виде маски? Код HAL_GPIO_WritePin(GPIOx, PIN1 | PIN2 | | PINX, PinState) Можно, но это подходит только если всем пинам нужно выставить одно состояние. А если необходимо вывести байт иди два на шину - то нет. Цитата(scifi @ Jul 12 2015, 23:07)  +1. Вот сейчас ваяю под LPC4370. У них там софтина называется LPCOpen. Я ваще не понял, зачем оно надо. Документации на софтину практически нет, работать напрямую с регистрами проще и быстрее (про них же написан мануал!). Заглядываю внутрь и вижу индусский говнокод: например, задержка 50 мкс "while(delay--) {}" - это вообще как или где? Такие дела. Видимо, не все софты одинаково полезны. Такие софтины полезны для быстрого освоения процессора/платформы, нет необходимости прыгать по тысячестраничному референс мануалу. Иногда отсутствие документации компенсируется примерами, внятными комментариями к коду или хорошим стилем кода. Но говнокод в таких библиотеках раздражает, приходится допиливать. А если уж нужна скорость работы - то оперировать только регистрами.
|
|
|
|
|
Jul 13 2015, 06:14
|

Знающий
   
Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847

|
Цитата(Nixon @ Jul 12 2015, 21:12)  Кто вам мешает делать вызов HAL_GPIO_WritePin с параметрами в виде маски? Код HAL_GPIO_WritePin(GPIOx, PIN1 | PIN2 | | PINX, PinState) Именно это меня и ужаснуло!... Коряво..
|
|
|
|
|
Jul 14 2015, 02:49
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(Сергей Борщ @ Jul 13 2015, 23:42)  Ну ладно, с содержимым функции еще можно было бы смириться, но почему не сделать эту функцию статической и не поместить ее в заголовочный файл? Компилятор бы ужал ее по максимуму и эффективность была бы практически как с прямой записью в регистр. Но видимо это верхняя математика для писателей библиотек. эм. простите что немного не по теме.. я привык считать, что статические функции имеют ограничения и доступны только в пределах библиотеки (за счет чего происходит сжатие - оптимизация). т.е. выражения " сделать эту функцию статической" и " поместить ее в заголовочный файл" взаимоисключающие.. или я чего то не понимаю..?
|
|
|
|
|
Jul 14 2015, 04:29
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(k000858 @ Jul 14 2015, 05:49)  эм. простите что немного не по теме.. я привык считать, что статические функции имеют ограничения и доступны только в пределах библиотеки (за счет чего происходит сжатие - оптимизация). т.е. выражения "сделать эту функцию статической" и "поместить ее в заголовочный файл" взаимоисключающие.. или я чего то не понимаю..? static-функции доступны в пределах единицы трансляции (т.е. файла *.c после подстановки в него всех файлов *.h) static в хидере - это, как я понимаю, замена inline для древних си-компиляторов. Без static будет ошибка линковки. Однако со static, если компилятор не проинлайнит, получится несколько копий одной и той же функции в разных объектниках, а затем и в программе. Для inline, как я понимаю, в таком случае в программе будет одна копия. Что касается громкого слова "библиотека", то это в данном случае это просто набор исходных файлов, которые лежат в отдельной папке и включаются в проект наравне с файлами самой программы.
|
|
|
|
|
Jul 14 2015, 07:12
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(Непомнящий Евгений @ Jul 14 2015, 08:29)  static-функции доступны в пределах единицы трансляции (т.е. файла *.c после подстановки в него всех файлов *.h)
static в хидере - это, как я понимаю, замена inline для древних си-компиляторов. Без static будет ошибка линковки. Однако со static, если компилятор не проинлайнит, получится несколько копий одной и той же функции в разных объектниках, а затем и в программе. Для inline, как я понимаю, в таком случае в программе будет одна копия.
Что касается громкого слова "библиотека", то это в данном случае это просто набор исходных файлов, которые лежат в отдельной папке и включаются в проект наравне с файлами самой программы. под "в пределах библиотеки" имелось ввиду "в пределах с-файла"
|
|
|
|
|
Jul 14 2015, 07:18
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(k000858 @ Jul 14 2015, 05:49)  я привык считать, что статические функции имеют ограничения и доступны только в пределах библиотеки В пределах единицы трансляции. Цитата(k000858 @ Jul 14 2015, 05:49)  т.е. выражения "сделать эту функцию статической" и "поместить ее в заголовочный файл" взаимоисключающие.. Напротив. Это позволяет иметь в каждой единице трансляции копию этой функции, что позволяет оптимизатору видеть тело этой функции в каждой единице трансляции и попытаться вставить все тело в точку вызова. Поскольку обсуждаемая функция в 99.99% случаев имеет константный аргумент PinState, оптимизатор выкидывает и проверку условия и неиспользуемую ветку под условием. Оставшееся вырождается в пару-тройку команд, которые занимают явно меньше места, чем код по вызову исходной функции (не говоря уже о времени исполнения). А если таких вызовов идет несколько, то оптимизатор может дополнительно объединить между ними загрузку указателя на структуру порта. Да, как заметил Непомнящий Евгений, это некое подобие inline, не предусмотренного в стандартном C 89 года. К сожалению, подобные "библиотеки от призводителя" до сих пор тащат в себе совместимость с этим древним стандартом. Можно пойти еще дальше - написать макрос, который при компиляции в режиме стандарта 89 года будет разворачиваться в static, а для более нового - в inline. Но слабо верится, что кто-то в ST когда-нибудь так сделает.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 15 2015, 10:15
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
извиняюсь за неграмотность, что есть Цитата В пределах единицы трансляции. ?
|
|
|
|
|
Jul 15 2015, 11:43
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(scifi @ Jul 15 2015, 13:52)  Уже нет нужды приделывать для этого костыли. Писатели "библиотек" даже такие костыли не умеют. А я давно использую плюсы и inline. К сожалению, всю программу на плюсах целиком gcc до сих пор не умеет, увы. Для ARM7 ему сносит крышу от thumb/arm, а для кортексов добавление -flto на программе чуть сложенее "Здравствуй, мир!" дает кучу ошибок Код `имя_функции' referenced in section `.text' of /tmp/ccALW1vd.ltrans2.ltrans.o: defined in discarded section `.text' of ./release/obj/имя_файла.o (symbol from plugin)
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 15 2015, 12:32
|

Знающий
   
Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847

|
Цитата(Сергей Борщ @ Jul 15 2015, 14:43)  Писатели "библиотек" даже такие костыли не умеют. А я давно использую плюсы и inline. К сожалению, всю программу на плюсах целиком gcc до сих пор не умеет, увы. Для ARM7 ему сносит крышу от thumb/arm, а для кортексов добавление -flto на программе чуть сложенее "Здравствуй, мир!" дает кучу ошибок Код `имя_функции' referenced in section `.text' of /tmp/ccALW1vd.ltrans2.ltrans.o: defined in discarded section `.text' of ./release/obj/имя_файла.o (symbol from plugin) Осмелюсь спросить, какую именно среду вы предпочитаете для С++? uVision ведет себя странно по моим наблюдениям. Имеет смысл копать дальше или выбрать другую среду IAR? GCC/Eclipse? EmBlocks? emIDE?...
|
|
|
|
|
Jul 16 2015, 11:19
|

Знающий
   
Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847

|
https://www.youtube.com/watch?v=PqsgSVbgfBsЗдесь можно глянуть процесс создания проекта под эту интересную среду. Геморрой не автоматизирован, как в IAR или Keil. Впечатлительным не смотреть! Получается OFFTOP! Не поленился и наваял себе по этому фильму мурзилку. Может кому пригодится? Процедура создания проекта в среде SW4STM321. CubeMX генерируем проект под эту среду. Причем, установки делаем следущие: А.Выбор контроллера, установка тактирования и периферии B.Режим генерации. Имя проекта XXX . SW4STM32 среда. Copy only the necessary library files 2. Открываем папку назначения после генерации. 3. Запускаем SW4STM32 и открываем новый проект. New-> C++Project->Empty Ptoject(Executable) + Acб STM32 MCU GCC + Project name(…prj)->Next->Next-> Create a new custom board( name+mcu+sel.debug interface (ST-Link SWD)) ->OK->Next->Finish 3.5. Открыть …prj В папке …prj удалить startup – папку и LinkerScript.ld В среде сделать Refresh ( исчезнет startup) 4. В сгенерированой папке пометить Drivers\Inc\Src и перенести в …prj. Цитата 5. В сгенерированой папке войти в папку SW4STM32 и файл syscalls.c перенести в …prj. лишнее в текущей версии 6. В сгенерированой папке войти в папку SW4STM32\...Configuration перенести STM32F….Flash.ld в …prj. В среде сделать Refresh 7. Переходим в SW4STM32 Properties for …prj 8. C/C++Build -> Settings -> MCU G++ Linker правим строку LinkerScript на STM32F….Flash.ld 9. C/C++General -> Paths and Symbols -> Includes-> Add.. + 3 галочки+Workspace… -> Drivers->CMSIS->Device->ST-> STM32F1xx-> Include->OK 10. Add.. + 3 галочки+Workspace… -> Drivers->CMSIS-> Include->OK 11. Add.. + 3 галочки+Workspace… -> Drivers-> STM32F1xx _HAL_Driver-> Inc->OK 12. Add.. + 3 галочки+Workspace… -> Drivers-> STM32F1xx _HAL_Driver-> Inc->Legacy->OK # Symbols->GNU C -> удаляем все, кроме #DEBUG # Symbols->GNU C -> Add… + 2 галочки -> ввести STM32F103хВ # Symbols->GNU C -> Add… + 2 галочки -> ввести USE_HAL_DRIVER Source Location-> Add Folder-> Drivers->OK В проекте(IDE) …prj -> Index -> Freshen All Files 13. Редактируем main.c 14. Project-> Build All 15. Debug-> Debug As -> Acб STM32 С/C++ Application -> Пауза >>> Confirm Perspective Switch -> Yes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|