Обновить
5
0

Пользователь

Отправить сообщение

У микроконтроллеров Artery устроено все плюс-минус так же. И это, внезапно, вызвало невозможность их применения в микропотребляющих устройствах. Некоторое время не могли понять, потом заподозрили как раз механизм кэширования, написали китайцам и те с неохотой подтвердили.

При старте контроллер еще до начала исполнения кода некоторое время (десятки миллисекунд) как раз занимается перекладыванием из FLASH в SRAM и жрет при этом как не в себя (по меркам батарейных устройств). И это увы никак не лечится (. Зато потом да, хоть до 200 МГц разгоняй.

Да, Вы абсолютно правы. Но только я получаю удовольствие от контроллера, его архитектуры, особенностей периферии, а не от Вашей обертки над оберткой из HAL, от которой тянет к нехорошему. И я совершенно точно при необходимости сделать что-то, сделаю это на регистрах, прочитав даташит и одним глазком подглядев в HAL, в чем не вижу ничего зазорного.

Но я реально наверное старой школы. Вот мой код для CH32V003 - управление вентилятором охлаждения одной хитрой железки, к которой уже нет родных запчастей. Все на регистрах, написан и отлажен на реальном железе за полдня субботы вместе с подбором констант под железку (правда до этого вечер пятницы ушел на чтение макулатуры и примеров)

Собственно трэш и угар
#define SYSCLK 24000000L
#define TIMCLK 100000L
#define AVG_NUM 10

#define RPM_MIN 600
#define RPM_MAX 1500
#define RPM_COEFF 30 // RPM = RPM_COEFF / period in seconds from sensor

volatile uint32_t avg = 0, avgnum = 0;

void TIM2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

void TIM2_IRQHandler(void)
{
	TIM2->CNT = 0;
	uint16_t rpm;

	if(TIM2->INTFR)
	{
		avg += TIM2->CH3CVR;
		if(++avgnum == 10)
		{
			rpm = (TIMCLK * RPM_COEFF * AVG_NUM) / avg;
			avgnum = 0;
			avg = 0;

			if(rpm > RPM_MAX) rpm = RPM_MAX;
			if(rpm < RPM_MIN) rpm = RPM_MIN;

			TIM1->ATRLR = (TIMCLK * RPM_COEFF) / rpm;
			TIM1->CH2CVR = (TIM1->ATRLR) >> 1;
		}
		TIM2->INTFR = 0;
	}
}

int main(void)
{
	RCC->APB1PCENR |= RCC_TIM2EN;
	RCC->APB2PCENR |= RCC_IOPDEN | RCC_IOPCEN | RCC_TIM1EN;

	TIM1->PSC = (SYSCLK / TIMCLK) - 1;
	TIM1->ATRLR = (TIMCLK * RPM_COEFF / RPM_MAX);
	TIM1->CH3CVR = (TIM1->ATRLR) >> 1;
	TIM1->CTLR1 |= TIM_ARPE;
	TIM1->CHCTLR2 &= ~TIM_OC3M_0; // CH2 PWM mode 110
	TIM1->CHCTLR2 |= TIM_OC3M_2 | TIM_OC3M_1 | TIM_OC3PE; // CH3 PWM mode 110, CH3 preload
	TIM1->CCER |= TIM_CC3E; // CH3 enable
	TIM1->BDTR |= TIM_MOE;
	TIM1->CTLR1 |= TIM_CEN; // TIM1 enable

	TIM2->PSC = (SYSCLK / TIMCLK) - 1;
	TIM2->ATRLR = 0xFFFF;
	TIM2->CHCTLR2 |= (TIM_IC3F_3 | TIM_IC3F_2 | TIM_IC3F_1 | TIM_IC3F_0) | TIM_CC3S_0;
	TIM2->CTLR2 |= TIM_TI1S;
	TIM2->SMCFGR |= TIM_TS_TI1FP1;
	TIM2->INTFR = 0 ;
	TIM2->CCER |= TIM_CC3E;
	TIM2->DMAINTENR |= TIM_CC3IE;
	TIM2->CTLR1 |= TIM_CEN; // TIM2 enable

	GPIOD->CFGLR &= ~(GPIO_CFGLR_CNF4_1 | GPIO_CFGLR_CNF4_0 | GPIO_CFGLR_CNF2_1 | GPIO_CFGLR_CNF2_0); // PD4 LED -> pushpull, PD2 -> pullup for extfan
	GPIOD->CFGLR |= (GPIO_CFGLR_MODE4_1 | GPIO_CFGLR_MODE4_0 | GPIO_CFGLR_MODE2_1 | GPIO_CFGLR_MODE2_0); // output Fmax
	GPIOD->OUTDR |= (GPIO_OUTDR_ODR2); // PD2 -> 1

	GPIOC->CFGLR &= ~(GPIO_CFGLR_CNF3_0 | GPIO_CFGLR_CNF0_0); // PC0 -> input + pullup/pulldown, PC3 -> output PWM
	GPIOC->CFGLR |= (GPIO_CFGLR_CNF3_1 | GPIO_CFGLR_MODE3_1 | GPIO_CFGLR_MODE3_0 | GPIO_CFGLR_CNF0_1); // PC0 -> input + pullup/pulldown, PC3 -> output PWM
	GPIOC->OUTDR |= (GPIO_OUTDR_ODR0); // PC0 -> pullup

	NVIC_EnableIRQ(TIM2_IRQn);
	__enable_irq();

	while(1)
	{
	}
}

WCH кстати для старта тоже вполне себе, я взял поиграться и меня прямо зацепило. Много возможностей за копейки. Даже в сраном чипидипе они по 17 рублей.

А вот оказывается уже братья китайцы и bluepill на WCH сварганили

какую бы вы рекомендовали не ардуиновую платформу

Я далек от обучения школьников и от подхода шилд-на шилд-на шилд-через переходнушку. Из микроконтроллерного пожалуй Bluepill, из wireless - наверное ESP какую-то.

Но мне ближе подход подбора оборудования под конкретную прикладную задачу, а не наоборот.

Видимо я слишком старый.
Не понять мне, для чего надо учить людей не сказать что плохому, но реально далекому от разработки на микроконтроллерах Arduino-like подходу, хотя Arduino как явление безусловно было прорывом. Без понимания того, что внутри, в embedded делать нечего. И чем раньше новоявленный микроконтроллерщик это поймет, тем ему же и легче будет.

У WCH весьма неплохая документация, куча примеров, порог вхождения минимальный для старта с того же HAL. Их MRS можно конечно назвать перенастроенным Eclipse, только вот реально удобнее иметь один инструмент вместо зоопарка от вендоров. И это я конечно не про Arduino IDE, а про Eclipse или VS.

А про отладку по printf() совсем не понял. Это вообще не отладка, а трассировка, и для этого есть родной SDI_printf() для WCH - работает из коробки. А отладка для микроконтроллера - это остановиться в прерывании, вручную дернуть ножками, глянуть осфиллографом, продолжить выполнение.

UPD: для v003 надо именно LinkE, не перепутайте с более дешевым но без поддержки v003 1-wire debug

Что только люди не придумают, чтобы не покупать копеечный LinkE, который по одному проводу умеет одновременно прошивать, отлаживаться под openocd и еще и отладочную консоль трассировки иметь )))

https://aliexpress.ru/item/1005005180653105.html

Все это прикручивается в пару кликов к Eclipse, кроссплатформенно и на вкус моих фломастеров явно удобнее чем VSCode

Вы не поверите, но во всех изделиях, критичнее поделок с Али нормальные люди так и делают (пишут софт самостоятельно). А виснет I2C только у тех, у кого ардуино головного мозга и слепая вера в HAL от ST и т.п.

Хехе. Сколько людей, столько и мнений))) Я пока не попал в Краснодар за рулем, тоже думал что самые-самые водители в Ростове.

Нет, в Краснодаре не пробки. Там другое слово на Пэ. А если учесть стиль вождения и полнейшее отсутствие уважения к другим участникам движения - то Полный Пэ.

Ага, и футы с фунтами, и вилки сетевые пусть не забудут.

Пошел покупать на Ави...то, а там ...

продавцы слегка ошалевшие )))

Н-да. Лежит у меня на карте ВТБ ххх рублей. Ну лежит и лежит, я этой картой не пользуюсь, в личный кабинет захожу раз в пятилетку. С принятием вышенаписанных мер, гениальный ИИ совершенно очевидно заблокирует мне попытку вывода при необходимости, ибо это будут "нетипичные для данного клиента запросы". Пошел снимать наличку.

По факту что. Проще нанять двух по 200

Попробуйте. Начиная с определенного уровня навыка это не работает. Один за 400 сделает работу за 1 месяц, а два за 200 ни за месяц, ни вообще никогда не сделают, поскольку у них знаний на 200 и планку они взять не в состоянии. И учиться они чаще всего не могут или не хотят, поэтому они и за 200.

Вы пробовали? Мы - да. Компания с названием на ЭР. Банальные SMT резисторы. Брак до 1% в виде потери контакта (обрыва) через некоторое время. При очередной поставке "Ой, у нас ни говна ни ложки лента для упаковки закончилась, можно мы россыпью отгрузим?" SMT резисторы 0603 РОССЫПЬЮ, Карл! Возможно для штучных разовых партий и да, но точно не для серии. И, заметьте, про цену разговора нет вообще: $1 или $10 за катушку это копейки.

очень интересно, продолжайте пожалуйста

еще бы в default-city для джихад-курьеров такое сделали ... (мечтательно) ...

смешались в кучу ... биты, TCP, таймауты, Bluetooth, ...

горшочек, не вари, не дай Б..г Вы про HDLC во второй статье решите написать

Формально есть. Фактически - добывай где-то по цене золота, разводи плату, пиши всё с нуля... Так-то и у китайцев контроллеров полно - без поддержки и обучения всё тлен, в массы не пойдет

это личный опыт, или так, мнение?

Мой вот личный: несколько сотен тысяч выпущенных изделий с китайскими процами от трех разных производителей (и не GigaDevice, а суровый китайский китай, про который до 24.02 никто и не слышал), и несколько разработок на отечественных процах, не пошедших пока в серию именно изза цены. Было бы желание, а возможности найдутся

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность