簡體   English   中英

Cortex-M0 +定時器預分頻器不會降低TIM2的速度

[英]Cortex-M0+ timer prescaler is not slowing down TIM2

我正在嘗試使用STM32L031K6(Cortex-M0 +)上的TIM2計時器來評估某些代碼的性能。 由於M0 +僅提供16位計數器,因此我想將TIM2的預分頻器設置為較慢的計數。 但是,似乎完全沒有效果。 計時器仍以最大速度運行,這對於我的用例而言並不理想。

我以前使用過libopencm3,但是現在我直接通過指針寫入寄存器,因為無論如何我以后都無法訪問libopencm3。 我瀏覽了STM32L0系列的數據表,並了解了如何直接設置定時器。 設置計時器並測量一些小的代碼(適用於帶nops的循環)非常有效。 但是設置預分頻器將不起作用。 我將值(例如0x1234)寫入了預分頻寄存器,然后再次讀取該值,以確保寫入操作確實有效。 我試圖觸發更新事件,因為似乎影子寄存器正在進行某些緩沖,但它也沒有起作用。

void __attribute__ ((noinline)) timer_setup()
{
  *(  (uint32_t*) 0x40021038 ) |= 1; //Enable Timer in RCC_APB1ENR (Bit 0)

  *(  (uint32_t*) 0x40000028 ) = 0x1234; //Some prescaler

  *(  (uint32_t*) 0x4000002C ) = 0xFFFF; //Auto-Reload to max 2**16

  // *(  (uint32_t*) 0x40000000 ) ^= 2; //I tried triggering an update here

  // *(  (uint32_t*) 0x40000014 ) ^= 1; //But it also didn't work

  *(  (uint32_t*) 0x40000000 ) ^= 1; //Enable the timer
}

void __attribute__ ((noinline)) timer_stop()
{
  *(  (uint32_t*) 0x40000000 ) ^= 1; //Stop the timer
}

int __attribute__ ((noinline)) timer_value()
{
  return *(  (uint32_t*) 0x40000024 ); //Read the counter
}

我希望如果設置預分頻器,該計數會降低。 但是,我總是得到相同的值。 例如,循環1326。

您需要生成一個更新事件,可以通過將計時器的EGR寄存器的位0設置為該事件。

在注釋了“我嘗試在此處觸發更新”的兩行中,您使用的是^=運算符,而是使用|=來設置寄存器中的位。

對於寄存器及其地址,還應使用ST提供的可讀定義。 這將使您可以編寫類似TIM2->EGR |= TIM_EGR_UG; 生成更新事件,比*( (uint32_t*) 0x40000014 ) |= 1;更可讀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM