Ничего, что запись в ODR заменяет все биты? А запись в BSRR - только те, где были единички (и то, если и в BS, и в BR стоит 1, то в приоритете будет BR, как выше на картинке было отображено).
Я на гитхабе, в ЖЖ
Я тебе больше скажу, что знают, но не делают.Dimon456 писал(а):Только одно не понятно, разработчик STM32CubeMX что ни чего не знает про чип?
Код: Выделить всё
for(uint8_t p=TOTAL_PIN-1, i=0; i<TOTAL_PIN; p=i++){
digitalWrite(p, false);
digitalWrite(i, true);
uint32_t t = Millis();
while((Millis() - t) < 100) ;
}Ну что за жесть? Есть же таймер. Настраиваешь, чтобы каждые 100мс было прерывание, а в прерывании уже гасишь предыдущий и зажигаешь следующий диод. А еще проще - генерить таймером меандр, а "бегущий огонь" организовать при помощи обычного сдвигового регистра…while((Millis() - t) < 100) ;
Код: Выделить всё
// Buttons: PA10, PA13, PA14, PA15, pullup (0 active)
volatile GPIO_TypeDef *BTNports[BTNSNO] = {GPIOA, GPIOA, GPIOA, GPIOA};
const uint32_t BTNpins[BTNSNO] = {1<<10, 1<<13, 1<<14, 1<<15};Код: Выделить всё
template<typename... Pins>
struct VirtualPort
{
void Set()
{
(Pins::Set(), ...);
}
};
using Port = VirtualPort<Pa0, Pb2, Pc13>;
Port::Set(); // Установить "1" на все
Э-э-э? А можно поподробнее? А то у меня ответственная железяка на регулярную смену скорости завязана. Пока, правда, не вылетала ни разу, но мало ли, может исправлять придется.tonyk писал(а):при попытке сменить, например, скорость порта при подключенном девайсе, получишь зависание драйвера в МК.
Я ведь уже приводил свой код, также ориентированный на доступ к отдельным ножкам:ARV писал(а):думаю, сравнивать надо корректно. digitalWrite заточена на обращение к пинам в произвольном порядке
Код: Выделить всё
#define LED C,8,1,GPIO_PP50
...
GPIO_config( LED );
GPO_ON( LED );
GPO_T( LED );Не спорю, для ардуинщиков это актуальная задача. В хорошем смысле: при обучении программированию.ARV писал(а):реализовать "одиночный бегущий огонь" по всем пинам платы ардуино по кругу со скоростью 1 пин в 100 мс.
А еще допускает вообще отказаться от ардуиновской IDE и оставить только платку с ATmega328, которую спокойно программировать на ассемблере. Но ардуиной это называться уже не будет.ARV писал(а):ардуина допускает и групповой, т.е. через порт, доступ к битам
Отлично сделано, нечего тут!Eddy_Em писал(а):Ну что за жесть? Есть же таймер.
Код: Выделить всё
char leds(){
//задержка в стиле конечного автомата: если продолжать выполнение рано, просто возвращаем управление
static int32_t t_prev = 0;
int32_t t_cur = Millis();
if( (t_cur - t_prev) < 100 )return 1;
t_prev = t_cur;
//тело функции: гасим предыдущий диод, включаем следующий. Никаких "тупых" задержек, никакого прохода по всем диодам за раз
static uint8_t led_prev = TOTAL_PIN-1;
static uint8_t led_cur = 0;
digitalWrite(led_prev, 0);
digitalWrite(led_cur, 1);
led_prev = led_cur;
led_cur++;
//проверка конца анимации. Сбрасываем счетчик в ноль и делаем return 0 чтобы вызывающая сторона поняла, что анимация закончилась
if(led_cur >= TOTAL_PIN-1){
led_cur = 0;
return 0;
}
return 1;
}У меня тоже есть подобный код для SPI и I2C чтобы тестировать на малознакомой железке. В конечном автомате внутри прерывания есть шанс запутаться, а в дубовом коде - нет.Eddy_Em писал(а):Я как-то видел код одного дегенерата для работы с 1-wire. Так он нет, чтобы UART или таймер использовать (с прерываниями, т.к. DMA у мелких аврок нет), а херячил паузы "дилеями"!!!
Код: Выделить всё
// 64 пина GPIO
using ALL_PINS = PinList<GpioA<>, GpioB<>,GpioC<>,GpioD<>>;
void SysTick_Handler()
{
static auto counter=0;
ALL_PINS::write(1ULL<<counter);
if(counter++ == ALL_PINS::PinCount()-1) counter=0;
}Код: Выделить всё
//void SysTick_Handler()
//{
SysTick_Handler:
PUSH {R4-R7,LR}
// static auto counter=0;
// ALL_PINS::write(1ULL<<counter);
LDR.N R4,??DataTable1_4
LDR.N R6,??DataTable1_5
LDR R5,[R4, #+0]
MOVS R0,#+1
MOVS R1,#+0
MOV R2,R5
BL __aeabi_llsl
ASRS R2,R1,#+16
STRH R2,[R6, #+0]
STRH R1,[R6, #+1024]
ASRS R7,R0,#+16
STRH R7,[R6, #+2048]
STRH R0,[R6, #+3072]
// if(counter++ == ALL_PINS::PinCount()-1) counter=0;
ADDS R0,R5,#+1
CMP R5,#+63
IT EQ
MOVEQ R0,#+0
//}
STR R0,[R4, #+0]
POP {R4-R7,PC} вообще-то, это даже обидно... мы ведь с вами не первый раз дискутируем, и по идее вы должны мало-мало иметь представление о моих реальных способностях...COKPOWEHEU писал(а):Возможно, со временем ARV перейдет на полноценный КА, который будет не тупо висеть в пустом цикле, а возвращать управление основному коду
В смысле?! Не хотите же вы сказать, что не осилите такую вещь, как конечный автомат. Научиться можно чему угодно, хватило бы мотивации.ARV писал(а):вообще-то, это даже обидно... мы ведь с вами не первый раз дискутируем, и по идее вы должны мало-мало иметь представление о моих реальных способностях...