ViKo 1 10 июля, 2009 Опубликовано 10 июля, 2009 · Жалоба Начинаю писать для STM32 в Keil uVision3. Понятно, что будет файл типа main.c. А что вызывать из него для инициализации процессора? startup_stm32f10x_hd.s - инициализация стека и таблица векторов прерываний. А дальше? В каталоге Keil\ARM\Boards\ST\EK-STM32F есть примеры, в которых в файлах STM32_Init.c есть Configuration Wizard, в котором можно настроить всю периферию, частоты, и т.д. А в библиотеке stm32f10x_stdperiph_lib, скачанной с сайта ST, ничего подобного нет. Да и изменить в них ничего нельзя, у них атрибут "только для чтения". Что же, использовать их только как пример, писать свои файлы? Подскажите примерную структуру проекта, а то накидал файлов, что уже заблудился в них. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 июля, 2009 Опубликовано 13 июля, 2009 · Жалоба Коль никто не ответил, попробую ответить себе сам: Не е** мозги, напиши свою инициализацию, назови файл, к примеру, Init_STM32.c, и по-порядочку, задай работу генераторов, прерываний, памяти... все, что вычитаешь в datashet и в примерах. Для описания регистров, битов, структур создай отдельный заголовочный файл, тоже на основе готовых, например stm32f10x.h. Тогда и в периферии быстрее разберешься. И всех делов. Тебе ж не нужна некая универсальная инициализация, что приведена в библиотеках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 13 июля, 2009 Опубликовано 13 июля, 2009 · Жалоба Кто то для инициализации пользуется фирменными библиотеками. Я привык работать напрямую с регистрами - делов-то (правда, для этого надо хорошенько "вкурить" мануал). Совсем необязательно для инициализации создавать отдельный файл - достаточно всего лишь одной функции. Например: void Init() { //Enable SysTick as periodic timer SysTick->LOAD = SYSTICK_PERIOD; SysTick->CTRL = SysTick_CTRL_ENABLE | SysTick_CTRL_CLKSOURCE | SysTick_CTRL_TICKINT; //configure clocks FLASH->ACR |= FLASH_ACR_LATENCY_1; //flash latency = 2 wait states RCC->CR |= RCC_CR_HSEON; RCC->CFGR = RCC_CFGR_PLLMULL9 | RCC_CFGR_PLLSRC | RCC_CFGR_PPRE1_DIV2; while (!(RCC->CR & RCC_CR_HSERDY)); RCC->CR |= RCC_CR_PLLON; while (!(RCC->CR & RCC_CR_PLLRDY)); RCC->CFGR |= RCC_CFGR_SW_PLL; while ((RCC->CFGR & (RCC_CFGR_SWS_HSE | RCC_CFGR_SWS_PLL)) != RCC_CFGR_SWS_PLL); //Enable clocking of the peripherals RCC->APB2ENR = RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | RCC_APB2ENR_SPI1EN; RCC->APB1ENR = RCC_APB1ENR_SPI2EN | RCC_APB1ENR_USBEN; RCC->AHBENR = RCC_AHBENR_FLITFEN | RCC_AHBENR_SRAMEN | RCC_AHBENR_DMA1EN; //SPI1 SPI1->CR1 = SPI_CR1_DFF | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_BR_0 | SPI_CR1_SPE; //18 Mbit @ 72 MHz //SPI2 SPI2->CR1 = SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR | SPI_CR1_BR_2 | SPI_CR1_BR_1 | SPI_CR1_BR_0 | SPI_CR1_SPE; //281 Kbit @ 72 MHz SPI2->CR2 = SPI_CR2_RXDMAEN | SPI_CR2_TXDMAEN; //enable DMA support //setup ports //PortA GPIOA->ODR = PIN15 | PIN13 | PIN9 | PIN6; GPIOA->CRH = (IN_Pull << 28) | /* PIN15 */ (IN_Pull << 24) | /* PIN14 */ (IN_Pull << 20) | /* PIN13 */ (IN_Pull << 16) | /* PIN12 */ (IN_Pull << 12) | /* PIN11 */ (OUT_PP << 8) | /* PIN10 */ (OUT_PP << 4) | /* PIN9 */ (OUT_PP << 0); /* PIN8 */ GPIOA->CRL = (OUT_AltPP << 28) | /* PIN7 */ (OUT_PP << 24) | /* PIN6 */ (OUT_AltPP << 20) | /* PIN5 */ (IN_Pull << 16) | /* PIN4 */ (IN_Pull << 12) | /* PIN3 */ (IN_Pull << 8) | /* PIN2 */ (IN_Pull << 4) | /* PIN1 */ (IN_Pull << 0); /* PIN0 */ } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 июля, 2009 Опубликовано 13 июля, 2009 · Жалоба Кто то для инициализации пользуется фирменными библиотеками. Я привык работать напрямую с регистрами - делов-то (правда, для этого надо хорошенько "вкурить" мануал). Совсем необязательно для инициализации создавать отдельный файл - достаточно всего лишь одной функции. А регистры, адреса тоже должны быть где-то расписаны, например, в файле stm32f10x_map.h, который сам уже имеет немалый размер. Т.е. без библиотек не обойтись, наверное. Нужно включить файлик stm32f10x_lib.h, а остальное само прилепится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 13 июля, 2009 Опубликовано 13 июля, 2009 · Жалоба А регистры, адреса тоже должны быть где-то расписаны, например, в файле stm32f10x_map.h, который сам уже имеет немалый размер. Т.е. без библиотек не обойтись, наверное. Нужно включить файлик stm32f10x_lib.h, а остальное само прилепится. Я включил только stm32f10x_map.h, либа мне нафиг не нужна. Громоздкие вызовы, корявый код... Смотрите сами, как вам удобнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
baralgin 0 22 июля, 2009 Опубликовано 22 июля, 2009 · Жалоба >>Я включил только stm32f10x_map.h, либа мне нафиг не нужна. Навскидку, поискал в этом хидере SysTick_CTRL_ENABLE - нет такого. Нужно использовать stm32f10x.h (тот, который качать с st.com)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 сентября, 2009 Опубликовано 30 сентября, 2009 · Жалоба Докладываю, до чего дошел. Решил все-таки использовать библиотеку StdPeriph_Lib последней версии 3.1.0, скачанную с сайта ST. В ее составе идет файл помощи, на одной из страничек указано, как применять библиотеку. Особых сложностей нет - разобраться с предложенными структурами и функциями, и вызывать их по мере необходимости. Не обязательно все файлы забрасывать в свой проект, просто в опциях проекта нужно указать Include Path. Согласен, что функции работают не оптимально, зато, надеюсь, без ошибок. На примеры посматриваю. Doxygen скачал и установил. Создал шаблоны для заголовков файлов и функций, в виде, который понимает Doxygen. Пришлось слегка изменить своему стилю. После компиляции в Keil запускаю отладчик-симулятор, и наблюдаю за периферийными устройствами. Что-то работает, как должно, что-то нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться