0
ну пиши uint32, если нравится, никто никому не навязывает. Вообще непонятно, к чему этот срач на ровном месте…
  • avatar
  • reptile
  • 11 августа 2015, 18:10
0
1. мне они не нужны, как и много кому еще…
2. вот тут сомневаюсь… даже не заглядывания в листинг — вангую что для каждого пина будет вызываться метод настройки.
по удобству — тоже не факт:
PA5::Mode(OUTPUT);
PA7::Mode(OUTPUT);
PA8::Mode(OUTPUT);


vs

gpio_mode3(GPIOA, GPIO_Mode_OUT, 5,7,8);
  • avatar
  • reptile
  • 11 августа 2015, 16:48
0
во-1х, откуда в С template?
во-2х — попробуй кодом по ссылке настроить например 4 вывода на выход, и посмотри на сгенерированный листинг…
  • avatar
  • reptile
  • 11 августа 2015, 16:30
0
вот например настройка режима порта (любого количества пинов):

80025e6:	2290      	movs	r2, #144	; 0x90
 80025e8:	05d2      	lsls	r2, r2, #23
 80025ea:	6813      	ldr	r3, [r2, #0]
 80025ec:	4819      	ldr	r0, [pc, #100]	; (8002654 <ind_setup+0x70>)
 80025ee:	4d1a      	ldr	r5, [pc, #104]	; (8002658 <ind_setup+0x74>)
 80025f0:	4003      	ands	r3, r0
 80025f2:	432b      	orrs	r3, r5
 80025f4:	6013      	str	r3, [r2, #0]
  • avatar
  • reptile
  • 11 августа 2015, 15:54
0
если ничего непонятно — зачем неаргуметрированное набрасывание г@вна?
без сравнения ASM-листингов, количества тактов и т.д.?
лично Вам неудобно и не нужно — просто проходите мимо…
  • avatar
  • reptile
  • 11 августа 2015, 15:39
0
обычный тролль-мудач@ок… пока не видно ни одного аргумента, или слабо предъявить свой мега-эффектичный код?
  • avatar
  • reptile
  • 11 августа 2015, 15:16
-1
опять вылез? лезь обратно.
  • avatar
  • reptile
  • 11 августа 2015, 12:49
0
обработка энкодера без таймера и прерываний, с гистерезисом поворота, антидребезгом, и генерацией событий по повороту/нажатию. для нормальной работы хватает частоты опроса 100 Гц.

хедер:
// A/B/button bits
enum { ENC_A=1, ENC_B=2, ENC_AB=3, ENC_C=4 };

// events
enum { ENC_NONE, ENC_FORW, ENC_BACK, ENC_BUTT };

// AB counter reset threshold
#ifndef ENC_AB_RES
	#define ENC_AB_RES 300
#endif

// short press counter
#ifndef ENC_BUTT_SHORT
	#define ENC_BUTT_SHORT 80
#endif

// long press counter
#ifndef ENC_BUTT_LONG
	#define ENC_BUTT_LONG 2000
#endif

struct enc_struct {
	u8  en;                  // disable / enable

	// A/B input
	u8  prev, cur;           // previous/current state
	u8  inv, event;          // =1 direction inversion, current event
	s8  acc, threshold, dec; // step accumulator, threshold, decrement
	u16 cnt;                 // current state counter

	// button input
	struct {
		u8  prev, cur;       // previous/current state
		u16 cnt;             // current state counter
	} butt;
};

u8 enc_update( struct enc_struct *enc, u8 next );


код:
#include "enc.h"

// forward/backward next states
const u8 enc_forw[] = { 0b01, 0b11, 0b00, 0b10 };
const u8 enc_back[] = { 0b10, 0b00, 0b11, 0b01 };

u8 enc_update( struct enc_struct *enc, u8 next ){
	enc->event = ENC_NONE;      // reset event

	// update AB state
	enc->prev  = enc->cur;      // update previous AB state
	enc->cur   = next & ENC_AB; // get current AB state
	if (enc->cur != enc->prev){ // changed ?
		enc->cnt = 0;
		// forward direction
		if (enc->cur == enc_forw[enc->prev]){
			if (enc->inv) enc->acc--; else enc->acc++;
		}
		// backward direction
		else if (enc->cur == enc_back[enc->prev]){
			if (enc->inv) enc->acc++; else enc->acc--;
		}
		// wrong sequence - reset accumulator
		else enc->acc = 0;

		// forward step
		if (enc->acc >= enc->threshold){
			enc->acc -= enc->dec;
			enc->event = ENC_FORW;
		}
		// backward step
		else if (enc->acc <= -enc->threshold){
			enc->acc += enc->dec;
			enc->event = ENC_BACK;
		}
	} else {
		// no change - increment counter
		if (enc->cnt != 0xFFFF) enc->cnt++;
		// reset accumulator
		if (enc->cnt == ENC_AB_RES) enc->acc = 0;
	}

	// update button state
	enc->butt.prev = enc->butt.cur;
	enc->butt.cur  = !(next & ENC_C);
	// button state change - reset counter
	if (enc->butt.cur != enc->butt.prev){
		enc->butt.cnt = 0;
	} else { // not changed - increment counter
		if (enc->butt.cnt != 0xFFFF) enc->butt.cnt++;
		// gnenerate button press event
		if ((enc->event == ENC_NONE) && enc->butt.cur && ((enc->butt.cnt == ENC_BUTT_SHORT)||(enc->butt.cnt == ENC_BUTT_LONG)))
			enc->event = ENC_BUTT;
	}

	return enc->event;
}
  • avatar
  • reptile
  • 10 августа 2015, 23:59
0
MCP9700,TC1047 — от 20руб
  • avatar
  • reptile
  • 09 августа 2015, 22:34
0
#define _bs(bits,n,m)  ((u32)(bits) << ((n) << ((m)-1)))
#define _nbs(bits,n,m) ((u32)~(_bs((bits),(n),(m))))

#define _rm11(r,b,n) (R) = ((R) & _nbs(1,n,1)) | _bs(b,n,1)
#define _rm12(r, b, n1,n2) (R) = ((R) & (_nbs(1,n1,1) & _nbs(1,n2,1))) | (_bs(b,n1,1) | _bs(b,n2,1))
#define _rm13(r, b, n1,n2,n3) (R) = ((R) & (_nbs(1,n1,1) & _nbs(1,n2,1) & _nbs(1,n3,1))) | (_bs(b,n1,1) | _bs(b,n2,1) | _bs(b,n3,1))
#define _rm14(r, b, n1,n2,n3,n4) (R) = ((R) & (_nbs(1,n1,1) & _nbs(1,n2,1) & _nbs(1,n3,1) & _nbs(1,n4,1))) | (_bs(b,n1,1) | _bs(b,n2,1) | _bs(b,n3,1) | _bs(b,n4,1))
#define _rm15(r, b, n1,n2,n3,n4,n5) (R) = ((R) & (_nbs(1,n1,1) & _nbs(1,n2,1) & _nbs(1,n3,1) & _nbs(1,n4,1) & _nbs(1,n5,1))) | (_bs(b,n1,1) | _bs(b,n2,1) | _bs(b,n3,1) | _bs(b,n4,1) | _bs(b,n5,1))

#define _rm21(r,b,n) (R) = ((R) & _nbs(3,n,2)) | _bs(b,n,2)
#define _rm22(r, b, n1,n2) (R) = ((R) & (_nbs(3,n1,2) & _nbs(3,n2,2))) | (_bs(b,n1,2) | _bs(b,n2,2))
#define _rm23(r, b, n1,n2,n3) (R) = ((R) & (_nbs(3,n1,2) & _nbs(3,n2,2) & _nbs(3,n3,2))) | (_bs(b,n1,2) | _bs(b,n2,2) | _bs(b,n3,2))
#define _rm24(r, b, n1,n2,n3,n4) (R) = ((R) & (_nbs(3,n1,2) & _nbs(3,n2,2) & _nbs(3,n3,2) & _nbs(3,n4,2))) | (_bs(b,n1,2) | _bs(b,n2,2) | _bs(b,n3,2) | _bs(b,n4,2))
#define _rm25(r, b, n1,n2,n3,n4,n5) (R) = ((R) & (_nbs(3,n1,2) & _nbs(3,n2,2) & _nbs(3,n3,2) & _nbs(3,n4,2) & _nbs(3,n5,2))) | (_bs(b,n1,2) | _bs(b,n2,2) | _bs(b,n3,2) | _bs(b,n4,2) | _bs(b,n5,2))

#ifdef __STM32F0

	inline void gpio_mode1(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1){ _rm21(GPIOx->MODER, mode, pin1);	}
	inline void gpio_mode2(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2){ _rm22(GPIOx->MODER, mode, pin1,pin2);	}
	inline void gpio_mode3(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3){ _rm23(GPIOx->MODER, mode, pin1,pin2,pin3);	}
	inline void gpio_mode4(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3, u32 pin4){ _rm24(GPIOx->MODER, mode, pin1,pin2,pin3,pin4);	}
	inline void gpio_mode5(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3, u32 pin4, u32 pin5){ _rm25(GPIOx->MODER, mode, pin1,pin2,pin3,pin4,pin5);	}

	inline void gpio_otype1(GPIO_TypeDef* GPIOx, GPIOOType_TypeDef mode, u32 pin1){ _rm11(GPIOx->OTYPER, mode, pin1); }
	inline void gpio_otype2(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2){ _rm12(GPIOx->OTYPER, mode, pin1,pin2);	}
	inline void gpio_otype3(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3){ _rm13(GPIOx->OTYPER, mode, pin1,pin2,pin3);	}
	inline void gpio_otype4(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3, u32 pin4){ _rm14(GPIOx->OTYPER, mode, pin1,pin2,pin3,pin4);	}
	inline void gpio_otype5(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3, u32 pin4, u32 pin5){ _rm15(GPIOx->OTYPER, mode, pin1,pin2,pin3,pin4,pin5);	}

	inline void gpio_ospeed1(GPIO_TypeDef* GPIOx, GPIOSpeed_TypeDef mode, u32 pin1){ _rm21(GPIOx->OSPEEDR, mode, pin1); }
	inline void gpio_ospeed2(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2){ _rm22(GPIOx->OSPEEDR, mode, pin1,pin2);	}
	inline void gpio_ospeed3(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3){ _rm23(GPIOx->OSPEEDR, mode, pin1,pin2,pin3);	}
	inline void gpio_ospeed4(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3, u32 pin4){ _rm24(GPIOx->OSPEEDR, mode, pin1,pin2,pin3,pin4);	}
	inline void gpio_ospeed5(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3, u32 pin4, u32 pin5){ _rm25(GPIOx->OSPEEDR, mode, pin1,pin2,pin3,pin4,pin5);	}

	inline void gpio_pupd1(GPIO_TypeDef* GPIOx, GPIOPuPd_TypeDef mode, u32 pin1){ _rm21(GPIOx->PUPDR, mode, pin1); }
	inline void gpio_pupd2(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2){ _rm22(GPIOx->PUPDR, mode, pin1,pin2);	}
	inline void gpio_pupd3(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3){ _rm23(GPIOx->PUPDR, mode, pin1,pin2,pin3);	}
	inline void gpio_pupd4(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3, u32 pin4){ _rm24(GPIOx->PUPDR, mode, pin1,pin2,pin3,pin4);	}
	inline void gpio_pupd5(GPIO_TypeDef* GPIOx, GPIOMode_TypeDef mode, u32 pin1, u32 pin2, u32 pin3, u32 pin4, u32 pin5){ _rm25(GPIOx->PUPDR, mode, pin1,pin2,pin3,pin4,pin5);	}

	inline u32  gpio_get(GPIO_TypeDef* GPIOx, u32 pin){ return GPIOx->IDR & (1uL << pin); }
	inline void gpio_set(GPIO_TypeDef* GPIOx, u32 pin, u32 state){ if (state) GPIOx->BSRR = 1 << pin; else GPIOx->BRR = 1 << pin; }

#endif
  • avatar
  • reptile
  • 06 августа 2015, 11:44
0
просто непонятно по какому принципу проходит сортировка по памяти — в результате реальных тестов, или чистый маркетинг. Например в STM32F100C4T6 без сбоев пишется 128К, при нормальной температуре.
  • avatar
  • reptile
  • 12 декабря 2014, 23:36
0
память тестируют при какой температуре? вполне возможно что при комнатной будет работать, а при 85 давать сбои.
  • avatar
  • reptile
  • 12 декабря 2014, 23:08
0
STM32F100C4T6 — пишется/читается 128К (максимум для Medium-density VL).
  • avatar
  • reptile
  • 12 декабря 2014, 20:18
+1
«ARM is maintaining a GNU toolchain with a GCC»
launchpad.net/gcc-arm-embedded/+download
releases.linaro.org
  • avatar
  • reptile
  • 13 ноября 2014, 11:47
0
обновите StdPeriph_Lib до V1.3.1 www.st.com/web/en/catalog/tools/PF257884

ADC_SMPR1… помечены как Legacy
  • avatar
  • reptile
  • 22 сентября 2014, 22:04
0
yadi.sk/i/D2EXuk__a9eeB, там есть превью
канал beat — крайний справа.
проблема что не на всех композициях работает, нужны адаптивные алгоритмы
  • avatar
  • reptile
  • 21 августа 2014, 11:26
0
был простейший пиковый детектор (крайний справа).
но работал непредсказуемо.
  • avatar
  • reptile
  • 17 августа 2014, 10:41
0
Добавлен beat-detector.
  • avatar
  • reptile
  • 17 августа 2014, 03:32
0
  • avatar
  • reptile
  • 15 августа 2014, 14:58