[英]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.