сдвиг нуля по части регистра
сдвиг нуля по части регистра
STM32
Порт В. Использую пины 5 6 7 8. Изначально они open drain и вытянуты в высокоомку. То есть я на них записал 1. А теперь в цикле мне надо пройтись поочерёдно по каждому биту нулём
1111
0111
1011
1101
1110
Раньше было проще, так как конфа была другая и изначально там были нули и надо было пробросить единицу
for(i = 0; i < 4; i++){
GPIOB->BSRR = (1 << (i + 5));
}
А теперь надо нуль. Как это сделать покороче? и что бы не затронуть остальные неиспользуемые биты
Порт В. Использую пины 5 6 7 8. Изначально они open drain и вытянуты в высокоомку. То есть я на них записал 1. А теперь в цикле мне надо пройтись поочерёдно по каждому биту нулём
1111
0111
1011
1101
1110
Раньше было проще, так как конфа была другая и изначально там были нули и надо было пробросить единицу
for(i = 0; i < 4; i++){
GPIOB->BSRR = (1 << (i + 5));
}
А теперь надо нуль. Как это сделать покороче? и что бы не затронуть остальные неиспользуемые биты
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: сдвиг нуля по части регистра
По мимо регистра установки, существует ещё и регистр сброса по маске. Почему бы им не воспользоваться ?
Re: сдвиг нуля по части регистра
Это BRR? Я его пррбовал. Чето у меня не получилось. Как я понял в каждой итерации надо сначало установить везде 1, а потом ставить 0 там где надо. С 1 было проще. Ее можно было просто сдвигать.Аlex писал(а):По мимо регистра установки, существует ещё и регистр сброса по маске. Почему бы им не воспользоваться ?
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: сдвиг нуля по части регистра
Регистр BSRR позволяет не только устанавливать отдельные биты, но и сбрасывать тоже.
Попробуйте вот так
Не проверял, смущает These bits are write-only and can be accessed in Word mode only. Быть может нельзя одновременно устанавливать и сбрасывать порты этим регистром.
Попробуйте вот так
Код: Выделить всё
GPIOB->LCKR=GPIO_LCKR_LCK9;
for(i = 8+16; i >= 5+16; i--){
GPIOB->BSRR = (1 << i)|(1<<(i-16+1));
}
GPIOB->LCKR=0;Re: сдвиг нуля по части регистра
Так в том и фишка что can, а не must
- Реклама
Re: сдвиг нуля по части регистра
Word - это у них 32 бита. Кроме того там написано, что если сразу устанавливать и сбрасывать, то установка имеет приоритет.Z_h_e писал(а): Не проверял, смущает These bits are write-only and can be accessed in Word mode only. Быть может нельзя одновременно устанавливать и сбрасывать порты этим регистром.
- Z_h_e
- Собутыльник Кота
- Сообщения: 2708
- Зарегистрирован: Сб май 14, 2011 21:16:04
- Откуда: г. Чайковский
Re: сдвиг нуля по части регистра
Ну на счет World значит затупил. Тогда должно работать.
-------
Проще вообще без цикла и будет максимально быстро.
-------
Проще вообще без цикла и будет максимально быстро.
Код: Выделить всё
GPIOB->BSRR = (1 << (8+16));
GPIOB->BSRR = (1 << (7+16))|(1<<8);
GPIOB->BSRR = (1 << (6+16))|(1<<7);
GPIOB->BSRR = (1 << (5+16))|(1<<6);Re: сдвиг нуля по части регистра
Сделал вот так
Прикол все цифры работают норм, кроме 1 и 4. Когда жмёшь на 1 на экране - 4, когда жмёшь на 4 , на экране - 7. Либо при нажатии на 1 или 4 зависает.
Код: Выделить всё
void KEYBOARD_SCAN(void){
unsigned char i, j;
for(i = 0; i < 4; i++){
GPIOB->BSRR |= 0x1E0;
GPIOB->BSRR |= (1 << (i + 5 + 16));
for(j = 0; j < 4; j++){
if(!(GPIOB->IDR & 1 << (j + 11))){
key = (1 << i);
key |= (1 << j) << 4;
}
}
}
if(old_key == 0){
old_key = key;
} else {
GPIOD->BSRR |= 0x4;
if(!(key ^ old_key)){
valid_key++;
} else {
valid_key = 0;
}
if(valid_key == 5){
TIM2->CR1 &= ~TIM_CR1_CEN;
find_key = key;
valid_key = 0;
old_key = 0;
key = 0;
NVIC_EnableIRQ(EXTI15_10_IRQn);
GPIOB->BRR |= 0x1E0;
}
}
}
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: сдвиг нуля по части регистра
Наоборот. Где в маске стоит единица, там происходит сброс бита.supercelt писал(а):Как я понял в каждой итерации надо сначало установить везде 1, а потом ставить 0 там где надо.
Просто двигайте единицу в маске и кидайте её в регистр сброса.
Кошмарsupercelt писал(а):Сделал вот так
Re: сдвиг нуля по части регистра
Для регистра BSRR чтение не имеет смысла - только запись, причем значение имеет запись единицы в тех разрядах, где биты должны быть изменены. Биты 0...15 устанавливают выход в 1, биты 16...31 сбрасывают выход в 0. Поэтому можно писать в этот регистр сразу 32 бита и без оператора |=, достаточно только =.
Re: сдвиг нуля по части регистра
Нету идей, почему вместо 1 вылезает 4, а вместо 4 вылезает 7 ??? Все остальные клавиши норм
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: сдвиг нуля по части регистра
А у вас нету идей по поводу того, что сказали люди выше ?
Или вы слушаете только то, что хотите слушать ? Зачем тогда вопросы задавать ?
Или вы слушаете только то, что хотите слушать ? Зачем тогда вопросы задавать ?
Re: сдвиг нуля по части регистра
Так я написал это после того, как сделал по наставлениям выше)))



