Jag har äntligen lyckats hitta i referensmanualen vad DMAn tar hand om samt vad den inte gör.
Den tar inte automatiskt hand om conditions som måste settas, den skyfflar bara data mellan skicka/ta emot registren.
De gör att jag bara tjänar på att använda DMAn om jag ska skicka stora mängder data.
Pga detta så kommer jag skriva en interruptdriven I2C rutin som läser/skriver istället. De har jag gjort en gång förut så jag satsar på det igen.
Om någon har information eller exempelkod som kan vara av nytta så tar jag gärna och kikar på den!
SvenW:
Jag har kollat mycket på den och han följer alla konstens regler enligt referensmanualen för pollade överföringar. Så den borde fungera.

Den är riktigt bra att ha som referens då han har tagit hänsyn till att STM32F4ans I2C läsning inte är symmetrisk (olika metoder ska följas om man ska läsa en byte, två bytes eller fler än två bytes).
När det gäller CodeSourcery (numera CodeBench) så fungerar den för Cortex-M3 för den på Cortex-M4, det är samma. Man måste bara ha med/byta flaggorna -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -fsingle-precision-constant
Det ända som man måste tänka på är vid programmering via GDB så måste man manuellt reseta MCUn, GDB gör inte detta för någon konstig anledning.
Så men får stänga av den och sedan starta den igen. Jag drar ur strömkabeln och stoppar i den igen.
När det gäller makefile så kan du kolla på min och ta lite insperation från samt att du behöver stm32f4xx.cfg till OpenOCD.
stm32f4xx.cfg:
Kod: Markera allt
# Modified stm32f2xxx script to work with the st32f4
# run something like this to flash your board
# flash write_image erase demo.hex 0 ihex
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME stm32f4xxx
}
if { [info exists ENDIAN] } {
set _ENDIAN $ENDIAN
} else {
set _ENDIAN little
}
# Work-area is a space in RAM used for flash programming
# By default use 64kB
if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE $WORKAREASIZE
} else {
set _WORKAREASIZE 0x10000
}
# JTAG speed should be <= F_CPU/6. F_CPU after reset is 16MHz, so use F_JTAG = 2MHz
#
# Since we may be running of an RC oscilator, we crank down the speed a
# bit more to be on the safe side. Perhaps superstition, but if are
# running off a crystal, we can run closer to the limit. Note
# that there can be a pretty wide band where things are more or less stable.
jtag_khz 2000
jtag_nsrst_delay 100
jtag_ntrst_delay 100
#jtag scan chain
if { [info exists CPUTAPID ] } {
set _CPUTAPID $CPUTAPID
} else {
# See STM Document RM0033
# Section 32.6.3 - corresponds to Cortex-M3 r2p0
set _CPUTAPID 0x4ba00477
}
jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID
if { [info exists BSTAPID ] } {
set _BSTAPID $BSTAPID
} else {
# See STM Document RM0033
# Section 32.6.2
#
set _BSTAPID 0x06413041
}
jtag newtap $_CHIPNAME bs -irlen 5 -expected-id $_BSTAPID
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME cortex_m3 -endian $_ENDIAN -chain-position $_TARGETNAME
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME stm32f2x 0 0 0 0 $_TARGETNAME
Makefile:
Kod: Markera allt
#-------------------------------------------
# Makefile for STM32F4xx targets
# Author: (C) Emil Fresk
#-------------------------------------------
# External high speed crystal frequency
F_HSE = 12000000
# Use Standard Pheriphial Libraries (true = 1)
USE_STD_LIBS = 1
# Optimization
OPTIMIZATION = 2
# Build tools
GCC = arm-none-eabi-gcc
SIZE = arm-none-eabi-size
OBJDUMP = arm-none-eabi-objdump
OBJCOPY = arm-none-eabi-objcopy
# Flags
MCU = -mcpu=cortex-m4 -mthumb -g -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -fsingle-precision-constant
CFLAGS = $(COMMON) -std=gnu99 -O$(OPTIMIZATION) $(INCLUDE)
AFLAGS = $(COMMON) $(INCLUDE)
LDFLAGS = $(COMMON) -Tstm32f4x_flash.ld -Wl,--build-id=none,-Map=main.map
# StdLibs to use if wanted
STDLIBDIR = Libraries/STM32F4xx_StdPeriph_Driver/src/
CSTD = $(STDLIBDIR)stm32f4xx_gpio.c
CSTD += $(STDLIBDIR)stm32f4xx_exti.c
CSTD += $(STDLIBDIR)stm32f4xx_rcc.c
CSTD += $(STDLIBDIR)stm32f4xx_syscfg.c
CSTD += $(STDLIBDIR)stm32f4xx_tim.c
CSTD += $(STDLIBDIR)misc.c
# Sources
INCLUDE = -I./include -I./include/drivers -I./CMSIS -I./Libraries/STM32F4xx_StdPeriph_Driver/inc
CSRCS = $(wildcard CMSIS/*.c) $(wildcard source/*.c) $(wildcard source/drivers/*.c)
# FreeRTOS includes and source files
RTOS_DIR = ./FreeRTOS/
RTOS_PORT = $(RTOS_DIR)portable/GCC/ARM_CM4F/
RTOS_MEM = $(RTOS_DIR)portable/MemMang/
INCLUDE += -I$(RTOS_PORT) -I$(RTOS_DIR)include/
CSRCS += $(RTOS_DIR)list.c $(RTOS_DIR)tasks.c $(RTOS_DIR)queue.c $(RTOS_PORT)port.c $(RTOS_MEM)heap_1.c
# USB Libraries
USBLIB = $(wildcard Libraries/STM32_USB_Device_Library/Class/cdc/src/*.c)
USBLIB += $(wildcard Libraries/STM32_USB_Device_Library/Core/src/*.c)
USBLIB += $(wildcard Libraries/STM32_USB_OTG_Driver/src/*.c)
INCLUDE += -I./Libraries/STM32_USB_Device_Library/Class/cdc/inc
INCLUDE += -I./Libraries/STM32_USB_Device_Library/Core/inc
INCLUDE += -I./Libraries/STM32_USB_OTG_Driver/inc
CSTD += $(USBLIB)
# Include different source files depending on USE_STD_LIBS
ifeq ($(USE_STD_LIBS),1)
CSRCS += $(CSTD)
COMMON = $(MCU) -DHSE_VALUE=$(F_HSE) -DUSE_STDPERIPH_DRIVER -DUSE_USB_OTG_FS
else
COMMON = $(MCU) -DHSE_VALUE=$(F_HSE)
endif
ASRCS = $(wildcard CMSIS/*.s) $(wildcard source/*.s) $(wildcard source/drivers/*.s)
OBJECTS = $(ASRCS:.s=.o) $(CSRCS:.c=.o)
test:
@echo $(USBLIB)
@echo $(CSRCS)
dump: main.elf
@$(OBJDUMP) -D main.elf > main.dump
@echo "main.dump created"
bin: main.elf
@$(OBJCOPY) -O binary main.elf main.bin
@echo "main.bin created"
all: main.elf
@echo
@echo "Size:"
@$(SIZE) main.elf
main.elf: $(OBJECTS)
$(GCC) $(LDFLAGS) $(OBJECTS) -o main.elf
clean:
rm -f $(OBJECTS) *.elf *.bin *.dump *.map *.*~
@echo
.c.o:
$(GCC) $(CFLAGS) -c $< -o $(<:.c=.o)
@echo
.s.o:
$(GCC) -c $(AFLAGS) -o $(<:.s=.o) $<
@echo