Драйвер для MICRO_SD карт
Re: Драйвер для MICRO_SD карт
вот исходник софтового mp3 плеера с карточкой и http под stm32f207, проект в keil. тестил с картой на 1, 2, 8 гиг. чановская фатфс, драйвер SDIO от ST, чуток допиленный для стабильной работы. используется DMA. Успевает играть MP3 и работать по HTTP с картой. для полного счастья не хватает внешней памяти туда и кодека, лень было макетировать
ссылка: http://qclk.ru/kz/s3z1
Форум архив не принимает
ссылка: http://qclk.ru/kz/s3z1
Форум архив не принимает
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Да коду там много еще и RTOS приплели. Софтовый mp3 нафиг не нужен декодер. VS1053 получше будет для этих целей.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
STM32F0 и F2 - разные весовые категории. Приведите ваши данные по скорости записи/чтения, потом сравним с "классической" реализацией с DMA и SDIO. ОС там затем, что у вас процессор во время работы с картой больше ничего и не делает, а здесь - наоборот, свободен для других задач, той же индикации или декодера.
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
А при чем тут собственно F2? Конечно разные процессоры. как и F2 и F4 тоже разные. В чем фишка?
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
в наборе периферии. у F4 практически то же самое что и у F2 и совершенно отличное от STM32F0. А тут драйвер для STM32F0 на STM32F4 прикрутили - как на гоночный болид колеса от велосипеда.
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Этот драйвер не для F0 конкретно.
Этот драйвер реализует обмен с картой по SPI интерфейсу.
Этот код будет работать на любых процессорах с аппаратным SPI и потребляет мало ресурсов, при отсутствии аппаратного можно заменить на программный ввод/вывод SPI, с изменением всего 1 функции.
А драйвер с SDIO требует SDIO интерфейс который не у всех процессоров он есть.
Этот драйвер реализует обмен с картой по SPI интерфейсу.
Этот код будет работать на любых процессорах с аппаратным SPI и потребляет мало ресурсов, при отсутствии аппаратного можно заменить на программный ввод/вывод SPI, с изменением всего 1 функции.
А драйвер с SDIO требует SDIO интерфейс который не у всех процессоров он есть.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Пишу в CooCox
есть буфер
char BUFFER[512];
Читаю 0 сектор все гуд.
Потом пытаюсь выдернуть поле из массива по указателю, если обращаться структурой то все гуд через структуру к полям доступ работает. А вот так не хочет.
Подскажите как сказать компилятору что бы работал.
есть буфер
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>Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
Oxford, проверил ваш кусок, все работает. выдает 0x200 = 512.
вся эта фат-информация лежит на моей флешке в секторе 32, посмотрел в WinFex. компилятор keil.
вся эта фат-информация лежит на моей флешке в секторе 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);
}- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Благодарю значит чето кокос загоняет. Если беру BUFFER[11] смещение улетает в DefaultHandler, если BUFFER[12] взять выводит со смещением 514 десятичное.
А на CooCox можете проверить скомпилить у меня одного или у вас так же будет глючить? Надо проверить факт. Если полностью структуру брать то она все поля берет исправно.
KEIL прошел проверку ок значит все.
На IAR проверю еще.
А на CooCox можете проверить скомпилить у меня одного или у вас так же будет глючить? Надо проверить факт. Если полностью структуру брать то она все поля берет исправно.
KEIL прошел проверку ок значит все.
На IAR проверю еще.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
завтра, точнее уже сегодня установлю CooCox и попробую.
а вы пишете на C++? просто у меня в этой строке вылетает ошибка:
а в этой все ок:
а вы пишете на C++? просто у меня в этой строке вылетает ошибка:
Код: Выделить всё
short BytePerSec = *((short *)&BUFFER[11]);а в этой все ок:
Код: Выделить всё
BytePerSec = *((short *)&BUFFER[11]);- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
drakon писал(а):завтра, точнее уже сегодня установлю CooCox и попробую.
а вы пишете на C++? просто у меня в этой строке вылетает ошибка:Код: Выделить всё
short BytePerSec = *((short *)&BUFFER[11]);
а в этой все ок:Код: Выделить всё
BytePerSec = *((short *)&BUFFER[11]);
в CooCox Си язык. А в чем разница строк чет не понял из-за переменной что ли? У меня в кокосе в обоих случаях ошибка хоть как делай.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
Сам сталкивался с таким. Причина в том, что компилятор из-за оптимизации не выделяет память под переменную. Можно даже легко в HardFault попасть на таком присвоении.
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
murkot писал(а):Сам сталкивался с таким. Причина в том, что компилятор из-за оптимизации не выделяет память под переменную. Можно даже легко в HardFault попасть на таком присвоении.
Оптимизация отключена вообще. При оптимизации вообще не работает прошивка. Ну вот что-то компилятор возможно настраивать надо как то его указывать, я не знаю как.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
поставил CoIDE, но проект так и не удалось скомпилировать, куча непонятных ошибок.
чего у вас возвращаемый параметр ф-и char, но вы ничего не возвращаете? а объявление переменной не в начале кода возможно только на C++. при исправлении этого в KEIL все работает.
чего у вас возвращаемый параметр ф-и char, но вы ничего не возвращаете? а объявление переменной не в начале кода возможно только на C++. при исправлении этого в KEIL все работает.
Код: Выделить всё
short BytePerSec; //объявляем гл. переменную
void FAT_INI(void)
{
SD_READ(0); //0 сектор
BytePerSec = *((short *)&BUFFER[11]);
lcd_int(BytePerSec, 3, 0);
}
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Нет это все ни при чем. Не в этом дело.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Вот и как доверять CooCox после этого. Получается в любом коде могут баги появиться.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Re: Драйвер для MICRO_SD карт
short BytePerSec = *((short *)&BUFFER[11]);
Попробуйте присвоить по 1 байту
Код: Выделить всё
short BytePerSec;
((char*)&BytePerSec)[0] = BUFFER[11];
((char*)&BytePerSec)[1] = BUFFER[12];
Должно заработать
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
Респект
Работает благодарю вас. Будем формировать побайтно для совместимости кода.
Посимвольно то буфер он выводит правильно, додуматься что-то я сам не смог до такого приема. )))
Посимвольно то буфер он выводит правильно, додуматься что-то я сам не смог до такого приема. )))
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
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 проверил все ок работает такая конструкция.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Oxford
- Опытный кот
- Сообщения: 819
- Зарегистрирован: Вт окт 23, 2012 13:17:25
- Откуда: Прокопьевск
- Контактная информация:
Re: Драйвер для MICRO_SD карт
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;
}
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford