User Tag List

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 37

Тема: Выставить биты данных на ШД Микроши в диапазоне 8000H-BFFFH

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    26.11.2021
    Адрес
    г. Санкт Петербург
    Сообщений
    192
    Спасибо Благодарностей отдано 
    33
    Спасибо Благодарностей получено 
    133
    Поблагодарили
    66 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Подключал как то stm к рк86, проблемы такой не было, была другая проблема, стм банально не успевал войти в прерывание по сигналам RD или WR. Пропуская обращение и получалась каша. А так - да, коллеги выше правильно подсказали - неправильно настроены порты микроконтроллера.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    HardWareMan
    Гость

    По умолчанию

    Т.е., прерывания продолжают стрелять, ок. А RCC гарантированно настроен правильно?

  4. #3

    Регистрация
    03.09.2020
    Адрес
    г. Санкт-Петербург
    Сообщений
    36
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Т.е., прерывания продолжают стрелять, ок. А RCC гарантированно настроен правильно?
    Ты код смотрел? Нет там никаких прерываний. В новой версии (еще не заливал) я даже добавил при инициализации, как у тебя:
    Код:
    int main(void)
    {
        clockInit();
        portClockInit();
        disableGlobalInterrupt();
        ...
    }
    
    // Остановка глобальных прерываний
    void disableGlobalInterrupt(void)
    {
        __asm volatile (
            "CPSID	f\n"
        );
    }
    Не знаю, достаточно ли этого. И еще не знаю, останавливаются ли таким способом все глобальные прерывания во всем последующем коде, или только в коде функции disableGlobalInterrupt(), а при выходе из нее опять восстанавливаются (слишком сложный STM для меня), просвяти.

    И еще я провел два чистых эксперимента. Решил, что коль установка 0x00 оптимизируется, то надо сделать две вещи:

    • Собрать весь проект с -O0,
    • Устанавливать в первом случае 0x0F вместо 0x00 (все равно мы мониторим старший бит, и при 0x0F в нем так же будет 0), чтобы не срабатывала оптимизация установки 0x00.

    Так я и сделал. Сборка с 0x0F и 0xFF стали отличаться только в единственном месте, вот так:
    Код:
    <  80004b2:     b292            uxth    r2, r2
    <  80004b4:     f442 6270       orr.w   r2, r2, #3840   ; 0xf00
    ---
    >  80004b2:     f062 02ff       orn     r2, r2, #255    ; 0xff
    >  80004b6:     b292            uxth    r2, r2
    Здесь уже можно считать, что эти команды выполняются одинаковое количество тактов. На различное выравнивание кода уже не сошлешься, длина в байтах одинакова.

    Странная конструкция orr.w r2, r2, #3840; 0xf00 действительно дает 0x0F, можно сравнить с таким примером:
    Код:
    LCD_DATA_PORT->BSRR=0x00FF0000 | (sColor&0x00FF);
    0x08000bbe:   orr.w r7, r7, #16711680 ; 0xff0000
    Так что показали эти два чистых эксперимента? Да то же самое. Установка с 1 на 0 дает "провал" в ~120нс. Установка с 0 на 1 дает "полочку" в ~700нс. Объяснить почему так я своим скудным умишком не могу.

    Ну и самый первый вопрос остался: почему установка с 1 на 0 такая короткая? По алгоритму отпускание удерживания нуля не может начаться раньше, чем желтая линия вернется к единице. Вначале STM должен увидеть, что /32К или /RD не 0, и только после этого отпустить удерживать 0. А на деле этого не происходит. И почему так - тоже не ясно.

    - - - Добавлено - - -

    Цитата Сообщение от tnt23 Посмотреть сообщение
    Еще важно, какие оптимизации включены при компиляции (ключи -o в GCC, например).
    Выше написал, сделал проверку с -O0.
    Любопытный хомячок webhamster.ru - маленький и пушистый IT-проект

  5. #4

    Регистрация
    28.03.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,788
    Спасибо Благодарностей отдано 
    584
    Спасибо Благодарностей получено 
    202
    Поблагодарили
    139 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Еще важно, какие оптимизации включены при компиляции (ключи -o в GCC, например).

  6. #5

    Регистрация
    28.03.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,788
    Спасибо Благодарностей отдано 
    584
    Спасибо Благодарностей получено 
    202
    Поблагодарили
    139 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    if(workAddrDiapason!=0) // Если сигналы /32К и /RD физически не установлены в 0
    Мне думается, что тут не "и", а "или" (хотя бы один из /32K или /RD не установлен)

  7. #6
    HardWareMan
    Гость

    По умолчанию

    Цитата Сообщение от tnt23 Посмотреть сообщение
    Код:
    if(workAddrDiapason!=0) // Если сигналы /32К и /RD физически не установлены в 0
    Мне думается, что тут не "и", а "или" (хотя бы один из /32K или /RD не установлен)
    У него перед этим стоит это:
    Код:
    uint32_t workAddrDiapason = GPIOA->IDR & (GPIO_IDR_IDR10_Msk | GPIO_IDR_IDR11_Msk)
    И 0 там будет только если оба в нуле будут. А условие выше срабатывает на 1 для отключения шины, иначе включает и эта ветка после else.

  8. #7

    Регистрация
    03.09.2020
    Адрес
    г. Санкт-Петербург
    Сообщений
    36
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    И 0 там будет только если оба в нуле будут. А условие выше срабатывает на 1 для отключения шины, иначе включает и эта ветка после else.
    Да, именно так. В if-ветке обрабатывается ситуация когда не оба в нуле, там режим ножки выставляется как input чтобы не влиять этой ножкой на подключаемую схему. В else-ветке включается режим выхода и выставляется нужное значение на ножке (в эксперименте-1 выставляю 0, в эксперименте-2 выставляю 1).

    Для варианта выставления нуля (эксперимент-1), этот ноль выставляется на слишком короткое время. Ноль должен удерживаться как минимум до момента восходящего фронта на желтой линии. После этого еще нужно время чтобы STM-ка поняла, что не оба сигнала в нуле, и только после этого перестать удерживать ноль. А по графику мы видим, что ноль перестает удерживаться гораздо раньше. И почему так происходит, я не могу понять.
    Любопытный хомячок webhamster.ru - маленький и пушистый IT-проект

  9. #8

    Регистрация
    28.03.2006
    Адрес
    Санкт-Петербург
    Сообщений
    2,788
    Спасибо Благодарностей отдано 
    584
    Спасибо Благодарностей получено 
    202
    Поблагодарили
    139 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Еще из мыслей навскидку - не доверяю локальным переменным с областью видимости в пределах ветки цикла. Попробуйте вынести объявление переменной повыше, или вообще сделайте ее статической/volatile.

    uint32_t workAddrDiapason

  10. #9

    Регистрация
    03.09.2020
    Адрес
    г. Санкт-Петербург
    Сообщений
    36
    Спасибо Благодарностей отдано 
    1
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от tnt23 Посмотреть сообщение
    Еще из мыслей навскидку - не доверяю локальным переменным с областью видимости в пределах ветки цикла.
    Новое слово в программировании? Нельзя же так к алгоритмизации относиться.

    Но! Я проверю, я готов поверить в любую дичь.
    Любопытный хомячок webhamster.ru - маленький и пушистый IT-проект

  11. #10

    Регистрация
    30.12.2018
    Адрес
    г. Москва
    Сообщений
    1,399
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    390
    Поблагодарили
    350 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от xintrea Посмотреть сообщение
    Новое слово в программировании? Нельзя же так к алгоритмизации относиться.

    Но! Я проверю, я готов поверить в любую дичь.
    надо брать листинг того что нагенерил компилятор и вникать. возможно просто бага компилятора.
    и еще - я бы для проверки перенес кусок кода со 165 по 181 строки в район 145 строки. чем-то мне этот кусок подсознательно не нравится...
    Последний раз редактировалось Serg6845; 30.05.2022 в 21:55.

    Зверинецъ

    Специалист (был когда-то "совсем стандарт") - 1988-2023
    Ленинград1 +256К +AY+BDI+VGA выход +Ethernet (Speccyboot) +Xmodem (115200)+divmmc
    Ленинград2 + CF карта
    Платформа 8085+Z80+CPLD (Специалист МХ2 +SD +FDD +PS/2kbd)
    БК0010-01 стоковый
    [свернуть]

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 35
    Последнее: 07.01.2020, 11:32
  2. Генерация случайных чисел в заданном диапазоне
    от Oleg N. Cher в разделе Программирование
    Ответов: 31
    Последнее: 09.02.2017, 03:19
  3. Как выставить уровень чёрного?
    от Demige в разделе Изображение
    Ответов: 15
    Последнее: 13.03.2012, 15:16
  4. Как выставить перемычки для подключения к ПК
    от Руслан в разделе Внешние накопители
    Ответов: 13
    Последнее: 12.10.2011, 19:37

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •