реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> SDRAM -> DMA STM32F4
Atlantis-
сообщение Nov 17 2014, 09:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Здравствуйте!
У меня такой вопрос: можно ли подсунуть DMA в качестве источника указатель на буфер, расположенный в SDRAM? или обязательно надо данные копировать в промежуточный буфер?
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 17 2014, 09:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Можно.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Nov 17 2014, 10:14
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(scifi @ Nov 17 2014, 12:54) *
Можно.

тогда такой вопрос, SDRAM начинается с адреса 0xD0000000 т.е. нужен 32-битный указатель. а приемник DMA (в моем случае это 16 битный регистр данных I2S) - 16-битный и нужен 16 битный указатель. как в этом случае их "срастить"?
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 17 2014, 10:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Atlantis- @ Nov 17 2014, 13:14) *
тогда такой вопрос, SDRAM начинается с адреса 0xD0000000 т.е. нужен 32-битный указатель. а приемник DMA (в моем случае это 16 битный регистр данных I2S) - 16-битный и нужен 16 битный указатель. как в этом случае их "срастить"?

Ничего не понимаю. Какое отношение адрес SDRAM имеет к разрядности приёмника? Вообще не вижу никакой проблемы.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Nov 17 2014, 11:01
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Atlantis- @ Nov 17 2014, 16:14) *
нужен 16 битный указатель. как в этом случае их "срастить"?

Нужен 16-битный указатель???
Всё просто! Меняете ваш STM32F4 на что-нить типа MSP430 - и у вас 16-битные указатели! smile3046.gif
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Nov 17 2014, 11:37
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(scifi @ Nov 17 2014, 13:36) *
Ничего не понимаю. Какое отношение адрес SDRAM имеет к разрядности приёмника? Вообще не вижу никакой проблемы.

может я чего то туплю, но допустим пишу я в SDRAM массив, начиная с адреса 0xD0000000 (указатель uint32_t *Addr = (uint32_t *)0xD0000000;)
потом мне надо Addr подсунуть DMA. я же не могу его привести вот так (uint16_t *)Addr ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 17 2014, 11:59
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Atlantis- @ Nov 17 2014, 14:37) *
может я чего то туплю, но допустим пишу я в SDRAM массив, начиная с адреса 0xD0000000 (указатель uint32_t *Addr = (uint32_t *)0xD0000000;)
потом мне надо Addr подсунуть DMA. я же не могу его привести вот так (uint16_t *)Addr ?

Во-первых, указатель на буфер в SDRAM не обязан иметь тип uint32_t*. Он может быть uint16_t*, void*, enum foobar* и т.д. А во-вторых, регистр адреса источника данных у DMA - это всего лишь 32-разрядный регистр, и он ничего не знает про тип данных, на которые он указывает, да и зачем ему это? Более того, эти регистры чаще всего объявлены в заголовках как uint32_t, поэтому указатель придётся приводить к целому: REG = (uint32_t)Addr.
Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Nov 17 2014, 12:30
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(scifi @ Nov 17 2014, 14:59) *
Во-первых, указатель на буфер в SDRAM не обязан иметь тип uint32_t*. Он может быть uint16_t*, void*, enum foobar* и т.д. А во-вторых, регистр адреса источника данных у DMA - это всего лишь 32-разрядный регистр, и он ничего не знает про тип данных, на которые он указывает, да и зачем ему это? Более того, эти регистры чаще всего объявлены в заголовках как uint32_t, поэтому указатель придётся приводить к целому: REG = (uint32_t)Addr.

меня смущает запись uint16_t *Addr = (uint16_t *)0xD0000000; потому что 0xD0000000 - 32-битное число, или все правильно и эта запись лишь означает что указатель указывает на 16-битное число?
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 17 2014, 14:44
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Atlantis- @ Nov 17 2014, 15:30) *
меня смущает запись uint16_t *Addr = (uint16_t *)0xD0000000; потому что 0xD0000000 - 32-битное число

Понятно, язык Си вчера начали изучать. Советую Кернигана и Ричи - хороший учебник.

Цитата(Atlantis- @ Nov 17 2014, 15:30) *
или все правильно и эта запись лишь означает что указатель указывает на 16-битное число?

Именно так, как вам стало бы понятно по прочтении вышеуказанного учебника.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 17 2014, 15:21
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Да вот не фига, указатели - самая жопа языка С, и становиться она понятно не после прочтения учебника, а после некоторой практики с ними. Так что максимум можно направить человека к новичкам, а гнобить его не стоит...
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 17 2014, 15:28
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Nov 17 2014, 18:21) *
становиться она понятно не после прочтения учебника, а после некоторой практики с ними

Так может говорить только человек, катастрофически пренебрегающий учебниками.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 17 2014, 17:36
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



А так только человек катастрофически не понимающий смысл упражнений и практики

1:1 ?
Go to the top of the page
 
+Quote Post
scifi
сообщение Nov 17 2014, 19:17
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Nov 17 2014, 20:36) *
1:1 ?

Да ради бога. Я счёт не веду.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Nov 17 2014, 21:59
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



я думаю что вы меня не правильно поняли.
Я только хотел сказать что для того чтобы утвердительно сказать "я разбираюсь в указателях С" необходимо не только прочитать учебник, но еще и потратить некоторое время на упражнения и практику. Одной теории мало...

Go to the top of the page
 
+Quote Post
Atlantis-
сообщение Nov 18 2014, 06:32
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102



Цитата(scifi @ Nov 17 2014, 17:44) *
Понятно, язык Си вчера начали изучать. Советую Кернигана и Ричи - хороший учебник.
Именно так, как вам стало бы понятно по прочтении вышеуказанного учебника.

Спасибо за помощь! Учебники читаю, но как сказал Golikov A. - тема мутновата
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 06:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016