Size: a a a

2020 January 03

AS

Alexey Sidorov in STM32
в ЛС
источник
2020 January 04

A

ASSembler in STM32
noname
понять, не могу, мне же нужно дождаться, когда (ADC1->CR2 & ADC_CR2_CAL) будет 0
1 & 0 вернёт 0 while работает пока 1, тебе нужно дождаться когда АЦП сбросит бит, тоесть в регистре 1 & 1(в adc_cr2_cal) вернёт 1, цикл будет крутиться пока в АЦП не сбросит бит, хз как получилось объяснить, сорян
источник

A

ASSembler in STM32
Yury Lyushnevsky
Расскажите, пожалуйста, как записать значение полностью в порт? То есть, имеется lcd display с 8/16 бит параллельная шина и нужно сразу записать значение в порт, не хочу использовать WritePin
Можно писать в bsrr и тогда можно одновременно какие-то биты сбрасывать а какие-то устанавливать не влияя на не нужные выводы, в одной половине регистры запись 1 прижимает к gnd, а во второй половине запись 1 притянет к vcc
источник

YL

Yury Lyushnevsky in STM32
ASSembler
Можно писать в bsrr и тогда можно одновременно какие-то биты сбрасывать а какие-то устанавливать не влияя на не нужные выводы, в одной половине регистры запись 1 прижимает к gnd, а во второй половине запись 1 притянет к vcc
То есть в одной половине?
источник

T

Turunchuk in STM32
Если знакомы с плюсами, гляньте библиотеку mcucpp К.Чижова на гитхабе. Там можно делать так:

PinList<Pa1, Pb3, Pc6, Pa5, Pc3> group;
group::write(0x17);
источник

A

ASSembler in STM32
Yury Lyushnevsky
То есть в одной половине?
Регистр 32бит, 16 из них отвечают за подтяжку к vcc 16 к gnd
источник

s

stD in STM32
Yury Lyushnevsky
То есть в одной половине?
Такое лучше посмотреть в мануале...
источник

s

stD in STM32
источник

s

stD in STM32
RM0008
источник

s

stD in STM32
Есть ещё регистр BRR, он просто сбрасывает все пины...
источник

s

stD in STM32
источник

A

ASSembler in STM32
stD
Есть ещё регистр BRR, он просто сбрасывает все пины...
Вот не могу понять его смысл если есть bsrr, ведь не просто так его запилили
источник

YL

Yury Lyushnevsky in STM32
ASSembler
Регистр 32бит, 16 из них отвечают за подтяжку к vcc 16 к gnd
Все порты в STM32 разве 16 бит?
источник

s

stD in STM32
ASSembler
Вот не могу понять его смысл если есть bsrr, ведь не просто так его запилили
Думается что ход мыслей у разработчиков камня был такой:

У нас есть регистр ODR, но менять его состояние долго - чтение порта > наложение маски > возврат результата в регистр.

Да, согласились разрабы, это очень долго, давайте ка запилим регистр BSRR, с помощью которого можно менять состояние отдельного бита в порту, да ещё и за один такт, вот народ то обрадуется.

Круто! Воскликнули разработчики, и решили что поскольку камень то у нас 32-ух битный, а порты 16-ти битные, то давайте ка запись единички в левую часть будет сбрасывать бит, а запись опять же единички в правую часть, устанавливать.

И снова ликование, - "мы сделали атомарное переключение, да ещё и в один регистр всё уместили, мы молодцы !".

Потом посидели и ещё немного подумали, - "а на фига мы всё в один регистр запихали, ведь памяти у нас вагон и маленькая тележка, а из-за того что всё в одном регистре, не очень то удобно этим оперировать". Ведь гораздо удобнее было бы, если бы это были два разных  регистра, и тогда записывая в один регистр число 0х0001 мы сможем устанавливать бит, а записывая то же число (0х0001), но в другой регистр будем снимать этот бит. Операция осталась такая же атомарная, но теперь не нужно морочится со сдвигом чисел.

Эврика! Воскликнули разработчики и побежали мутить регистр BRR.

Как то так.
источник

s

stD in STM32
Наглядно это можно посмотреть в HAL...
источник

s

stD in STM32
источник

s

stD in STM32
Одно и то же число записывается в разные регистры.
источник

s

stD in STM32
Если в регистре ODR такой-то пин установлен, то записываем единицу в BRR (то есть сбрасываем бит), а если не установлен, то записываем эту же единичку в BSRR (то есть устанавливаем бит).
источник

s

stD in STM32
Если бы небыло регистра BRR, тогда пришлось бы  значение GPIO_Pin сдвигать (GPIO_Pin << 16) чтоб записать его в BSRR.

Операция сдвига, это потеря такта.
источник

s

stD in STM32
Что характерно, функция HAL_GPIO_WritePin реализована именно через сдвиг...
источник