Так никто не спорит, с авр немного разобрался, но стм32 - новое. HAL - даёт абстракцию. В ардуино в абстракции есть микросекунды, в HAL их нет. (( Назревает вопрос - почему?)
Может потому что универсально не получится? МК разные бывают и где то может оказаться реализация микросекундных интервалов съест всё процессорное время? У эстээмов много таймеров и реализовать на них микросекундные интервалы аппаратно в случае необходимости гораздо эффективней.
Возможно.
Не представляю где эти паузы нужны. Ну в инициализации дисплеев, модулей связи и прочего да, приходится. Но там при запуске устройства как бы и хрен с ним. А в процессе, так сказать, нафига они? Если протокол с жёсткими таймингами, то есть DMA с таймером.
например CAN нужны микросекунды
#ifndef __DELAY_US_H__
#define __DELAY_US_H__
#ifdef __cplusplus
extern "C" {
#endif
/******************************************************************************/
/* Подключение заголовочных файлов используемых модулей */
#include "main.h"
//#define DWT_CONTROL *(volatile unsigned long *)0xE0001000
//#define SCB_DEMCR *(volatile unsigned long *)0xE000EDFC
/******************************************************************************/
/* inline func */
__STATIC_INLINE void DWT_Init(void)
{
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; // разрешаем использовать счётчик
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; // запускаем счётчик
}
__STATIC_INLINE void delay_us(uint32_t us)
{
uint32_t us_count_tic = us * (SystemCoreClock / 1000000U);
DWT->CYCCNT = 0U;
while(DWT->CYCCNT < us_count_tic);
}
#ifdef __cplusplus
}
#endif
#endif //__DELAY_US_H__
/******************************* END OF FILE ********************************/
delay_us(100); // 100 микросекунд
несовсем … тики могут подвиснуть , а dwt независим
По сути, счётчик DWT это просто 32-х битный регистр, значение в котором увеличивается на единичку с каждым последующим тактом. Мы можем писать в этот регистр и читать из него, а значит можем с его помощью измерять время выполнения каких-то кусков программы в тактах, и организовывать микросекундные задержки. Этот счётчик полностью независимый.
НАсколько помню даже прерывания на него по моему не действует…
dwt не ест процессорное время а микросекунды лучше на нем
В спор не буду ударятся и так полно его … но я например для себя решил настройка периферии в кале , а потом когда заработала переписать на ll или cmsis… и ошибок меньше и времени тратиться меньше…Ну и от железа не отходишь т.к все равно потом оптимизируешь своими функциями…
Просто искать ошибки сразу в двух местах (железо-код) проблематично бывает , а так код заработал прототипом - оптимизировал с хал на лл или кмис…
у меня программы часто и так и так одновременно куб позволяет…
например пересылка дисплею через регистры, а считывание с сд пока еще на хал … частично только переписал
void LCD_WR_CMD(const uint16_t Command)
{
LCD->LCD_RAM = Command;
}
void LCD_WR_DATA(const uint16_t Data)
{
LCD->LCD_REG = Data;
}
void LCD_RD_REG(const uint8_t LCD_Reg, uint16_t* LCD_RegValue, uint16_t n)
{
LCD->LCD_RAM = LCD_Reg;
while(n--)
{
*(LCD_RegValue++) =LCD->LCD_REG;
}
}
На микросекундных задержка общение с ds18b20 например писал ногодрыгом.
Прерывания на все действуют, и если во время чтения регистра (непосредственно перед чтением точнее) сработает какое либо прерывание, то и значение dwt регистра прочитаете более позднее.
Совсем ламерский вопрос: тут есть автоподсказки или как их там? Когда набираешь где-то задефайненое имя, куб не предлагает подсказку. Структуры после точки подсказывает, дефайны нет.
Ctrl + ПРОБЕЛ
Что-то пошло не так…
DIVH и DIVL я так понимаю предделитель RTC?
Так вот, он у меня меняется при каждом шаге отладки. RTC_IRQHndler не срабатывает.
Таймеров целых 14 штук. Походу что-то пошло не так с репозиторием, т.к. МК stm32f103C6T6, там 3 таймера. Версия IDE 1.18.0
а как написано…?
NVIC_EnableIRQ (RTC_IRQn);?
Докладываю: с RTC пока не разобрался, решил попробовать TIM2(просто на него палец попал). Целый день потребовался чтобы понять что конфигуратор MX не запускает таймер и не разрешает прерывания. Сейчас под вечер разобрался, включил, разрешил и заработало. Меня обескураживает необходимость вручную в обработчике сбрасывать флаг прерывания.
Все дела делаю через LL, думаю так правильней.
Это что у тебя за плата с 22я таймерами? 0_0