К1921ВГ015 общее

32-разрядные микроконтроллеры разработки АО "НИИЭТ"

Модераторы: ea, dav, bkolbov, Alis, pip, _sva_

RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

День добрый.
В файле https://gitflic.ru/project/niiet/niiet_ ... nch=master есть следующая настройка для HSE 24 МГц и PLLOUT 50/30 МГц:

Код: Выделить всё

#elif (HSECLK_VAL == 24000000)
// Fout0 = 50 000 000 Hz
// Fout1 = 30 000 000 Hz
    RCU->PLLSYSCFG0 =( 7 << RCU_PLLSYSCFG0_PD1B_Pos) |  //PD1B
                     ( 4 << RCU_PLLSYSCFG0_PD1A_Pos) |  //PD1A
                     ( 2 << RCU_PLLSYSCFG0_PD0B_Pos) |  //PD0B
                     ( 3 << RCU_PLLSYSCFG0_PD0A_Pos) |  //PD0A
                     ( 2 << RCU_PLLSYSCFG0_REFDIV_Pos)       |  //refdiv
                     ( 0 << RCU_PLLSYSCFG0_FOUTEN_Pos)    |  //fouten
                     ( 0 << RCU_PLLSYSCFG0_DSMEN_Pos)     |  //dsmen
                     ( 0 << RCU_PLLSYSCFG0_DACEN_Pos)     |  //dacen
                     ( 3 << RCU_PLLSYSCFG0_BYP_Pos)       |  //bypass
                     ( 1 << RCU_PLLSYSCFG0_PLLEN_Pos);       //en
    RCU->PLLSYSCFG1 = 0;          //FRAC = 0                     
    RCU->PLLSYSCFG2 = 65;         //FBDIV
На первый взгляд не "бьётся" с формулами из документации. Если подставить значения в формулы, получается:
fVCO = 24000000 * 65 / 2 = 780000000
fOUT0 = 780000000 / ((3 + 1) * (4 + 1)) = 39000000
fOUT1 = 780000000 / ((2 + 1) * (7 + 1)) = 32500000
В моём калькуляторе получается REFDIV = 1, FBDIV = 25, FRAC = 0, A0 = 0, B0 = 11, A1 = 0, B = 19
Или я что-то, как обычно, упускаю :)
Аватара пользователя
ejsan
Сообщения: 43
Зарегистрирован: 15 авг 2022, 21:17
Предприятие: vbrspb.ru

Re: К1921ВГ015 общее

Сообщение ejsan »

Подозреваю, что все такие тонкие нюансы проистекают из-за того, что мы пользуем сборку от Syntacore, заточенную, соответственно, под особенности ядра их собственной разработки. Но в недрах ВГ015 прячется CloudBear, посему мы и получаем кривую оптимизацию. И в целом, это странно, что, по сути, производитель чипа предлагает нам не совсем то, что нужно! :mrgreen: А нужно было бы предложить или тулчейн от CloudBear (кстати, а такие бывают? Или как, бывают, но уже не бесплатно?), или так, как делают всякие китайцы вроде WCh - "generic" версия GCC под самый базовый набор RISC-V, безо всяких специфических оптимизаций.
RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

fog писал(а): 18 июн 2025, 15:08 Исключение вызывает сама malloc
А кто у Вас собственно ecall обрабатывает? Вы попадаете в trap_handler собственно по команде вызова "ОС" (MCAUSE_EXCEPT_ECALLFRM_M_MODE), а никакой "ОС" у Вас вроде и нет.
Последний раз редактировалось RabidRabbit 19 июн 2025, 00:07, всего редактировалось 1 раз.
RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

ejsan писал(а): 18 июн 2025, 19:43 Подозреваю, что все такие тонкие нюансы проистекают из-за того, что мы пользуем сборку от Syntacore, заточенную, соответственно, под особенности ядра их собственной разработки. Но в недрах ВГ015 прячется CloudBear, посему мы и получаем кривую оптимизацию.
Собираю "штатным" компилятором из комплекта riscv64-unknown-elf (под Debain 12), который ни на что не заточен :) Все "заточки" - указать в ключах компиляции поддерживаемые ядром расширения. Вроде всё норм.
fog
Сообщения: 15
Зарегистрирован: 21 май 2025, 09:32
Предприятие: ***

Re: К1921ВГ015 общее

Сообщение fog »

RabidRabbit писал(а): 18 июн 2025, 17:49 На первый взгляд не "бьётся" с формулами из документации.
Там от балды все написано.
RabidRabbit писал(а): 18 июн 2025, 23:59 а никакой "ОС" у Вас вроде и нет.
Нету, для других МК с "коробки" все работает без оси, а тут свой менеджер памяти писать, этим я еще не занимался...
Вложения
Расчет тактирования.xlsx
(10.96 КБ) 179 скачиваний
RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

fog писал(а): 20 июн 2025, 09:13 Там от балды все написано.
По остальным вроде правильно :) Прилагаю свой "калькулятор" https://gitflic.ru/project/rabidrabbit/ ... nch=master, на входе частота HSE и требуемая частота на выходе блока PLL, само считает всё остальное.

fog писал(а): 20 июн 2025, 09:13 Нету, для других МК с "коробки" все работает без оси, а тут свой менеджер памяти писать, этим я еще не занимался...
Менеджер писать не надо. Тут при обработке ecall достаточно отработать функционал вызова sbrk(), который просто увеличивает "выделенную" память, т.е. минимально проконтролировать только, что не залезли на область стека. Вот тут https://stackoverflow.com/questions/698 ... em-call-do хорошо описано.
Vcoder
Сообщения: 22
Зарегистрирован: 01 май 2025, 14:50
Предприятие: .
Откуда: Уфа

Re: К1921ВГ015 общее

Сообщение Vcoder »

Где можно почитать про "стандартные" функции RISC-V ядра, не описанные в документации на К1921ВГ015? В частности про mtimer и обработку его прерываний, регистры mie, mstatus и др. Применительно к ВГ015 естественно.

В РП К1921ВГ015 (актуальная сейчас версия от 05.06.2025) в разделе 9.5 "Программная модель обработки внешних прерываний" есть ссылки "см. [3]", но я не нашёл в документе списка ссылок на источники. Плохо искал? Подскажите пожалуйста, где взять этот список.
Аватара пользователя
ejsan
Сообщения: 43
Зарегистрирован: 15 авг 2022, 21:17
Предприятие: vbrspb.ru

Re: К1921ВГ015 общее

Сообщение ejsan »

Vcoder писал(а): 21 июн 2025, 12:31 Где можно почитать про "стандартные" функции RISC-V ядра, не описанные в документации на К1921ВГ015?
Может, покопаться в документации от самих CloudBear? https://tools.cloudbear.ru/docs/
Кстати, делал на mtimer-е простой delay_ms(), просто взяв какой-то пример от Gigadevice что-ли, уже даже не помню. Но всё заработало. Видимо, этот таймер везде одинаковый.
Vcoder
Сообщения: 22
Зарегистрирован: 01 май 2025, 14:50
Предприятие: .
Откуда: Уфа

Re: К1921ВГ015 общее

Сообщение Vcoder »

ejsan писал(а): 21 июн 2025, 16:25Может, покопаться в документации от самих CloudBear? https://tools.cloudbear.ru/docs/
Спасибо за наводку. Нашёл описание интересующих регистров в документах "riscv-privileged". Осталось понять, какой из двух относится к нашему МК. :)

Но что скрывается за ссылкой "[3]" в РП К1921ВГ015 всё равно интересно. ;)
RabidRabbit
Сообщения: 17
Зарегистрирован: 10 июн 2025, 12:11
Предприятие: HomeWork

Re: К1921ВГ015 общее

Сообщение RabidRabbit »

Vcoder писал(а): 21 июн 2025, 12:31 Где можно почитать про "стандартные" функции RISC-V ядра, не описанные в документации на К1921ВГ015? В частности про mtimer и обработку его прерываний, регистры mie, mstatus и др. Применительно к ВГ015 естественно.
Первоисточник: мhttps://github.com/riscv/riscv-isa-manual
Конкретно про системный таймер https://riscv.github.io/riscv-isa-manua ... ivileged// в разделе 3.2.1. Machine Timer (mtime and mtimecmp) Registers

По системному таймеру в К1921ВГ015 внес для себя, что он запускается автоматом после сброса на системной частоте.
Прерывание от "будильника" системного таймера разрешается в регистре mie установкой бита MTIE регистра mie (см. "3.1.9. Machine Interrupt (mip and mie) Registers"), соответственно если прерывание вызвано сработкой "будильника" системного таймера, то в поле "Exception Code" регистра mcause (см. "3.1.15. Machine Cause (mcause) Register") будет значение 0x07 "Machine timer interrupt". Также ожидающее обработки прерывание от системного таймера светится в регистре MIP в виде флага MTIP. Так что например для реализации счётчика миллисекунд надо в прерывании от системного таймера переставлять ему "будильник".

В основном более-менее в ядрах RISC-V все одинаковое, нюансы в реализации. Например где-то надо этот системный таймер отдельно включать и системная частота на него идёт через настраиваемый предделитель (например, как в КК1948ВК018/К1948ВК015).
Ответить

Вернуться в «32-разрядные микроконтроллеры»