Easyelectronics.ru

Электроника для всех
Текущее время: 18 янв 2020, 16:14

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



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

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

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 349
Решение:
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
Сообщения: 1185
Во-первых, пока будете заниматься подобным долбое....мом ничего хорошего не выйдет
Код:
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
Сообщения: 349
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
Сообщения: 1047
Jaguar_showjumping писал(а):
КАК МОЖЕТ PSC НЕ ВЛИЯТЬ НА РАБОТУ ТАЙМЕРА?

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


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

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 349
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
Сообщения: 1185
dosikus_2 писал(а):
VladislavS писал(а):
Куб не даст выставить плохую конфигурацию.


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


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

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

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


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

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 349
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
Сообщения: 1047
Jaguar_showjumping писал(а):
Я же так и делаю - читаю SR:

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


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

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

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

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


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

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

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


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

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

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

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


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

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


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

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

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

_________________
Потоковая OS


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

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

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

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


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

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


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

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

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


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

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


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

Зарегистрирован: 19 окт 2016, 13:57
Сообщения: 349
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
Сообщения: 1185
Посмотрите листинг, хороший оптимизатор ваш код в несколько ассемблерных команд скомпилирует. В любом случае, добавить в конце TIM7->SR; и проверить намного быстрее чем с нами спорить. Быстрее отбросите причину - быстрее новую придумаем. :)


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

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 762
Насчёт серии 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
Сообщения: 349
Поймал за хвост!
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
Сообщения: 349
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
Сообщения: 1185
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
Сообщения: 482
Откуда: Киев
Jaguar_showjumping ппц а не стиль


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


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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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