Easyelectronics.ru

Электроника для всех
Текущее время: 20 окт 2019, 00:54

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: РЕШЕНО. почти... Таймеры H7. Игнорируется PSC
СообщениеДобавлено: 27 июн 2019, 11:24 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
Решение:
NVIC_SetPriority(TIM7_IRQn, 1); если убрать - все работает.

Взялся переехать на sm32h743. Купил поиграться Nuckleo-stm32h743zi
И понеслось. Либо чудеса, либо битый МК.
Взял статью https://habr.com/ru/post/427435/
Казалось бы работает. Но оказалось, что нет. В целом МК работает, но таймеры жутчайше глючат при этих настройках.
И это либо нюансы недонастройки, либо мне попался бракованный чип.

Если сделать все как в статье, мы действительно получаем 400 МГц на CPU.
Но в этом случае при подключении таймеров (пробовал и TIM1 и TIM7), какое бы мы не взяли значение TIM7->PSC, оно игнорируется - от его любых значение скорость срабатывания таймера не меняется, а TIM7->ARR не игнорируется - таймер изменяет счет.
Более того, почему-то тактирование таймера такое бешеное, что пришлось задать делитель шины HPRE аж на режим деления 512 (1111), только чтобы увидеть мигание светодиода на UIF, да и вообще все делители шин величил на максимум. По расчетам он тогда должен работать на пентагерцах :)

ОДНАКО!
если HPRE задать default (0000), а не как в статье, то работа таймеров приходит в штатный режим.
а TIM7->PSC начинает влиять на работу таймера, более того, соотнесение скорости шин и этого делителя дает правильные временные интервалы мигания светодиода в зависимости от теоретически вычисленных настроек.

Помогите разобраться с этой мистикой. Чтобы исключить брак МК, заказал еще одну плату, но она пока едет. Может эти процы неправильным тактированием можно пожечь и я доэксперементировался?

Код:
#include "stm32h743xx.h"

uint8_t Blink=0;
void InitTimer() {
   RCC->APB1LENR |=  RCC_APB1LENR_TIM7EN;
   TIM7->PSC =    10000;
   TIM7->ARR =    32000;
   TIM7->DIER |= TIM_DIER_UIE;
   TIM7->CR1  |=   TIM_CR1_CEN;
   NVIC_EnableIRQ(TIM7_IRQn);
   NVIC_SetPriority(TIM7_IRQn, 1);

}

void TIM7_IRQHandler(void) {
   if(TIM7->SR&TIM_SR_UIF)
   {
       TIM7->SR&=~TIM_SR_UIF;
       Blink=1-Blink;
       if (Blink==0) GPIOB->BSRRL = (1 << 0); else GPIOB->BSRRH = (1 << 0);
   }
}

void InitHSE() {
   FLASH->ACR = FLASH_ACR_LATENCY_2WS;
   RCC->CR |= RCC_CR_HSEON; // Enable HSE
   while((RCC->CR & RCC_CR_HSERDY) == 0); // Wait till HSE is ready
//    RCC->CFGR |= RCC_CFGR_SW_HSE;
//    while (!(RCC->CFGR & RCC_CFGR_SWS_HSE)) __NOP();

   RCC->PLLCKSELR |= RCC_PLLCKSELR_PLLSRC_HSE; // Указание источника частоты для PLL1 — внешний кварц.

   //PLLM = 4
   RCC->PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_5; //0
   RCC->PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_4; //0
   RCC->PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_3; //0
   RCC->PLLCKSELR |= RCC_PLLCKSELR_DIVM1_2; //1
   RCC->PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_1; //0
   RCC->PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_0; //0

   //PLL1DIVR     bits
   //DIVN1[8:0]  0  - 8   PLLN = 400
   //DIVP1[6:0]  9  - 15  PLLP = 2
   //DIVQ1[6:0]  16 - 22  PLLQ = 2
   //DIVR1[6:0]  24 - 30  PLLR = 2
   //------------QQQQQQQ-QQQQQQQPPPPPPPNNNNNNNNN
   RCC->PLL1DIVR  |= 0b1000000010000001110001111;

   RCC->PLL1FRACR = 0; // Configure PLL  PLL1FRACN
   RCC->PLLCFGR |= RCC_PLLCFGR_PLL1RGE_3; // Select PLL1 input reference frequency range: VCI
   RCC->PLLCFGR &= ~RCC_PLLCFGR_PLL1VCOSEL; // Select PLL1 output frequency range : VCO

   RCC->PLLCFGR |= RCC_PLLCFGR_DIVP1EN;
   RCC->PLLCFGR |= RCC_PLLCFGR_DIVQ1EN;
   RCC->PLLCFGR |= RCC_PLLCFGR_DIVR1EN;
   RCC->PLLCFGR |= RCC_PLLCFGR_PLL1FRACEN;

   RCC->CR |= RCC_CR_PLLON;
   while((RCC->CR & RCC_CR_PLL1RDY) == 0);

   //RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
   //MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1CPRE, RCC_ClkInitStruct->SYSCLKDivider);
   //D1CPRE[3:0]: D1 domain Core prescaler
   //0xxx: sys_ck not divided (default after reset)
   RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE_3; //0
   RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE_2; //0
   RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE_1; //0
   RCC -> D1CFGR &= ~RCC_D1CFGR_D1CPRE_0; //0

   //RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
   // MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_HPRE, RCC_ClkInitStruct->AHBCLKDivider);
   //HPRE[3:0]: D1 domain AHB prescaler
   //1000: rcc_hclk3 = sys_d1cpre_ck / 2
   RCC->D1CFGR |=  RCC_D1CFGR_HPRE_3; //1
   RCC->D1CFGR |=  RCC_D1CFGR_HPRE_2; //0
   RCC->D1CFGR |=  RCC_D1CFGR_HPRE_1; //0
   RCC->D1CFGR |=  RCC_D1CFGR_HPRE_0; //0

   //RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
   //MODIFY_REG(RCC->CFGR, RCC_CFGR_SW, RCC_ClkInitStruct->SYSCLKSource);
   //SW[2:0]: System clock switch
   //011: PLL1 selected as system clock (pll1_p_ck)

   RCC->CFGR &= ~RCC_CFGR_SW_2; //0
   RCC->CFGR |=  RCC_CFGR_SW_1; //1
   RCC->CFGR |=  RCC_CFGR_SW_0; //1

   //D1PCLK1 Configuration
   //RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
   //MODIFY_REG(RCC->D1CFGR, RCC_D1CFGR_D1PPRE, RCC_ClkInitStruct->APB3CLKDivider);
   //Bits 6:4 D1PPRE[2:0]: D1 domain APB3 prescaler
   //100: rcc_pclk3 = rcc_hclk3 / 2
   RCC -> D1CFGR |=  RCC_D1CFGR_D1PPRE_2;
   RCC -> D1CFGR |=  RCC_D1CFGR_D1PPRE_1;
   RCC -> D1CFGR |=  RCC_D1CFGR_D1PPRE_0;

   //PCLK1 Configuration
   //RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
   //MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE1, (RCC_ClkInitStruct->APB1CLKDivider));
   //Bits 6:4 D2PPRE1[2:0]: D2 domain APB1 prescaler
   //100: rcc_pclk1 = rcc_hclk1 / 2
   RCC -> D2CFGR |=  RCC_D2CFGR_D2PPRE1_2;
   RCC -> D2CFGR |=  RCC_D2CFGR_D2PPRE1_1;
   RCC -> D2CFGR |=  RCC_D2CFGR_D2PPRE1_0;

   //PCLK2 Configuration
   //RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
   //MODIFY_REG(RCC->D2CFGR, RCC_D2CFGR_D2PPRE2, (RCC_ClkInitStruct->APB2CLKDivider));
   //Bits 10:8 D2PPRE2[2:0]: D2 domain APB2 prescaler
   //100: rcc_pclk2 = rcc_hclk1 / 2
   RCC -> D2CFGR |=  RCC_D2CFGR_D2PPRE2_2;
   RCC -> D2CFGR |=  RCC_D2CFGR_D2PPRE2_1;
   RCC -> D2CFGR |=  RCC_D2CFGR_D2PPRE2_0;

   //D3PCLK1 Configuration
   //RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
   //MODIFY_REG(RCC->D3CFGR, RCC_D3CFGR_D3PPRE, (RCC_ClkInitStruct->APB4CLKDivider) );
   //Bits 6:4 D3PPRE[2:0]: D3 domain APB4 prescaler
   //100: rcc_pclk4 = rcc_hclk4 / 2
   RCC -> D3CFGR |=  RCC_D3CFGR_D3PPRE_2;
   RCC -> D3CFGR |=  RCC_D3CFGR_D3PPRE_1;
   RCC -> D3CFGR |=  RCC_D3CFGR_D3PPRE_0;

   while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL1);


}

