完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
2个回答
|
|
一、stm32标准库工程结构
下面是正点原子标准库串口例程的工程结构,本节将以此工程为例子介绍stm32工程的组织结构和各个文件的功能。 ├─CORE ├─HARDWARE │ ├─KEY │ └─LED ├─OBJ ├─STM32F10x_FWLib │ ├─inc │ └─src ├─SYSTEM │ ├─delay │ ├─sys │ └─usart └─USER └─DebugConfig CORE文件夹 core_cm3.c core_cm3.h startup_stm32f10x_hd.s core_cm3.c,core_cm3.h 这两个文件提供了cotex-M3内核的寄存器定义和一些内核指令和函数。也包含一些数据类型的定义。
HARDWARE文件夹 这个大家应该很熟悉,里面是用户编写的外设驱动 STM32F10x_FWLib文件夹 这里面是标准外设库的寄存器定义和操作函数 SYSTEM文件夹 这个是正点原子自己编写的一些库,便于开发的 USER文件夹 main.c stm32f10x.h stm32f10x_conf.h stm32f10x_it.c stm32f10x_it.h system_stm32f10x.c system_stm32f10x.h
了解了stm32工程的基本组成后,本节我们将自己构建一个新工程。 1、工程准备
│ Makefile │ README.TXT │ stm32_flash.ld │ ├─BUILD ├─CORE │ core_cm3.c │ core_cm3.h │ startup_stm32f10x_hd.s │ ├─HARDWARE │ ├─KEY │ │ key.c │ │ key.h │ │ │ └─LED │ led.c │ led.h │ ├─STM32F10x_FWLib │ ├─inc │ │ misc.h │ │ stm32f10x_adc.h │ │ stm32f10x_bkp.h │ │ stm32f10x_can.h │ │ stm32f10x_cec.h │ │ stm32f10x_crc.h │ │ stm32f10x_dac.h │ │ stm32f10x_dbgmcu.h │ │ stm32f10x_dma.h │ │ stm32f10x_exti.h │ │ stm32f10x_flash.h │ │ stm32f10x_fsmc.h │ │ stm32f10x_gpio.h │ │ stm32f10x_i2c.h │ │ stm32f10x_iwdg.h │ │ stm32f10x_pwr.h │ │ stm32f10x_rcc.h │ │ stm32f10x_rtc.h │ │ stm32f10x_sdio.h │ │ stm32f10x_spi.h │ │ stm32f10x_tim.h │ │ stm32f10x_usart.h │ │ stm32f10x_wwdg.h │ │ │ └─src │ misc.c │ stm32f10x_adc.c │ stm32f10x_bkp.c │ stm32f10x_can.c │ stm32f10x_cec.c │ stm32f10x_crc.c │ stm32f10x_dac.c │ stm32f10x_dbgmcu.c │ stm32f10x_dma.c │ stm32f10x_exti.c │ stm32f10x_flash.c │ stm32f10x_fsmc.c │ stm32f10x_gpio.c │ stm32f10x_i2c.c │ stm32f10x_iwdg.c │ stm32f10x_pwr.c │ stm32f10x_rcc.c │ stm32f10x_rtc.c │ stm32f10x_sdio.c │ stm32f10x_spi.c │ stm32f10x_tim.c │ stm32f10x_usart.c │ stm32f10x_wwdg.c │ ├─SYSTEM │ ├─delay │ │ delay.c │ │ delay.h │ │ │ ├─sys │ │ sys.h │ │ │ └─usart │ usart.c │ usart.h │ └─USER main.c stm32f10x.h stm32f10x_conf.h system_stm32f10x.c system_stm32f10x.h
int main(void) { while(1) { } return 0; } 2、Makefile模板 这里直接提供一个Makefile模板并做简要介绍,有兴趣和能力的读者可以自行编写,或者使用cmake生成。 # 假目标,用于清除编译生成的中间文件 .PHONY: clean ####################################### # binaries ####################################### #指定使用的编译器 PREFIX = arm-none-eabi- # The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx) # either it can be added to the PATH environment variable. ifdef GCC_PATH CC = $(GCC_PATH)/$(PREFIX)gcc AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp CP = $(GCC_PATH)/$(PREFIX)objcopy SZ = $(GCC_PATH)/$(PREFIX)size else CC = $(PREFIX)gcc AS = $(PREFIX)gcc -x assembler-with-cpp CP = $(PREFIX)objcopy SZ = $(PREFIX)size endif HEX = $(CP) -O ihex BIN = $(CP) -O binary -S #指定openocd的配置文件,当更换下载器时需要修改这里的内容 #openocd OCD_INTERFACE =interface/stlink-v2.cfg OCD_TARGET =target/stm32f1x_stlink.cfg ###################################### # target ###################################### # 生成的hex文件名字 TARGET = stm32makefileTemplate # macros for gcc # AS defines AS_DEFS = # 宏定义,在keil中也有这两个宏,作用同keil # C defines C_DEFS = -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER ###################################### # building variables ###################################### # debug build? DEBUG = 1 # optimization OPT = -Og ####################################### # paths ####################################### #指定输出路径 # Build path BUILD_DIR = BUILD # AS includes AS_INCLUDES = #指定头文件包含路径,作用同keil # C includes C_INCLUDES = -ICORE -IUSER -IHARDWARE/LED -ISYSTEM/delay -ISYSTEM/sys -ISYSTEM/usart -ISTM32F10x_FWLib/inc ###################################### # source ###################################### #指定启动文件 # ASM sources ASM_SOURCES = CORE/startup_stm32f10x_hd.s #指定c文件,需要增减时修改 # C sources #CORE C_SOURCES = CORE/core_cm3.c #ST C_SOURCES += USER/system_stm32f10x.c STM32F10x_FWLib/src/stm32f10x_rcc.c STM32F10x_FWLib/src/misc.c STM32F10x_FWLib/src/stm32f10x_gpio.c STM32F10x_FWLib/src/stm32f10x_usart.c #USER C_SOURCES += USER/main.c SYSTEM/delay/delay.c SYSTEM/usart/usart.c HARDWARE/LED/led.c ####################################### # LDFLAGS ####################################### #指定链接文件 # link script LDSCRIPT = stm32_flash.ld #指定使用的链接库和库目录 # libraries LIBS = -lc -lm -lnosys LIBDIR = ####################################### # CFLAGS ####################################### #指定内核架构 # cpu CPU = -mcpu=cortex-m3 # fpu # NONE for Cortex-M0/M0+/M3 # float-abi # mcu MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) # compile gcc flags ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections ifeq ($(DEBUG), 1) CFLAGS += -g -gdwarf-2 endif #生成依赖信息 # Generate dependency information CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections # default action: build all all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin #开始编译 ####################################### # build the application ####################################### # list of objects OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o))) vpath %.c $(sort $(dir $(C_SOURCES))) # list of ASM program objects OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o))) vpath %.s $(sort $(dir $(ASM_SOURCES))) $(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@ $(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR) $(AS) -c $(CFLAGS) $< -o $@ $(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile $(CC) $(OBJECTS) $(LDFLAGS) -o $@ $(SZ) $@ $(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(HEX) $< $@ $(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR) $(BIN) $< $@ $(BUILD_DIR): mkdir $@ ####################################### # clean up ####################################### #清除中间文件 clean: del BUILD*.* /q ########################## # write to flash ########################## #烧录命令,这里集成到了makefile中 write: openocd -f $(OCD_INTERFACE) -f $(OCD_TARGET) -c init -c halt -c "flash write_image erase $(BUILD_DIR)/$(TARGET).hex" -c reset -c shutdown ####################################### # dependencies ####################################### -include $(wildcard $(BUILD_DIR)/*.d) # *** EOF *** 注意这里没有添加usart.c,因为正点原子实现串口printf用到了keil的microlib,arm-gcc没有这个库,所以要实现串口printf需要使用其他方法。 3、修改core_m3.c 找到core_cm3.c 736行改为: __ASMvolatile(“strexb%0,%2,[%1]”:"=&r"(result):“r”(addr),“r”(value)); 753行改为: __ASMvolatile(“strexh%0,%2,[%1]”:"=&r"(result):“r”(addr),“r”(value)); 4、编译烧录 使用vscode打开新建的工程文件夹,在vscode中打开终端,输入make进行编译,如果提示路径错误,请检查终端的工作路径是不是在stm32工程路径下。 最终输出以下结果表明编译成功 arm-none-eabi-size BUILD/stm32makefileTemplate.elf text data bss dec hex filename 3024 32 504 3560 de8 BUILD/stm32makefileTemplate.elf arm-none-eabi-objcopy -O ihex BUILD/stm32makefileTemplate.elf BUILD/stm32makefileTemplate.hex arm-none-eabi-objcopy -O binary -S BUILD/stm32makefileTemplate.elf BUILD/stm32makefileTemplate.bin |
|
|
|
三、移植xprintf
上面提到arm-gcc不能像keil那样实现printf,所以这里借用了第三方组件xprintf,详情见官网【嵌入式字符串函数】
#include "sys.h" #include "usart.h" #include "xprintf.h" // /* 串口1初始化 */ // // #if EN_USART1_RX //如果使能了接收 //串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART_RX_STA=0; //接收状态标记 void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(USART1, ENABLE); //使能串口1 //绑定xprintf xdev_out(uart_putc); } void uart_putc(char c) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) c; } void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } } #endif |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1936浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
729浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
569浏览 3评论
594浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
552浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:50 , Processed in 0.910024 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号