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