Проверил в кейловском симуляторе. Всё нормально работает даже при переходе через 0xffffffff. Как переделать на 16 бит, подумаю.
Дизассемблер "проекта" прикладываю. Исходный код (все 10 строчек) легко восстановить.
CODE
; generated by ARM C/C++ Compiler with , RVCT4.0 [Build 524] for uVision
; commandline ArmCC [--debug -c --asm --interleave -omain.o --depend=main.d --device=DARMP1 --apcs=interwork -O3 -IC:\Keil\ARM\INC\NXP --omf_browse=main.crf main.c]
THUMB
AREA ||.text||, CODE, READONLY, ALIGN=2
main PROC
;;;31
;;;32 int main (void)
000000 b530 PUSH {r4,r5,lr}
;;;33 {
;;;34
;;;35 TIM0->CTCR = 0x00;
000002 2000 MOVS r0,#0
000004 f04f2240 MOV r2,#0x40004000
000008 6710 STR r0,[r2,#0x70]
;;;36 TIM0->TCR = 0x02;
00000a 2102 MOVS r1,#2
00000c 6051 STR r1,[r2,#4]
;;;37 TIM0->PR = 0;
00000e 60d0 STR r0,[r2,#0xc]
;;;38 TIM0->TCR = 0x01;
000010 2001 MOVS r0,#1
000012 6050 STR r0,[r2,#4]
;;;39
;;;40
;;;41 GPIO0->FIODIR ^= 0x01;
000014 4c08 LDR r4,|L1.56|
000016 6820 LDR r0,[r4,#0]
000018 f0800001 EOR r0,r0,#1
00001c 6020 STR r0,[r4,#0]
00001e f2427510 MOV r5,#0x2710
|L1.34|
000022 6891 LDR r1,[r2,#8]
000024 462b MOV r3,r5
|L1.38|
000026 6890 LDR r0,[r2,#8]
000028 1a40 SUBS r0,r0,r1
00002a 4298 CMP r0,r3
00002c d3fb BCC |L1.38|
;;;42
;;;43 while (1)
;;;44 {
;;;45 delay_ms (10);
;;;46
;;;47 GPIO0->FIOPIN ^= 0x01;
00002e 6960 LDR r0,[r4,#0x14]
000030 f0800001 EOR r0,r0,#1
000034 6160 STR r0,[r4,#0x14]
000036 e7f4 B |L1.34|
;;;48 }
;;;49
;;;50 ;
;;;51 }
ENDP
|L1.56|
DCD 0x2009c000
__ARM_use_no_argv EQU 0
таймер настраивался в режиме "лишь бы тикал"