Кто любит RISC в жизни, заходим, не стесняемся.
Сб авг 24, 2013 07:21:06
вот исходник софтового mp3 плеера с карточкой и http под stm32f207, проект в keil. тестил с картой на 1, 2, 8 гиг. чановская фатфс, драйвер SDIO от ST, чуток допиленный для стабильной работы. используется DMA. Успевает играть MP3 и работать по HTTP с картой. для полного счастья не хватает внешней памяти туда и кодека, лень было макетировать
ссылка:
http://qclk.ru/kz/s3z1Форум архив не принимает
Сб авг 24, 2013 14:34:11
Да коду там много еще и RTOS приплели. Софтовый mp3 нафиг не нужен декодер. VS1053 получше будет для этих целей.
Сб авг 24, 2013 16:26:35
STM32F0 и F2 - разные весовые категории. Приведите ваши данные по скорости записи/чтения, потом сравним с "классической" реализацией с DMA и SDIO. ОС там затем, что у вас процессор во время работы с картой больше ничего и не делает, а здесь - наоборот, свободен для других задач, той же индикации или декодера.
Сб авг 24, 2013 16:48:57
А при чем тут собственно F2? Конечно разные процессоры. как и F2 и F4 тоже разные. В чем фишка?
Сб авг 24, 2013 17:38:48
в наборе периферии. у F4 практически то же самое что и у F2 и совершенно отличное от STM32F0. А тут драйвер для STM32F0 на STM32F4 прикрутили - как на гоночный болид колеса от велосипеда.
Сб авг 24, 2013 17:46:27
Этот драйвер не для F0 конкретно.
Этот драйвер реализует обмен с картой по SPI интерфейсу.
Этот код будет работать на любых процессорах с аппаратным SPI и потребляет мало ресурсов, при отсутствии аппаратного можно заменить на программный ввод/вывод SPI, с изменением всего 1 функции.
А драйвер с SDIO требует SDIO интерфейс который не у всех процессоров он есть.
Сб авг 24, 2013 23:11:01
Пишу в CooCox
есть буфер
char BUFFER[512];
Читаю 0 сектор все гуд.
Потом пытаюсь выдернуть поле из массива по указателю, если обращаться структурой то все гуд через структуру к полям доступ работает. А вот так не хочет.
Подскажите как сказать компилятору что бы работал.
- Код:
char FAT_INI(void)
{
SD_READ(0); //0 сектор
short BytePerSec = *((short *)&BUFFER[11]);
lcd_int(BytePerSec, 3, 0);
}
08001512: movs r0, #0
08001514: bl 0x8000960 <SD_READ>
08001518: ldr r2, [pc, #32] ; (0x800153c <FAT_INI+48>)
0800151a: adds r3, r7, #6
0800151c: ldrh r2, [r2, #0]
0800151e: strh r2, [r3, #0]
08001520: adds r3, r7, #6
08001522: movs r2, #0
08001524: ldrsh r3, [r3, r2]
08001526: adds r0, r3, #0
08001528: movs r1, #3
0800152a: movs r2, #0
0800152c: bl 0x8001064 <lcd_int>
Вс авг 25, 2013 15:46:54
Oxford, проверил ваш кусок, все работает. выдает 0x200 = 512.
вся эта фат-информация лежит на моей флешке в секторе 32, посмотрел в WinFex. компилятор keil.
- Код:
short BytePerSec;
void FAT_INI(void){
SD_READ(32); //0 сектор
BytePerSec = *((short *)&BUFFER[11]);
sprintf(str, "BytePerSec_0x%x ", BytePerSec);
LCD_PutStr8x12(5, 30, str, 0);
}
Вс авг 25, 2013 21:55:42
Благодарю значит чето кокос загоняет. Если беру BUFFER[11] смещение улетает в DefaultHandler, если BUFFER[12] взять выводит со смещением 514 десятичное.
А на CooCox можете проверить скомпилить у меня одного или у вас так же будет глючить? Надо проверить факт. Если полностью структуру брать то она все поля берет исправно.
KEIL прошел проверку ок значит все.
На IAR проверю еще.
Пн авг 26, 2013 00:43:26
завтра, точнее уже сегодня установлю CooCox и попробую.
а вы пишете на C++? просто у меня в этой строке вылетает ошибка:
- Код:
short BytePerSec = *((short *)&BUFFER[11]);
а в этой все ок:
- Код:
BytePerSec = *((short *)&BUFFER[11]);
Пн авг 26, 2013 03:38:15
drakon писал(а):завтра, точнее уже сегодня установлю CooCox и попробую.
а вы пишете на C++? просто у меня в этой строке вылетает ошибка:
- Код:
short BytePerSec = *((short *)&BUFFER[11]);
а в этой все ок:
- Код:
BytePerSec = *((short *)&BUFFER[11]);
в CooCox Си язык. А в чем разница строк чет не понял из-за переменной что ли? У меня в кокосе в обоих случаях ошибка хоть как делай.
Пн авг 26, 2013 17:43:45
Сам сталкивался с таким. Причина в том, что компилятор из-за оптимизации не выделяет память под переменную. Можно даже легко в HardFault попасть на таком присвоении.
Пн авг 26, 2013 20:19:37
murkot писал(а):Сам сталкивался с таким. Причина в том, что компилятор из-за оптимизации не выделяет память под переменную. Можно даже легко в HardFault попасть на таком присвоении.
Оптимизация отключена вообще. При оптимизации вообще не работает прошивка. Ну вот что-то компилятор возможно настраивать надо как то его указывать, я не знаю как.
Пн авг 26, 2013 21:19:08
поставил CoIDE, но проект так и не удалось скомпилировать, куча непонятных ошибок.
чего у вас возвращаемый параметр ф-и char, но вы ничего не возвращаете? а объявление переменной не в начале кода возможно только на C++. при исправлении этого в KEIL все работает.
- Код:
short BytePerSec; //объявляем гл. переменную
void FAT_INI(void)
{
SD_READ(0); //0 сектор
BytePerSec = *((short *)&BUFFER[11]);
lcd_int(BytePerSec, 3, 0);
}
Вт авг 27, 2013 00:56:52
Нет это все ни при чем. Не в этом дело.
Вт авг 27, 2013 15:30:30
Вот и как доверять CooCox после этого. Получается в любом коде могут баги появиться.
Вт авг 27, 2013 16:17:58
short BytePerSec = *((short *)&BUFFER[11]);
Попробуйте присвоить по 1 байту
- Код:
short BytePerSec;
((char*)&BytePerSec)[0] = BUFFER[11];
((char*)&BytePerSec)[1] = BUFFER[12];
Должно заработать
Вт авг 27, 2013 16:31:19
Респект
Работает благодарю вас. Будем формировать побайтно для совместимости кода.
Посимвольно то буфер он выводит правильно, додуматься что-то я сам не смог до такого приема. )))
Вт авг 27, 2013 20:53:04
drakon писал(а):поставил CoIDE, но проект так и не удалось скомпилировать, куча непонятных ошибок.
чего у вас возвращаемый параметр ф-и char, но вы ничего не возвращаете? а объявление переменной не в начале кода возможно только на C++. при исправлении этого в KEIL все работает.
- Код:
short BytePerSec; //объявляем гл. переменную
void FAT_INI(void)
{
SD_READ(0); //0 сектор
BytePerSec = *((short *)&BUFFER[11]);
lcd_int(BytePerSec, 3, 0);
}
В IAR проверил все ок работает такая конструкция.
Вт авг 27, 2013 20:57:38
Oxford писал(а):drakon писал(а):завтра, точнее уже сегодня установлю CooCox и попробую.
а вы пишете на C++? просто у меня в этой строке вылетает ошибка:
- Код:
short BytePerSec = *((short *)&BUFFER[11]);
В IAR работает все делал так:
char FAT_INI(void)
{
SD_READ(0);
short BytePerSec = *((short *)&BUFFER[11]);
lcd_int(BytePerSec, 4, 0);
return BytePerSec;
}
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.