В CooCox автоматизировано. Тактирование часто засовывают в SystemInit. В пакете фирмвари для конкретной борды можно поискать. SystemInit запускается по вектору Reset до вызова Main. Для распинывания Cortex M3/4 часто просто вписываю перед main её - void SystemInit(void){} и запускаюсь на клоке по дефолту для камня (RC на сколько-то там). Далее включаю DWT-таймер и считаю по нему.
говнокодю что-то типа такого хедера
typedef unsigned long CORE_Time_t;
#define DWT_CYCCNT *(volatile uint32_t *)0xE0001004
#define DWT_CONTROL *(volatile uint32_t *)0xE0001000
#define SCB_DEMCR *(volatile uint32_t *)0xE000EDFC
#define CORE_TIME() (DWT_CYCCNT)
#define CORE_uS(X) ((X)*32UL) /* 32UL- частота ядра в MHz */
#define CORE_mS(X) ((X)*32UL*1000UL) /* 32UL- частота ядра в MHz */
#define CORE_TIME_DELAY(X) do{ \
CORE_Time_t ts = CPU_TIME(); \
while((CORE_TIME()-ts) < (X));\
}while(0)
void CORE_Time_Init(void);
CORE_Time_t CORE_Time(void);
CORE_Time_t CORE_Time_Elapsed(CORE_Time_t ts);
void CORE_Time_Delay(CORE_Time_t duration);
}
и такого остального
void CORE_Time_Init(void){
//if (!(DWT_CONTROL & 1)){
SCB_DEMCR |= 0x01000000;
DWT_CYCCNT = 0;
DWT_CONTROL|= 1; // enable the counter
//}
}
CORE_Time_t CORE_Time(void){
return CORE_TIME();
}
CORE_Time_t CORE_Time_Elapsed(CORE_Time_t ts){
return (CORE_TIME() - ts);
void CORE_Time_Delay(CORE_Time_t duration){
volatile CORE_Time_t ts;
ts = CORE_TIME();
while(CORE_Time_Elapsed(ts) < duration);
}
Дальше распинать GPIO и уже блинкать можно