/@【TextCompletion】选项卡 语法检测&代码提示
Strut/Class Members,用于开启结构体/类成员提示功能。
Function Parameters,用于开启函数参数提示功能。
Symbols after xx characters,用于开启代码提示功能,即在输入多少个字符以后,提示匹配的内容(比如函数名字、结构体名字、变量名字等)
Dynamic Syntax Checking,则用于开启动态语法检测,比如编写的代码存在语法错误的时候,会在对应行前面出现图标,如出现警告,则会出现图标,将鼠标光标放图标上面,则会提示产生的错误/警告的原因。有的时候会误报。
一、新建文件夹和文件复制【STM32F4xx】
1、新建1个[名字为工程名]的文件夹,下面包含4个子文件夹:CORE/USER/FWLIB/OBJ。
2、//@加入到CORE@//
|@.LibrariesCMSISDeviceSTSTM32F4xxSourceTemplatesarm
startup_stm32f40_41xxx.s //启动文件。不同型号对应的启动文件也不一样。启动文件主要是进行堆栈之类的初始化,中断向量表以及中断函数定义。启动文件要引导进入main函数。Reset_Handler中断函数是唯一实现了的中断处理函数,其他的中断函数基本都是死循环。系统启动的时候会调用Reset_handler[在系统复位之后引导进入main函数,同时在进入main函数之前,首先要调用SystemInit系统初始化函数]。
|@.LibrariesCMSISInclude
core_cm4.h //CMSIS核心文件。提供进入M4内核接口,这是ARM公司提供,对所有CM4内核的芯片都一样。你永远都不需要修改这个文件。
core_cm4_simd.h
core_cmFunc.h
core_cmInstr.h
3、//@加入到USER@//
|@.LibrariesCMSISDeviceSTSTM32F4xxInclude
system_stm32f4xx.h //片上外设接入层系统头文件。主要是申明设置系统及总线时钟相关的函数,对应的源文件system_stm32f4xx.c在目录.ProjectTemplates可以找到
stm32f4xx.h //片上外设访问层头文件。很多结构体以及宏定义。主要是系统寄存器定义申明以及包装内存操作,同时该文件还包含了一些时钟相关的定义,FPU和MPU单元开启定义,中断相关定义等。 .@看外设是挂载在哪个个总线之下。看中断的类型
|@.ProjectTemplates
system_stm32f4xx.c //有一个SystemInit()函数申明,这个函数在我们系统启动的时候都会调用,用来设置系统的整个系统和总线时钟。
stm32f4xx_conf.h //外设驱动配置文件。一堆的#include,建立工程时,可以注释掉一些不用的外设头文件。
stm32f4xx_it.c //用来编写中断服务函数,中断服务函数也可以随意编写在工程里面的任意一个文件里面,没太大意义。可以删除。
stm32f4xx_it.h
4、//@加入到FWLIB@// //STM32F4标准的外设库文件
|@.LibrariesSTM32F4xx_StdPeriph_Driver 的所有文件,
misc.c/h //中断优先级分组以及Systick定时器。必须添加。
stm32f3xx_rcc.c/h //时钟的配置和使能。必须添加。
stm32f4xx_fsmc.c/h //STM32F40/41系列才用到,不用就把它删掉。
stm32f4xx_fmc.c/h //STM32F42/43系列才用到,不用就把它删掉。
5、//@编译文件输出到到OBJ@//
6、//@修改标准文件//
|@system_stm32f4xx.c 把PLL第一级分频系数M修改为8,这样达到主时钟频率为168MHz。
/************************* PLL Parameters ************/
#if defined (STM32F40_41xxx) || defined (STM32F427_437xx) || defined (STM32F429_439xx)
|| defined (STM32F401xx)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 8
|@stm32f4xx_it.c 把文件内容清空。或者删掉其中的32行对main.h头文件的引入以及144行SysTick_Handler函数内容。
|@stm32f4xx.h 里面修改外部时钟 HSE_VALUE 值为 8MHz。
#if !defined (HSE_VALUE)
#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */
一、新建文件夹和文件复制【STM32F1xx】
1、新建1个[名字为工程名]的文件夹,下面包含4个子文件夹:CORE/USER/FWLIB/OBJ。
2、//@加入到CORE@//
|@.LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm
startup_stm32f10x_hd.s
|@.LibrariesCMSISCM3CoreSupport
core_cm3.c
core_cm3.h
3、//@加入到USER@//
|@.LibrariesCMSISCM3DeviceSupportSTSTM32F10x
system_stm32f10x.c
system_stm32f10x.h
stm32f10x.h
|@.ProjectSTM32F10x_StdPeriph_Template
stm32f10x_conf.h
stm32f10x_it.c
stm32f10x_it.h
4、//@加入到FWLIB@// //STM32F1标准的外设库文件
|@.LibrariesSTM32F10x_StdPeriph_Driver 的所有文件
5、//@编译文件输出到到OBJ@//
二、【配置MDK 5.14】
注意,每个文件完成后一定要有一个空行,不然会报警告。
1、新建工程模板【Project –>New Uvision Project】。
选择工程文件夹:定位到【USER】文件夹,取工程名;
接下来【选择Device】的界面:就是选择我们的芯片型号;点击OK;
MDK会弹出 【Manage Run-Time Environment】对话框:可以添加自己需要的组件,方便构建开发环境,直接点击 Cancel即可。
2、右击 【Project】栏的【Target1】,选择【Manage Project Items】,配置工程文件。
Project Targets 栏:将Target名字修改为“工程名”;
Groups 栏建立Groups: USER,CORE,FWLIB;
Files 栏:选择需要添加文件的 Group,然后“Files栏” 选【Add Files】添加所需的.c和.h文件。
(注意,默认添加的时候文件类型为.c,添加.s 启动文件的时候,你需要选择文件类型为 All files 才能看得到这个文件)
3、编译设置 点击【菜单栏-魔法棒】
/@【Target】选项卡
Xtal(MHz):8 外部晶振频率
/@【Output】选项卡 //选择编译中间文件编译后存放目录
点击Select folder for objects…选择OBJ目录
Creat Executable三个选项框都勾上
“Create HEX File”选项选上是要求编译之后生成HEX文件。“Browse Information”选项选上是方便我们查看工程中的一些函数变量定义。
/@例子:ProgramSize: Code=19378 RO-data=1230 RW-data=260 ZI-data=16636
Code是代码占用的空间,RO-data是 Read Only 只读常量的大小,如const型,RW-data是(Read Write) 初始化了的可读写变量的大小,ZI-data是(Zero Initialize) 没有初始化的可读写变量的大小。ZI-data不会被算做代码里因为不会被初始化。
简单的说就是在烧写的时候是FLASH中的被占用的空间为:Code+RO Data+RW Data。(不是.hex文件的大小)
程序运行的时候,芯片内部RAM使用的空间为: RW Data + ZI Data。
C中的指令以及常量被编译后是RO类型数据。C中的未被初始化或初始化为0的变量编译后是ZI类型数据。C中的已被初始化成非0值的变量编译后市RW类型数据。
/@【C++】选项卡
/@添加全局宏定义标识符 【PreProcessor Symbols -> Define:】
//M4系列:USE_STDPERIPH_DRIVER,STM32F40_41xxx //“STM32F40_41xxx”为对应的启动文件名“startup_stm32f40_41xxx.s”修改来的。
//M3系列:USE_STDPERIPH_DRIVER,STM32F10X_HD //中等容量修改MD//小容量容量修改LD
//程序的执行是从“main.c”文件开始的,其中必须包含有头文件“stm32f10x.h”。预编译指令预定义了“USE_STDPERIPH_DRIVER”,才会将"stm32f10x_conf.h"包含进“stm32f10x.h”中,从而被"main.c"用到。
/@添加头文件路径 【Include Paths: -> ...】
头文件所在的目录,这个目录必须直接包含库文件
三、下载与调试
1、//@自举配置
复位后,在 SYSCLK 的第四个上升沿锁存BOOT引脚的值。复位后,用户可以通过设置BOOT1和BOOT0引脚来选择需要的自举模式。
CPU 将从地址 0x0000 0000 获取栈顶值,然后从始于 0x0000 0004 的自举存储器开始执行代码。
BOOT1:x BOOT0:0 选择主Flash作为自举空间,正常启动模式。
BOOT1:0 BOOT0:1 选择系统存储器作为自举空间,用于串口下载代码。
BOOT1:1 BOOT0:1 选择嵌入式SRAM作为自举空间,用于调试。
2、//@STM32的串口下载选择
SART外设以内部16MHz振荡器(HSI)频率运行,而CAN和USB OTG FS则需要相当于1MHz数倍(4MHz到26MHz之间)的外部时钟(HSE)频率。
USART1[PA9/PA10]
USART3[PB11/PB12]或[PC11/PC12]
CAN2[PB5/PB13]
USB OTG FS[PA11/12]从设备模式(DFU:器件固件升级)
3、//@串口下载过程
设置BOOT1:0、BOOT0:1,按一下复位按键,通过串口下载代码。
下载完成之后,如果没有设置从0x0800 0000开始运行,则代码不会立即运行。
再设置BOOT1:0、BOOT0:0,然后再按一次复位,才会开始运行你刚刚下载的代码。
【例子】:ALIENTEK探索者STM32F4开发板,不是通过RS232串口下载的,而是通过USB转成串口下载的。
首先要在板子上设置一下,在板子上把RXD和PA9(STM32的TXD),TXD和PA10(STM32的RXD)通过跳线帽连接起来,这样我们就把CH340G和 MCU的USART1连接上了。[USB-SERIAL CH340]
固件串口下载软件flymcu
推荐设置波特率为76800bps。
选中“编程前重装文件”、“校验”、“编程后执行”。不要选中“使用RamIsp”、“连续烧录”。
选择的【DTR的低电平复位,RTS高电平进 BootLoader】。
点击【开始编程】,一键下载代码到STM32上。
4、//@Jlink下载调试 点击【菜单栏-魔法棒】
/@【Target】选项卡
勾选右边仿真工具【use】;
仿真工具选择【J-LINK/J-TRACECortex】;
勾选“Run to main()” //如果没选择这个选项,则会先执行startup_stm32f40_41xxx.s文件的Reset_Handler,再跳到main函数。该选项选中后,只要点击仿真就会直接运行到main函数.
点击【Settings】,设置J-LINK的一些参数。
【ort:SW】【max:10MHz或者5MHz】可以点击AutoClk来自动设置,USB数据线比较差,可能会出问题,此时,你可以通过降低这里的速率来试试。
/@【Utilities】选项卡 设置下载时的目标编程器
勾选【Use Debug Driver】,选择JLINK来给目标器件的FLASH编程,【Use Target Driver...】和【Update Target...】也是选中的。
点击【Settings ->Flash Download】
MDK5会根据我们选择的目标器件,自动设置flash算法。我们使用的是STM32F407ZGT6,FLASH容量为1M字节,所以ProgrammingAlgorithm里面默认会有1M型号的STM32F4xxFLASH算法。对于小于1MFLASH的型号,也是采用这个flash算法。
注意:M3有512K的FLASH算法
选中【Reset and Run】选项,以实现在编程后自动运行,其他默认设置即可。
/@【Target】选项卡 //M3软件仿真还需设置
选择:Use Simulator,即使用软件仿真。选择:Run to main(),即跳过汇编代码,直接跳转到main函数开始仿真。
|@设置下方的:DialogDLL分别为:DARMSTM.DLL和TARMSTM.DLL,Parameter均为:-pSTM32F103ZE
用于设置支持STM32F103ZE的软硬件仿真(即可以通过 Peripherals 选择对应外设的对话框观察仿真结果)。最后点击OK,完成设置。
特别注意:串口打印窗口和逻辑分析窗口仅在软件仿真的时候可用,而MDK5对STM32F4的软件仿真,基本上不支持;但是对STM32F1的软件仿真,MDK5是支持的。
点击菜单栏的【Peripherals->SystemViewer->USART->USART1】,查看的是串口1的情况。
四、MDK文本美化【扳手符号】
/@【Editor】选项卡
设置【Encoding】为:Chinese GB2312(Simplified),然后设置【Tab size】为:4。
/@【TextCompletion】选项卡 语法检测&代码提示
Strut/Class Members,用于开启结构体/类成员提示功能。
Function Parameters,用于开启函数参数提示功能。
Symbols after xx characters,用于开启代码提示功能,即在输入多少个字符以后,提示匹配的内容(比如函数名字、结构体名字、变量名字等)
Dynamic Syntax Checking,则用于开启动态语法检测,比如编写的代码存在语法错误的时候,会在对应行前面出现图标,如出现警告,则会出现图标,将鼠标光标放图标上面,则会提示产生的错误/警告的原因。有的时候会误报。
/@块操作
MDK 的 TAB 键支持块操作。选中块通过 TAB 键一片代码整体右移固定的几个位,也可以通过 SHIFT+TAB 键整体左移固定的几个位。
/@快速注释与快速消注释
选中块然后右键,再选择【Advanced ->Comment Selection】就可以把这段代码注释掉了。取消注释,【Uncomment Selection】。
/@快速定位变量
你把光标放到这个函数/变量(xxx)的上面[(xxx)为你想要查看的函数或变量的名字],然后右键出现菜单,单击左键选择【Go to Definition Of‘xxx’】就可以快速跳到(xxx)的定义处。
五、位操作
不改变其他位的值的状况下,对某几个位进行设值。方法就是先对需要设置的位用&操作符进行清零操作,然后用|操作符设值。
移位操作提高代码的可读性。 GPIOx->ODR = (((uint32_t)0x01) << pinpos); 这个操作就是将ODR寄存器的第pinpos位设置为 1。
.@记得在编写的代码的最后面加上一个回车,否则会有警告。
一周热门 更多>