|
SDRAM -> DMA STM32F4 |
|
|
|
 |
Ответов
|
Nov 17 2014, 10:14
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(scifi @ Nov 17 2014, 12:54)  Можно. тогда такой вопрос, SDRAM начинается с адреса 0xD0000000 т.е. нужен 32-битный указатель. а приемник DMA (в моем случае это 16 битный регистр данных I2S) - 16-битный и нужен 16 битный указатель. как в этом случае их "срастить"?
|
|
|
|
|
Nov 17 2014, 11:37
|
Местный
  
Группа: Участник
Сообщений: 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 ?
|
|
|
|
|
Nov 17 2014, 11:59
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Nov 17 2014, 12:30
|
Местный
  
Группа: Участник
Сообщений: 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-битное число?
|
|
|
|
|
Nov 17 2014, 14:44
|
Гуру
     
Группа: Свой
Сообщений: 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-битное число? Именно так, как вам стало бы понятно по прочтении вышеуказанного учебника.
|
|
|
|
Сообщений в этой теме
Atlantis- SDRAM -> DMA STM32F4 Nov 17 2014, 09:43       Atlantis- Цитата(scifi @ Nov 17 2014, 17:44) Понятн... Nov 18 2014, 06:32  jcxz Цитата(Atlantis- @ Nov 17 2014, 16:1... Nov 17 2014, 11:01 Golikov A. Да вот не фига, указатели - самая жопа языка С, и ... Nov 17 2014, 15:21 scifi Цитата(Golikov A. @ Nov 17 2014, 18:21) с... Nov 17 2014, 15:28 Golikov A. А так только человек катастрофически не понимающий... Nov 17 2014, 17:36 scifi Цитата(Golikov A. @ Nov 17 2014, 20:36) 1... Nov 17 2014, 19:17 Golikov A. я думаю что вы меня не правильно поняли.
Я только ... Nov 17 2014, 21:59
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|