KEIL 4.50, WEB/FTP c SD Card и/или USB Disk + RTOS (KEIL RTX)



Незаметно в очередной раз обновился KEIL. Наконец то во-первых, заработала возможность использовать USB диск для хранения файлов для WEB сервера, и во-вторых, появилась возможность работы одновременно и с SD и USB дисками.

Ниже простейший пример. Используется плата SK-STM32F217. Но это не важно, достаточно заменить заголовочный файл и драйвера SD, USB, ETH и пример заработает на чем угодно.

В примере инитятся сначала SD карта, а затем USB диск. В случаи отсутствия файловой системы или ее некорректности (по мнению кейла), носитель форматируется. Какой конкретно носитель будет использоваться для WEB сервера и FTP сервера задается в файле File_Config.с, в нем нужно выбрать носитель по умолчанию. Именно к нему и будет доступ по протоколам TCP и FTP. Второй носитель будет также доступен для программы. С его файловой системой можно производить любые операции (создавать файлы, удалять, копировать и тд). На uart1 организован дебажный вывод, типа:


Starting

SD Memory Card inited.
USB Disk inited.


Весь код:


#include <RTL.h>     
#include <string.h>        
#include "stm32f2xx.h"
#include "File_Config.h"

BOOL tick;

uint32_t retvsd;
uint32_t retvusb;

static void timer_poll (void) 
{
	if (SysTick->CTRL & 0x10000) 
	{  
		timer_tick ();
		tick = __TRUE;  
	}
}

void Uart1Init_115200 (void) 
{	
	RCC->AHB1ENR  |=  (1 <<  0); 
	
	GPIOA->AFR[1] |= 0x00000770;    
	GPIOA->MODER  &= 0xFFC3FFFF;
	GPIOA->MODER  |= 0x00280000;
	
	RCC->APB2ENR  |= (1 << 4);	
	       
	USART1->BRR = (32 << 4) | 9;
	USART1->CR3 = 0x0000;
	USART1->CR2 = 0x0000;
	USART1->CR1 = 0x200C;
}

int32_t Uart1_PutChar (uint8_t ch) 
{
	while (!(USART1->SR & 0x0080));
	USART1->DR = (ch & 0xFF);
	return (ch);
}

void Uart1_putString (uint8_t *s) 
{
	while (*s != 0) 
	{
		Uart1_PutChar (*s++);
	}
}

int main (void)
{
	SystemInit();
	Uart1Init_115200 ();
	Uart1_putString ("\n\nStarting\n\n");
	
	while ((retvsd = finit ("M0:")) != 0) 
        {            
                if (retvsd == 1) 
                {
			Uart1_putString ("SD Memory Card Init Failed\n");
			Uart1_putString ("Insert SD Memory Card...\n");      
                }
                else 
                {
			Uart1_putString ("SD Memory Card is Unformatted\n");
			if (fformat ("M0:SD /FAT32") != 0) 
			{
				Uart1_putString ("SD Memory Card format failed.\n");
			}
			else 
			{
				Uart1_putString ("SD Memory Card formatted.\n");
			}      
                }
        }
				
	Uart1_putString ("SD Memory Card inited.\n");
				
	while ((retvusb = finit ("U0:")) != 0) 
        {            
                if (retvsd == 1) 
                {
			Uart1_putString ("USB Disk Init Failed\n");
			Uart1_putString ("Insert USB Disk...\n");      
                }
                else 
                {
			Uart1_putString ("USB Disk is Unformatted\n");
			if (fformat ("U0:USB /FAT32") != 0) 
			{
				Uart1_putString ("USB Disk format failed.\n");
			}
			else 
			{
				Uart1_putString ("USB Disk formatted.\n");
			}      
                }
        }
				
	Uart1_putString ("USB Disk inited.\n");
	
	init_TcpNet ();
	SysTick->LOAD = (SystemCoreClock / 10) - 1;
	SysTick->CTRL = 0x05;
				
	while (1) 
	{
		timer_poll ();
		main_TcpNet ();
	}
}



А если к проекту добавить файлик RTX_Conf_CM.c, то получается все это начинает вертеться внутри RTOS. Раньше этого тоже не было :)

Измененный код, тоже самое что и выше, но с RTOS:


#include <RTL.h>     
#include <string.h>        
#include "stm32f2xx.h"
#include "File_Config.h"

uint32_t retvsd;
uint32_t retvusb;
uint64_t tcp_stack[1024/8];

OS_TID t_TIMER_HTTP;
OS_TID t_HTTP;

void Uart1Init_115200 (void) 
{	
	RCC->AHB1ENR  |=  (1 <<  0); 
	
	GPIOA->AFR[1] |= 0x00000770;    
	GPIOA->MODER  &= 0xFFC3FFFF;
	GPIOA->MODER  |= 0x00280000;
	
	RCC->APB2ENR  |= (1 << 4);	
	       
	USART1->BRR = (32 << 4) | 9;
	USART1->CR3 = 0x0000;
	USART1->CR2 = 0x0000;
	USART1->CR1 = 0x200C;
}

int32_t Uart1_PutChar (uint8_t ch) 
{
	while (!(USART1->SR & 0x0080));
	USART1->DR = (ch & 0xFF);
	return (ch);
}

void Uart1_putString (uint8_t *s) 
{
	while (*s != 0) 
	{
		Uart1_PutChar (*s++);
	}
}

__task void f_TIMER_HTTP (void) 
{
	os_itv_set (10);
	while (1) 
	{
		timer_tick ();
		os_itv_wait ();
	}
}

__task void f_HTTP (void) 
{
	while (1) 
	{
		main_TcpNet();
		os_tsk_pass();          
    }
}

__task void init (void) 
{
	os_tsk_prio_self (100);
	
	t_TIMER_HTTP = os_tsk_create (f_TIMER_HTTP, 99);
	t_HTTP = os_tsk_create_user (f_HTTP, 1, &tcp_stack, sizeof(tcp_stack));
			
	os_tsk_delete_self ();
}


int main (void)
{
	SystemInit();
	Uart1Init_115200 ();
	Uart1_putString ("\n\nStarting\n\n");
	
	while ((retvsd = finit ("M0:")) != 0) 
        {            
                if (retvsd == 1) 
                {
			Uart1_putString ("SD Memory Card Init Failed\n");
			Uart1_putString ("Insert SD Memory Card...\n");      
                }
                else 
                {
			Uart1_putString ("SD Memory Card is Unformatted\n");
			if (fformat ("M0:SD /FAT32") != 0) 
			{
				Uart1_putString ("SD Memory Card format failed.\n");
			}
			else 
			{
				Uart1_putString ("SD Memory Card formatted.\n");
			}      
                }
        }
				
	Uart1_putString ("SD Memory Card inited.\n");
				
	while ((retvusb = finit ("U0:")) != 0) 
        {            
                if (retvsd == 1) 
                {
			Uart1_putString ("USB Disk Init Failed\n");
			Uart1_putString ("Insert USB Disk...\n");      
                }
                else 
                {
			Uart1_putString ("USB Disk is Unformatted\n");
			if (fformat ("U0:USB /FAT32") != 0) 
			{
				Uart1_putString ("USB Disk format failed.\n");
			}
			else 
			{
				Uart1_putString ("USB Disk formatted.\n");
			}      
                }
        }
				
	Uart1_putString ("USB Disk inited.\n");
	
	init_TcpNet ();
	os_sys_init(init);
}


  • +2
  • 31 марта 2012, 15:16
  • lexanet
  • 1
Файлы в топике: 232.zip

Комментарии (44)

RSS свернуть / развернуть
А как в новой версии обстоит дело с поддержкой русских символов?
0
а разве раньше были проблемы?
0
у меня — да, их файловая система некорректно отображала русские имена.
0
Насчет русского, Вы знаете, как то не проверял, честно сказать никогда не было нужды, все по англицки, да по англицки, всегда и везде… Но заинтригован, обязательно проверю. Скажите только, если я через FTP создам на флэшке или карточке вставленную в мк папку с русским именем, перегружу контроллер и папка останется не испорченной, это будет считаться удачным экспериментом?
0
Создал на компе папку «Русская папка», в ней файл «Русский файл», в нем текст на русском. Скопировал по ftp на usb флэшку подключенную к плате, перегрузил, зашел по фтп, все на месте, переименовал в другое название по русски и скопировал назад на комп. Все в целости, открывается, содержимое папок и файлов целое.
0
По моему предполагались проблемыкогда вы создали файл на компе и переткнули эту флешку в плату. Там из-за разных кодировок может быть лажа.
0
Таки да, проблема есть. Только язык Шекспира поможет в этом случаи.
0
ftp у меня не на чем поднять. А проблемы с созданными компом файлами — библиотечные функции возвращают только младший байт кода русской буквы. Сказал бы кто где старший байт выдрать…
0
Тут я не помощник. Повторюсь, стараюсь пользоваться англицким, чтобы меньше было проблем.
+1
А в другом посте некоторый народ говорил что не уважает ПО которое не понимает русский.
Так что готовьтесь, скоро вам предложат выкинуть кеил :)
0
Гы, такие советы я игнорирую :)
0
Если это камень в мой огород, то как раз кейл отлично дружит с кириллическими путями.
А драйвер ФС и переписать можно…
0
Подскажите как переписать, а то мне не понятно как ихнии .lib раздраконить… Прикрутить Chan-овскую FS не в счет…
0
таки незаметно??
новый редактор на синтилле крайне глючен. лично мною наложенных кирпичей уже на особняк, наверно, хватит.
ну и, кажись, все изменения у этого релиза в мидл-вээ
0
А что за платка на фотке?
0
дык маркировка ведь видна невооруженным взглядом — SK-STM32F217
0
Интересно, только у меня при попытке ввести коментарии в сабже выдводится абы-што, но только не то что я жду? Кодировка што ли глючит?
0
Это проблема Кейла 4.5. У всех такое. Похоже коменты можно писать только на английском.
0
Хотя, если вставить из другого места — то отображается
0
Надо выбрать кодировку UTF-8 (Edit -> Configuration -> Encoding) при этом все русские буквы превратятся в тыкву. Поэтому перед сменой кодировки делаем Ctr+A,Ctr+C а после смены кодировки делаем Ctrl+A,Ctrl+V.
0
Аналогично. Комментарии на русском заработали только после смены кодировки UTF-8. В процессе поиска решения часто встречается нечто типа «отключите стиль написания шрифта „Italic“ и будет вам счастье», но у меня это не заработало. Есть хто кому помогло это?
0
«после смены кодировки UTF-8» читать как «после смены кодировки НА UTF-8»
0
Оффтоп, но если говорить про кейл, то у меня он вообще не сохраняет настройку цветов в редакторе — жаль.
0
Проект сохраняешь перед выходом?
0
Конечно.
0
а нельзя ли приложить архив с проектом ни как не могу понять что не так плата точ в точ но не работает
0
Проект уже не найду. Давно это было. А что именно не работает?
0
Undefined symbol fformat
Undefined symbol finit
Undefined symbol init_TcpNet
Undefined symbol main_TcpNet
Undefined symbol timer_tick

