Перейти к содержанию
    

vitmeat

Участник
  • Постов

    13
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Старые поля

  • Vkontakte
    Array

Контакты

  • Сайт
    Array
  • ICQ
    Array
  1. STM32F4+HAL+FIFO_DMA+UART_TX

    Я так и хочу! Но не понимаю как это настроить. Либо ДМА начинает все с начала не обращая внимания на мои HAL_UART_DMAPause и __HAL_DMA_SET_COUNTER Либо выходит за пределы памяти, либо по кругу просто все выдает. Я просто думал есть какая то последовательность мне неизвестная.
  2. STM32F4+HAL+FIFO_DMA+UART_TX

    Ну, в общем, один и тот же: #define __HAL_DMA_SET_COUNTER(__HANDLE__, __COUNTER__) ((__HANDLE__)->Instance->NDTR = (uint16_t)(__COUNTER__)) #define __HAL_DMA_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->NDTR)
  3. STM32F4+HAL+FIFO_DMA+UART_TX

    Ну в общем суть такая: * Послали данных, настроили ДМА и он начал их отправлять в юарт * Дослали еще данных, предыдущая передача ДМА еще не завершена: - приостанавливаем ДМА HAL_UART_DMAPause - дописываем данные в буфер - берем из __HAL_DMA_GET_COUNTER сколько было не отправлено - плюсуем с количеством новых данных и устанавливаем __HAL_DMA_SET_COUNTER - обратно запускаем HAL_UART_DMAResume - в прерывании делаем HAL_UART_DMAStop Так по идее должно работать. Как у меня сейчас * Послали данных, закинули их в фифо, вынули из фифо в буфер ДМА, настроили ДМА и он начал их отправлять в юарт * Дослали еще данных, предыдущая передача ДМА еще не завершена: - закинули их в фифо, установили флаг что есть еще данные - в прерывании окончания передачи, смотрим на флаг, если он установлен, копируем из фифо в буфер ДМА данные и опять запускаем передачу Дело в том, что так тратится ДВА буфера одинакового размера.
  4. STM32F4+HAL+FIFO_DMA+UART_TX

    Доброго времени суток. Я пытаюсь настроить передачу по UART при помощи кольцевого FIFO буфера с использованием соответствующего режима DMA. Но как то не получилось у меня приостанавливать передачу, и стартовать ее заново с того же места, всегда получается с начала. Функции HAL_UART_DMAPause и HAL_UART_DMAResume не работают, по крайней мере так, как я ожидаю. __HAL_DMA_GET_COUNTER - возвращает количество еще не переданных данных. __HAL_DMA_SET_COUNTER - устанавливает количество еще не переданных данных, но она опять же не работает. Настройки DMA hdma_tx.Init.Channel = USARTx_TX_DMA_CHANNEL; hdma_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_tx.Init.Mode = DMA_CIRCULAR; hdma_tx.Init.Priority = DMA_PRIORITY_LOW; hdma_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; hdma_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; hdma_tx.Init.MemBurst = DMA_MBURST_SINGLE; hdma_tx.Init.PeriphBurst = DMA_MBURST_SINGLE; В итоге сейчас остановился на реализации отдельного кольцевого FIFO буфера и обычной передаче по DMA, а в прерывании DMA дописываю в буфер то, что еще пришло за время передачи. Но получается что у меня два буфера, один FIFO другой DMA. Подскажите пожалуйста, как правильно работать с кольцевым режимом DMA. То есть, хочется докладывать в кольцевой буфер пока DMA передает, и не блокировать процесс, и чтобы это был всего один буфер. Или этого нельзя делать пока DMA не отработал?
  5. Начало будет в 13.00, Мероприятия будут в 103 аудитории, а так же в самом помещении хакспейса.
  6. Собственно открывается сабж =) А именно HackSpace-spb Ссылки -> http://hackspace-spb.ru/hackspace_weekend.html Людям свойственно искать «братьев по разуму», таких-же как и они горячо увлеченных каким-либо делом. Люди увлекающиеся электроникой, робототехникой всякими «железяками» и гаджетами – не исключение. По всему миру такие люди собираются на площадках называемых «Hacker-Space» что означает «место для хакеров». Здесь, конечно же, имеются ввиду не те злые хакеры по ночам ломающие банки и сервера пентагона (как это показано в фильмах), а люди интересующиеся технологиями и хорошо их знающие. Это будет открытая площадка. Мы постарались сделать из этого события целый праздник, и приглашаем Всех заинтересовавшихся 29 и 30 октября на технический фестиваль «HackSpace Weekend»! В программе – интересные семинары, мастер классы, конкурсы, дискуссии. И главное – сможете поучаствовать на открытии сразу двух технических площадках ХакСпейса, где будут вестись проекты по электронике, робототехнике и программированию. Вы можете предложить свой проект для хостинга в рамках ХакСпейса или присоединиться к другим. Каждую неделю в ХакСпейсе будут проходить открытые мероприятия. Информация о ХакСпейсе и регистрация на фестиваль – на сайте http://hackspace-spb.ru Вход свободный, но нужна регистрация. Место проведения: Санкт-Петербург, Биржевая линия, дом 14. Будем рады вас видеть =)
  7. Ага спасибо =) Программа минимум для меня выполнена ( моргание светодиодом ) Благодаря интернетам собрал солянку -> /* link.ld - GNU ld script */ SEARCH_DIR(.); ENTRY(reset); /* точка входа программы */ OUTPUT_ARCH(arm); OUTPUT_FORMAT("elf32-littlearm","elf32-bigarm","elf32-littlearm"); /* */ MEMORY /* Начальные адреса и размеры оперативной и флешь памяти */ { flash (rx) : ORIGIN = 0x0, LENGTH = 0x8000 /* размер флешь LENGTH = 32K */ ram (rwx) : ORIGIN = 0x10000000, LENGTH = 0x2000 /* размер опреативной памяти LENGTH = 8K */ } SECTIONS /* куда какую информацию размещать */ { /*. = flash; */ .text : /* размещение самой программы (исполняемый код) */ { /*. = ALIGN(4) */ /* оператор точка определяет текущий адрес, оператор ALIGN(4) – предписываем компоновщику выравнивать адреса по 4 байта */ KEEP(*(.vector_table)) /* таблица векторов прерывания в начале флешь памяти, KEEP */ *(.text*) /* исполняемый код */ *(.rodata*) /* константы */ } > flash /* размещаем во флешь*/ _etext = .; /* */ /*. = ram; */ .data : /* размещение ненулевых данных */ { _data = .; /* */ *(.data*) /* */ _edata = .; /* */ } > ram AT>flash /* */ .bss : /* */ { _bss = .; /* */ *(.bss*) /* */ _ebss = .; /* */ } > ram /* */ /*_ram_top = ram;*/ /*_stack_top = _ram_top;*/ _stack_size = 200; /* */ _stack_top = 0x10000000 + 0x2000; /* */ _stack_begin = _stack_top - _stack_size;/* */ . = _stack_begin; /* */ ._stack : /* */ { . = . + _stack_size; /* */ } > ram /* */ } /* startup.c */ void reset(void); extern void main(void); extern unsigned long _stack_top; __attribute__ ((section(".vector_table"))) void (* const vectors[128])(void) = { (void *) &_stack_top, reset }; void reset(void) { /* copy the .data section from flash to RAM */ /* zero the .bss section */ main(); while(1); } #========================================================== # File: Makefile for Cortex-M3 # Date: 2011-01-02 #========================================================== OPTIMIZATION = s #---------------------------------------------------------- SRC_C = startup.c SRC_C += lpc1343_hello.c #---------------------------------------------------------- #CROSS_PATH = C:/gcc/arm/Sourcery/ CROSS_PATH = C:/gcc/arm/yagarto/ #CROSS_PATH = C:/gcc/arm/kgp-arm-eabi_x86-64/ LD_SCRIPT = link.ld TOOLCHAIN = arm-none #TOOLCHAIN = arm-kgp #CROSS = $(CROSS_PATH)/bin/arm-none-eabi- CROSS = $(CROSS_PATH)/bin/$(TOOLCHAIN)-eabi- INCLUDES += -I$(CROSS_PATH)/$(TOOLCHAIN)-eabi/include INCLUDES += -I$(CROSS_PATH)/$(TOOLCHAIN)-eabi/include/lib #---------------------------------------------------------- FLAGS_C = $(INCLUDES) -I. FLAGS_C += -O$(OPTIMIZATION) FLAGS_C += -Wall FLAGS_C += -c FLAGS_C += -fmessage-length=0 FLAGS_C += -fno-builtin FLAGS_C += -ffunction-sections FLAGS_C += -fdata-sections FLAGS_C += -msoft-float FLAGS_C += -mapcs-frame FLAGS_C += -D__thumb2__=1 FLAGS_C += -mno-sched-prolog FLAGS_C += -fno-hosted FLAGS_C += -mtune=cortex-m3 FLAGS_C += -mcpu=cortex-m3 FLAGS_C += -mthumb FLAGS_C += -mfix-cortex-m3-ldrd FLAGS_LD = -Xlinker FLAGS_LD += --gc-sections FLAGS_LD += -mcpu=cortex-m3 FLAGS_LD += -mthumb FLAGS_LD += -static FLAGS_LD += -nostdlib #---------------------------------------------------------- all: clean target.elf %.elf: $(SRC_C:%.c=target/%.o) @echo Linking: $@ @$(CROSS)gcc $(FLAGS_LD) -T'$(LD_SCRIPT)' -o 'target/$@' $^ $(LD_LIB) @echo '-----------------------------------------------------------' @$(CROSS)size 'target/target.elf' @$(CROSS)objcopy -O binary 'target/target.elf' 'target/target.bin' @$(CROSS)objcopy -O ihex 'target/target.elf' 'target/target.hex' @$(CROSS)objdump -h -S -z 'target/target.elf' > 'target/target.lss' @$(CROSS)nm -n 'target/target.elf' > 'target/target.sym' @rm -f target/*.o $(SRC_C:%.c=target/%.o): target/%.o: %.c @echo Compiling: $< @$(CROSS)gcc $(FLAGS_C) -c $< -o $@ clean: @echo '-----------------------------------------------------------' @rm -f target/*.* .PHONY : all clean ну и собственно сам код, без CMSIS, еще не вкурил как ей пользоваться. /* lpc1343_hello.c */ #define LED_BIT 7 #define DELAY 35E+4 #define GPIO0DIR 0x50008000 #define GPIO0DATA 0x50000000 #define LED_MASK (GPIO0DATA + (1 << (LED_BIT+2))) #define LED_SET_DATA (1 << (LED_BIT+2)) #define LED_CLR_DATA ~(1 << (LED_BIT+2)) void delay(int n) { int i; for(i=0; i < n; i++) {__asm("nop");} } int main() { int *p = (int *)GPIO0DIR; // port 0 // GPIO 0 data direction register // set pin0_7 as output *p |= (1 << LED_BIT); //int *led = (int *)(GPIO0DATA + (1 << (LED_BIT+2))); // port 0 bit 7 int *led = (int *)LED_MASK; while (1) { // *led = 0xFFFFFFFF;//~0; *led = LED_CLR_DATA; delay(500000); //*led = 0; *led = LED_SET_DATA; delay(500000); } return 0; } да и сейчас другой проект на linux embeded поэтому раскуриваю маны по линуксу
  8. Да, я попробовал пользоваться этим code red. Спасибо, больше желания нет. Говорю, среду я выберу. Благо хватает альтернатив, это и code::blocks, и codelite. Наверняка еще разных IDE можно найти тот же ваш любимый eclipse (на котором code red и построена). Мне сейчас важно откомпилить какой нибудь хеллоу ворд, а уж потом озаботится средой, и перейти на любую другую среду поддерживающую gcc и makefile не составит труда. Я просто надеялся, что может кто уже работает с этим процом, и поделится хелло вордом для него, что ускорит изучение. Но видимо не судьба. Буду сам рыть интернет и по чуть чуть все изучать.
  9. Да, родной jtag я уже отпилил. Имеется в наличии какой то клон j-link'а, вот его и прикручу. Но для начала надо хоть что нибудь скомпилировать. Как я уже говорил имеется стойкая неприязнь ко всем навязываемым IDE. Тут весьма сложно для начала. То есть, я не понимаю что там происходит при сборке (что и от чего зависит), и это мне не нравится. Хочется во всем разобраться. Надеялся на то, что тут у кого нибудь имеется совсем простенький пример makefile и ld скрипта для lpc13xx. Если в makefile'ах я еще что-то понимаю, то с ld я не сталкивался. И нужен ли он, ld-скрипт, вообще, может он в CMSIS'е есть? Там не про cortex'ы, я так понял что cortex'ы довольно сильно отличаются от arm7tdmi. Да и к тому же там все как то объясняется через одно место, типа: для работы процессора нужна низкоуровневая инициализация low_level_init(), вот она. В ней эта строка обозначает то, а та строка обозначает это. то же самое и для ld-скриптов. Меня больше интересует, где это взять для конкретного процессора, в частности моего, а уж дальше я надеюсь разберусь там, где да что. Если есть еще какие мануалы, я буду рад. P.S. Обзавелся еще платкой с stm32f103cbt6, может с этим чипом у меня заладится. Хотя, как я думал, между кортексами окромя переферии разницы нет. Оказывается не так?
  10. Да, смотрел, спасибо. Копал довольно долго, но там в основном если и есть какие примеры, то для их среды на code red, или для keil'овского uVision'а, то есть всякие IDE. А makefile'ы в Example Projects созданы средой и имеют соответствующее предупреждение ################################################################################ # Automatically-generated file. Do not edit! ################################################################################ И вообще высылаю сайту NXP лучики паноса, ибо гуглом не гуглится, а ихними поисками находятся постоянно 100500 страниц одного и того же, как бы ты не уточнял запрос.
  11. В общем имеется у меня платка LPCExpresso, с lpc1343 на борту, давно купленная за кровные 750руб. Никакие keil'ы, iar'ы, code red'ы, меня категорически не устраивают, как и eclipse в принципе. Выбор IDE я хочу сделать самостоятельно. А вот компилятор я хочу gcc. Есть от klen'а, есть Yagarto, есть Codesourcery G++. Так вот: Не могу сообразить, как собрать первый проект с cortex'овским cmsis'ом. (CMSISv1p30_LPC13xx) Нужен как минимум makefile и скрипты для линкера, а также правильная инициализация при старте. - это я правильно понимаю? Есть у кого нибудь пример для сабжа. Ну или может кто объяснит, что да как. Или даст адресок, где можно об этом почитать. Натыкался вот на это в интернете. http://www.microbuilder.eu/Projects/LPC134...enceDesign.aspx Но там все как-то перепахано и simple example от туда не получается выдрать.
  12. Попробуйте заменить стандартный gcc'ый printf на xprintf от elm-chan'a http://elm-chan.org/fsw/strf/xprintf.html Эмм... В общем он теперь тоже сишный и большой, раньше был на асме и маленький, аж удивился :rolleyes: . Но даже сейчас он меньше. Заменил sprintf на xsprintf без потери функциональности Из 4 тулчейнов: WinAVR -> ( тут еще включен -mint8 и --param inline-call-cost=0 ) Program: 3268 bytes (39.9% Full) Data: 161 bytes (15.7% Full) kgp_avr -> Program: 3402 bytes (41.5% Full) Data: 161 bytes (15.7% Full) AVR_Toolchain -> ( тут еще включен -mint8 ) Program: 3366 bytes (41.1% Full) Data: 161 bytes (15.7% Full) mhvavrtools -> Program: 3386 bytes (41.3% Full) Data: 161 bytes (15.7% Full) Для стандартной printf у меня получилось: WinAVR -> ( тут еще включен -mint8 и --param inline-call-cost=0 ) Program: 3514 bytes (42.9% Full) Data: 157 bytes (15.3% Full) kgp_avr -> Program: 3578 bytes (43.7% Full) Data: 157 bytes (15.3% Full) AVR_Toolchain -> ( тут еще включен -mint8 ) Program: 3554 bytes (43.4% Full) Data: 157 bytes (15.3% Full) mhvavrtools -> Program: 3566 bytes (43.5% Full) Data: 157 bytes (15.3% Full) WinAVR -> avr-gcc.exe (WinAVR 20100110) 4.3.3 kgp_avr -> avr-gcc.exe (Klen's GCC package (KGP) for AVR/elf platform) 4.6.0 20100725 (experimental) AVR_Toolchain -> avr-gcc.exe (AVR_Toolchain_3.0_149) 4.4.3 mhvavrtools -> avr-gcc.exe (GCC) 4.5.1 :cranky:
  13. IDE для WINAVR.

    Даже фоток толком нет этого avr-project-ide. А в чем отличие Code::Blocks от CodeLite? Меня очень пропер CodeLite -> http://codelite.org -> http://ru.wikipedia.org/wiki/CodeLite Сейчас активно на него перехожу. Умеет автодописывание функций из тех файлов которые ему укажешь, с doxygen подсказкой. Интегрирован Subversion, и GDB интерактивный отладчик. Можно указать для разных проектов и типов сборки (debug, relese, и тд) разное окружение (PATH). При варнингах или ошибках, сам переходит на строку где они произошли. Кросс платформенный. В общем мое путешествие PN -> Notepad++ -> CodeLite Eclipse - мало того что тормозно, даже на моем довольно мощном домашнем, так еще и не интуитивный интерфейс. В общем не мое! =)
×
×
  • Создать...