delay.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <stm32f10x.h>
  2. #include <core_cm3.h>
  3. #include <stm32f10x_rcc.h>
  4. #include <misc.h>
  5. #include <stm32f10x_tim.h>
  6. #include "delay.h"
  7. volatile uint8_t done;
  8. void delay_init (void)
  9. {
  10. TIM_TimeBaseInitTypeDef ts;
  11. // TIM3 @ APB1 -> 6MHz WTF?!
  12. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  13. RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3, DISABLE);
  14. ts.TIM_Prescaler = 6 - 1;
  15. ts.TIM_CounterMode = TIM_CounterMode_Up;
  16. ts.TIM_Period = 0;
  17. ts.TIM_ClockDivision = TIM_CKD_DIV1;
  18. ts.TIM_RepetitionCounter = 0;
  19. TIM_TimeBaseInit(TIM3,&ts);
  20. TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  21. TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
  22. NVIC_InitTypeDef NVIC_InitStructure; //create NVIC structure
  23. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  24. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  25. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  26. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  27. NVIC_Init(&NVIC_InitStructure);
  28. TIM_Cmd(TIM3, DISABLE);
  29. }
  30. void _delay_us (uint16_t us, uint8_t precise)
  31. {
  32. TIM_Cmd(TIM3, DISABLE);
  33. TIM_SetAutoreload(TIM3, us);
  34. TIM_SetCounter(TIM3, 0);
  35. TIM_Cmd(TIM3, ENABLE);
  36. done = 0;
  37. while(!done) continue;
  38. TIM_Cmd(TIM3, DISABLE);
  39. }
  40. inline void _delay_ms (uint32_t ms)
  41. {
  42. while(ms-- > 0) _delay_us(1000, 0);
  43. }
  44. void TIM3_IRQHandler (void)
  45. {
  46. if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  47. {
  48. TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
  49. done = 1;
  50. }
  51. }