Начинаю писать для STM32 в Keil uVision3. Понятно, что будет файл типа main.c. А что вызывать из него для инициализации процессора? startup_stm32f10x_hd.s - инициализация стека и таблица векторов прерываний. А дальше? В каталоге Keil\ARM\Boards\ST\EK-STM32F есть примеры, в которых в файлах STM32_Init.c есть Configuration Wizard, в котором можно настроить всю периферию, частоты, и т.д. А в библиотеке stm32f10x_stdperiph_lib, скачанной с сайта ST, ничего подобного нет. Да и изменить в них ничего нельзя, у них атрибут "только для чтения". Что же, использовать их только как пример, писать свои файлы? Подскажите примерную структуру проекта, а то накидал файлов, что уже заблудился в них.
Коль никто не ответил, попробую ответить себе сам:
Не е** мозги, напиши свою инициализацию, назови файл, к примеру, Init_STM32.c, и по-порядочку, задай работу генераторов, прерываний, памяти... все, что вычитаешь в datashet и в примерах. Для описания регистров, битов, структур создай отдельный заголовочный файл, тоже на основе готовых, например stm32f10x.h. Тогда и в периферии быстрее разберешься. И всех делов. Тебе ж не нужна некая универсальная инициализация, что приведена в библиотеках.
sonycman
Jul 13 2009, 11:05
Кто то для инициализации пользуется фирменными библиотеками.
Я привык работать напрямую с регистрами - делов-то (правда, для этого надо хорошенько "вкурить" мануал).
Совсем необязательно для инициализации создавать отдельный файл - достаточно всего лишь одной функции.
Например:
CODE
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 */
}
Цитата(sonycman @ Jul 13 2009, 14:05)

Кто то для инициализации пользуется фирменными библиотеками.
Я привык работать напрямую с регистрами - делов-то (правда, для этого надо хорошенько "вкурить" мануал).
Совсем необязательно для инициализации создавать отдельный файл - достаточно всего лишь одной функции.
А регистры, адреса тоже должны быть где-то расписаны, например, в файле stm32f10x_map.h, который сам уже имеет немалый размер.
Т.е. без библиотек не обойтись, наверное. Нужно включить файлик stm32f10x_lib.h, а остальное само прилепится.
sonycman
Jul 13 2009, 12:39
Цитата(ViKo @ Jul 13 2009, 17:30)

А регистры, адреса тоже должны быть где-то расписаны, например, в файле stm32f10x_map.h, который сам уже имеет немалый размер.
Т.е. без библиотек не обойтись, наверное. Нужно включить файлик stm32f10x_lib.h, а остальное само прилепится.
Я включил только stm32f10x_map.h, либа мне нафиг не нужна.
Громоздкие вызовы, корявый код...
Смотрите сами, как вам удобнее.
baralgin
Jul 22 2009, 12:43
>>Я включил только stm32f10x_map.h, либа мне нафиг не нужна.
Навскидку, поискал в этом хидере SysTick_CTRL_ENABLE - нет такого. Нужно использовать stm32f10x.h (тот, который качать с st.com)?
Докладываю, до чего дошел.
Решил все-таки использовать библиотеку StdPeriph_Lib последней версии 3.1.0, скачанную с сайта ST. В ее составе идет файл помощи, на одной из страничек указано, как применять библиотеку. Особых сложностей нет - разобраться с предложенными структурами и функциями, и вызывать их по мере необходимости. Не обязательно все файлы забрасывать в свой проект, просто в опциях проекта нужно указать Include Path. Согласен, что функции работают не оптимально, зато, надеюсь, без ошибок. На примеры посматриваю. Doxygen скачал и установил. Создал шаблоны для заголовков файлов и функций, в виде, который понимает Doxygen. Пришлось слегка изменить своему стилю.
После компиляции в Keil запускаю отладчик-симулятор, и наблюдаю за периферийными устройствами. Что-то работает, как должно, что-то нет.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.