delay_ms_systick.c 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * http://chipspace.ru/stm32-systick/
  3. */
  4. #include "stm32f10x.h"
  5. static __IO uint32_t TimingDelay;
  6. void Delay_ms(__IO uint32_t nTime);
  7. GPIO_InitTypeDef GPIO_InitStruct;
  8. int main()
  9. {
  10. /*Вызов функции конфигурации системного таймера SysTick.
  11. Эта функция находится в файле core_cm3.h и:
  12. --Задает источник тактирования системного таймера (по умолчанию это SYSCLK = 24 МГц,
  13. другой возможный вариант - SysTick тактируется от SYSCLK/8);
  14. --Задает уровень приоритета прерывания;
  15. --Сбрасывает флаг ожидания прерывания, если он выставлен;
  16. --Заносит в нужный регистр перезагружаемое значение для декрементирующего счетчика,
  17. которое вычисляется по формуле:
  18. Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s),
  19. для базовой задержки длительностью 1 мс получим величину
  20. Reload Value = 24 000 000 Гц х 0,001 с = 24 000
  21. (Необходимо самостоятельно посчитать эту величину и вставить в качестве
  22. параметра при вызове функции);
  23. --Обнуляет счетчик
  24. --Запускает счет системного таймера*/
  25. SysTick_Config(24000);
  26. //Включаем тактирование порта GPIOC
  27. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  28. //Конфигурируем выводы, к которым подключены светодиоды платы
  29. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //Выбираем выводы PC8, PC9
  30. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //Максимальная скорость работы
  31. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //Выход Push-Pull
  32. GPIO_Init(GPIOC, &GPIO_InitStruct); //Заносим заданные настройки в регистры порта
  33. while(1)
  34. {
  35. GPIO_ResetBits(GPIOC, GPIO_Pin_9); //Гасим зеленый LED
  36. GPIO_SetBits(GPIOC, GPIO_Pin_8); //Зажигаем синий LED
  37. Delay_ms(1000); //Временная задержка на 1 с
  38. GPIO_ResetBits(GPIOC, GPIO_Pin_8); //Гасим синий LED
  39. GPIO_SetBits(GPIOC, GPIO_Pin_9); //Зажигаем зеленый LED
  40. Delay_ms(1000); //Временная задержка на 1 с
  41. }
  42. }
  43. //Функция временной задержки
  44. void Delay_ms(__IO uint32_t nTime)
  45. {
  46. TimingDelay = nTime;
  47. while(TimingDelay != 0);
  48. }
  49. void TimingDelay_Decrement(void)
  50. {
  51. if (TimingDelay != 0x00)
  52. {
  53. TimingDelay--;
  54. }
  55. }
  56. //Обработчик прерывания системного таймера
  57. void SysTick_Handler(void)
  58. {
  59. TimingDelay_Decrement();
  60. }