目录
一、串口通信实验
1.1 硬件原理图
1.2 相关寄存器
UART1时钟源:CCM_CSCDR1寄存器。
初始化UART:
UART1_UCR1:使能UART1、设置自动波特率(很少使用,直接禁用)。
UART1_UCR2:设置串口的发送帧格式。
奇偶校验位、软件复位。
数据长度。
发送完成标志、数据接收标志。
发送使能、接收使能。
UART1_UCR3:bit2置一,官方要求设置。
UART1_UFCR:时钟分频、发送与接收的fifo大小。
UART1_UBIR、UART1_UBMR:波特率。
波特率 = 时钟分频后的值 / (16 * (UBMR + 1)/(UBIR + 1))
收发数据:
UART1_UTXD:发送一个字符。
UART1_URXD:接收一个字符。
1.3 Makefile修改
官方SDK的设置波特率函数使用了除法,需要提供gcc除法库。
LIBPATH := -lgcc -static -L/usr/lib/gcc/arm-none-eabi/6.3.1
-lgcc:表示链接libgcc.a库。
-static -L:表示静态库所在路径。
#ARCH?=x86
ifeq ($(ARCH),x86)
CC=gcc
else
CC=arm-none-eabi-gcc
LD=arm-none-eabi-ld
OBJCOPY=arm-none-eabi-objcopy
endif
TARGET=test
BUILD_DIR=build
SRC_DIR=module/project \
module/common \
module/irq \
module/led \
module/btn \
module/clock \
module/uart
INC_DIR=include \
module/common \
module/irq \
module/led \
module/btn \
module/clock \
module/uart
CFLAGS=$(patsubst %,-I %,$(INC_DIR))
INCLUDES=$(foreach dir,$(INC_DIR),$(wildcard $(dir)/*.h))
LIBPATH := -lgcc -static -L/usr/lib/gcc/arm-none-eabi/6.3.1
SOURCE_c=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.c))
SOURCE_s=$(foreach dir,$(SRC_DIR),$(wildcard $(dir)/*.s))
OBJS=$(patsubst %.c,$(BUILD_DIR)/%.o,$(notdir $(SOURCE_c)))
OBJS+=$(patsubst %.s,$(BUILD_DIR)/%.o,$(notdir $(SOURCE_s)))
VPATH=$(SRC_DIR)
$(BUILD_DIR)/$(TARGET).bin:$(OBJS)
$(LD) -Tscript.lds -o $(BUILD_DIR)/$(TARGET).elf $^ $(LIBPATH)
$(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $@
$(BUILD_DIR)/%.o:%.c $(INCLUDES) | create_build
$(CC) -c $< -o $@ $(CFLAGS)
#编译汇编文件
$(BUILD_DIR)/%.o:%.s $(INCLUDES) | create_build
$(CC) -c $< -o $@ $(CFLAGS)
.PHONY:clean create_build burn
clean:
rm -r $(BUILD_DIR)
create_build:
mkdir -p $(BUILD_DIR)
burn:
# cp $(BUILD_DIR)/$(TARGET).bin /mnt/hgfs/Share\ File\ Pack/Embedfire\ IMX\ download\ Tools/download_tool
cd ../Embedfire\ IMX\ download\ Tools/download_tool && ./mkimage.sh ../../test1/$(BUILD_DIR)/$(TARGET).bin