К1921ВК01Т (арм Cortex-M4F)

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

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

dav
Сообщения: 209
Зарегистрирован: 14 дек 2015, 09:21
Предприятие: АО НИИЭТ
Откуда: АО НИИЭТ, Воронеж

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение dav »

serg_vega писал(а): 28 янв 2022, 12:38 А как настроить PLL с системной частотой 100МГц так что бы можно было использовать WatchDog? В Errata опять враки. При 48МГц ничего не работает. И при 30 тоже. При 25МГц - работает.
В случае использования PLL, могут возникнуть проблемы с программным сбросом (см. пункт 22 Errata https://niiet.ru/wp-content/uploads/err ... 170419.pdf). В большинстве случаев обойти данную ситуацию помогает рекомендация из Errat:
"Использовать в качестве системной частоты PLLс внешним делителем.
Так, например, для получения системной частоты в 100 МГц необходимо настроить выход PLL на 200 МГц и включить внешний делитель на 2."
Обязательно должно соблюдаться условие для Fvco : 200 МГц ≤ Fvco ≤ 300 МГц.

При повторении рекомендации, получилось достичь значения (70-72) МГц системной частоты, при которой сохраняется работоспособность сторожевого таймера.

Так при входной частоте 10МГц (частоте кварцевого резонатора) можно получить системную частоту 69,16МГц, применив следующие настройки:
PLL_OD = 1, PLL_NF=164, PLL_NR=4, PLL_DIV =0. (Fvco = 276,666 667 МГц) - функция инициализации PLL69_OSC10MHz_Init()

При входной частоте 12МГц (частоте кварцевого резонатора) можно получить системную частоту 71МГц, применив следующие настройки:
PLL_OD = 1, PLL_NF=140, PLL_NR=4, PLL_DIV =0. (Fvco = 284 МГц) - функция инициализации PLL71_OSC12MHz_Init()

Код функции PLL69_OSC10MHz_Init():

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

void PLL69_OSC10MHz_Init()
{
    NT_COMMON_REG->SYS_CLK = COMMON_REG_SYS_CLK_SEL_SRC_ExtOsc;
    uint32_t pll_stable_wait = 1000;
    while (pll_stable_wait) {
        pll_stable_wait--;
    }   
    NT_COMMON_REG->PLL_CTRL_bit.REFSEL = COMMON_REG_PLL_CTRL_REFSEL_ExtOsc;
    NT_COMMON_REG->PLL_OD = 1;
    NT_COMMON_REG->PLL_NF = 164;
    NT_COMMON_REG->PLL_NR = 4;
    NT_COMMON_REG->PLL_CTRL_bit.PLL_DIV = 0;
    pll_stable_wait = 1000;
    while (pll_stable_wait) {
        pll_stable_wait--;
    }
     NT_BOOTFLASH->T_ACC = 6;
     NT_COMMON_REG->SYS_CLK = COMMON_REG_SYS_CLK_SEL_SRC_PLLDiv;
} 
Код функции PLL71_OSC12MHz_Init():

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

void PLL71_OSC12MHz_Init()
{
    NT_COMMON_REG->SYS_CLK = COMMON_REG_SYS_CLK_SEL_SRC_ExtOsc;
    uint32_t pll_stable_wait = 1000;
    while (pll_stable_wait) {
        pll_stable_wait--;
    }   
    NT_COMMON_REG->PLL_CTRL_bit.REFSEL = COMMON_REG_PLL_CTRL_REFSEL_ExtOsc;
    NT_COMMON_REG->PLL_OD = 1;
    NT_COMMON_REG->PLL_NF = 140;
    NT_COMMON_REG->PLL_NR = 4;
    NT_COMMON_REG->PLL_CTRL_bit.PLL_DIV = 0;
    pll_stable_wait = 1000;
    while (pll_stable_wait) {
        pll_stable_wait--;
    }
     NT_BOOTFLASH->T_ACC = 6;
     NT_COMMON_REG->SYS_CLK = COMMON_REG_SYS_CLK_SEL_SRC_PLLDiv;
} 
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение serg_vega »

Мой вопрос и был про то, как в соответствии с Errata получить эти самые 200 МГц и поделить их потом на два.
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение serg_vega »

Лашкевич писал(а): 28 янв 2022, 12:50 Пожалуйста, поясните вопрос. В моих заголовочниках COMMON_REG_SYS_CLK_CURR_SRC_PLLDiv не ищется. Пользователь переключает NT_COMMON_REG->SYS_CLK , а проц сам показывает в NT_COMMON_REG->SYS_CLK_bit.CURR_SRC какой источник частоты текущий. См. ТО:
Это из исходников НИИЭТ файл system_K1921VK01T.c
typedef enum {
COMMON_REG_SYS_CLK_CURR_SRC_CPE = 0x0, /*!< select POR clock or XI_OSC by input CPE */
COMMON_REG_SYS_CLK_CURR_SRC_POR = 0x1, /*!< POR clock */
COMMON_REG_SYS_CLK_CURR_SRC_ExtOsc = 0x2, /*!< external oscillator clock (XI_OSC) */
COMMON_REG_SYS_CLK_CURR_SRC_PLL = 0x3, /*!< PLL clock */
COMMON_REG_SYS_CLK_CURR_SRC_PLLDiv = 0x4, /*!< PLL clock with post-divider */
COMMON_REG_SYS_CLK_CURR_SRC_USB60MHz = 0x5, /*!< USB clock 60 MHz */
COMMON_REG_SYS_CLK_CURR_SRC_USBClk = 0x6, /*!< clock from input CLK_USB GPIO A0 (12/24 MHz) */
COMMON_REG_SYS_CLK_CURR_SRC_ETH25MHz = 0x7, /*!< clock from external Ethernet clock GPIO B3 or GPIO A8 */
} COMMON_REG_SYS_CLK_CURR_SRC_Enum;

Только вот беда, я скопировал вашу функцию Init_Clk_Pll_Div_Fvco200(); вызвал ее и благополучно окирпичил проц. Сейчас раскирпичил полным стиранием с переподтяжкой ноги Н2 и чешу репу, шо это було. Правда, я забыл продефайнить 12 МГц))). Могло быть из-за этого? Второй раз кирпичить не хочется.
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение serg_vega »

Дело не в дефайне. Все равно кирпичится! Видно из-за превышения частоты.
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение serg_vega »

Я правильно понимаю, что если у меня NT_COMMON_REG->SYS_CLK==0x00000404, то есть включен делитель, то WATCHDOG должен работать? !!!
Так он не работает, тупо завешивает проц!!!.
Аватара пользователя
Disona
Сообщения: 81
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Контактная информация:

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение Disona »

Я правильно понимаю, что если у меня NT_COMMON_REG->SYS_CLK==0x00000404, то есть включен делитель, то WATCHDOG должен работать? !!!
Так он не работает, тупо завешивает проц!!!.
А вы не могли бы показать полный код настройки тактирования процессора?

P.S.: Не очень понятно, как неправильная настройка настолько ломает процессор, что приходится его стирать с H2 - обычно это требуется, когда ножки JTAG перенастраиваются в коде...
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение serg_vega »

Disona писал(а): 28 янв 2022, 16:58
Я правильно понимаю, что если у меня NT_COMMON_REG->SYS_CLK==0x00000404, то есть включен делитель, то WATCHDOG должен работать? !!!
Так он не работает, тупо завешивает проц!!!.
А вы не могли бы показать полный код настройки тактирования процессора?

P.S.: Не очень понятно, как неправильная настройка настолько ломает процессор, что приходится его стирать с H2 - обычно это требуется, когда ножки JTAG перенастраиваются в коде...
Легко.
int main()
{
// status4260_type* tmp;
uint32_t ch6_res, ch7_res, ch12_res, inc_in1, inc_in2, inc_out1, inc_out2;
uint32_t temp_MOAR;
uint8_t tmp8, systick_copy;
uint8_t* p_tmp8;
uint16_t delta1, delta2;
// inc_in это channel0

periph_init();
SPI0_Init();

SPI2_Init();
myADCInit(); ....


void periph_init()
{

// SystemCoreClockUpdate();
// RCC_PLLAutoConfig(RCC_PLLRef_XI_OSC, 100000000);
// RCC_PLLAutoConfig1(RCC_PLLRef_XI_OSC, 100000000);
Init_Clk_Pll_Div_Fvco200();
GPIO_DeInit(NT_GPIOE);


GPIO_StructInit(&GPIOE_Init);
GPIOE_Init.GPIO_Dir=GPIO_Dir_Out;
GPIOE_Init.GPIO_Out=GPIO_Out_En;
GPIOE_Init.GPIO_Pin=TST1|TST2|ON1|ON2|ON_RF|ON3|ON4;
GPIO_Init(NT_GPIOE, &GPIOE_Init);
GPIO_ClearBits(NT_GPIOE, ON1|ON2|ON3|ON4);
NT_COMMON_REG->GPIOPCTLE_bit.PIN1 = 0; //af1 JT_TRST
NT_GPIOE->ALTFUNCSET=2;
NT_COMMON_REG->GPIODENE |= 1<<1;

GPIO_DeInit(NT_GPIOB);
GPIO_StructInit(&GPIOB_Init);
GPIOB_Init.GPIO_Dir=GPIO_Dir_Out;
GPIOB_Init.GPIO_Out=GPIO_Out_En;
GPIOB_Init.GPIO_Pin=TCS1|TCS2|DAC11_CS_PIN_Msk|DAC12_CS_PIN_Msk;
GPIO_Init(NT_GPIOB, &GPIOB_Init);
GPIO_ITConfig(NT_GPIOB, ALERT1|ALERT2, GPIO_IntType_Edge, GPIO_IntPol_Neg);
GPIO_ITCmd(NT_GPIOB, ALERT1|ALERT2, ENABLE);
Энвик_EnableIRQ(GPIOB_IRQn);
IRQ_HandlerInit(GPIOB_IRQn, Alert1);

NT_COMMON_REG->GPIOPCTLB_bit.PIN0 = 0; //af1 JT_TDI
NT_COMMON_REG->GPIOPCTLB_bit.PIN1 = 0; //af1 JT_ТМС
NT_COMMON_REG->GPIOPCTLB_bit.PIN2 = 0; //af1 JT_TCK
NT_GPIOB->ALTFUNCSET = 7;
NT_COMMON_REG->GPIODENB |= 1<<1;

GPIO_ITConfig(NT_GPIOD, ALERT3|ALERT4, GPIO_IntType_Edge, GPIO_IntPol_Neg);
GPIO_ITCmd(NT_GPIOD, ALERT3|ALERT4, ENABLE);
Энвик_EnableIRQ(GPIOD_IRQn);
IRQ_HandlerInit(GPIOD_IRQn, Alert2);



NT_GPIOA->OUTENSET = D_UPR_minus|D_UPR_plus;
NT_COMMON_REG->GPIODENA |= D_UPR_minus|D_UPR_plus;
NT_GPIOA->DATAOUT |= D_UPR_plus;
NT_GPIOA->DATAOUT &= ~D_UPR_minus;




// NT_COMMON_REG->GPIODENF |= 1<<5;

SMBus_Init(SMBUS_MASTER0, 200000, 2000000);
SMBus_Init(SMBUS_MASTER1, 200000, 2000000);

SysTick_Config(5000000); //SysTick_Config(16000000);
RCC_PeriphRstCmd(RCC_PeriphRst_Timer0, ENABLE);

// TIMER_PeriodConfig(NT_TIMER0, EXT_OSC_VALUE, 10000000);
TIMER_SetReload(NT_TIMER0, 0xffffff);
TIMER_ITCmd(NT_TIMER0, ENABLE);
TIMER_Cmd(NT_TIMER0, ENABLE);
Энвик_EnableIRQ(TIM0_IRQn);
// printf("\nAll peripherals inited, SYSCLK = %3d MHz\n", (int)(SystemCoreClock / 1E6));
}

Нас же интересуют действия в periph_init()...?
Первым делом вызываем Init_Clk_Pll_Div_Fvco200(); .... и окирпичиваемся. Да, у меня восстановление ножек SWD идет ниже, но с другими настройками PLL камень остается управляемым.
Аватара пользователя
Disona
Сообщения: 81
Зарегистрирован: 06 дек 2016, 11:18
Предприятие: НПФ Вектор
Откуда: Москва
Контактная информация:

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение Disona »

Ещё уточните, пожалуйста, на какой плате вы работаете?
Куда подвязана ножка CPE? Кварц, как я понял, 12 МГц?
С уважением, Дмитрий Шпак
ООО "НПФ Вектор"
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение serg_vega »

Я просто вставил код Лашкевича в свою функцию и.. . либо невозможно прописать NT_COMMON_REG->PLL_NF = 48; Данный код просто не изменяет содержимого регистра! Это если NT_COMMON_REG->SYS_CLK_bit.CURR_SRC == 4, а если до этого
NT_COMMON_REG->SYS_CLK_bit.CURR_SRC ==3, как у меня, то происходит окирпичивание!!!!
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

Re: К1921ВК01Т (арм Cortex-M4F)

Сообщение serg_vega »

Disona писал(а): 28 янв 2022, 17:34 Ещё уточните, пожалуйста, на какой плате вы работаете?
Куда подвязана ножка CPE? Кварц, как я понял, 12 МГц?
CPE висит в воздухе. Да, кварц 12МГц. Плата наша, проц в металлокерамике.
Последний раз редактировалось serg_vega 28 янв 2022, 17:38, всего редактировалось 1 раз.
Ответить

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