Зажги светодиод на STM32F103C8T6

Я пытаюсь зажечь светодиод (на порту c, контакт 13) на STM32F103C8T6. Я не использую IDE. Код:

#include "include/stm32f10x.h"

int main()
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

    GPIOC->CRH  &= ~GPIO_CRH_CNF13;
    GPIOC->CRH  |=  GPIO_CRH_MODE13_0;

    GPIOC->BSRR  = GPIO_BSRR_BR13;

    while(1)
    {
        GPIOC->BSRR = GPIO_BSRR_BS13;
    }

    return 0;
}

Ссылки для включения файлов в каталог include:

system_stm32f10x.h

core_cmInstr.h

core_cmFunc.h

core_cm3.h

stm32f10x.h часть1

stm32f10x.h part2

Вот как я это скомпилирую

arm-none-eabi-gcc --specs=nosys.specs -o output led.c

После загрузки его в mc ничего не происходит.

1 ответ

Решение

Чтобы зажечь светодиод на синей таблетке, вам нужен низкий уровень PC13 (сброс), поэтому запишите бит сброса 13, установленный в регистре gpioc bsrr, а затем завершите программу, сделав линию gpio высокой, отключив светодиод.

#include "include/stm32f10x.h"

int main()
{
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

    GPIOC->CRH  &= ~GPIO_CRH_CNF13;
    GPIOC->CRH  |=  GPIO_CRH_MODE13_0;

    GPIOC->BSRR  = GPIO_BSRR_BR13;

    while(1)
    {
        continue;
    }

    return 0;
}

Просто посмотрите на схему.

Поймите, это не универсальная истина о том, что низко. Вы должны посмотреть на дизайн платы. Кроме того, не все чипы stm32f103c8t6 имеют светодиод на этом выводе, но я предполагаю, что это плата stm32 "blue pill".

РЕДАКТИРОВАТЬ

полный рабочий пример блинкера для этой доски

flash.ld

MEMORY
{
    rom : ORIGIN = 0x08000000, LENGTH = 0x1000
    ram : ORIGIN = 0x20000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > rom
    .rodata : { *(.rodata*) } > rom
    .bss : { *(.bss*) } > ram
}

flash.s

.cpu cortex-m0
.thumb


.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang

.thumb_func
reset:
    bl notmain
    b hang
.thumb_func
hang:   b .

.align

.thumb_func
.globl PUT16
PUT16:
    strh r1,[r0]
    bx lr

.thumb_func
.globl PUT32
PUT32:
    str r1,[r0]
    bx lr

.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr

.thumb_func
.globl dummy
dummy:
    bx lr

.end

blinker01.c

void PUT32 ( unsigned int, unsigned int );
unsigned int GET32 ( unsigned int );
void dummy ( unsigned int );

#define GPIOCBASE 0x40011000
#define RCCBASE 0x40021000

int notmain ( void )
{
    unsigned int ra;
    unsigned int rx;

    ra=GET32(RCCBASE+0x18);
    ra|=1<<4; //enable port c
    PUT32(RCCBASE+0x18,ra);
    //config
    ra=GET32(GPIOCBASE+0x04);
    ra&=~(3<<20);   //PC13
    ra|=1<<20;      //PC13
    ra&=~(3<<22);   //PC13
    ra|=0<<22;      //PC13
    PUT32(GPIOCBASE+0x04,ra);

    for(rx=0;;rx++)
    {
        PUT32(GPIOCBASE+0x10,1<<(13+0));
        for(ra=0;ra<200000;ra++) dummy(ra);
        PUT32(GPIOCBASE+0x10,1<<(13+16));
        for(ra=0;ra<200000;ra++) dummy(ra);
    }
    return(0);
}

строить

arm-none-eabi-as --warn --fatal-warnings -mcpu=cortex-m3 flash.s -o flash.o
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding  -mthumb -mcpu=cortex-m0 -march=armv6-m -c blinker01.c -o blinker01.thumb.o
arm-none-eabi-ld -o blinker01.thumb.elf -T flash.ld flash.o blinker01.thumb.o
arm-none-eabi-objdump -D blinker01.thumb.elf > blinker01.thumb.list
arm-none-eabi-objcopy blinker01.thumb.elf blinker01.thumb.bin -O binary
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding  -mthumb -mcpu=cortex-m3 -march=armv7-m -c blinker01.c -o blinker01.thumb2.o
arm-none-eabi-ld -o blinker01.thumb2.elf -T flash.ld flash.o blinker01.thumb2.o
arm-none-eabi-objdump -D blinker01.thumb2.elf > blinker01.thumb2.list
arm-none-eabi-objcopy blinker01.thumb2.elf blinker01.thumb2.bin -O binary

строит как с расширениями thumb2, так и без них (flash.s не должен быть только thumb, только остатки из предыдущих примеров).

теперь какой файл и как вы загружаете его в mcu? загрузка эльфа не приносит пользы, так как нет операционной системы, но в зависимости от используемого вами инструмента она может прочитать эльф и загрузить загружаемые части. Я написал свой собственный инструмент, так как он очень прост для взаимодействия с интерфейсом загрузчика UART. Я также использовал openocd с различными интерфейсами swd/jtag (stlink, j-link), чтобы написать их. Они приходят из Азии заблокированными, поэтому в первый раз, когда вам нужно их разблокировать, знайте, что вы можете сделать это через интерфейс UART, я уверен, что я понял это и из openocd...

Так что либо ваша бинарная сборка плохая / не правильно загружается, либо проблема в загрузке (или в обоих случаях).

флэш-память в stm32 отображается на 0x08000000, они повторно отображают ее на 0x00000000, если / при загрузке из приложения. Должен быть в состоянии использовать также 0x00000000, но большинство из них я видел использование 0x08000000. Как задокументировано, первое слово загружается в указатель стека при сбросе, второе слово является адресом большого пальца для вектора сброса (lsbit установлен для указания большого пальца, поэтому 0x41 ниже означает, что вектор сброса находится по адресу 0x40, как показано)

08000000 <_start>:
 8000000:   20001000    andcs   r1, r0, r0
 8000004:   08000041    stmdaeq r0, {r0, r6}
 8000008:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800000c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000010:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000014:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000018:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800001c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000020:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000024:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000028:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800002c:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000030:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000034:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 8000038:   08000047    stmdaeq r0, {r0, r1, r2, r6}
 800003c:   08000047    stmdaeq r0, {r0, r1, r2, r6}

08000040 <reset>:
 8000040:   f000 f80a   bl  8000058 <notmain>
 8000044:   e7ff        b.n 8000046 <hang>

08000046 <hang>:
 8000046:   e7fe        b.n 8000046 <hang>

Вы должны решить эту проблему для начала, затем, если у вас есть что-то с возможностью загрузки, вы можете посмотреть код.

Другие вопросы по тегам