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

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

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

serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

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

Сообщение serg_vega »

Странно.
NT_COMMON_REG->SYS_CLK_bit.SEL_SRC=4; // SYSCLK_PLLDIVCLK;
while(i<250)
{
i++;
//if(NT_COMMON_REG->SYS_CLK_bit.CURR_SRC==4)break;
}

Если в Вашем коде раскомментировать данную строку, то плата стартует нестабильно, собсно, без отладчика (одна из двух) не стартует совсем))). Вторая - нормально. Интересно почему?
Аватара пользователя
Лашкевич
Сообщения: 373
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

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

Сообщение Лашкевич »

Ну скорее всего плата не может перейти на выбранный источник тактирования (кварц). Проверьте тактирование. И просьба привести полный листинг кода, чтобы было видно, что сверху, что снизу. Отладчик, возможно, даёт дополнительное время кварцу или PLL начать работать, или меняет питание платы как-то, что этого начинает хватать для работы.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

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

Сообщение serg_vega »

Лашкевич писал(а): 31 янв 2022, 13:21 Ну скорее всего плата не может перейти на выбранный источник тактирования (кварц). Проверьте тактирование. И просьба привести полный листинг кода, чтобы было видно, что сверху, что снизу. Отладчик, возможно, даёт дополнительное время кварцу или PLL начать работать, или меняет питание платы как-то, что этого начинает хватать для работы.
volatile uint8_t i = 0;
NT_COMMON_REG->SYS_CLK_bit.SEL_SRC = 0;
while(i<250)
{
i++;
// if(NT_COMMON_REG->SYS_CLK_bit.CURR_SRC==0)break;
}

NT_COMMON_REG->PLL_OD = 0; // Выходной делитель NO = 1
NT_COMMON_REG->PLL_NR = 1; // Опорный делитель NR = PLL_NR + 2 = 3
NT_COMMON_REG->PLL_CTRL_bit.PLL_DIV = 0; // N = 2 * (PLL_DIV + 1) = 2
#ifdef QUARTZ_10MHZ
NT_COMMON_REG->PLL_NF = 58; // Делитель обратной связи PLL NF=F_PLL+2=60
#endif
#ifdef QUARTZ_12MHZ
NT_COMMON_REG->PLL_NF = 48; // Делитель обратной связи PLL NF=F_PLL+2=50
#endif
// Для кварца 12 МГц:
// Fvco = 12 * (50 / 3) = 200 MHz
// Fref = 12 / (2 * 3) = 2 MHz
// FOUT = 12 * 50 / (3 * 1) / 2 = 100 МГц, вроде сходится
// Для 10 МГц тоже должно подойти с PLL_NF = 58
NT_COMMON_REG->SYS_CLK_bit.SEL_SRC=4; // SYSCLK_PLLDIVCLK; //Блок PLL
/*
do
{
// Выбор источника синхросигнала
for(i = 0; i < 250; i++);
}
*/
i=0;
// while (NT_COMMON_REG->SYS_CLK_bit.CURR_SRC != 4); //SYSCLK_PLLDIVCLK); // Текущий источник тактирования должен совпадать с выбранным
while(i<250)
{
i++;
//if(NT_COMMON_REG->SYS_CLK_bit.CURR_SRC==4)break;
}
SystemCoreClock = 100000000;


Дело исключительно в задержке. Если 250 i++ то нормально, если с break как только переходит на нужный источник, то сбоит одна из двух плат. Ну буду относиться к этому как к данности....
Аватара пользователя
Лашкевич
Сообщения: 373
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

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

Сообщение Лашкевич »

Код, который вы привели, отличается от того, что постил я.
Вот выдержка из моего кода:
NT_COMMON_REG->SYS_CLK = SYSCLK_PLLDIVCLK; //Блок PLL
do
{
// Выбор источника синхросигнала
for(i = 0; i < 250; i++);
}
while (NT_COMMON_REG->SYS_CLK_bit.CURR_SRC != SYSCLK_PLLDIVCLK); // Текущий источник тактирования должен совпадать с выбранным
Здесь процессор будет сидеть в цикле до тех пор, пока источник тактирования не установится на нужный. Если не сможет перейти, то зависнет. В вашем же коде проверки нет, крутится цикл на 250 и всё, даже если тактирование не то - программа продолжит выполнение.

Я бы эту ситуацию не оставлял как "данность", надо разбираться. Можно, например, поотлаживать так - подёргать разные GPIO на выход в разных частях программы, посмотреть осциллографом, на каком месте именно зависает без отладчика процессор.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
serg_vega
Сообщения: 96
Зарегистрирован: 20 июл 2020, 15:50
Предприятие: АО "ВНИИ "Вега"

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

Сообщение serg_vega »

Лашкевич писал(а): 31 янв 2022, 14:32 Код, который вы привели, отличается от того, что постил я.
Вот выдержка из моего кода:
NT_COMMON_REG->SYS_CLK = SYSCLK_PLLDIVCLK; //Блок PLL
do
{
// Выбор источника синхросигнала
for(i = 0; i < 250; i++);
}
while (NT_COMMON_REG->SYS_CLK_bit.CURR_SRC != SYSCLK_PLLDIVCLK); // Текущий источник тактирования должен совпадать с выбранным
Здесь процессор будет сидеть в цикле до тех пор, пока источник тактирования не установится на нужный. Если не сможет перейти, то зависнет. В вашем же коде проверки нет, крутится цикл на 250 и всё, даже если тактирование не то - программа продолжит выполнение.

