А что на счёт задержек на
Код: Выделить всё
GPIOB->BSRRH = GPIO_Pin_12;Mr.Denis,По читайте про DWT.
http://forum.easyelectronics.ru/viewtop ... 31#p271595
Код: Выделить всё
GPIOB->BSRRH = GPIO_Pin_12;Код: Выделить всё
#ifndef __DELAY_H
#define __DELAY_H
/*================*/
#define SYSTEM_FREQUENCY SystemCoreClock // Устанавливаем значение AHB из system_stm32f4xx.c
/*================*/
/****************** Регистеры системного таймера ядра Cortex-M ***********************/
#define STK_CTRL (*(volatile uint32_t*) 0xE000E010)
#define STK_LOAD (*(volatile uint32_t*) 0xE000E014)
#define STK_VAL (*(volatile uint32_t*) 0xE000E018)
#define STK_CALIB (*(volatile uint32_t*) 0xE000E01C)
/***************** Биты для работы с регистром STK_CTRL *****************/
#define STK_CTRL_ENABLE ((uint32_t)0x00000001) // Bit № 0, название бита ENABLE.
#define STK_CTRL_TICKINT ((uint32_t)0x00000002) // Bit № 1, название бита TICKINT
#define STK_CTRL_CLKSOURCE ((uint32_t)0x00000004) // Bit № 2, название бита CLKSOURCE
#define STK_CTRL_COUNTFLAG ((uint32_t)0x00010000) // Bit № 16, название бита COUNTFLAG
void Init_SysTick_delay(void); // Объявление Функция настройки системного таймера
void delay_us(uint32_t us); // Объявление Функция для задержки в микросикундах
void delay_ms(uint32_t ms); // Объявление Функция для задержки в милисекундах
#endif
void Init_SysTick_delay(void){ // Функция настройки системного таймера
STK_CTRL &=~STK_CTRL_TICKINT; // Выключить прерывание от SysTick, в bit1 записываем 0
STK_CTRL |= STK_CTRL_CLKSOURCE; // Тактирование от AHB, в bit2 записываем 1
}
void delay_us(uint32_t us){
STK_LOAD = (SYSTEM_FREQUENCY / 1000000); // Загружаем значение, в этом случаи равен 168 = 168000000 \ 1000000. (1 us = 168 тактов)
STK_VAL = 1; // Как я понял любое число???
STK_CTRL |= STK_CTRL_ENABLE; // Включаем счетчик, в bit0 записываем 1
while(us > 0){ // Цикл выполняется до тех пор, пока us больше 0
while (!(STK_CTRL & STK_CTRL_COUNTFLAG)); // Проверяем бит COUNTFLAG (bit № 16) на еденицу. Цикыл выболняется пока значение != 0
us--; // С каждым заходом в цикл вычетаем 1 из переменной us
}
STK_CTRL &= ~STK_CTRL_ENABLE; // Выключаем счетчик, в bit0 записываем 0
}
void delay_ms(uint32_t ms){
STK_LOAD = (SYSTEM_FREQUENCY / 1000); // Загружаем значение, в этом случаи равен 168 = 168000000 \ 1000. (1 ms = 168000 тактов)
STK_VAL = 1; // Как я понял любое число???
STK_CTRL |= STK_CTRL_ENABLE; // Включаем счетчик, в bit0 записываем 1
while(ms > 0){ // Цикл выполняется до тех пор, пока us больше 0
while (!(STK_CTRL & STK_CTRL_COUNTFLAG)); // Проверяем бит COUNTFLAG (bit № 16) на еденицу. Цикыл выболняется пока значение != 0
ms--; // С каждым заходом в цикл вычетаем 1 из переменной us
}
STK_CTRL &= ~STK_CTRL_ENABLE; // Выключаем счетчик, в bit0 записываем 0
}
Код: Выделить всё
#ifndef __DELAY_H
#define __DELAY_H
#define AHB1_clock 42000000
void delay_us(uint32_t us);
void delay_ms(uint32_t ms);
#endif /*__DELAY_H*/
void delay_ms(uint32_t ms)
{
TIM6->PSC = AHB1_clock/1000-1;
TIM6->ARR = ms;
TIM6->EGR |= TIM_EGR_UG;
TIM6->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;
while (TIM6->CR1&TIM_CR1_CEN);
}
void delay_us(uint32_t us)
{
TIM6->PSC = AHB1_clock/1000000-1;
TIM6->ARR = us;
TIM6->EGR |= TIM_EGR_UG;
TIM6->CR1 |= TIM_CR1_CEN|TIM_CR1_OPM;
while (TIM6->CR1 & TIM_CR1_CEN);
}
Не выдумывай х..и , это для измерения ...Mr.Denis писал(а):
P.S. Сейчас продумываю функцию задержки которую хочу реализовать на DWT
Да все как то страшно, честно говоря .Mr.Denis писал(а): Что скажите про два варианта которые я реализовал?
Согласен, но что-то мне подсказывает что на базовом или системном таймере оно намного точнее, или я сильно заблуждаюсь?dosikus писал(а):причем по функциональности мало чем отличающийся задержек с пустыми циклами- пустая молотьба
Насколько я понимаю ситуацию то с задержками в us это будет очень хренова, с применением прерывания разве что делать большие задержки.dosikus писал(а):Можно конечно реализовать все это дело , как писал ранее с прерываниями
эту информацию почерпнул из даташит на HD44780, хотя мог в спешки перепутать us и ms. Обязательно перепроверю.dosikus писал(а):Кстати а зачем все таки такие точные , да еще мелкие задержки с HD44780 ?
Код: Выделить всё
void delay(uint32_t i)
{
while(i-- > 0);
}
Код: Выделить всё
void delay(uint32_t i)
{
i *= N;
while(i-- > 0);
}
А че, нормально. Ребята на изиэлектрониксе неслабо так побились головой об STLink, чтоб бутлоадер "утянуть", а теперь все, кому не лень, лепят клонов, даже абсолютно не пониая, как это работает. Была бы совесть - хоть бы ссылочку на форум указал, откуда прошивка появилась.dosikus писал(а):reidfix , Вам фантазия, а точней ее отсутствие , не позволяет найти другой способ раскрутки своего блога, кроме как впихивать ссылки на него куда попало ?
+100500coredumped писал(а):ST-Link упакован в корпус и снабжен защитой от статики. Те это какбэ более надежное устройство.
Код: Выделить всё
//------------ Вывод null-terminated string (в экранную память): -------------
void LCD_PutString(char __flash *s)
{
while(*s) LCD_PutChar(*s++);
}Код: Выделить всё
void LCD_PutString(const uint8_t *s);Код: Выделить всё
EXTI_ClearITPendingBit(EXTI_Line0);Код: Выделить всё
EXTI->PR |= EXTI_PR_PR15;//сброс флага PR15 перрывания записью единицы
EXTI->SWIER |= EXTI_SWIER_SWIER15;//установка флага PR15 в регистре EXTI_PR