STM32CubeIDE (вопросы и ответы)

Так никто не спорит, с авр немного разобрался, но стм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 + ПРОБЕЛ

1 лайк

Что-то пошло не так…


DIVH и DIVL я так понимаю предделитель RTC?
Так вот, он у меня меняется при каждом шаге отладки. RTC_IRQHndler не срабатывает.
Таймеров целых 14 штук. Походу что-то пошло не так с репозиторием, т.к. МК stm32f103C6T6, там 3 таймера. Версия IDE 1.18.0

У меня 3


Выбрал паке 1.8.0 с патчем до 1.8.4

а как написано…?

NVIC_EnableIRQ (RTC_IRQn);?

Докладываю: с RTC пока не разобрался, решил попробовать TIM2(просто на него палец попал). Целый день потребовался чтобы понять что конфигуратор MX не запускает таймер и не разрешает прерывания. Сейчас под вечер разобрался, включил, разрешил и заработало. Меня обескураживает необходимость вручную в обработчике сбрасывать флаг прерывания.
Все дела делаю через LL, думаю так правильней.

не запускает, да, и прально делает, а вот по прерываниям, может забыли тут галку?

RTC тоже так же

Это что у тебя за плата с 22я таймерами? 0_0