STM Урок 203. Assembler. RCC. Стек. Новые команды. Часть 2



В предыдущей части урока мы подключили новый модуль, познакомились со стеком, а также научились обеспечивать видимость продпрограмм других модулей.

 

Аналогичным образом отключим PLL

 

 

Так как очищали мы только один бит, логичнее было применить бит-бэндинг.

Выключим HSE и его детектор тактового сигнала, дождавшись затем отключения HSE

 

 

Сбросим бит, разрешающий использование внешнего генератора

 

 

Сбросим флаги всех прерываний от RCC

 

 

Вот и вся процедура деинициализации RCC. Думаю, что инициализацию мы напишем быстрее, так как мы теперь знакомы с многими командами и с тем, как и где их применять.

Вернёмся в main.s и, прежде чем вызывать инициализацию, поделаем ещё некоторые шаги.

Включим тактирование AFIO

 

 

 

Здесь нам нужна небольшая задержа. Применим вот такой финт

 

 

Мы просто считали значение, находящееся по адресу, находящемуся в R2 в сам регистр R2.

Настроим SWD

 

 

Вот теперь мы можем инициализировать наш RCC, для чего вернёмся в файл rcc.s и после окончания процедуры деинициализации RCC добавим заготовку для процедуры инициализации, в теле которой мы также занесём значения регистров в стек, а по окончании заберём оттуда

 

 

Также добавим для данной процедуры экспорт

 

 

А в main.s произведём импорт

 

 

Вызовем нашу подпрограмму

 

 

Вернёмся в код подпрограммы SYSCLK72_START в файл rcc.s и также занесём в регистры R0 и R1 0 и 1

 

 

Включим HSE, дождавшись его стабилизации

 

 

 

Теперь настройка работы с памятью FLASH. Включим буфер предварительной выборки, сначала отключив его, затем включим максимальную задержку, так как мы настраиваем максимальную частоту

 

 

Настроим значения всех делителей

 

 

Настроим PLL на коэффициент 9 и настроим его вход для работы от HSE

 

 

Разрешим работу PLL, дождавшись затем его разблокировки

 

 

Выберем PLL в качестве источника системного тактирования, дождавшись затем применения данного действия

 

 

Соберём код, прошьём контроллер и, если мы всё правильно написали, то наш светодиод будет мигать намного быстрее

 

 

 

Размер нашей прошивки получился всего лишь 389 байт. Если посмотреть размер аналогичной прошивки, созданной с применением CMSIS, то он составлял 1900 байт. Как вам экономия?

Итак, сегодня нам удалось настроить модуль RCC, в результате чего наш контроллер теперь работает с максимальной частотой. Всё это получилось благодаря тому, что мы изучили несколько новых команд, а также познакомились со стеком, научившись отправлять туда и забирать затем обратно данные.

Всем спасибо за внимание!

 

 

Предыдущая часть Программирование МК STM32 Следующий урок

 

Исходный код

 

 

Отладочную плату STM32F103C8T6 можно приобрести здесь STM32F103C8T6

Программатор недорогой можно купить здесь ST-Link V2

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM Assembler. RCC. Стек. Новые команды

2 комментария на “STM Урок 203. Assembler. RCC. Стек. Новые команды. Часть 2
  1. ВитГо:

    ООО, интересные уроки 🙂

    правда я кейлом не пользовался, а компилил при помощи консольного GNU AS, без среды конечно набирать было тяжко программы, но компиляцию делал батничек автоматом, так что можно было не задумываться…
    кстати мигалка помоему рекордная была что то около 50 байт для F4…

  2. A-Soft:

    Большое спасибо за урок. Много информации — 2 дня изучал.
    Есть небольшие замечания по файлу rss.s
    1) наверное правильнее было бы назвать файл rcc.s (несущественное)
    2) в строках 32-33, 43-44, 54-55 эффективнее использовать одну команду ANDS вместо двух AND+CMP (возможно вашей целью было показать команду CMP)
    3) в строке 112 надо делать BIC R3, R3, #RCC_CFGR_PPRE1 (у вас PPRE2 — опечятка?)
    4) вообще, наверное, блок со 102 по 129 строки можно сильно сократить. Чего этот RCC_CR читать-писать туда-сюда? прочитали, изменили всё что надо, записали. Там же не надо ждать установки/сброса бита.
    LDR R3, [R2]
    BIC R3, R3, #(RCC_CFGR_HPRE)
    BIC R3, R3, #(RCC_CFGR_PPRE2 + RCC_CFGR_PPRE1)
    BIC R3, R3, #(RCC_CFGR_PLLXTPRE + RCC_CFGR_PLLMULL + RCC_CFGR_PLLSRC + RCC_CFGR_PLLMULL9)
    ORR R3, R3, #RCC_CFGR_PPRE1_DIV2
    ORR R3, R3, #(RCC_CFGR_PLLSRC + RCC_CFGR_PLLMULL9)
    STR R3, [R2]
    Вот только одной командой BIC всё закрыть не получилось. Везде этот гЫбкий Operand2 не даёт использовать произвольные 32-бита за одну операцию.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*