Arduino Due:实测 SysTick RELOAD 行为不符合数据表描述

78 阅读1分钟

Atmel-11057-32-bit-Cortex-M3-Microcontroller-SAM3X-SAM3A_Datasheet 193页:

When ENABLE is set to 1, the counter loads the RELOAD value from the LOAD register and then counts down.

然而,

void setup() {
  Serial.begin(9600);
  Serial.print("LOAD之前的VAL: ");
  Serial.println(SysTick->VAL);
  SysTick->LOAD = -1;
  SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
  Serial.println("LOAD之后的VAL: ");
}
void loop() {
  Serial.println(SysTick->VAL);
}

串口输出

LOAD之前的VAL: 81390
LOAD之后的VAL: 
77539
76051
74563
73075
71587
70099
68611
67123
65538
64050
62562
61074
59586
……

可见设置ENABLE并不会立即载入LOAD到VAL。实际上,我找到的唯一能立即载入LOAD的方法,就是将VAL手动设为0:

void setup() {
  Serial.begin(9600);
  Serial.print("LOAD之前的VAL: ");
  Serial.println(SysTick->VAL);
  SysTick->LOAD = -1;
  SysTick->VAL = 0;  //SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
  Serial.println("LOAD之后的VAL: ");
}
void loop() {
  Serial.println(SysTick->VAL);
}

你实际上可以设置VAL为任意值,因为根据数据表:

A write of any value clears the field to 0

于是这次串口输出:

VAL before LOAD: 81369
VAL after LOAD:
16774708
16772787
16770866
16768945
16767024
16765103
16763090
16761169
……

本例可见一些芯片厂家提供的数据表也不一定正确,很多东西还是需要实际测试才知道。