qtcreator + Keil MDK armcc +openocd 编译 调试stm32
Keil MDK 的编辑功能太弱了 本人又习惯了qtcreator的小巧和编辑方便是
经过折腾其实可以利用qtcreator结合Keil MDK来编辑 编译 下载 调试 STM32的工程 方法如下
准备的软件:
1.Qtcreator
2. gcc-arm-none-eabi (新版的可能有bug )
3. openocd
4. python-2.7(用于qtceator 的gdb python版本调试器 用新版本 )
安装好上面的软件
配置好openocd python的环境变量(具体百度)
打开qtceator , 菜单->帮助->关于插件 找到Bare Metal 插件 勾先该插件
关闭后 重新启动qtcreator
菜单->工具->选项 找到 设备选项 在Bare Metal页上 add ->OpenOCD 添加一个类型
名字可根据Stm32 cpu类型和下载器名命
Startup mode 选择为 TCP/IP mode
Host 填localhost 端口为3333
Executable file 填安装的openocd程序文件路径
Addition argument 填 -f interface/cmsis-dap.cfg -f target/stm32f4x.cfg
根据下载器及实际的Stm32 芯片填写 这些配置文件是在openocd安装的位置
Init command 填
set remote hardware-breakpoint-limit 6
set remote hardware-watchpoint-limit 4
monitor reset halt
monitor report_flash_progress on
monitor program "%{CurrentRun:Executable:FilePath}" reset
monitor poll on
monitor reset halt
b main
%{CurrentRun:Executable:FilePath}就当前qtcreator的变量 表示要下载的文件路径 在项目/运行/ 中填写的被调试的elf文件
b main 表示在main函数上下一个断点
Reset command 填
monitor reset halt
b main
点击Apply应用设置
然后到 设备页 新建一个 Bare Matel设备 选择刚刚设置好的openocd类型
点击左则的
Kits 进到套件设置
在编译器选项 新建 c 和 c++编译器 选择安装好的arm gcc 和 g++
点击Apply
转到debugger 页 新增一个调试器 选 arm-gdb-py python版本
点Apply
根据上面的设置 在构建套件页 增加一个套件
点Ok
Qtcreator 设置完毕
然后新建一个工程 选Non-Qt Project Plain C Application模版
项目的路径跟Keil工程相同 (.qbs 与.uvprojx相同路径) 不要有空格和中文
Build system选Qbs
构建位置填为 .\Qbs
Kits选建好的Stm32构建套件
Main.c文件 main()改成没有参数输入的
双击编辑 *.qbs文件 输入如下代码
import qbs
import qbs.FileInfo
import qbs.Process
Project {
Product {
name: project.name
type: "compileByARMCC"
Depends { name: "cpp" } //refer "cpp" Module
// cpp.defines跟Keil的工程设置成一样
//cpp.includePaths 是为了编辑时不会报错 不要也可以
cpp.defines:["STM32F40_41xxx","STM32F407xx=1","_RTE_=1","__GCC=1","USE_STDPERIPH_DRIVER"]
cpp.includePaths:
[
"./CMSIS/Include",
"./CMSIS/Device/ST/STM32F4xx/Include",
"./fwlib/inc",
"./include"
]
files: [
"driver/led.c",
"driver/stm32f4xx_it.c",
"driver/system_stm32f4xx.c",
"fwlib/inc/stm32f4xx_gpio.h",
"fwlib/inc/stm32f4xx_rcc.h",
"fwlib/src/stm32f4xx_gpio.c",
"fwlib/src/stm32f4xx_rcc.c",
"include/led.h",
"include/main.h",
"include/stm32f4xx.h",
"include/stm32f4xx_conf.h",
"include/stm32f4xx_it.h",
"include/system_stm32f4xx.h",
"main/main.c",
"startup_stm32f40_41xxx.s",
]
Group {
files: [
"Target 1.BAT",
]
// Target 1.BAT 这个文档是Keil工程生成的 放在本qbs工程目录下 生成方法见下文
fileTags: "compileBat"
}
Rule{
inputs: "compileBat"
Artifact{
fileTags: "compileByARMCC"
}
prepare:{
var callCmd=new Command("cmd"); //
var callCmdArgs=["/c",input.filePath];
callCmd.arguments=callCmdArgs;
callCmd.workingDirectory=project.sourceDirectory;
callCmd.description="calling copile bat file..."
return [callCmd];
}
}
}
}
构建好的qbs工程结构如图
Qbs工程配置好后 就选 on RemoteOpenOCD的构建目标
设置Keil MDK的工程选项
打开建立好的Keil MDK stm32工程
菜单->Project->Options for target…
在打开的选项对话框中 选中output页面 勾选下面的选项 以生成编译批处理文件
Create Executable Create Batch File
Debug Information
Create Hex file
Browse Information
点击ok 后 在Keil中重新编译一下工程 就会在工程的根目录下生成一个 Target 1.bat(跟keil的工程名相同) 的批处理文件,这个是用于上面qbs文件的代码中实现编译的
再次切换到qtcreator
右键qbs的工程图标 选择重新构建 如无错误如下所示
然后就点项目
设置运行配置为custom on remoteOpenocd
设置executable 为生成的axf文件
连接好下载器
点击调试运行就会进行下载并运行
中断在main函数入口了
存在的问题:
有时中断会断不下来 可能是gdb-py或者是openocd的bug吧,更换版本可能好点
有时调试会假死 在进程管理器中关掉openocd各gdb-py的假死进程 重连下载器才可以再进行调试
还有就是点连续运行后再按暂停是停不下来的
Restart debuggin 一按就会假死
单步调试较慢 步过一些时间较长的指命会假死 最好用先下好断点-直接运行到断点-删除断点-单步/步过 的方式进行调试
在qtcreator中编辑代码后,必须右键qbs工程图标 选择重新编译 才会生成新的代码对应的axf文件,
而qtcreator左下角的构建按钮不起作用。
如果要在工程中增加一个新的代码文档(c 或 cpp),必须要在Keil中先增加该文档并重新编译以生成新的Target1.bat文件,才可以qtcreator进行编译、调试。