Я бы эту ситуацию не оставлял как "данность", надо разбираться. Можно, например, поотлаживать так - подёргать разные GPIO на выход в разных частях программы, посмотреть осциллографом, на каком месте именно зависает без отладчика процессор.
Все так. Только зачем мне нужен кнтроллер, который зависнет, если что в бесконечном цикле? У меня есть контрольные пины, например я переключаю с частотой 20Гц SysTick и переключаю контрольтную точку. Если частота отличается от заданной, значит, что-то пошло не так))). Я как-то не сторонник циклов, из которых нет вообще выхода. Вот только неделю назад попался на чрезвычайно редкие, но зависания I2C:
было
while (SMBus_GetStatus(SMBUS_MASTER0, NULL) == SMBUS_STAT_BUSY);

стало

while ((SMBus_GetStatus(SMBUS_MASTER0, NULL) == SMBUS_STAT_BUSY)&&(i2c0_counter<0xffff))
{
i2c0_counter++;
}


Мне было непонятно, каким образом при выходе из цикла по
while(i<250)
{
i++;
if(NT_COMMON_REG->SYS_CLK_bit.CURR_SRC==4)break;
}
а я проверял, счетчик был равен 5, а далеко не 250 один из двух контроллеров сбоил. Ведь условие уже выполнено....
Последний раз редактировалось serg_vega 31 янв 2022, 16:13, всего редактировалось 1 раз.
Дмитрий128
Сообщения: 5
Зарегистрирован: 20 янв 2022, 11:38
Предприятие: ООО НИЦ БУЛАТ

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

Сообщение Дмитрий128 »

Лашкевич писал(а): 24 янв 2022, 16:58 Скорее всего поможет установка микросхемы менеджера питания, который уведёт RST в ноль раньше, чем все питания уйдут за допустимые пределы. Попробуйте имитировать это руками - руками нажать резет перед отключением питания, отключите питание, через 10 секунд включите питание и потом отпустите резет. Запустится?
Так тоже не запускается. Программа- мигание светодиодом. За основу взял пример работы с SPI.
1) Не отключая питание делаю RESET, программа останавливается, но после отпускания кнопки не работает.
2) Зажимаю RESET, включаю питание, через секунду отпускаю RESET- не работает.
Похоже, контроллер уходит в какое-то прерывание, которое я не обрабатываю.
Подскажите, в чем может быть дело.
Аватара пользователя
Лашкевич
Сообщения: 373
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

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

Сообщение Лашкевич »

Опишите, пожалуйста, также условия, когда программа запускается успешно.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
Дмитрий128
Сообщения: 5
Зарегистрирован: 20 янв 2022, 11:38
Предприятие: ООО НИЦ БУЛАТ

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

Сообщение Дмитрий128 »

Лашкевич писал(а): 11 фев 2022, 14:58 Опишите, пожалуйста, также условия, когда программа запускается успешно.
После обесточивания схемы 30 сек и более включаю питание- работает.
RC цепочка на сбросе дает задержку примерно 1мс.
Аватара пользователя
Лашкевич
Сообщения: 373
Зарегистрирован: 13 май 2015, 13:10
Предприятие: ООО "НПФ Вектор"
Откуда: Москва
Контактная информация:

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

Сообщение Лашкевич »

Проверьте настройку PLL - что обсуждалось выше для serg_vega, почитайте пару-тройку страниц назад. Убедитесь, что у вас
200 МГц ≤ Fvco ≤ 300 МГц
Проверьте разные готовые примеры кода. Также попробуйте тактирование от встроенной в процессор RC цепочки - не включайте кварц и PLL, проверьте, будет ли зависание при этом. Проверьте, если есть возможность, свой код на другой плате на предмет корректной реакции на reset. Надо понять чётко, в программе дело или в железе.
С уважением,
Лашкевич Максим.
Инженер-программист ООО "НПФ Вектор", Москва.
http://motorcontrol.ru/
Дмитрий128
Сообщения: 5
Зарегистрирован: 20 янв 2022, 11:38
Предприятие: ООО НИЦ БУЛАТ

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

Сообщение Дмитрий128 »

Лашкевич писал(а): 11 фев 2022, 16:38 Проверьте настройку PLL - что обсуждалось выше для serg_vega, почитайте пару-тройку страниц назад. Убедитесь, что у вас
200 МГц ≤ Fvco ≤ 300 МГц
Пробовал следующее:
- C отключенным PLL и с внутренним генератором(СРЕ=0).
- 2 платы нашего производства на которых работают примеры Ethernet и др.
- Пример k1921vk01t-niietcm4pd и вновь созданный проект.
- Разные версии IAR.
Результат один- зависает после нажатия Reset.

При работе от кварца пробовал срывать его колебания. Программа останавливается, но после- работает дальше.
Ответить

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