Jump to content

    
Sign in to follow this  
Сергей Борщ

STM32F2xx - как покрасивее считывать внешнее АЦП черз SPI

Recommended Posts

На поверхностный взгляд по спаду BUSY можно сгенерировать событие триггера таймера с вывода внешнего триггера TIM _ETR или захвата TIM_CH1 для запроса к DMA, а этим DMA пулять в SPI на выход.
Правильно ли я понимаю, что по захвату DMA может пульнуть байты никак не связанные с таймером? Как-то мутно у них в документации написано:

After an event, the peripheral sends a request signal to the DMA controller. The DMA

controller serves the request depending on the channel priorities. As soon as the DMA

controller accesses the peripheral, an Acknowledge signal is sent to the peripheral by the

DMA controller. The peripheral releases its request as soon as it gets the Acknowledge

signal from the DMA controller. Once the request has been deasserted by the peripheral

Вот и пойми их - в выделенных местах имеется ввиду одна и та же периферия, т.е. в данном случае - таймер, или разные?

 

Share this post


Link to post
Share on other sites
Если бы я мог инициировать транзакцию DMA внешним сигналом - проблем мы не было.

Почти у всех таймеров есть входы TIMx_CH1, TIMx_CH2,TIMx_CH3,TIMx_CH4, которые по изменению уровня могут генерить транзакцию DMA, (проверено, работает), а DMA запишет в SPIDR данные и SPI считает АЦП, по завершению чтения АЦП другой канал DMA сохранит измерение в памяти. Все без участия ядра. Причем таймер при этом может жить своей жизнью и на него эти входы никак не влияют, кроме того, что значение таймера будет сохраняться в регистре захвата таймера.

 

PS. на этих входах таймера и DMA у меня построен вобще хитрый спец интерфейс и многоходовые транзакции (по смене сигнала на одном пине, DMA изменяет уровень на другом пине, при этом еще один канад ДМА сохраняет данные с порта, а на другой порт по еще одному каналу данные из памяти перемещаются в порт). Эти входы таймеров имеют еще и фильтр настраеваемый на различное количество тактов, что позволяет делать задержку транзакции ДМА на нужное время.

Share this post


Link to post
Share on other sites
Правильно ли я понимаю, что по захвату DMA может пульнуть байты никак не связанные с таймером? Как-то мутно у них в документации написано:

Написано действительно мутно. А вот AN2548 "Using the STM32F101xx and STM32F103xx DMA controller" описывает подходящий пример, когда по захвату внешнего строба таймером генерируется DMA, записывающее из порта в память. Как бы должно жить и с записью в SPI.

On the rising edge of the external trigger, the timer generates a DMA request. As the GPIO data register address is

set to DMA1 channel 6 peripheral address, the DMA controller reads the data from the

GPIO port on each DMA request, and stores it into an SRAM buffer.

 

Share this post


Link to post
Share on other sites

Спасибо всем - да, до AN2548 я не добрался. Посмотрел - действительно, то, что нужно. Разводка упростилась. Так и буду действовать.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this