keilMDK:如何新建工程

1 code磁盘结构

  先在磁盘上把自己的代码目录结构搭好,然后再去keil中新建project工程;

  1.1 code目录

    1.1.1 .gitignore:   *.crf >> #*.icf>>*.d>>*.o>>*.dep>>*.htm>>*.lnp>>*.lst>>*.sct>>*.dbgconf

  1.2 mdk目录 :存放keilProject工程相关

  1.3 xx.si4project:sourceInsight自己会创建,位置留着不用管;

2 keil project工程新建

  新建的keil工程想要编译,keil都需要配置哪些信息告诉编译器编译规则呢?

  2.1 project new

    project >> new project >> 命名后保存在mdk目录中 >> 此时建立完成了keil5工程的框架;

  2.2 project mapp

    添加xx.c和xx.h文件给编译器编译链接;添加xx.s文件给汇编器编译链接;

    2.2.1 target右键>>manage project items>>add group>>add file>>add  xx.c

      (未加入xx.c文件)Error: L6218E: Undefined symbol edidListDIP (referred from task_audiomain.o).

    2.2.2 target右键>>manage project items>>add group>>add file>>add  xx.s

    2.2.3 target右键>>options for target >>C/C++>>Include Paths>>递归添加xx.h目录(keil不会递归查找);

      (未加入xx.s文件) error: L6236E: No section matches selector - no section to be FIRST/LAST;

  2.3 project macro

    作为各类库和芯片的预处理补充,告诉编译器应该包含编译哪些xx.h文件,以USE_STDPERIPH_DRIVER代码举例;

    F1标准库  :target右键 -> options for target -> C/C++ -> Define: <   USE_STDPERIPH_DRIVER, STM32F10X_HD  >;

    F1HAL库  :target右键 -> options for target -> C/C++ -> Define: <   USE_HAL_DRIVER, STM32F103xE   >;

    H7HAL库  :target右键 -> options for target -> C/C++ -> Define: <   USE_HAL_DRIVER, STM32H743xx   >;

    2.3.1 以hal库举例

      target右键>>options for target>>Device >> STM32F103RC >> 属于增强型系列 >>包含hal库增强型宏;

      target右键 -> options for target -> C/C++ -> Define: <   USE_HAL_DRIVER, STM32F103xE   >;

/***stm32f10x.h line 8296***/
#ifdef USE_STDPERIPH_DRIVER
#include "stm32f10x_conf.h"
#endif
/***stm32f10x_conf.h***/
/* Includes ------------------------------------------------------------------*/
/* Uncomment/Comment the line below to enable/disable peripheral header file inclusion */
#include "stm32f10x_adc.h"
#include "stm32f10x_bkp.h"
#include "stm32f10x_can.h"
#include "stm32f10x_cec.h"
#include "stm32f10x_crc.h"
#include "stm32f10x_dac.h"
#include "stm32f10x_dbgmcu.h"
#include "stm32f10x_dma.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_flash.h"
#include "stm32f10x_fsmc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_i2c.h"
#include "stm32f10x_iwdg.h"
#include "stm32f10x_pwr.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_rtc.h"
#include "stm32f10x_sdio.h"
#include "stm32f10x_spi.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_wwdg.h"
#include "misc.h" /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */

3 keil 编译包含

  keil编译器在编译的时候又是如何使用加载的xx.c和xx.h编译代码的呢?

  3.1 xx.c编译

    将xx.c加入project结构目录下,keil编译时会编译project目录下的xx.c文件,为xx.c中的函数以函数名生成唯一的函数地址;

    或者将xx.c以#include "xx.c"包含,keil编译时同样可以寻址到对应的xx.c文件;

  3.2 xx.h检查

    将xx.c内的函数声明写到xx.h中去,然后在xx.c内包含xx.h,编译器在编译的时候会检查函数地址一样的函数,它的变量是否一致;

    目前实践后xx.h文件在编译过程中的唯一实际用处就是编译检查变量,这个作用实际没啥卵用;那为什么xx.h又那么常见呢?

    xx.h的主要作用是像目录一样抽象代码结构,方便查阅理解;

    比如将闭源代码的xx.h的函数接口提供给客户使用;比如将需要共享的数据结构放到xx.h文件中包含使用,便于结构一致和维护;

  3.3 xx.h找不到报错

    既然xx.h在编译中不起作用,那为什么有时候编译报错找不到的时候,包含一个xx.h就可以了呢?

    有时候只要加xx.c到project结构目录下,不需要包含xx.h就可以查找到;因为函数在被调用时已经编译过了;

    有时候不仅把xx.c加到project结构目录下,还需要包含xx.h才可以查找到;因为函数在被调用时还没编译过;

    总结就是xx.c只要已经编译过了,包含不包含xx.h文件都可以被调用;等价于函数声明要写在main函数前的原因;

