STM32f103C8T6入门学习记录.doc

上传人:wj 文档编号:8776031 上传时间:2023-05-14 格式:DOC 页数:35 大小:1.13MB
下载 相关 举报
STM32f103C8T6入门学习记录.doc_第1页
第1页 / 共35页
STM32f103C8T6入门学习记录.doc_第2页
第2页 / 共35页
STM32f103C8T6入门学习记录.doc_第3页
第3页 / 共35页
STM32f103C8T6入门学习记录.doc_第4页
第4页 / 共35页
STM32f103C8T6入门学习记录.doc_第5页
第5页 / 共35页
STM32f103C8T6入门学习记录.doc_第6页
第6页 / 共35页
STM32f103C8T6入门学习记录.doc_第7页
第7页 / 共35页
STM32f103C8T6入门学习记录.doc_第8页
第8页 / 共35页
STM32f103C8T6入门学习记录.doc_第9页
第9页 / 共35页
STM32f103C8T6入门学习记录.doc_第10页
第10页 / 共35页
STM32f103C8T6入门学习记录.doc_第11页
第11页 / 共35页
STM32f103C8T6入门学习记录.doc_第12页
第12页 / 共35页
STM32f103C8T6入门学习记录.doc_第13页
第13页 / 共35页
STM32f103C8T6入门学习记录.doc_第14页
第14页 / 共35页
STM32f103C8T6入门学习记录.doc_第15页
第15页 / 共35页
STM32f103C8T6入门学习记录.doc_第16页
第16页 / 共35页
STM32f103C8T6入门学习记录.doc_第17页
第17页 / 共35页
STM32f103C8T6入门学习记录.doc_第18页
第18页 / 共35页
STM32f103C8T6入门学习记录.doc_第19页
第19页 / 共35页
STM32f103C8T6入门学习记录.doc_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

STM32f103C8T6入门学习记录.doc

《STM32f103C8T6入门学习记录.doc》由会员分享,可在线阅读,更多相关《STM32f103C8T6入门学习记录.doc(35页珍藏版)》请在冰点文库上搜索。

STM32f103C8T6入门学习记录.doc

STM32自学笔记

作者:

忙碌的小姚

新浪微博:

@忙碌的小姚

新浪博客:

目录

STM32自学笔记 1

第一章 3

我与STM32的那些日子 3

第二章 4

使用固件库建立一个工程 4

1、了解STM32F103的固件库 4

2、创建第一个工程 4

3、接下来就是管理工程文件了 9

4、编写main.c和文件路径 10

第三章 14

STM32点亮第一个LED使用keilforARMMDK软件仿真 14

1、Main.c函数代码:

14

2、代码分析:

15

3、软件仿真介绍:

16

第四章 19

串口的使用 19

1、为什么要用串口?

19

2、STM32跟PC机(也就是电脑)如何连接 19

3、代码分析 20

4、仿真及调试 23

5、串口接收数据 25

第五章 27

通用定时器的使用 27

1、STM32F103内部定时器有哪些?

27

2、如何进行程序编写 27

3仿真结果观察 30

4对第四章串口的补充 31

5工程代码 35

第一章

我与STM32的那些日子

STM32这块板子是在阿莫上跟一个老师买的,砍了半天100块钱。

包括一个Jlinkv8仿真器(好像65块左右),和一块STM32系统板。

那已是一年前的事了。

那时我刚大三,刚学了半年51,于是想学点更高级的。

但我好像属于三分钟热度的这种人,买回来学了一个星期,就学不动了,寄存器操作,固件库的使用根本就没明白是怎么一回事,之后就没有然后了。

现在看到那块板子,总有一种说不出的滋味,要是当时能咬牙切齿努力学习,说不定现在也不会安静地坐在电脑前一字一句敲打这篇激励性文章了。

对于STM32我没用任何基础,唯一有的也只是一年前学的那一个星期,不过那已不重要了,我现在仍是一个小白。

作为一个初学者,也许是坐井观天,看的是片面的,可能有很多观点是错误的,希望读者朋友能勇于指出来。

-----前记

第二章

使用固件库建立一个工程

我打算先从软件编程学起,以前用过KEIL和IAR,IAR我比较熟悉,因为参加电子设计竞赛的时候,就是用它编程MSP430程序的。

但我还是选择了KEIL,也许因为资料比较多,或者别的吧,我没分析过KEIL和IAR代码效率如何,因为这不是我现在要考虑的,软件都只是工具而已。

我去百度搜索了几篇如何在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_Speed_10MHz,

GPIO_Speed_2MHz,

GPIO_Speed_50MH

设置管脚电平翻转的速率,比如不要求快速变化一般10M,做串口的时候设置较高波 特率的话就使用50MHZ的。

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

设置输出为推挽输出。

