вторник, 20 марта 2012 г.

I & STM32F4-discovery part6 - blinking leds part2

Продолжая раскрывать тему мигания светодиодами, в этой статье мы собственно будем ими мигать. Т.к. это не такая сложна задача то статья собственно получилась достаточно короткая. Итак добро пожаловать под кат



Подробно рассматривать систему тактирования мы будем в одной из следующих статей, а пока отметим что после сброса мк по умолчанию работает от внутреннего источника тактов с частотой ~16 МГц. Почему примерно, а потому что такова природа этого генератора, что частота зависит от температуры мк и напряжения питания, поэтому она и плавает. Не сильно но достаточно, поэтому при разработке не стоит этого забывать.

Итак приступим к написанию кода. Для этого перейдем в наш проект:

nis@jane ~ $ cd stm32/f4examples/00-blink-led/
nis@jane ~/stm32/f4examples/00-blink-led $

И добавим в файл main.c функцию задержки:

/* Simple delay function */
void delay_ms(unsigned int delay) {
    volatile unsigned int delay_tick = delay * 4000;
    while (delay_tick--);
}

Здесь идет умножение значения задержки в милисикундах на 4000 тактов, это число означает примерное число циклов на столько проходов цикла while сколько потребовалось чтобы сделать задержку в 1 мс. Заодно модифицируем main.h, добавив еще одну константу дабы сократить размер кода:

#define ALL_LEDS (LED_GREEN | LED_ORANGE | LED_BLUE | LED_RED)

После этого изменим основную функцию - main:

/* Main function */
void main(void) {
    /* enable i/o port D clocking */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
    /* setup i/o port D to output - push/pull mode */
    LED_PORT->MODER |= GPIO_MODER_MODER12_0 | GPIO_MODER_MODER13_0 |
        GPIO_MODER_MODER14_0 | GPIO_MODER_MODER15_0;
    /* enable leds on D port */
    LED_PORT->ODR |= ALL_LEDS;
    /* infinity loop */
    while (1) {
        delay_ms(500);
        LED_PORT->ODR ^= ALL_LEDS;
    }
}

Осталось только собрать проект:

nis@jane ~/stm32/f4examples/00-blink-led $ make
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F4XX -I. -I../../stlink/example/libs_stm/inc/base -I../../stlink/example/libs_stm/inc/core_support -I../../stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f4xxxg_flash.ld   -c -o main.o main.c
arm-softfloat-linux-gnueabi-gcc -g -O2 -mlittle-endian -mthumb -ffreestanding -nostdlib -nostdinc -mcpu=cortex-m3 -DSTM32F4XX -I. -I../../stlink/example/libs_stm/inc/base -I../../stlink/example/libs_stm/inc/core_support -I../../stlink/example/libs_stm/inc/device_support -Wl,-T,stm32f4xxxg_flash.ld -o firmware.elf main.o startup.o -L.
arm-softfloat-linux-gnueabi-objcopy -O binary firmware.elf firmware.bin

И залить прошивку в мк:

nis@jane ~/stm32/f4examples/00-blink-led $ make write
qstlink2 -cewV ./firmware.bin
Verbose level: 2
Info: Devices list loaded.
Info: File Path: "./firmware.bin"
Info: Erasing: true
Info: Writing: true
Info: Found an ST Link V2.
Info: Opening device...
Info: Device Open.
Info: ChipID: "413"
Info: Device type:  "STM32F4**"
Info: Verify not yet implemented.
Info: Writing from "8000000" to "8000074"
Info: Erasing flash... This might take some time.
Info: Transfer done
Info: Disconnected. 

Видео работы примера:

Начиная с этой статьи все исходные коды проектов для stm32f4-discovery хранятся на ГитХабе, адрес моего проекта - git@github.com:no111u3/stm32f4examples.git

для того чтобы скачать свежую версию необходимо из корневой папки примеров выполнить:

nis@jane ~/stm32/f4examples $ nis@jane git clone git@github.com:no111u3/stm32f4examples.git

После этого у нас должен появится первый пример:

nis@jane ~/stm32/f4examples $ ll
итого 4
drwxr-xr-x 2 nis nis 4096 марта 20 11:25 00-blink-led

Продолжение следует...