Цитата(MiklPolikov @ Feb 14 2016, 04:57)

Код
DMA2_Stream4->CR = 0;
DMA2_Stream4->CR &=~DMA_SxCR_CHSEL;
DMA2_Stream4->CR &=~ DMA_SxCR_PSIZE_1;
DMA2_Stream4->CR &=~ DMA_SxCR_MSIZE_1;
Не в тему, но объясните смысл последних трех операций после выполнения первой?
Я обычно делаю так:
Код
DMA2_Stream4->CR = 0;
DMA2_Stream4->M0AR = (uintptr_t)p_data_buf; // для указателей есть специальный тип uintptr_t
DMA2_Stream4->PAR = (uintptr_t)&ADC1->DR;
DMA2_Stream4->NDTR = data_size;
DMA2_Stream4->FCR = 0; буферизация отключена
DMA2_Stream4->CR = 0
| 0 * (DMA_SxCR_CHSEL & -DMA_SxCR_CHSEL) // канал 0
| 2 * (DMA_SxCR_PSIZE & -DMA_SxCR_PSIZE) // разрядность 32 бита (для примера)
| 1 * (DMA_SxCR_MSIZE & -DMA_SxCR_MSIZE) // разрядность 16 бит
| 0 * DMA_SxCR_PINC
| 1 * DMA_SxCR_MINC
| 1 * DMA_SxCR_CIRC // кольцевой режим
| 1 * DMA_SxCR_EN
;
В такой записи легко менять значения битов, значит ее можно копировать из проекта в проект и такая запись компилится ровно в одну запись в регистр.
Запись ( x & -x ) выделяет младший установленный бит из x.