STM32f103C8T6入门学习记录.docx
《STM32f103C8T6入门学习记录.docx》由会员分享,可在线阅读,更多相关《STM32f103C8T6入门学习记录.docx(34页珍藏版)》请在冰豆网上搜索。
STM32f103C8T6入门学习记录
STM32自学笔记
作者:
忙碌的小姚
新浪微博:
@忙碌的小姚
新浪博客:
第一章
我与STM32的那些日子
STM32这块板子是在阿莫上跟一个老师买的,砍了半天100块钱。
包括一个Jlinkv8仿真器(好像65块左右),和一块STM32系统板。
那已是一年前的事了。
那时我刚大三,刚学了半年51,于是想学点更高级的。
但我好像属于三分钟热度的这种人,买回来学了一个星期,就学不动了,寄存器操作,固件库的使用根本就没明白是怎么一回事,之后就没有然后了。
现在看到那块板子,总有一种说不出的滋味,要是当时能咬牙切齿努力学习,说不定现在也不会安静地坐在电脑前一字一句敲打这篇激励性文章了。
对于STM32我没用任何基础,唯一有的也只是一年前学的那一个星期,不过那已不重要了,我现在仍是一个小白。
作为一个初学者,也许是坐井观天,看的是片面的,可能有很多观点是错误的,希望读者朋友能勇于指出来。
-----前记
第二章
使用固件库建立一个工程
我打算先从软件编程学起,以前用过KEIL和IAR,IAR我比较熟悉,因为参加电子设计竞赛的时候,就是用它编程MSP430程序的。
但我还是选择了KEIL,也许因为资料比较多,或者别的吧,我没分析过KEIL和IAR代码效率如何,因为这不是我现在要考虑的,软件都只是工具而已。
我去XX搜索了几篇如何在KEILMDK环境下建立STM32工程,加上自己的实践。
我也把我的初学者步骤贴出来。
1、了解STM32F103的固件库
我在网上下了STM32F103的固件库-----stm32f10x_stdperiph_lib3.5V版的,里面内容如图所示,据说STM32F103和STM32F101都能用。
2、创建第一个工程
1.新建一个文件夹取名如first_project,也可以建在桌面。
2.在里面新建CMSIS,libraries,Libaries,List(用于链接的),Obj(工程文件),output
(输出hex文件),User文件夹;
3.将固件库里Libraries--->STM32F10x_StdPeriph_Driver下的inc和src文件夹复
制到fisrt_project文件夹下的libraries里;
将固件库里Libraries--->CMSIS--->CM3--->CoreSupport文件夹里面的core_cm3.c
和core_cm3.h文件复制到我们新建的fisrt_project文件夹下的CMSIS里;
将固件库里Project---->STM32F10x_StdPeriph_Template(这个文件家里有KEIL和
IAR建好工程的模板)里的stm32f10x_conf.h,stm32f10x_it.c,
stm32f10x_it.h,system_stm32f10x.c四个文件复制到我们新建的fisrt_project
文件夹下的User里;
如下图所示
打开keiluvision4MDK,在菜单栏里点击project选择newuVisionproject
保存工程名,选择Obj文件夹,文件名为first_project,不用加后缀格式,系统默认。
接下来会弹出让你选择器件的窗口,这里我们选择STmicroelectronics的STM32F103C8
最后会弹出是否复制启动代码的对话框,选择YES;
3、接下来就是管理工程文件了
1、在project窗口右键点击Tagert1选择manageconponents或者找到倒数第二个品字形图标;
2、在Groups框下面将Groups1重命名为startup,同时添加CMSIS,Libraries,User;
选择CMSIS在Files框下将CMSIS文件夹的core_cm3.c添加进去;
选择Libraries在Files框下将Libraries--->src文件下的所以文件都加进去添加进去;
选择User在Files框下将User文件下的所以文件都加进去添加进去;
如下图所示:
点击OK,确定;
工程构架如下图所示:
4、编写main.c和文件路径
1、新建main.c保存到User文件夹里,将其添加到User工程名下。
#include"stm32f10x.h"
intmain(void)
{
while
(1)
{;}
}
2、在project框下,右键点击Target1,选择OptionsforTargettarget1
在output选项下,在createHEXfile前打上钩,点击selectFolderforObjects选择输出文
件夹为output文件夹;
在Listing选项下,点击selectFolderforListings选择链接文
件夹为List文件夹;
在C/C++选项下,define里填入USE_STDPERIPH_DRIVER,STM32F10X_MD中间用英
文的逗号;(一定要记得)
IncludePaths里,点击右边的文件路径框,选择相应的CMSIS,
libraries里的INC和SRC还有User;
也可以填绝对路径,比如:
C:
\Users\Administrator\Desktop\STM32编程练习
\fisrt_project\CMSIS这样比较麻烦
好了,这下开始编译链接:
0Error,0Warring;
First_project就建好了;万里长征的第一步,总算走出去了。
总结:
关键是Optionfortarget的设置,包括output,listing,和C/C++,尤其是C/C++这个选项里一定要设置对。
Define:
USE_STDPERIPH_DRIVER,STM32F10X_MD,这是预定义的两个宏定义。
在stm32f10x.h这个头文件里搜索USE_STDPERIPH_DRIVER有这么一段
#ifdefUSE_STDPERIPH_DRIVER
#include"stm32f10x_conf.h"
#endif
据说是定义控制了是否在应用中启用外设驱动。
在stm32f10x.h这个头文件里搜索STM32F10X_MD,
/*#defineSTM32F10X_MD*//*!
STM32Mediumdensity
devices*/STM32中密度器件
#ifdefSTM32F10X_MD
ADC1_2_IRQn=18,/*!
USB_LP_CAN1_RX0_IRQn=20,/*!
CAN1_RX1_IRQn=21,/*!
CAN1_SCE_IRQn=22,/*!
EXTI9_5_IRQn=23,/*!
5]Interrupts*/
:
:
:
#endif/*STM32F10X_MD*/可能是定义中断向量的值吧
就写到这里,才发现自己做也许一个两个小时就能建好工程,但是要把写出来我却用了一个下午。
为了大家跟我都尽快学会STM32,我会努力学习将成果与大家分享;
2013年12月25日
第三章
STM32点亮第一个LED使用keilforARMMDK软件仿真
按照上一章建立的第一个工程模板,我们只需要在main函数里加入相关的点亮led灯的代码,并使用keil的软件仿真功能。
软件仿真在一定程度上可以在设计的初期发现程序的错误,减少我们下载到开发板的麻烦。
但是纯软件的仿真的正确,也不能保证程序就正确。
有时候仿真正确,实物却没这个效果。
有时软件仿真结果是错误,你分析你的程序却没错误。
遇到多了,经验也就出来,前几天我仿真一个STM32的Systick,仿真结果就不对,程序就是对的,我估计也许是软件本身的问题。
我建议用STM32+JLINK进行仿真,有个硬件平台结果的正确性就有保证。
1、Main.c函数代码:
#include"stm32f10x.h"
voiddelay(void)/**/
{
inti,j;
for(i=1000;i>0;i--)
for(j=1000;j>0;j--);
}
voidGPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
intmain(void)
{
GPIO_Config();
SystemInit();
while
(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);//点亮PB.5
delay();
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//熄灭PB.5
delay();
GPIO_SetBits(GPIOB,GPIO_Pin_6);//点亮PB.6
delay();
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//熄灭PB.6
delay();
}
}
2、代码分析:
GPIO_InitTypeDefGPIO_InitStructure;
定义一个结构变量GPIO_InitStructure,结构体类型为GPIO_InitTypeDef,相当于int
A;GPIO_InitTypeDef=intGPIO_InitStructure=A一样。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
开启GPIOB的时钟,要使用某个管脚都需要开启该管脚的时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6;
管脚号设置为第五脚和第六脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Spee