【STM32F407】Note_01 STM32 编程环境搭建 -- Keil与VS code组合

1. 引言

在使用进行STM32F407开发的时候,一般被推荐使用的是Keil。经过一整子的Keil洗礼,我真的要崩溃了,在界面、调试、代码跳转、代码格式化、开发效率等方面一直很抓狂。之前一直使用vs code开发,用着还蛮顺心,界面风格很讨人喜欢。因此,尝试在vs code上进行STM32开发。接下来主要讲述个人将Keil和vs code环境搭建问题以及一些小Tips。


2. 环境搭建

2.1 Keil环境搭建

2.1.1 Keil安装

关于Keil程序的安装,网上已经有很多优秀的教程,此处贴出不错的博文。Keil的下载地址为https://www.keil.com/download/product/,其中会看到MDK-ARM,C51,C251,C166,关于他们的区别可以查看链接Keil 5(C51, MDK) 官方下载方法。若使用的板子是STM32,则选择MDK-ARM,若是51系列的开发板,则选择C51,根据个人所需,选择合适的版本(本人一般使用STM32F407,所以选择MDK-ARM)。安装之后需要对其进行破解,安装及破解步骤可参考链接Keil5的安装破解方法

2.1.2 Keil魔术棒设置

打开Keil,找到菜单栏Pproject -> New uVersion Project...创建一个新的工程项目,随意命名(最好不要包含中文字符)并保存在一个新建的文件夹中,之后会弹出提示框选择芯片,搜索自己想要的芯片即可。

将在新创建的文件夹下得到如下图所示:

程序自动创建ListingsObjectsDebugConfig三个文件夹。前两个是我们在日常开发中需要关心的。Listings存放编译过程的中间文件,Objects存放编译结果的文件,所生成的.hex将会在这找到。

接下来重点就是魔术棒的设置。

  1. 首先找到魔术棒的位置,如图所示。

  2. Target设置

    这里主要选择合适的编译器,根据自己MDK版本选择合适编译器即可。

  3. Output设置

    这里的设置将会影响到编译过程中所产生文件的存放位置以及生成的文件名。Select Folder for Objects...选择某个文件夹存放编译结果。这里可不用修改,编译结结果存放在当前工程目录的Objects里。Name of Excuetable设置生成将要烧写进开发板里的文件名。还要注意,要将Create GEX File勾选上,产生.hex文件,方便后续程序烧写。

  4. Listing设置

    这里的设置主要会影响编译过程中间文件的存放位置,默认存放在当前工程目录下的Listings里。

  5. C/C++设置

    这里是最重要的设置。

    一个是预编译器符号,另一个是头文件的路径。Preprocessor Sysbols设置两个宏函数,分别为USE_STDPERIPH_DRIVERSTM32F40_41xxx。这两个文件的目的就是配置程序正确使用对应芯片的相关外设头文件和源文件。这两个参数对应的标准库的文件为stm32f4xx.hstm32f4xx_conf.h。使用stm32f407的芯片需要配置这两个参数。

    另一个是头文件的添加。Keil编译器和以往用的编译器不一样,即使在工程目录创建的头文件和源文件,依然要在Keil工作界面添加源文件和头文件的路径。下图是我某个工程的头文件路径,仅作参考。关于其中不同路径下的文件,我将在项目模版中进行一一说明。

  6. Debug设置

    通过画圈的位置选择合适的仿真器,因为我是用的是野火的stm32f407开发板,他们送的是DAP仿真器,因此选择CMISI-DAP即可。根据个人喜好勾选Run to main(),每当烧写完成,程序会自动运行main函数。通过Setting,设置仿真器的配置。

    这是主要设置Flash Download配置,勾选Reset and Run,当程序烧写完毕,开发板会复位启动。

    关于魔术棒的设置基本就是这些。

2.1.3 项目模版说明

如图所示,一个ARM工程的基本模板如下:

  • App

    主要存放用户的模块文件,例如呼吸灯、ADC等文件。

  • Doc

    存放工程的说明文档或一些其他技术文档。

  • Libraries

    这里才存放的就是STM32外设库STM32F4xx_StdPeriph_Driver以及芯片驱动文件CMSIS,包括启动文件、库源码及头文件。这个文件可以在官网进行下载。

    链接:STM32F4 DSP和标准外设库(https://www.st.com/zh/embedded-software/stsw-stm32065.html#overview)

    概述页下拉,选择合适的版本即可。

    解压得到

    我们只需将Libraries复制到我们的工程目录下即可。

  • User

    主要存放main.hmain.cstm32f4xx_conf.hstm32f4xx_it.hstm32f4xx_it.c,后面三个文件是stm32的中断配置以及芯片配置的头文件和源文件。用户的中断函数一般在stm32f4xx_it.hstm32f4xx_it.c中实现。这几个从STM32F4xx_DSP_StdPeriph_Lib_V1.8.0/Project/STM32F4xx_StdPeriph_Templates/中找到直接幅复制到工程目录下的User文件下即可。

最终的结果如下:

2.1.4 Keil IDE工程文件创建

Keil IDE的工程目录和项目目录有些差别,但是Keil IDE的工程文件源头都是项目中。创建方法是选择Target -> Manager Project Items,在Groups中一次添加相关文件,如下所示分别创建几个目录:

  • STARPUP

    整个项目的启动文件startup_stm32f40xx.s。这个在目录Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\中,因为所使用的芯片是ARM,选择ARM目录下的相应的启动文件。除了ARM,还有gcc_ride7、iar等编译器的启动文件。

  • App

    这里为用户创建的相关应用源文件,在项目工程中导入即可。

  • CMSIS

    这里导入的是芯片的库源程序,主要导入system_stm32f4xx.c即可,这个函数涉及系统初始化、系统时钟初始化、外部存储扩展等核心函数,在目录Libraries\CMSIS\E:\ARM_workspace\05\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates下。

  • StdDrive

    这里将芯片外设的源文件全部导入即可。将Libraries\STM32F4xx_StdPeriph_Driver\src\里的所有源文件导入。

  • User

    导入main.c程序入口以及中断配置文件stm32f4xx_it.c即可。

最终效果如下:

添加完之后,还需要设置相关的头文件路径。

注意:编译的过程中会遇到如下错误,提示FMC_XXX未定义,此时将StdDriver中的stm32f4xx_fmc.c删除即可。

2.2 Vs code环境搭建

2.2.1 vs code安装

关于User和 System的版本区别,建议参考这篇文章VS Code User和System版区别_devxzh的博客-程序员秘密_vscode的user和system。个人推荐使用System版本。

2.2.2 vs code常用插件

  • KeilAssistant及设置

    打开vs code,步骤1点击插件按钮,然后搜索关键字,选择Keil Assistant进行安装,最后一步,也是最关键的一步是配置Keil的启动路径。点击步骤5中设置按钮,得到如下图:

    依次配置Keil的启动可执行文件即可。至此,用vs code从工程目录打开,即可看到Keil选项。

    这个插件允许我们对Keil项目进行编译和烧写。

    在vs code对代码的改动,会依次同步到Keil环 IDE相应源码的改动。前提:改动的源码已经被添加到Keil IDE中。图中Target1项目本人并有没有添加相关的源文件,因此此时我改动main.c并故意写了一个bug,Keil IDE并没有main.c源文件,编译(图中画圈的地方从左至右分别为 Build、Download to Device、Rebuild)Keil程序并没有报错。

    注意:因为本人已经安装号Keil Assistant,因此步骤4中的安装按钮显示为卸载

    如上述步骤,依次安装Chinese翻译、Intelligent 代码提示、C/C++等插件。这些插件根据需要进行相关设置。

3 Tips

  • Tip1 快速注释

    可以通过设置->用户代码->c.json,创建快捷键注释模版

    当我们在代码中打出prefix字符时,IDE自动提示prefixVar,选择prefixVar,就会出现注释模版,这个极大提高工作效率。

  • vs code识别c和c++的问题

    因为vs code不区分C和C++,当创建某个c文件的时候,vs code自动识别为c++。一般识别为C++文件,用快捷键注释就出现问题。

    为此,为了将文件文件识别为C文件,在setting.json中添加如下代码即可。

总结

本文写得比较粗糙,排版很有很多需要学习的地方。若内容如有不对的地方,欢迎在评论区指正。

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Keil 5上编程与HC-05连接的代码,您需要按照以下步骤进行操作: 1. 配置串口: 在Keil 5中,打开您的工程文件,到相应的源文件(如main.c),在其中添加串口配置代码。首先,您需要包含适当的头文件,如stm32f4xx.h和stdio.h。然后,根据您的需求选择合适的串口和波特率进行配置,例如: ```c #include "stm32f4xx.h" #include <stdio.h> void UART_Config(void) { // 使能串口时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // 配置串口引脚 GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); // USART3_TX GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3); // USART3_RX GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOB, &GPIO_InitStruct); // 配置串口参数 USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate = 9600; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStruct); // 使能串口 USART_Cmd(USART3, ENABLE); } ``` 2. 编写与HC-05通信的代码: 您可以使用串口发送和接收函数来与HC-05进行通信。例如,如果您想要发送数据到HC-05,可以使用以下代码: ```c void UART_SendChar(char c) { while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); USART_SendData(USART3, c); } void UART_SendString(char* str) { while (*str) { UART_SendChar(*str++); } } ``` 要接收来自HC-05的数据,您可以使用以下代码: ```c char UART_ReceiveChar(void) { while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET); return USART_ReceiveData(USART3); } void UART_ReceiveString(char* buffer, int maxLength) { int count = 0; char c; while (count < maxLength) { c = UART_ReceiveChar(); if (c == '\r' || c == '\n') { break; } buffer[count++] = c; } buffer[count] = '\0'; } ``` 3. 使用上述函数与HC-05进行通信: 现在,您可以使用上述函数与HC-05进行通信。例如,您可以发送AT指令给HC-05并接收其响应: ```c int main(void) { // 初始化串口 UART_Config(); // 发送AT指令给HC-05 UART_SendString("AT\r\n"); // 等待HC-05的响应 char response[100]; UART_ReceiveString(response, sizeof(response)); // 处理HC-05的响应 printf("Response: %s\r\n", response); while (1) { // 主循环 } } ``` 上述代码首先发送AT指令给HC-05,然后等待并打印出HC-05的响应。 请注意,上述代码只是一个简单的示例,您可能需要根据您的具体需求进行修改和扩展。此外,还需要确保正确配置了STM32F407芯片的时钟和其他必要的设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值