라이브러리로 제공되는 함수가 milisec 함수(HAL_Delay()) 는 있는데,
가끔 가다가 필요한 us 함수를 구글링해서 찾았고, 잘 동작합니다.
링크는 다음과 같습니다.
cubemx 로 여러가지 테스트해보다 보면 실수로 User code 부분이 싹~ 날아가는 경우가 많아서,
이곳에 코드를 다시 정리해 봅니다.
저는 user_def.c 라는 파일을 하나 만들어서 cubemx 에서 갑자기 지워지는 것을 막기 위해 필요한 함수를 정의해 놓아서,
새로 추가된 DWT_Delay_Init() 함수는 이곳에 정의해 놓았습니다.
1. user_def.c 에 다음의 코드를 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | uint32_t DWT_Delay_Init(void) { /* Disable TRC */ CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000; /* Enable TRC */ CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000; /* Disable clock cycle counter */ DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001; /* Enable clock cycle counter */ DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; //0x00000001; /* Reset the clock cycle counter value */ DWT->CYCCNT = 0; /* 3 NO OPERATION instructions */ __ASM volatile ("NOP"); __ASM volatile ("NOP"); __ASM volatile ("NOP"); /* Check if clock cycle counter has started */ if(DWT->CYCCNT) { return 0; /*clock cycle counter started*/ } else { return 1; /*clock cycle counter not started*/ } } | cs |
2. user_def.h 에 다음의 코드 추가
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | uint32_t DWT_Delay_Init(void); /** * @brief This function provides a delay (in microseconds) * @param microseconds: delay in microseconds */ __STATIC_INLINE void DWT_Delay_us(volatile uint32_t microseconds) { uint32_t clk_cycle_start = DWT->CYCCNT; /* Go to number of cycles for system */ microseconds *= (HAL_RCC_GetHCLKFreq() / 1000000); /* Delay till end */ while ((DWT->CYCCNT - clk_cycle_start) < microseconds); } | cs |
3. main.c 의 main() 함수에서 us Delay 함수(DWT_Delay_us()) 사용.
1 2 3 4 5 6 | while(1) { HAL_GPIO_TogglePin(IND_LED_FL_GPIO_Port,IND_LED_FL_Pin); DWT_Delay_us(1000000); // 1sec } | cs |
1000,000 us (1 sec) 마다 GPIO 가 토글되는 것을 확인했으니, 동작이 잘 되네요. ^^
'STM32F4' 카테고리의 다른 글
[STM32F4xx] EEPROM Emulate Test (내부 Flash Mem 사용) (0) | 2018.09.06 |
---|---|
[STM32F4xx] Polling us Delay 함수 (0) | 2018.09.05 |
[STM32F4xx] 타이머 인터럽트 동작 시 이상한 점. (1) | 2018.09.05 |
[STM32F4xx] CUBEMX ver 4.19 버전 갖고 계신분? (0) | 2018.09.05 |
[STM32F4xx] CUBEMX ver 4.2 버그 많아서 못쓰겄네. (0) | 2018.09.05 |