|
@@ -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;
|
|
}
|
|
}
|