А что на счёт задержек на
Код: Выделить всё
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 писал(а):причем по функциональности мало чем отличающийся задержек с пустыми циклами- пустая молотьба
dosikus писал(а):Можно конечно реализовать все это дело , как писал ранее с прерываниями
dosikus писал(а):Кстати а зачем все таки такие точные , да еще мелкие задержки с HD44780 ?
Код: Выделить всё
void delay(uint32_t i)
{
while(i-- > 0);
}
Код: Выделить всё
void delay(uint32_t i)
{
i *= N;
while(i-- > 0);
}
dosikus писал(а):reidfix , Вам фантазия, а точней ее отсутствие , не позволяет найти другой способ раскрутки своего блога, кроме как впихивать ссылки на него куда попало ?
coredumped писал(а):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