Я чтот понять не могу откуда он их должен брать
0
А Вы к проекту подключили файлы из RL?
FS_CM3.lib
TCP_CM3.lib
ETH_STM32F2xx.c
RTX_Conf_CM.c

и прочие.
0
Посмотрите тут:
we.easyelectronics.ru/LPC/lpc1768-httpftp-s-sd-mmc.html
и тут:
we.easyelectronics.ru/LPC/lpc1768-keil-i-fleshka-usbhost.html

Там плата другая, но основные файлы апаратнонезависимые.
К проекту нужно добавить примерно такие файлы, только некоторые вместо LPC взять для STM:
C:\Keil\ARM\RL\FlashFS\Config\File_Config.c
C:\Keil\ARM\RL\FlashFS\Drivers\SPI_LPC17xx.c
C:\Keil\ARM\RV31\LIB\FS_CM3.lib
C:\Keil\ARM\RV31\LIB\USB_CM3.lib
C:\Keil\ARM\RV31\LIB\FS_CM3.lib
C:\Keil\ARM\Boards\Keil\MCB1700\RL\USB\Host\MSD_File\usbh_ohci_lpc17xx.c
C:\Keil\ARM\Boards\Keil\MCB1700\RL\USB\Host\MSD_File\usb_config.c
C:\Keil\ARM\Boards\Keil\MCB1700\RL\USB\Host\MSD_File\system_LPC17xx.c
C:\Keil\ARM\Boards\Keil\MCB1700\RL\USB\Host\MSD_File\fs_usbh_msc.c
C:\Keil\ARM\Boards\Keil\MCB1700\RL\USB\Host\MSD_File\File_Config.c
0
Из RL вообще проекты не собираются (даже стандартные) сыпет ошибки от ST все нормально
0
Какая версия кейла и RL-ARM?
0
Keil 4.53
RL-ARM 4.13
0
И даже стантартные, из папки C:\Keil\ARM\Boards\Keil проекты не собираются?
Например: C:\Keil\ARM\Boards\Keil\MCBSTM32F200\RL\TCPnet\Http_demo
или C:\Keil\ARM\Boards\Keil\MCBSTM32F200\RL\FlashFS\SD_File\
?
0
Не собираются
function "__sys_open" declared implicitly
function "__sys_close" declared implicitly
function "__sys_write" declared implicitly
и т.д
0
Тогда я тут не помощник. Попробуйте скачать новый кейл 5.60 и переустановить. У меня все примеры собираются без ошибок. А я, если не забуду или не будет лениво, вечерком соберу проект приведенный в статье. Выложу ZIP.
0
Буду очень благодарен за собранный проект
0
Выложил ZIP. Не знаю, работает или нет, платы нет под рукой проверить, но собирается без ошибок.
0
Разобрался Keil 4.53 и RL-ARM 4.13 вместе не работают сейчас все собирается спасибо за собранный проект. Теперь проблема другая на железе не работает.
0
Что именно не работает?
0
плата SK-STM32F417 все собирается и шьется включаю питание пинга нет
0
И не будет. Там ETH_STM32F2xx.c править надо. Чипы сетевые разные. Не могу пока выложить свой правленный файл. Архив потерял. Надо искать на бэкапных дисках. Можете сами подправить, там не сложно. В моей версии кейла была забыта проинициалированна одна нога и нужно отменить проверку идентификатора чипа, просто закомментить if. А я уж, как с делами разгребусь, поищу архивчик. Но, плата у меня на stm32f217, может и какие то отличия быть.
0
Поидее мне скорей всего сюда но я все равно не могу разобраться
0
Помогите с карточкой:
Проект из архива собрался. Собираю свой выдает:. Error: L6218E: Undefined symbol mci0_drv (referred from file_config.o).
Плата stm32l-discovery
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.