A. stm32在MDK环境下重新建工程,文件夹以及相应文件夹的文件都相同,但是不知道为什么编译完成后代码长度变长
可能是新建工程的时候MDK把默认的优化率给改变了。
可以按以下操作修改编译器的优化率:
project->options for target->C/C++,那里有个optimization,level 0优化率最低,编译后代码最大,level 4优化率最大,代码最小,一般咱们选defualt默认即可。
ps:不过楼主要先确保您的MDK已经破解了,不然optimization这个选项是不可选的。
B. 学习stm32,keil的编程环境,看了很多板子的例子,可是很模糊,打开一个GPIO的例子都要一大堆H文件
我当初第一次接触单片机的时候, 是为了参加学校的比赛, 当时只懂C语言. 就搞了块51回来,自己焊线,下程序(当时烧录器也没有, 也不知道怎么烧, 反正是一穷二白). 后来在网上找到一篇非常入门的说明书, 就从上面学会了怎么通过keil建立工程, 怎么控制一个IO口. 然后就开始捣鼓自己比赛作品了. 捣鼓的东西是一个温度计, 就是从18B20那读取温度, 再把温度显示在1206液晶屏上. 当时的程序都是从网上下过来自己看看改改再拼起来的. 搞了1个多月顺利交差了. 后来才明白, 我只用了51上面的IO口, 其他什么外设资源都没用到. 但是捣鼓过程中,总算是在感性上有不少的收获.
现在搞DSP去了. 经常也是一大堆.h .c. 其实这些都不用怕的, 只要看看DEMO工程, 分析一下这些文件的作用, 你就能知道要片子跑起来(比如点亮一个LED)至少需要哪些文件. 等这些熟悉后, 你就会发现其实什么单片机都是一个样的. 然后就是学习使用片上的各种资源. 当然, 跑OS的另外说.
我不是什么高人, 希望我的这些感受对你有所启发罢了.
C. 基于keil MDK给stm32编程的问题。。。嵌入式系统开发环境的搭建
您好,一、【安装STM32库】 将下载后的stm32f10x_stdperiph_lib.zip解压后得到三个文件夹分别是:"Libraries"、"Project"、"Utilities"将这3个目录复制到"Keil uVision4"的安装目录,和目录中的文件覆盖合并。二、【新建工程】 1、打开"Keil uVision4",在Project菜单中选择新建工程,选择工程要保存的位置,在弹出的“Select Device for target”的对话框中选择使用的STM32单片机的型号如“STM32F103C8”,点确定,然后在弹出的“Copy startup code”的对话框中点选"NO".
2、在Project“Target 1”上点选右键菜单“Option for target target1中设置相关参数”在[Output]选项卡中点选“Create HEX file”,点"Select folder for objects"设置临时生成的obj文件的存放目录,当然也可以不选择;
3、在[C/C++]选项卡的"Preprocessor Sysmbols"的Define框中做如下定义:USE_STDPERIPH_DRIVER,STM32F10X_MD
其中USE_STDPERIPH_DRIVER表明要使用ST提供的库,在"system_stm32f10x.c"文件中包含的"stm32f10x.h"文件中有如下定义:
#ifdef USE_STDPERIPH_DRIVER #include "stm32f10x_conf.h"#endif在[C/C++]选项中添加的USE_STDPERIPH_DRIVER宏就是这个作用,用来包含"stm32f10x_conf.h"这个文件被称为"Library Configuration file"用来配置你需要使用到库的那些文件的,例如需要使用到GPIO就应在在这个文件中加上#include "stm32f10x_gpio.h"这个文件可以在STM32库的给出的例程中找得到(C:\Keil\ARM\Project\STM32F10x_StdPeriph_Examples)另外还需要在例程中复制"stm32f10x_it.c"和"stm32f10x_it.h"这2个文件,这2个文件时用来完成STM32中重中断服务程序的将一下三个文件复制到自己工程的user目录下供以后使用:"stm32f10x_conf.h"、"stm32f10x_it.c"、"stm32f10x_it.h"STM32F10X_MD 表明使用的是STM32F10X系列的CPU而该CPU的Flash代码密度是中等(Medium-density devices)这个和使用的CPU相关的查阅CPU的手册就可以得到。
然后在该选项卡的下方的"Include Paths"中设置include使用的路径等,如下图所示:其中.\user路径是用来保存自己定义的头文件的路径4、[Debug]选项卡选择使用"Cortex-M/R J-Link/J-Trace",然后点"Settings"按钮在新打开的对话框中选择[Flash Download]选项卡点"Add"按钮添加编程使用的Flash,在本例中选用的CPU是STM32F103C8,其Flah为Medium-density使用片上的Flash型号为"STM32F10X Med-density Flash On-chip-Flash 128K",最终点OK保存设置。5、[Utilities]选项卡中的"Use Target Device for Flash Programing"要选择和[Debug]选项卡中一样的调试器"Cortex-M/R J-Link/J-Trace";6、然后再次在左侧的"Target 1"上点选右键,在菜单中选择"Manger Components"然后在"Project components"选项卡的"Group"中新建3个组名称分别为"user"、"libs"、"cmsis"1、 分别用来保存用户自己的C文件、stm32f10x_stdperiph_lib的库、和cortex-m3的启动文件等。
users:
Keil\ARM\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\ system_stm32f10x.c (stm32f10x_it.c该文件定义各种中断的中断服务函数)
libs:
Keil\ARM\ Libraries\ STM32F10x_StdPeriph_Driver\src\*.*
cmsis:
Keil\ARM\ Libraries\ CMSIS\ CM3\ CoreSupport\core_cm3.c
Keil\ARM\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\system_stm32f10x.c
keil\ARM\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_md.s
(该文件和CPU的Flash的代码密度相关,本例中的STM32F103C8是Medium-density故选用xxx_md.s)
D. stm32编译程序的时候出现的问题:前提:使用库函数,编译器MDK
应该是你的编译环境默认包含一些不应该包含的库
E. keil mdk 5用哪个版本
曾经有新手提问为什么我装的keil的软件找不到89c51,或找不到stm32。今天特意发这一贴,希望对新手有所帮助。
KEIL是公司的名称,有时候也指KEIL公司的所有软件开发工具,目前2005年Keil由ARM公司收购,成为ARM的公司之一。
uVision是KEIL公司开发的一个集成开发环境(IDE),和Eclipse类似。它包括工程管理,源代码编辑,编译设uVision置,下载调试和模拟仿真等功能,uVision有uVision2、uVision3、uVision4、uVision5四个版本,目前最新的版本是uVision5。它提供一个环境,让开发者易于操作,并不提供能具体的编译和下载功能,需要软件开发者添加。uVisionu通用于KEIL的开发工具中,例如MDK,PK51,PK166,DK251等。目前使用Keil uVision4的产品有Keil MDK-ARM,Keil C51,Keil C166和Keil C251
MDK(Microcontroller Development Kit),也称MDK-ARM、KEIL MDK、RealView MDK、KEIL For ARM,都是同一个东西。ARM公司现在统一使用MDK-ARM的称呼,MDK的设备数据库中有很多厂商的芯片,是专为微控制器开发的工具,为满足基于MCU进行嵌入式软件开发的工程师需求而设计,支持ARM7,ARM9,Cortex-M4/M3/M1,Cortex-R0/R3/R4等ARM微控制器内核。
KEIL C51,亦即PK51,KEIL公司开发的基于uVision IDE,支持绝大部分8051内核的微控制器开发工具。
因此,如图C51是51系列单片机开发工具,MDK是arm开发工具。如果想两个都能用就必须两个都得装
F. MDK编译器优势有哪些
1.超过3000款Arm?的Cortex?-M微控制器的解决方案;
2.支持32位Arm Cortex-A和Cortex-A/ Cortex-M的基础设备;
3.Software Packs包括现成可使用的CMSIS和中间件组件;
4.MDK专业版支持Armv8-M架构;
5.强大的uVision?IDE,调试器和模拟环境;
6.配合ULINKpro?调试适配器使用生成应用的即时全指令跟踪分析记录;
7.关于程序执行的完整代码覆盖信息;
8.利用执行探查和性能分析器来优化你的代码;
9.调试器完全支持CMSIS-RTOS RTX实时操作系统;
10.提供完整的中间件库:包括TCP/ IP网络,文件系统,USB,和图形界面;
11.具有领先特定处理器优化和microlib的业界领先的Arm C/C ++编译器;
可以到亿道电子下载
G. STM32是用的什么开发环境
目前STM32开发最广泛、最常用的开发环境是MDK和IAR两种
各大学习开发板生产厂商例程都是以IAR和MDK为基准设计编写的
其中MDK居多
这样的回答希望您能满意 望采纳O(∩_∩)O
H. MDK5为什么不用再C/C++选项卡里定义STM32F10X
准确的来说,是编译器读取Keil的配置 ARM系列的有一些公司的库编译器,是与Keil的一些配置通信的.
I. 使用keil5编译stm32,头文件core_cmFunc.h中,是预定义__CC_ARM,还是__GNUC__
编译的时候,可能是那个地方定义了__CC_ARM, 预编译指令执行了#if defined ( __CC_ARM )下面的代码,没有执行#elif defined ( __GNUC__ )下面的代码;
#if ...
...
#elif ..
...
是条件预编译,只执行其中的一个分支
J. stm32中ad9959的使用例程。编译环境最好是keil。
/************************************************************
Copyright(C),1995-2013,***.Co.,Ltd.
文件名:ad9959.c
作者:Sun版本:1日期:2013-09-04
模块描述:
版本信息:
主要函数及其功能:
01.staticuint16_tWrite_DDS_Byte(unsignedcharaByte);//SPI写操作
02.voidInitAd9959(void);//初始化AD9959,即其工作频率以及各个通道的输出频率
03.voidwrite_CSR(charw_data);//通道的使能以及串行模式的设置
04.voidwrite_FR1(charw_data1,charw_data2,charw_data3);//设置AD9959的工作频率,需根据外部晶振,及倍频来设置
05.voidwrite_FR2(charw_data1,charw_data2);//写FR2寄存器
06.voidwrite_CFR(charw_data1,charw_data2,charw_data3);//写CFR寄存器
07.voidwrite_CFTW0(longF_word);//频率调谐字
08.voidwrite_CPW0(intP_word);//写CPW0寄存器
09.voidwrite_ACR(longA_word);//写ACR寄存器
10.voidwrite_LSR(charrising,charfalling);//写LSR寄存器
11.voidwrite_RDW(longrising);//写RDW寄存器
12.voidwrite_FDW(longfalling);//写FDW寄存器
13.voidwrite_CTWn(charn,longw_data);//写CTWn寄存器
14.voidset_frequency(u32f);//写频率控制字
15.voidSetAd(floatfre_mhz,intset);//设置通道输出频率
历史修改记录://
<author><time><version><desc>
***********************************************************/
#include"ad9959.h"
#include"usart.h"
#definePLL_DIV10//倍频系数
#definePLL16//外部晶振频率
#definesystemp_frequency(PLL*1000000*PLL_DIV)//AD9959系统频率
/*************************************************
函数名:staticuint16_tWrite_DDS_Byte(unsignedcharaByte);
功能:SPI写操作
调用函数:无
被调用函数:
voidwrite_CSR(charw_data);
voidwrite_FR1(charw_data1,charw_data2,charw_data3);
voidwrite_FR2(charw_data1,charw_data2);
voidwrite_CFR(charw_data1,charw_data2,charw_data3);
voidwrite_CFTW0(longF_word);
voidwrite_CPW0(intP_word);
voidwrite_ACR(longA_word);
voidwrite_LSR(charrising,charfalling);
voidwrite_RDW(longrising);
voidwrite_FDW(longfalling);
voidwrite_CTWn(charn,longw_data);
输入:aByte:SPI要写的字节
输出:无
返回值:SPI读到的字节
*************************************************/
staticuint16_tWrite_DDS_Byte(unsignedcharaByte)
{
/**/
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI1,aByte);
/*Waittoreceiveabyte*/
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
/**/
returnSPI_I2S_ReceiveData(SPI1);
}
/*************************************************
函数名:voidInitAd9959(void);
功能:初始化AD9959用到的GPIO,及设置其工作频率和通道输出频率
调用函数:
write_CSR();//设置通道启用
write_FR1();//设置主频
set_frequency();//设置通道输出频率
被调用函数:
voidBspInit(void);/初始化所有硬件函数
输入:无
输出:无
返回值:无
*************************************************/
voidInitAd9959(void)
{
inti;
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_SetBits(GPIOC,GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
/*************************************************
函数名:voidwrite_CSR(charw_data);
功能:通道的使能以及串行模式的设置
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:
voidInitAd9959(void)//初始化AD9959用到的GPIO,及设置其工作频率和通道输出频率
voidSetAd(floatfre_mhz,intset)//
输入:charw_data:要写的字节
输出:无
返回值:无
*************************************************/
voidwrite_CSR(charw_data)
{
CLR_DDSCS;
Write_DDS_Byte(0x00);//writeaddress0.CSR'saddressis0.
Write_DDS_Byte(w_data);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_FR1(charw_data1,charw_data2,charw_data3);
功能:设置AD9959的工作频率,需根据外部晶振,及倍频来设置
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:
voidInitAd9959(void)//初始化AD9959用到的GPIO,及设置其工作频率和通道输出频率
输入:charw_data1,charw_data2,charw_data3:要写的字节,从高到低
输出:无
返回值:无
*************************************************/
voidwrite_FR1(charw_data1,charw_data2,charw_data3)
{
CLR_DDSCS;
Write_DDS_Byte(0x01);//writeaddress1.FR1'saddressis0x01
Write_DDS_Byte(w_data1);
Write_DDS_Byte(w_data2);
Write_DDS_Byte(w_data3);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_FR2(charw_data1,charw_data2);
功能:用于控制各种功能、特性和模式
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:无
输入:charw_data1,charw_data2:要写的字节
输出:无
返回值:无
*************************************************/
voidwrite_FR2(charw_data1,charw_data2)
{
CLR_DDSCS;
Write_DDS_Byte(0x02);//writeaddress2
Write_DDS_Byte(w_data1);
Write_DDS_Byte(w_data2);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_CFR(charw_data1,charw_data2,charw_data3);
功能:通道功能寄存器
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:无
输入:charw_data1,charw_data2,charw_data3:要写的字节,从高到低
输出:无
返回值:无
*************************************************/
voidwrite_CFR(charw_data1,charw_data2,charw_data3)
{
CLR_DDSCS;
Write_DDS_Byte(0x03);
Write_DDS_Byte(w_data1);
Write_DDS_Byte(w_data2);
Write_DDS_Byte(w_data3);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_CFR(charw_data1,charw_data2,charw_data3);
功能:频率调谐字
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:
voidset_frequency(u32f);//设置频率
输入:longF_word:要写的字节
输出:无
返回值:无
*************************************************/
voidwrite_CFTW0(longF_word)//ChannelFrequencyTuningWord(CTW0)
{
CLR_DDSCS;
Write_DDS_Byte(0x04);
Write_DDS_Byte(((unsignedchar*)(&F_word))[3]);
Write_DDS_Byte(((unsignedchar*)(&F_word))[2]);
Write_DDS_Byte(((unsignedchar*)(&F_word))[1]);
Write_DDS_Byte(((unsignedchar*)(&F_word))[0]);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_CPW0(intP_word);
功能:相位偏移字
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:无
输入:intP_word:要写的字节
输出:无
输出:无
返回值:无
*************************************************/
voidwrite_CPW0(intP_word)//ChannelPhase1OffsetWord(CPW0)(0x05)
{
CLR_DDSCS;
Write_DDS_Byte(0x05);
Write_DDS_Byte(((unsignedchar*)(&P_word))[1]&0x3F);
Write_DDS_Byte((((unsignedchar*)(&P_word))[0]));
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_ACR(longA_word);
功能:幅度控制寄存器
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:无
输入:longA_word:要写的字节
输出:无
返回值:无
*************************************************/
voidwrite_ACR(longA_word)
{
CLR_DDSCS;
Write_DDS_Byte(0x06);
Write_DDS_Byte(((unsignedchar*)(&A_word))[2]);
Write_DDS_Byte(((unsignedchar*)(&A_word))[1]);
Write_DDS_Byte(((unsignedchar*)(&A_word))[0]);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_LSR(charrising,charfalling);
功能:线性斜率扫描
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:无
输入:charrising,charfalling:要写的字节
输出:无
返回值:无
*************************************************/
voidwrite_LSR(charrising,charfalling)
{
CLR_DDSCS;
Write_DDS_Byte(0x07);
Write_DDS_Byte(rising);
Write_DDS_Byte(falling);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_RDW(longrising);
功能:LSRRisingDeltaWord(RDW)
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:无
输入:longrising:要写的字节
输出:无
返回值:无
*************************************************/
voidwrite_RDW(longrising)
{
CLR_DDSCS;
Write_DDS_Byte(0x08);
Write_DDS_Byte(((unsignedchar*)(&rising))[3]);
Write_DDS_Byte(((unsignedchar*)(&rising))[2]);
Write_DDS_Byte(((unsignedchar*)(&rising))[1]);
Write_DDS_Byte(((unsignedchar*)(&rising))[0]);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_FDW(longfalling);
功能:LSRFallingDeltaWord
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:无
输入:longfalling:要写的字节
输出:无
返回值:无
*************************************************/
voidwrite_FDW(longfalling)
{
CLR_DDSCS;
Write_DDS_Byte(0x09);
Write_DDS_Byte(((unsignedchar*)(&falling))[3]);
Write_DDS_Byte(((unsignedchar*)(&falling))[2]);
Write_DDS_Byte(((unsignedchar*)(&falling))[1]);
Write_DDS_Byte(((unsignedchar*)(&falling))[0]);
SET_DDSCS;
}
/*************************************************
函数名:voidwrite_CTWn(charn,longw_data);
功能:
调用函数:
Write_DDS_Byte();//SPI写函数
被调用函数:无
输入:charn,longw_data:要写的字节
输出:无
返回值:无
*************************************************/
voidwrite_CTWn(charn,longw_data)
{
CLR_DDSCS;
Write_DDS_Byte(n+0x09);//CTWn'saddressisn+0x09.n>=1andn<=15.
Write_DDS_Byte(((unsignedchar*)(&w_data))[3]);
Write_DDS_Byte(((unsignedchar*)(&w_data))[2]);
Write_DDS_Byte(((unsignedchar*)(&w_data))[1]);
Write_DDS_Byte(((unsignedchar*)(&w_data))[0]);
SET_DDSCS;
}
/*************************************************
函数名:voidset_frequency(u32f);
功能:设置频率调谐字
调用函数:
write_CFTW0();//写频率调谐字
被调用函数:
voidInitAd9959(void);//初始化AD9959用到的GPIO,及设置其工作频率和通道输出频率
voidSetAd(floatfre_mhz,intset);//设置频率调谐字
输入:u32f:通道输出频率
输出:无
返回值:无
*************************************************/
voidset_frequency(u32f)
{
longtemp;
temp=(unsignedlongint)f*(0xFFFFFFFF*1.0/(float)systemp_frequency+1.0/systemp_frequency);
write_CFTW0(temp);
}
/*************************************************
函数名:voidSetAd(floatfre_mhz,intset);
功能:设置通道输出频率
调用函数:
write_CSR();//通道的使能以及串行模式的设置
set_frequency();//设置频率调谐字
被调用函数:无
输入:floatfre_mhz,intset:通道号及对应频率
输出:无
返回值:无
*************************************************/
voidSetAd(intFreKhz)
{
inti=0xff;
//通道2比通道3多50khz
write_CSR(0x80);//通道3
set_frequency((u32)(FreKhz*1000));
write_CSR(0x40);//通道2
set_frequency((u32)((FreKhz+50)*1000));
SET_IOUPDATE;
while(i--);
CLR_IOUPDATE;
}
延时没有很精确,仅做参考。