初学stm32f4开发板,应该从哪里开始?

2019-07-20 22:40发布

初学stm32f4开发板,应该从哪里开始?学过C语言
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
10条回答
lengjingzju
2019-07-21 14:18
本帖最后由 lengjingzju 于 2016-4-27 14:32 编辑

一、新建文件夹和文件复制【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。

    .@记得在编写的代码的最后面加上一个回车,否则会有警告。

一周热门 更多>