STM32 новичку в ARM что к чему
Re: STM32 новичку в ARM что к чему
Стараюсь писать так, чтобы код выполнялся быстрее. Некоторые выражения установки битов преобразуются до этапа компиляции.Не забываем что это очень сокращает код и время его выполнения.
- Реклама
Re: STM32 новичку в ARM что к чему
[uquote="dosikus",url="/forum/viewtopic.php?p=3575126#p3575126"]pavell, пример кстати занятный. Если здесь вроде бы "безобидная" трата ресурсов и при ините нисколько не напрягает...[/uquote]
Несмотря на стиль изложения трудно не согласится с Владиславом, что нужно сразу приучать себя писать грамотный и понятный код, а на счет хал и т.п. ну пусть останется на совести авторов ))
Несмотря на стиль изложения трудно не согласится с Владиславом, что нужно сразу приучать себя писать грамотный и понятный код, а на счет хал и т.п. ну пусть останется на совести авторов ))
Re: STM32 новичку в ARM что к чему
pavell, пробуйте еще один вариант , может приживется...
Код: Выделить всё
nrf_write_register(NRF24_CONFIG_REG,
1 * NRF24_CONFIG_PRIM_RX | /* Mode control: 0 - TX, 1 - RX; */
1 * NRF24_CONFIG_PWR_UP | /* Power control: 0 - OFF, 1 - ON; */
1 * NRF24_CONFIG_EN_CRC | /* CRC control: 0 - disable, 1 - enable; */
1 * NRF24_CONFIG_CRCO | /* CRC encoding scheme: 0 - 1 byte, 1 – 2 bytes */
1 * NRF24_CONFIG_MAX_RT | /* MAX_RT interrupt reflection on the IRQ pin: 0 - enable, 1 - disable; */
1 * NRF24_CONFIG_TX_DS | /* TX_DS interrupt reflection on the IRQ pin: 0 - enable, 1 - disable; */
0 * NRF24_CONFIG_RX_DR /* RX_DR interrupt reflection on the IRQ pin: 0 - enable, 1 - disable; */
);- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="pavell",url="/forum/viewtopic.php?p=3575060#p3575060"]не влияющая ни на что?[/uquote]Если бы каждый раз слыша этот довод мне на счёт капал один "дохлый президент", я бы уже бросил работу
Ну вот смотри. В переменной buff адрес массива лежит. Зачем вместо использования его напрямую по назначению брать адрес нулевого элемента массива? Да, результат тот же, но зачем? Хотелось бы ход мысли узнать.
Вот, кстати, пример кода, который "ни на что не влияет". Можно вставлять в произвольных местах программы.
Только не забыть С++ включить.
Да не обижайся, считай что это стиль обучения такой, лучше запомнится.
Вот, кстати, пример кода, который "ни на что не влияет". Можно вставлять в произвольных местах программы.
Код: Выделить всё
[](){[](){[](){[](){[](){}();}();}();}();}();Re: STM32 новичку в ARM что к чему
И так, что удалось выяснить. Прерывание происходит, но по какой-то причине оно не переходит в написанный мной обработчик, а уходит в default_handler. Имя из таблицы векторов и имя функции обработчика проверил раз 100, они одинаковые.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3575590#p3575590"]Да не обижайся..[/uquote]
И в мыслях не было.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3575590#p3575590"]Да не обижайся..[/uquote]
И в мыслях не было.
- Вложения
-
- 2019-02-23_12-00-17.png
- (37.13 КБ) 424 скачивания
-
- 2019-02-23_11-47-32.png
- (55.93 КБ) 435 скачиваний
- Реклама
Re: STM32 новичку в ARM что к чему
[uquote="pavell",url="/forum/viewtopic.php?p=3576233#p3576233"]Прерывание происходит, но по какой-то причине оно не переходит в написанный мной обработчик, а уходит в default_handler.[/uquote]
Если проект на плюсах, то обычно обработчики прерываний должны начинаться с extern "C".
Если проект на плюсах, то обычно обработчики прерываний должны начинаться с extern "C".
Re: STM32 новичку в ARM что к чему
[uquote="Reflector",url="/forum/viewtopic.php?p=3576240#p3576240"]Если проект на плюсах, то обычно обработчики прерываний должны начинаться с extern "C".[/uquote]
Во-первых огромное СПАСИБО! именно в этом и была причина.
Во-вторых, как говорится "чудес не бывает, бывают чудаки" )
Я же еще проверил в настройках проекта: Да и Keil пишет - А в жизни оказывается, все решает расширение файла (((
Во-первых огромное СПАСИБО! именно в этом и была причина.
Во-вторых, как говорится "чудес не бывает, бывают чудаки" )
Я же еще проверил в настройках проекта: Да и Keil пишет - А в жизни оказывается, все решает расширение файла (((
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Опять 25!
Короче, работать с портами (без СПЛ и ХАЛ) только на базе CMSYS приходится с помощью структур и обращений к элементам структуры. (Как впрочем и со всем остальным).
Мне теперь интересно, как переназначить (передефайнить) определения регистров порта, пинов и т.д.
Создать что-то типа "виртуального" порта. Т.е. если у меня внешний модуль какой-нибудь типа светодиодов (или еще чего-нибудь) подключен не к одному порту целиком, а к разным пинам, но управлять ими надо как с одного регистра.
Типа:
LED_1 = ON;
LED_2 = OFF;
Или:
LED_PORT |= (LED_1_ON | LED_2_OFF | LED_3_ON);
Или даже :
LED_PORT = 0b11000111100;
При этом все LED сидят фактиччески на PORTA, PORTB и т.д. На любых пинах.
Как это реализуется ? Ткните тоже носой.
Короче, работать с портами (без СПЛ и ХАЛ) только на базе CMSYS приходится с помощью структур и обращений к элементам структуры. (Как впрочем и со всем остальным).
Мне теперь интересно, как переназначить (передефайнить) определения регистров порта, пинов и т.д.
Создать что-то типа "виртуального" порта. Т.е. если у меня внешний модуль какой-нибудь типа светодиодов (или еще чего-нибудь) подключен не к одному порту целиком, а к разным пинам, но управлять ими надо как с одного регистра.
Типа:
LED_1 = ON;
LED_2 = OFF;
Или:
LED_PORT |= (LED_1_ON | LED_2_OFF | LED_3_ON);
Или даже :
LED_PORT = 0b11000111100;
При этом все LED сидят фактиччески на PORTA, PORTB и т.д. На любых пинах.
Как это реализуется ? Ткните тоже носой.
Станислав
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3578505#p3578505"]Как это реализуется ?[/uquote]Если с С++ сильно дружишь, то могу показать. Если нет, то даже пытаться не буду.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Я С++ изучал совсем не сильно и где-то в 2006 году... Уже все забыл. Сейчас после ассемблера (и того не большого) разбираюсь с языком программирования С.
Поэтому, наверное и пытаться время тратить не стоит. )
Поэтому, наверное и пытаться время тратить не стоит. )
Станислав
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: STM32 новичку в ARM что к чему
[uquote="VladislavS",url="/forum/viewtopic.php?p=3578530#p3578530"]Если с С++ сильно дружишь, то могу показать. Если нет, то даже пытаться не буду.[/uquote]Владислав, если будет соблюдена одновременность записи в несколько портов, то я бы с удовольствием посмотрел на такой вариант.
Если это - обычный шаблон, собирающий порты "в кучу" и работающий с ними последовательно - то не нужно
Если это - обычный шаблон, собирающий порты "в кучу" и работающий с ними последовательно - то не нужно
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Какими бы шаблонами или хитрыми макросами ни пользоваться, одновременно в разные порты не записать в принципе. Потому что существует такого машинного кода, в который это должно было бы развернуться.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: STM32 новичку в ARM что к чему
Мне не надо одновременно все включать. Вполне устроит алгоритм все по отдельности. ) ранее, я как-то делал это на АВР и на дефайнах ассемблерных. Как на Си еще не представляю, тем более, у АВР всего три регистра, там было проще. А здесь больше их и по умолчанию они в структурах. 
Станислав
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: STM32 новичку в ARM что к чему
[uquote="Аlex",url="/forum/viewtopic.php?p=3578697#p3578697"]Владислав, если будет соблюдена одновременность записи в несколько портов, то я бы с удовольствием посмотрел на такой вариант.[/uquote]Я бы тоже с удовольствием посмотрел на команду одновременной записи в разные порты 
[uquote="Аlex",url="/forum/viewtopic.php?p=3578697#p3578697"]Если это - обычный шаблон, собирающий порты "в кучу" и работающий с ними последовательно - то не нужно
[/uquote]Это шаблоны на основе списка типов. Уже не первый раз слышу мнение, что в современном С++ всё то же самое можно сделать на вариативных шаблонах. Попробовал, но итератор проще не получается.
Пример. Уж не знаю насколько это одновременно.
[uquote="Аlex",url="/forum/viewtopic.php?p=3578697#p3578697"]Если это - обычный шаблон, собирающий порты "в кучу" и работающий с ними последовательно - то не нужно
Пример. Уж не знаю насколько это одновременно.
Код: Выделить всё
using DATA = PinList<PA_0,PB_0,PA_1,PB_1,PA_2,PB_2,PA_3,PB_3>;
DATA data = 0xAA;
Код: Выделить всё
LDR.N R0,??main_0 ;; 0x40010810
MOV R1,#+983040
STR R1,[R0, #+0]
MOV R2,#+983055
STR R2,[R0, #+1024]
Re: STM32 новичку в ARM что к чему
Подскажите еще один момент с DMA - > UART.
Первый канал DMA пишет данные из периферии в память по 16 бит, с этим проблем нет, а вот дальше возникает нюанс. Указываю второму каналу, что разрядность и памяти, и периферии 8 бит, но при отправке каждый второй байт теряется.
Т.е. имеем в памяти допустим:
а UART дает на выходе:
По какой причине это происходит?
Надо было сразу напомнить, код в спойлере
Первый канал DMA пишет данные из периферии в память по 16 бит, с этим проблем нет, а вот дальше возникает нюанс. Указываю второму каналу, что разрядность и памяти, и периферии 8 бит, но при отправке каждый второй байт теряется.
Т.е. имеем в памяти допустим:
Код: Выделить всё
0xAA 0xBB 0xCC 0xDD
Код: Выделить всё
0xAA 0xCC
Надо было сразу напомнить, код в спойлере
Последний раз редактировалось pavell Ср фев 27, 2019 12:34:10, всего редактировалось 1 раз.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: STM32 новичку в ARM что к чему
[uquote="WiseLord",url="/forum/viewtopic.php?p=3578774#p3578774"]Какими бы шаблонами или хитрыми макросами ни пользоваться, одновременно в разные порты не записать в принципе. Потому что существует такого машинного кода, в который это должно было бы развернуться.[/uquote]Я с периферией STM32 ещё плохо знаком, по этому и спросил, на всякий случай. Вдруг там есть какие хитрости...
На мой взгляд, только по одной единственной. Ширина данных в источнике указана в 2 раза больше чем в приёмнике.pavell писал(а):По какой причине это происходит?
Re: STM32 новичку в ARM что к чему
[uquote="Аlex",url="/forum/viewtopic.php?p=3578911#p3578911"]На мой взгляд, только по одной единственной. Ширина данных в источнике в 2 раза больше чем в приёмнике.[/uquote]
А разве есть разница какая ширина данных в источнике?
В регистре DMA->MSIZE мы задаем значение которое является инкриментом указателя. И указав 8 бит я ожидаю, что указатель и будет увеличиваться на 8 бит. При этом, что и как я укладывал в память на первом этапе никакой роли играть не должно.
А разве есть разница какая ширина данных в источнике?
В регистре DMA->MSIZE мы задаем значение которое является инкриментом указателя. И указав 8 бит я ожидаю, что указатель и будет увеличиваться на 8 бит. При этом, что и как я укладывал в память на первом этапе никакой роли играть не должно.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Размер пересылаемых данных указывается как в источнике, так и в приёмнике. Именно по этим значениям DMA знает на сколько байт делать инкременты.
Re: STM32 новичку в ARM что к чему
Все это так, но.
По логике вещей раз мы не инкриминируем приемник, то по сути нам не важно какую ширину данных мы ему указываем. Если вернуться к моему случаю, то размерность источника и получателя одинакова и равна 8 бит
По логике вещей раз мы не инкриминируем приемник, то по сути нам не важно какую ширину данных мы ему указываем. Если вернуться к моему случаю, то размерность источника и получателя одинакова и равна 8 бит
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: STM32 новичку в ARM что к чему
Приёмник - нет, а источник - да. И если он будет = 16 бит, то как раз и получится как в Вашем случае.pavell писал(а):мы не инкриминируем приемник
В общем, чудес не бывает. Явно что-то с размерами не то.