它有8中工作模式,输出只有两种推挽和开漏输出。

其它可以参

考相关手册

GPIO_Init(GPIOB,&GPIO_InitStructure);

这一句就是将前面四句的设置初始化到GPIOB中;

SystemInit();将系统时钟设置为72M,不写这句,默认为8M;

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();

编译链接,然后开始软件仿真

3、软件仿真介绍:

1、编译连接好后,点击debug进入调试界面

2、调试窗口如下

3、

图片上加文字不好弄,大概就是复位、运行、停止、单步运行等我也不太熟悉,反正用到的时候试一试就知道了。

4、选择菜单栏上的peripherals按钮,选择generalpurposeI/O的GPIOB

5、点击左上角的运行按钮或者按F5键就可以看到GPIOB的5,6在一闪一闪的

6、顺便在看看波形仿真功能

点击下图的波形分析按钮

点击setup按钮会弹出一个窗口,在窗口的右上边,有个new的按钮,点击后

分别输入PORTB.5和PORTB.6

8、点击运行,将窗口调到合适的位置,最终波形图如下;

写得有些地方可能有错误,明天就要回四川了,有些急

2014年1月12日

第四章

串口的使用

1、为什么要用串口?

自上一篇写的时间是1月20号,今6月7号了,半年没更新了。

这半年发生了什么?

过完年就去找公司实习,在那里自我感觉进步很大。

其实在公司大多都是自学,师傅基本不会给你说什么。

但这并不能说明你的师傅对你不好,带我的那个师傅只比我高一届,但他的水平比我高的好多届。

他也是自学,也没人告诉他该怎么做,因为老板也不太懂。

所以自学能力很重要,当然有人带你的话,这样会更好。

不说这些了,串口在调试的时候作用非常大。

也学我们在学51的时候,只是将程序下载到开发板,看看是否能运行起来,通过数码管将结果显示出来,从而就知道程序设计的正确性。

以前我也是这样做的,没什么不好。

在公司实习的时候,他们调试都是使用串口打印输出信息,观察程序从上电、初始化、运行数据什么的全部都显示到PC机上。

然后再一句一句分析它的打印信息,从而找到出错的源头。

这使我对串口的认识有更深了一步,所以我决定在学习STM32的时候,开发流程跟在公司学的方法一样——使用串口,观察打印信息。

2、STM32跟PC机(也就是电脑)如何连接

我的STM32F103C8T6只是裸板,没有串口芯片,当然用的也是学生机——笔记本电脑,同样也没串口。

解决办法1、买一块MAX3232转接板+一条USB转串口线+邮费=30块左右

2、只需要买一块PL2303的USB转接板。

这样就将第一种的转接板和连接结合到一起了。

不过我用的是第一种,MAX3232+USB的串口线,为什么不用方便的2种?

max3232对于没有串口的开发板可以充当电平转换芯片,如何开发板有了电平转换芯片,我便使用USB转串口线经行连接,这样便灵活了。

第二种只是用在既没转换芯片也没USB转串口的情况,不过对于最小系统板来说,它既可以下载程序,又可以当做串口来调试。

至于台式机就不需要USB转串口线了,普通串口线即可。

连接示意如下所示:

3、代码分析

再写这里之前,应该已经学过模块化编程了,STM32的每个XXX.c和xxx.h这都是模块化编程。

良好的程序,与其好的代码风格有关。

你的代码风格跟你接触教你写代码的有很大关系。

以前刚刚学习单片机编程,我还不信,现在我承认,跟教我单片机的老师风格有些像。

这里我做的是一个串口发送数据到PC机的例子:

要让STM32能够顺利发出数据,要进行如下配置

PA9,PA10管脚要配置, USART也需要配置波特率,数据有几位,停止位,数据流等。

USART和uart有什么区别USART在做串口时,两者并不区别,但是USART有SPI的功能。

还有串口通信为什么要配置波特率,停止位,硬件数据留这些,以前我也没想过,现在只觉得协议这个东西,是一个好的标准。

建立一个usart_debug.c的文本,内容如下

#include"usart_debug.h"

voidGPIO_Configuration(void)

{

GPIO_InitTypeDefGPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能UASRT的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟,开始的时候,我没用这句话,调了两天,跟源码一句一句比才知道

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//波特率较高,IO翻转需较高频率

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出;我看网上有人说设置成GPIO_Mode_Out_PP普通推挽输出也行,但实践出真知,我试了发送是乱码。

;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置成浮空输入,既然是输入所以就不用配置IO口的频率了

GPIO_Init(GPIOA,&GPIO_InitStructure);

}

voidUSART1_config(void)

{

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate=115200;//配置波特率

USART_InitStructure.USART_WordLength=USART_WordLength_8b;//配置数据位

USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位

USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶校验位

USART_InitStructure.USART_Hardware

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2