4 keil工程编译

  实际使用时,我们不仅除了编译源码,还希望可以生成一些可以下载的bin或hex文件;那这些小配置又是如何配置的呢?

  4.1 使能printf

    target右键>>options for target>>Target>>√ use MicroLIB>> <stdio.h>fputc() 使能 >> printf();

  4.2 生成xx.hex

    target右键>>options for target>>output>>√ create HEX file;[Name of Executable]重命名xx.axf,间接命名xx.hex;

    把Browse Infomation、Debug Infomation√去掉,编译速度才快20秒,不值得特地去;

  4.3 生成xx.bin

    target右键>>options for target>>user >>after build/rebuild>>√ Run #1>>User Command如下:

    fromelf.exe --bin    -o ../Release/USERAPP.bin    "#L"

    fromelf.exe为bin和hex的链接输出工具;输出相对路径为相对xx.uvprojx目录;"#L"是编译器宏,链接到当前项目的xx.axf作为输入;

5 软件仿真配置

  [ 鸡肋的功能 ];

  改天整理一下把,先放着;

  3.1 target右键-> options for target -> Debug

    ->[• use simulator]  

      F1系列仿真配置:             -> [左边的dialog DLL :DARMSTM.DLL  ]    [左边的parameter:-pSTM32F103ZE]   

      rtthread_cm3内核仿真:  -> [左边的dialog DLL :DCM.DLL   ]    [左边的parameter:-pCM3] 

      修改配置软件仿真时使用的动态链接库dll,(为啥不用默认dll配置我也不晓得,大概有啥区别吧);

  3.2 target右键-> options for target -> Target

    把时钟改成软件仿真的时钟;可能需要修改,可能不需要,看代码是否配置sysclk;

  3.3 菜单栏 debug-> start/stop debug session  

    右键需要仿真观察的变量,add '***' to.. ->LogicAnalyzer;然后仿真就可以了;

  3.4 通过虚拟串口查看kei调试的串口

        keil MDK 中使用虚拟串口调试串口 - Hiker天下 - 博客园 (cnblogs.com)

     mode com1 115200,0,8,1  :设置计算机的com1口为串口,后面的数据为串口的配置参数;

     assign com1 <s1in>s1out  :<s1in>s1out表示是单片机的串口1,assign com1表示将串口映射到com1上;

  3.5 KEIL5的GPIO仿真:(PORTA & 0X00000002)>>1:仿真输出portA的pin1引脚的值;

             (PORTA & 0X00000004)>>2:仿真输出portA的pin2引脚的值;

6 STLink 下载仿真

  [ 实用的功能 ];

  6.1 target右键-> options for target -> Debug

    ->[• use ST-Link Debuger ] ;接着点击旁边的settings,对下载器进行设置;

    在Debug中可以选择JTAG模式还是SW模式下载;Debug目录下的Download to flash应该是debug模式时决定是否下载到flash,;

    在Flash Download中勾选program,verify,reset and run;下载完后如果程序没运行,排除是硬件问题,那就是这里没勾选的问题;

    这个"***reset and run***"务必重视;多次bug积累出的"***";

  6.2 STLINK固件安装

    MDK自带的STlink驱动程序路径:D:\MDK5\installFile\ARM\STLink\USBDriver;dpinst_amd64.exe

    点击安装就安装完了stlink的驱动程序了,然后回到前一页路径upgrade一下就完了;就可以使用STLINK下载了;

  6.3 STLINK硬件仿真

    点击菜单栏的debug按钮,进入debug模式 >> 将想查看的全局变量右键add to watch1 >> 点击run >> 即可查看全局变量状态;

    通过查看全局变量的值来粗略判断代码是否正常运行,值是否如期待变化;也可以因此排查掉一些问题;

    这个keil的STLINK仿真功能可能挺多功能的把;

7 STM32学习概览

  * 学习STM32的时候需要参考什么资料呢?单片机的资料都比较杂,没法系统概括,主要资料如下:

    1.1 F10XXX中文参考手册:包含寄存器的详细信息,技术参考手册;主要是各种外设的参考信息;

    1.2 Cortex-M3 技术参考手册:关于Cortex-M3核心、SysTick定时器和NVIC的详细说明;

    1.3 Cortex-M3 编程手册:关于Cortex-M3核心、SysTick定时器和NVIC等内核外设的详细说明;主要是内核功能的信息;

    1.4 Cortex-M3 权威指南:对底层及ARM架构的分析,包含部分底层汇编说明;主要参考cortex-xx编程手册;

    1.5 芯片数据手册:芯片功能框架图,地址映射,引脚复用,芯片型号的具体解释;

    1.6 对于stm32相关的参考资料,在官网搜型号,然后点进去即可看到;cube的话直接搜cube,hal库和cmsis软件接口标准包含在STM32CubeH7中;

  *  统一编程命名规范,变量为首字母小写的驼峰,函数为首字母大写的驼峰,常量大写,名词用下划线分割把;

  * 各种外设的了解无非是首先了解该外设的时钟,时钟决定传输性能;

    然后了解该外设的工作原理和配置原理;然后根据代码了解接口如何使用;

  *外设使用

    先看别人的例程,把代码移植之后跑起来或者看库函数,都有哪些函数使用了什么寄存器;

    然后看中文参考手册的寄存器总结,然后再看原理框图;

    然后总结一下源码;

    外设用完之后要养成习惯关掉它,时钟使能之后要养成习惯关掉它,中断开启之后又养成习惯关掉它;

8 细分领域

  车载,电机,物联网IoT;蓝牙,gsm,wifi,usb,can,zigbee,ad采集,伺服电机,看门狗,pwm

    

 

posted @   rls_v  阅读(779)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
点击右上角即可分享
微信分享提示