К1921ВК01Т (арм Cortex-M4F)
Модераторы: ea, dav, bkolbov, Alis, pip, _sva_
Re: К1921ВК01Т (арм Cortex-M4F)
Странно.
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;
}
Если в Вашем коде раскомментировать данную строку, то плата стартует нестабильно, собсно, без отладчика (одна из двух) не стартует совсем))). Вторая - нормально. Интересно почему?
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 начать работать, или меняет питание платы как-то, что этого начинает хватать для работы.
Re: К1921ВК01Т (арм Cortex-M4F)
volatile uint8_t i = 0;Лашкевич писал(а): ↑31 янв 2022, 13:21 Ну скорее всего плата не может перейти на выбранный источник тактирования (кварц). Проверьте тактирование. И просьба привести полный листинг кода, чтобы было видно, что сверху, что снизу. Отладчик, возможно, даёт дополнительное время кварцу или PLL начать работать, или меняет питание платы как-то, что этого начинает хватать для работы.
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)
Код, который вы привели, отличается от того, что постил я.
Вот выдержка из моего кода:
Я бы эту ситуацию не оставлял как "данность", надо разбираться. Можно, например, поотлаживать так - подёргать разные GPIO на выход в разных частях программы, посмотреть осциллографом, на каком месте именно зависает без отладчика процессор.
Вот выдержка из моего кода:
Здесь процессор будет сидеть в цикле до тех пор, пока источник тактирования не установится на нужный. Если не сможет перейти, то зависнет. В вашем же коде проверки нет, крутится цикл на 250 и всё, даже если тактирование не то - программа продолжит выполнение.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); // Текущий источник тактирования должен совпадать с выбранным
Я бы эту ситуацию не оставлял как "данность", надо разбираться. Можно, например, поотлаживать так - подёргать разные GPIO на выход в разных частях программы, посмотреть осциллографом, на каком месте именно зависает без отладчика процессор.
Re: К1921ВК01Т (арм Cortex-M4F)
Все так. Только зачем мне нужен кнтроллер, который зависнет, если что в бесконечном цикле? У меня есть контрольные пины, например я переключаю с частотой 20Гц SysTick и переключаю контрольтную точку. Если частота отличается от заданной, значит, что-то пошло не так))). Я как-то не сторонник циклов, из которых нет вообще выхода. Вот только неделю назад попался на чрезвычайно редкие, но зависания I2C:Лашкевич писал(а): ↑31 янв 2022, 14:32 Код, который вы привели, отличается от того, что постил я.
Вот выдержка из моего кода:Здесь процессор будет сидеть в цикле до тех пор, пока источник тактирования не установится на нужный. Если не сможет перейти, то зависнет. В вашем же коде проверки нет, крутится цикл на 250 и всё, даже если тактирование не то - программа продолжит выполнение.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); // Текущий источник тактирования должен совпадать с выбранным
Я бы эту ситуацию не оставлял как "данность", надо разбираться. Можно, например, поотлаживать так - подёргать разные GPIO на выход в разных частях программы, посмотреть осциллографом, на каком месте именно зависает без отладчика процессор.
было
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 раз.
-
- Сообщения: 5
- Зарегистрирован: 20 янв 2022, 11:38
- Предприятие: ООО НИЦ БУЛАТ
Re: К1921ВК01Т (арм Cortex-M4F)
Так тоже не запускается. Программа- мигание светодиодом. За основу взял пример работы с SPI.Лашкевич писал(а): ↑24 янв 2022, 16:58 Скорее всего поможет установка микросхемы менеджера питания, который уведёт RST в ноль раньше, чем все питания уйдут за допустимые пределы. Попробуйте имитировать это руками - руками нажать резет перед отключением питания, отключите питание, через 10 секунд включите питание и потом отпустите резет. Запустится?
1) Не отключая питание делаю RESET, программа останавливается, но после отпускания кнопки не работает.
2) Зажимаю RESET, включаю питание, через секунду отпускаю RESET- не работает.
Похоже, контроллер уходит в какое-то прерывание, которое я не обрабатываю.
Подскажите, в чем может быть дело.
- Лашкевич
- Сообщения: 373
- Зарегистрирован: 13 май 2015, 13:10
- Предприятие: ООО "НПФ Вектор"
- Откуда: Москва
- Контактная информация:
Re: К1921ВК01Т (арм Cortex-M4F)
Опишите, пожалуйста, также условия, когда программа запускается успешно.
-
- Сообщения: 5
- Зарегистрирован: 20 янв 2022, 11:38
- Предприятие: ООО НИЦ БУЛАТ
- Лашкевич
- Сообщения: 373
- Зарегистрирован: 13 май 2015, 13:10
- Предприятие: ООО "НПФ Вектор"
- Откуда: Москва
- Контактная информация:
Re: К1921ВК01Т (арм Cortex-M4F)
Проверьте настройку PLL - что обсуждалось выше для serg_vega, почитайте пару-тройку страниц назад. Убедитесь, что у вас
200 МГц ≤ Fvco ≤ 300 МГц
Проверьте разные готовые примеры кода. Также попробуйте тактирование от встроенной в процессор RC цепочки - не включайте кварц и PLL, проверьте, будет ли зависание при этом. Проверьте, если есть возможность, свой код на другой плате на предмет корректной реакции на reset. Надо понять чётко, в программе дело или в железе.
200 МГц ≤ Fvco ≤ 300 МГц
Проверьте разные готовые примеры кода. Также попробуйте тактирование от встроенной в процессор RC цепочки - не включайте кварц и PLL, проверьте, будет ли зависание при этом. Проверьте, если есть возможность, свой код на другой плате на предмет корректной реакции на reset. Надо понять чётко, в программе дело или в железе.
-
- Сообщения: 5
- Зарегистрирован: 20 янв 2022, 11:38
- Предприятие: ООО НИЦ БУЛАТ
Re: К1921ВК01Т (арм Cortex-M4F)
Пробовал следующее:
- C отключенным PLL и с внутренним генератором(СРЕ=0).
- 2 платы нашего производства на которых работают примеры Ethernet и др.
- Пример k1921vk01t-niietcm4pd и вновь созданный проект.
- Разные версии IAR.
Результат один- зависает после нажатия Reset.
При работе от кварца пробовал срывать его колебания. Программа останавливается, но после- работает дальше.