ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
460593 Топик полностью
Vit (06.11.2013 20:59, просмотров: 129) ответил Леонид Иванович на Примерно за полторы недели смог помигать светодиодом на STM32. Работает, но пока не совсем понимаю, как. Вопросы следующие:
В 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 и уже блинкать можно