int main(void)
{
   InitHSE();
   InitTimer();
   RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN;
   RCC->AHB4ENR |= RCC_AHB4ENR_GPIOBEN;
   RCC->AHB4ENR |= RCC_AHB4ENR_GPIOEEN;
   GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER5)) | (GPIO_MODER_MODER5_0);
   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER14)) | (GPIO_MODER_MODER14_0);
   GPIOB->MODER = (GPIOB->MODER & ~(GPIO_MODER_MODER0)) | (GPIO_MODER_MODER0_0);
   GPIOE->MODER = (GPIOE->MODER & ~(GPIO_MODER_MODER1)) | (GPIO_MODER_MODER1_0);
   GPIOE->BSRRH = (1 << 1);


while(1)
   {
       for (uint32_t a=0; a<1000000; a++) __NOP();
       GPIOB->BSRRH = (1 << 14);
       for (uint32_t a=0; a<1000000; a++) __NOP();
       GPIOB->BSRRL = (1 << 14);

}
}



Последний раз редактировалось Jaguar_showjumping 28 июн 2019, 03:14, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 11:35 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
Во-первых, пока будете заниматься подобным долбое....мом ничего хорошего не выйдет
Код:
RCC->CFGR &= ~RCC_CFGR_SW_2; //0
RCC->CFGR |=  RCC_CFGR_SW_1; //1
RCC->CFGR |=  RCC_CFGR_SW_0; //1


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 12:06 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
VladislavS писал(а):
Во-первых, пока будете заниматься подобным долбое....мом ничего хорошего не выйдет
Код:
RCC->CFGR &= ~RCC_CFGR_SW_2; //0
RCC->CFGR |=  RCC_CFGR_SW_1; //1
RCC->CFGR |=  RCC_CFGR_SW_0; //1


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


Да согласен я, согласен. Обязательно буду задавать потом константные числа разом в регистры.
Насчет Куба... Я RM 1000 раз перечитал, с Кубом сходится все, проверил.
Уже все биты регистров выучил и проверил каждый бит.

Все точно как в аптеке.

В любом случае любой моей ошибки - КАК МОЖЕТ PSC НЕ ВЛИЯТЬ НА РАБОТУ ТАЙМЕРА?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 12:25 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1017
Jaguar_showjumping писал(а):
КАК МОЖЕТ PSC НЕ ВЛИЯТЬ НА РАБОТУ ТАЙМЕРА?

Он влияет, скорее всего ты неправильно проверяешь. Например, значительно увеличив делители шин ты тормозишь работу с регистрами таймера и пока в прерывании очистится флаг в него может успеть зайти еще не один раз. Попробуй после TIM7->SR &= ~TIM_SR_UIF; добавить чтение из SR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 12:32 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
Reflector писал(а):
Jaguar_showjumping писал(а):
КАК МОЖЕТ PSC НЕ ВЛИЯТЬ НА РАБОТУ ТАЙМЕРА?

Он влияет, скорее всего ты неправильно проверяешь. Например, значительно увеличив делители шин ты тормозишь работу с регистрами таймера и пока в прерывании очистится флаг в него может успеть зайти еще не один раз. Попробуй после TIM7->SR &= ~TIM_SR_UIF; добавить чтение из SR.


Не понял :)
При приведенном мною коде светодиод, отвечающий за индикацию UIF таймера мигает примерно два раза в секунду.
Что я сделаю PSC=1000, что PSC=50000, он остается мигать одинаково.
А вот ARR=1000 и ARR=50000 дает соответствующие изменения частоты мигания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 12:34 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
dosikus_2 писал(а):
VladislavS писал(а):
Куб не даст выставить плохую конфигурацию.


Все, лапки к верху? Сдулся?
Без калокуба ни куда...
Я предлагаю только воспользоваться калькулятором, чтобы быть уверенным в конфигурации. Как-то же надо её проверить человеку, который не уверен в правильности. Я же не предлагаю кодогенератор использовать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 12:50 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1017
Jaguar_showjumping писал(а):
Не понял :)

