Jelajahi Sumber

Добавил вариант мксек задержки на Systick.

Vladimir N. Shilov 8 tahun lalu
induk
melakukan
c9b2bfb585
2 mengubah file dengan 83 tambahan dan 67 penghapusan
  1. 70 0
      stm32/delay_ms_systick.c
  2. 13 67
      stm32/delay_us_systick.c

+ 70 - 0
stm32/delay_ms_systick.c

@@ -0,0 +1,70 @@
+/*
+ * http://chipspace.ru/stm32-systick/
+ */
+
+#include "stm32f10x.h"
+
+static __IO uint32_t TimingDelay;
+
+void Delay_ms(__IO uint32_t nTime);
+
+GPIO_InitTypeDef    GPIO_InitStruct;
+
+int main()
+{
+  /*Вызов функции конфигурации системного таймера SysTick.
+  Эта функция находится в файле core_cm3.h и:
+  --Задает источник тактирования системного таймера (по умолчанию это SYSCLK = 24 МГц,
+    другой возможный вариант  - SysTick тактируется от SYSCLK/8);
+  --Задает уровень приоритета прерывания;
+  --Сбрасывает флаг ожидания прерывания, если он выставлен;
+  --Заносит в нужный регистр перезагружаемое значение для декрементирующего счетчика,
+    которое вычисляется по формуле:
+        Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s),
+        для базовой задержки длительностью 1 мс получим величину
+        Reload Value = 24 000 000 Гц х 0,001 с = 24 000
+    (Необходимо самостоятельно посчитать эту величину и вставить в качестве
+    параметра при вызове функции);
+  --Обнуляет счетчик
+  --Запускает счет системного таймера*/
+  SysTick_Config(24000);
+
+  //Включаем тактирование порта GPIOC
+  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
+  //Конфигурируем выводы, к которым подключены светодиоды платы
+  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //Выбираем выводы PC8, PC9
+  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //Максимальная скорость работы
+  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //Выход Push-Pull
+  GPIO_Init(GPIOC, &GPIO_InitStruct); //Заносим заданные настройки в регистры порта
+
+  while(1)
+  {
+    GPIO_ResetBits(GPIOC, GPIO_Pin_9); //Гасим зеленый LED
+    GPIO_SetBits(GPIOC, GPIO_Pin_8);   //Зажигаем синий LED
+    Delay_ms(1000); //Временная задержка на 1 с
+    GPIO_ResetBits(GPIOC, GPIO_Pin_8); //Гасим синий LED
+    GPIO_SetBits(GPIOC, GPIO_Pin_9);   //Зажигаем зеленый LED
+    Delay_ms(1000); //Временная задержка на 1 с
+  }
+}
+
+//Функция временной задержки
+void Delay_ms(__IO uint32_t nTime)
+{
+  TimingDelay = nTime;
+  while(TimingDelay != 0);
+}
+
+void TimingDelay_Decrement(void)
+{
+  if (TimingDelay != 0x00)
+  {
+    TimingDelay--;
+  }
+}
+
+//Обработчик прерывания системного таймера
+void SysTick_Handler(void)
+{
+  TimingDelay_Decrement();
+}

+ 13 - 67
stm32/delay_us_systick.c

@@ -1,70 +1,16 @@
-/*
- * http://chipspace.ru/stm32-systick/
+/**
+ * Delay
+ * no interrupt, clk = sysclk/8
+ * не проверял пока.
  */
-
-#include "stm32f10x.h"
-
-static __IO uint32_t TimingDelay;
-
-void Delay_ms(__IO uint32_t nTime);
-
-GPIO_InitTypeDef    GPIO_InitStruct;
-
-int main()
-{
-  /*Вызов функции конфигурации системного таймера SysTick.
-  Эта функция находится в файле core_cm3.h и:
-  --Задает источник тактирования системного таймера (по умолчанию это SYSCLK = 24 МГц,
-    другой возможный вариант  - SysTick тактируется от SYSCLK/8);
-  --Задает уровень приоритета прерывания;
-  --Сбрасывает флаг ожидания прерывания, если он выставлен;
-  --Заносит в нужный регистр перезагружаемое значение для декрементирующего счетчика,
-    которое вычисляется по формуле:
-        Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s),
-        для базовой задержки длительностью 1 мс получим величину
-        Reload Value = 24 000 000 Гц х 0,001 с = 24 000
-    (Необходимо самостоятельно посчитать эту величину и вставить в качестве
-    параметра при вызове функции);
-  --Обнуляет счетчик
-  --Запускает счет системного таймера*/
-  SysTick_Config(24000);
-
-  //Включаем тактирование порта GPIOC
-  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
-  //Конфигурируем выводы, к которым подключены светодиоды платы
-  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; //Выбираем выводы PC8, PC9
-  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //Максимальная скорость работы
-  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //Выход Push-Pull
-  GPIO_Init(GPIOC, &GPIO_InitStruct); //Заносим заданные настройки в регистры порта
-
-  while(1)
-  {
-    GPIO_ResetBits(GPIOC, GPIO_Pin_9); //Гасим зеленый LED
-    GPIO_SetBits(GPIOC, GPIO_Pin_8);   //Зажигаем синий LED
-    Delay_ms(1000); //Временная задержка на 1 с
-    GPIO_ResetBits(GPIOC, GPIO_Pin_8); //Гасим синий LED
-    GPIO_SetBits(GPIOC, GPIO_Pin_9);   //Зажигаем зеленый LED
-    Delay_ms(1000); //Временная задержка на 1 с
+inline void _delay_us(uint32_t us) {
+  if (us > 0xFFFFFFUL) {
+    us = 0xFFFFFFUL;
   }
-}
-
-//Функция временной задержки
-void Delay_ms(__IO uint32_t nTime)
-{
-  TimingDelay = nTime;
-  while(TimingDelay != 0);
-}
-
-void TimingDelay_Decrement(void)
-{
-  if (TimingDelay != 0x00)
-  {
-    TimingDelay--;
-  }
-}
-
-//Обработчик прерывания системного таймера
-void SysTick_Handler(void)
-{
-  TimingDelay_Decrement();
+  us *= (STM32_HCLK/8);
+  SysTick->LOAD = us;
+  SysTick->VAL = 0;
+  SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
+  while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));
+  SysTick->CTRL = 0;
 }