Jump to content

    
Sign in to follow this  
Nosaer

Не обновляется регистр CNT

Recommended Posts

Добрый день.

Хочу занести свое значение в регистр CNT:

	TIM2 	->	CNT 	=	0x112233;
	TIM2 	->	ARR 	=	0x334455;
	TIM2	->	EGR 	|= 	TIM_EGR_UG; 

С ARR проблем никаких нет, он обновляется  и значение остается тем, которое я задал.

CNT по началу принимает заданное значение, но буквально через пару тактов после TIM2 -> EGR |= IM_EGR_UG;  сбрасывается опять в 0 

 

Share this post


Link to post
Share on other sites
4 minutes ago, Nosaer said:

Считываю по UART значение.  Таймер на момент считывания значения CNT, даже не запущен. 

 

Приведите всю инициализацию таймера.

В том числе тактирование самого таймера (через RCC).

 

Не лишним будет указать семейство контроллеров (вангую, что речь идет о неком STM32).

 

Share this post


Link to post
Share on other sites
// Изначальная инициализация:
static void MX_TIM2_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 24999;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 68399999;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim2);
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
}


// Перезапуск с другими условиями
RCC		->	APB1ENR |= RCC_APB1ENR_TIM2EN;
TIM2	->	CR1 	|=	TIM_CR1_URS;
TIM2 	->	CNT 	=	0x112233;
TIM2 	->	ARR 	=	0x334455;
TIM2	->	EGR 	|= 	TIM_EGR_UG;

TIM2	->	SR 		&= 	~TIM_SR_UIF;
TIM2	->	DIER 	|= 	TIM_DIER_UIE;
NVIC_EnableIRQ(TIM2_IRQn);

TIM2	->	CR1 	|= 	TIM_CR1_CEN; 

МК STM32F4

Share this post


Link to post
Share on other sites

Честно говоря, не очень хочется разбираться в подобной смеси хала и прямого обращения к регистрам, эту лучше доверить автору такого кода :)

Могу посоветовать смотреть состояния регистров таймера, сверяя их с даташитом,

Для этого есть смысл включить отладочный режим для TIM2 в DBGMCU, чтобы спокойно ходить по инициализации включенного и даже работающего таймера под отладчиком по шагам.

 

Share this post


Link to post
Share on other sites

На данном этапе мне удобнее производить всю инициализацию на HAL.

Постепенно осваиваю CMSIS, т.к. некоторые функции от HAL выполняются очень долго и то что освоил пробую писать на CMSIS. Поэтому пока такая мусорка))

Штатными функциями HAL принудительно изменить значение регистра CNT тоже не получилось. 

Share this post


Link to post
Share on other sites

Nosaer, согласно документации, запись TIM2->EGR = TIM_EGR_UG приводит к сбросу счетчика таймера, если он настроен на режим счета "вверх" или режим "выровненный по центру", иначе его значение инициализируется величиной из регистра ARR.

Edited by ivan24190

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this