Я говорю об известной проблеме когда увеличивают делители шин, в итоге в прерывание может заходить, например, два раза подряд и если там будет toogle(), то визуально может казаться, что светодиод не светится вообще. Проверять частоту таймера по светодиоду в таком случае не лучшее решение, выведи частоту на ножку и померяй, или читай SR, это должно гарантировать, что запись в него уже завершена, по крайней мере на F4 такое работало.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 13:06 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
Reflector писал(а):
Jaguar_showjumping писал(а):
Не понял :)

Я говорю об известной проблеме когда увеличивают делители шин, в итоге в прерывание может заходить, например, два раза подряд и если там будет toogle(), то визуально может казаться, что светодиод не светится вообще. Проверять частоту таймера по светодиоду в таком случае не лучшее решение, выведи частоту на ножку и померяй, или читай SR, это должно гарантировать, что запись в него уже завершена, по крайней мере на F4 такое работало.


Я же так и делаю - читаю SR:
Код:
void TIM7_IRQHandler(void) {
   if(TIM7->SR&TIM_SR_UIF)
   {
       TIM7->SR&=~TIM_SR_UIF;
       Blink=1-Blink;
       if (Blink==0) GPIOB->BSRRL = (1 << 0); else GPIOB->BSRRH = (1 << 0);
   }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 13:13 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1017
Jaguar_showjumping писал(а):
Я же так и делаю - читаю SR:

Читать нужно после сброса UIF.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 13:51 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
Reflector писал(а):
Jaguar_showjumping писал(а):
Я же так и делаю - читаю SR:

Читать нужно после сброса UIF.

Как же я прочту этот флаг, если я его сброшу? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 13:57 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1017
Jaguar_showjumping писал(а):
Как же я прочту этот флаг, если я его сброшу? :)

Зачем читать флаг? Читают регистр, а чтение не может произойти до записи, какая бы медленная она не была, т.е. после чтения флаг UIF будет гарантированно сброшен и повторно прерывание сразу не вызовется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 14:00 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
Reflector писал(а):
Jaguar_showjumping писал(а):
Как же я прочту этот флаг, если я его сброшу? :)

Зачем читать флаг? Читают регистр, а чтение не может произойти до записи, какая бы медленная она не была, т.е. после чтения флаг UIF будет гарантированно сброшен и повторно прерывание сразу не вызовется.

Так мне нужна реакция именно на этот флаг. Если я его сброшу, я не смогу фильтровать события по этому флагу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 14:01 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
Читай и до, и после.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 15:41 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 745
Jaguar_showjumping писал(а):
Да согласен я, согласен. Обязательно буду задавать потом константные числа разом в регистры.

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

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 16:32 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
AVI-crak писал(а):
Jaguar_showjumping писал(а):
Да согласен я, согласен. Обязательно буду задавать потом константные числа разом в регистры.

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

Какой именно переключатель Вы имеете ввиду? Это про выбор PLL как источника в RCC_CFGR? (SW0, SW1, SW2)
Правильно ли я понимаю, что по Вашему мнению, установлен будет только первый упоминающийся бит, а остальные будут проигнорированы?
Где-то можно про это ограничение одноразовой записи почитать? Не нашел... но попробую поменять код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 16:54 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
Нет, конечно, биты можно много раз менять. Но каждое изменение бита это реальное переключение источника. По пути к нужному источнику вы 3 ненужных устанавливаете и не факт что они работают в этот момент.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 17:33 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
VladislavS писал(а):
Нет, конечно, биты можно много раз менять. Но каждое изменение бита это реальное переключение источника. По пути к нужному источнику вы 3 ненужных устанавливаете и не факт что они работают в этот момент.

Значит это не причина глюка... а я так надеялся... так надеялся, что это так просто решится...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 17:46 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
Ну прочитать SR тоже не сложно. Процессор работает на частоте выше чем периферия, да ещё и с кэшами. Пока бит в периферии сбросится процессор может успеть выйти из прерывания и схватить его заново. Обычно, достаточно сбрасывать бит не в самом конце прерывания, но тут частота очень большая, этого может быть недостаточно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 17:50 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
VladislavS писал(а):
Ну прочитать SR тоже не сложно. Процессор работает на частоте выше чем периферия, да ещё и с кэшами. Пока бит в периферии сбросится процессор может успеть выйти из прерывания и схватить его заново. Обычно, достаточно сбрасывать бит не в самом конце прерывания, но тут частота очень большая, этого может быть недостаточно.


Так я ж первым делом читаю и зануляю как раз
Код:
void TIM7_IRQHandler(void) {
   if(TIM7->SR&TIM_SR_UIF)
   {
       TIM7->SR&=~TIM_SR_UIF;
       Blink=1-Blink;
       if (Blink==0) GPIOB->BSRRL = (1 << 0); else GPIOB->BSRRH = (1 << 0);
   }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 27 июн 2019, 18:43 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
Посмотрите листинг, хороший оптимизатор ваш код в несколько ассемблерных команд скомпилирует. В любом случае, добавить в конце TIM7->SR; и проверить намного быстрее чем с нами спорить. Быстрее отбросите причину - быстрее новую придумаем. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 28 июн 2019, 00:22 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 745
Насчёт серии sm32h743 - RCC там несколько сложнее чем был раньше. RM0433 страница 331.
PLL способен работать в двух частотных диапазонах 1-2МГц и 2-16МГц входного сигнала, и где-то на границах этих диапазонов - безбожно глючит. То-есть использовать диапазон 1,9МГц до 2,1МГц - не желательно. А там и запуск немного разный получается - разные флаги проверять нужно (страница 334).

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймеры H7. Игнорируется PSC при некоторых настройках PLL
СообщениеДобавлено: 28 июн 2019, 03:11 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
Поймал за хвост!
NVIC_SetPriority(TIM7_IRQn, 1);
приводит к этим глюкам.

С ЛЮБЫМ ПРИОРИТЕТОМ!

Убирание этой команды при инициализации дает рабочий код, совпадающий с ожиданиями.
Таймер взводится на работу 200МГц, т.е. считает два раза в секунду при PSC=10000 и ARR=10000
То есть этот монстр на орбиту 400 МГц выходит успешно.

Вопрос:
Что не так с NVIC_SetPriority(TIM7_IRQn, 1);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РЕШЕНО. почти... Таймеры H7. Игнорируется PSC
СообщениеДобавлено: 28 июн 2019, 03:54 
Старожил

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 331
VladislavS Style:

Для 400МГц:

Код:
void InitHSE() {
    FLASH->ACR = FLASH_ACR_LATENCY_4WS;
    RCC->CR |= RCC_CR_HSEON; // Enable HSE
    while((RCC->CR & RCC_CR_HSERDY) == 0);
    RCC->PLLCKSELR = 0b10000000100000000001000010;
    RCC->PLL1DIVR  |= 0b1000000010000001110001111;
    RCC->PLL1FRACR = 0;
    RCC->PLLCFGR = 0b1111111110000000000000001;
    RCC->CR |= RCC_CR_PLLON;
    while((RCC->CR & RCC_CR_PLL1RDY) == 0);
    RCC->D1CFGR = 0b1001000;
    RCC->D2CFGR = 0b10001000000;
    RCC->D3CFGR = 0b1000000;
    RCC->CFGR = 0b11;
    while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL1);
}


Спасибо за участие


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РЕШЕНО. почти... Таймеры H7. Игнорируется PSC
СообщениеДобавлено: 28 июн 2019, 08:00 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1013
Jaguar_showjumping писал(а):
VladislavS Style
Боже, упаси! Разве этому я учил??? Как вы эту клинопись кодируете и потом читаете??? Мой стайл как-то так
Код:
I2C1->TIMINGR = _VAL2FLD(I2C_TIMINGR_SCLL, 0x57)
              | _VAL2FLD(I2C_TIMINGR_SCLH, 0x58)
              | _VAL2FLD(I2C_TIMINGR_SDADEL, 4)
              | _VAL2FLD(I2C_TIMINGR_SCLDEL, 4)
              | _VAL2FLD(I2C_TIMINGR_PRESC, 2);

Ну а для многоразрядных чисел, а двоичные обычно многоразрядные, в стандарте языка есть вот такая фишка, позволяющая хоть как-то клином не промахнуться
Код:
0b0010'0000'0010'0000'0000'0100'0010


И тщательнее надо с параметрами то. Почто WRHIGHFREQ обидели?
Код:
FLASH->ACR = FLASH_ACR_LATENCY_4WS;
Остальную клинопись проверять нет ни возможности, ни желения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РЕШЕНО. почти... Таймеры H7. Игнорируется PSC
СообщениеДобавлено: 28 июн 2019, 18:16 
Старожил

Зарегистрирован: 06 июн 2018, 22:30
Сообщения: 416
Откуда: Киев
Jaguar_showjumping ппц а не стиль


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Eddy_Em


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB