Цитата(Tanker @ May 4 2012, 14:02)

можно подробнее про флаг IDLE усарта (сейчас приёмом ч/з DMA занимаюсь)
Теоретически:
1) настраиваю прерывание от UART по IDLE
2) настраиваю DMA на приём от RX (и соотв. сообщаю UART что приём идет через DMA). В настройках указываю буфер куда валить данные и его размер (можно зациклить DMA_Mode_Circular чтобы не переполнялся)
3) начали приходить данные (например 4 байта я отправил с ПК на контроллер)
4) когда все 4 байта придут, срабатывает прерывание IDLE (действительно срабатывает) и в буфере указанном DMA будут лежать эти 4 байта
так?
а кол-во принятых байт лежит в DMAx_Channely->CNDTR ?
Ну почти так.
1) Настраиваете UART (тактование, ноги), включаете прерывание от UART по флагу IDLE (для определения конца входящего фрейма) и по флагу TCIE (для перевода драйвера 485 в приём после окончания передачи). Включаете в UART работу с DMA на приём и передачу.
2) Сразу инициируете приём с DMA на всю величину входного буфера и спокойненько занимаетесь другими задачами, пока не сработает прерывание от UART. Прерывания от DMA в принципе не нужны.
Переполнения не будет, т.к. заполнив буфер, DMA закончит свою работу по приёму.
3) В обработчике прерывания UART (не важно по какому флагу) начинаете новый приём, предварительно запомнив значение DMAx_Channely->CNDTR.
3.1) Если прерывание было по флагу IDLE - считаете исходя из CNDTR размер принятого пакета и делаете мероприятия, необходимые при приёме пакета.
3.2) Если прерывание по TCIE - ничего делать не надо, только снять флаг TCIE.
В процедуре, инициирующей приём, переводите свой драйвер 485 в приём.
В процедуре, инициирующей передачу, переводите свой драйвер 485 в передачу.
Надеюсь понятно описал.