Пн июл 27, 2020 13:51:41
Пн июл 27, 2020 14:34:36
Пн июл 27, 2020 14:48:01
Пн июл 27, 2020 14:58:15
volatile int delay = 123;
while(delay) delay--;
Пн июл 27, 2020 15:30:02
Пн июл 27, 2020 16:25:31
Пн июл 27, 2020 21:21:35
void DelayMs(uint32_t nTime)
{
volatile uint32_t CounterTick = nTime * (SystemCoreClock / 1000);
SCB_DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; //разрешаем использовать счётчик
DWT_CYCCNT = 0; //обнуляем значение счётного регистра
DWT_CONTROL |= DWT_CTRL_CYCCNTENA_Msk; //запускаем счётчик
while(DWT_CYCCNT < CounterTick);
DWT_CONTROL &= ~DWT_CTRL_CYCCNTENA_Msk; //останавливаем счётчик
}
Вт июл 28, 2020 05:05:13
Вт июл 28, 2020 08:51:10
Вт июл 28, 2020 21:29:19
#define DWT_CYCCNT *(volatile unsigned long *)0xE0001004
#define DWT_CONTROL *(volatile unsigned long *)0xE0001000
#define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC
Сб апр 10, 2021 10:55:11
Ср апр 14, 2021 07:49:53
Ср апр 14, 2021 07:59:52
облагороженная версия ардуиновского millis() и ардуиновского же подхода...Professor Chaos писал(а):Подробнее про реализацию можно прочитать тут.
Ср апр 14, 2021 12:07:53
void Delay(uint32_t ms)
{
volatile uint32_t nCount;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);
nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
for (; nCount!=0; nCount--);
}
// Конфигурируем и запуск системного таймера
// для генерации каждую 1 мс.
SysTick->LOAD = 48000000UL/1000 - 1; // Загрузка значения в 1 ms
SysTick->VAL = 48000000UL/1000 - 1; // Устанавливаем текущее значение
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
volatile uint32_t currentMillis = 0;
//Обработчик прерывания системного таймера
void SysTick_Handler(void)
{
currentMillis++;
}
uint32_t millis (void)
{
return currentMillis;
}
uint32_t previousMillis = 0;
if((millis() - previousMillis) > 500){
previousMillis = millis();
//делаем что-то
}
Ср апр 14, 2021 22:41:39
Dimon456 писал(а):nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
for (; nCount!=0; nCount--);
Чт апр 15, 2021 13:18:17
А вот мне "на.... с глубокой горки", главное работает и ладно, просто из вас ни кто ни чего не предложил, кроме слов конечно.Professor Chaos писал(а):Вы строите этот код исходя из предположения,
while(1)
{
GPIOA->ODR |= GPIO_Pin_2;
Delay(100); // Delay(1); Delay(10);
GPIOA->ODR &= ~GPIO_Pin_2;
}
RCC_Clocks.HCLK_Frequency/10000
Да плевать и на этоProfessor Chaos писал(а):Во втором варианте не учитывается событие переполнения счетчика
if((millis() - previousMillis) > 500){
previousMillis = millis();
blink = !blink;
}
LCDI2C_setCursor (10,0);
if (blink) LCDI2C_write(0x22); else LCDI2C_write(0x20);
Чт апр 15, 2021 19:51:55
Чт апр 15, 2021 23:02:54
Чт апр 15, 2021 23:04:11
TIM3->PSC = 56-1; // предварительная
TIM3->ARR = 10-1; // подготовка
TIM3->EGR = TIM_EGR_UG; // таймера
...
TIM3->CR1 = TIM_CR1_CEN|TIM_CR1_OPM; // старт таймера
...
if (!(TIM3->CR1&TIM_CR1_CEN)) {...;} // проверка с выполнением, если оттикал
или заLoopить на тупой опрос бита:
while(TIM3->CR1&TIM_CR1_CEN){}; // висеть если еще тикает
Чт апр 15, 2021 23:15:31