使用Keil MDK运行第一个STM32F10X程序.docx

上传人:b****4 文档编号:24831351 上传时间:2023-06-01 格式:DOCX 页数:22 大小:911.78KB
下载 相关 举报
使用Keil MDK运行第一个STM32F10X程序.docx_第1页
第1页 / 共22页
使用Keil MDK运行第一个STM32F10X程序.docx_第2页
第2页 / 共22页
使用Keil MDK运行第一个STM32F10X程序.docx_第3页
第3页 / 共22页
使用Keil MDK运行第一个STM32F10X程序.docx_第4页
第4页 / 共22页
使用Keil MDK运行第一个STM32F10X程序.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

使用Keil MDK运行第一个STM32F10X程序.docx

《使用Keil MDK运行第一个STM32F10X程序.docx》由会员分享,可在线阅读,更多相关《使用Keil MDK运行第一个STM32F10X程序.docx(22页珍藏版)》请在冰豆网上搜索。

使用Keil MDK运行第一个STM32F10X程序.docx

使用KeilMDK运行第一个STM32F10X程序

使用KeilMDK运行第一个STM32F10X程序

在上一小节中已经详细介绍了使用KeilMDK和标准外设库创建一个工程的过程,下面将介绍基于这个工程来编写一个小程序,通过这个程序我们可以初步了解:

1.STM32标准外设库的简单使用过程

2.STM32外设的使用方法和大致流程

3.程序的编译、链接、下载步骤

4. 利用KeilMDK的在线仿真功能进行软件仿真的简要步骤

1.程序的编写

(1)程序实现的功能

为了方便各位读者的入门和理解,这个小程序的功能非常简单,作为本书功能实践的第一个程序,其功能当然也是最为经典的“HelloWorld!

”了,只不过不是简单的屏幕输出,而是利用硬件的串口进行输出,同时作为单片机类的第一个程序自然少不了LED闪烁的功能,这就是这个小程序的两个主要的功能:

l利用串口1输出“HelloWorld!

”字符。

l控制两个LED闪烁。

(2)程序的实现

在基于标准外设库进行程序开发时一定要充分利用标准外设库下面的帮助文件stm32f10x_stdperiph_lib_um.chm以及库中自带的工程实例,同时结合STM32F10x系列的芯片手册来完成程序的开发,stm32f10x_stdperiph_lib_um.chm帮助文件如图525所示。

此文件中已经包含了标准外设库的全部内容,并根据根据内容结构进行了重新的编排和整理,更加方便程序的阅读和理解。

STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples文件夹下包括了众多外设的使用例程,这里的例程多是针对官方的开发板而编写,然而这些例程却非常全面的展示了相关外设的各种使用方法,对我们做基于标准外设库的开发有着非常重要的意义。

图525标准外设库的帮助文档

我们的第一个程序就通过这些参考来完成,首先来看串口部分。

串口部分的详细信息可以参考本书第8章,这儿只进行简单的说明和介绍简便的开发方法,首先先找一个与我们使用的功能最近的一个例程,STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\USART文件夹下给出了多达12中的USART例程,这里选择较为相近的Interrupt文件夹下得例程,打开文件夹下面的mian.c文件,通过简单的浏览可以找到如下一段程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

/*USARTyandUSARTzconfiguration------------------------------------------------------*/

 

/*USARTyandUSARTzconfiguredasfollow:

 

-BaudRate=9600baud

 

-WordLength=8Bits

 

-OneStopBit

 

-Noparity

 

-Hardwareflowcontroldisabled(RTSandCTSsignals)

 

-Receiveandtransmitenabled

 

*/

 

USART_InitStructure.USART_BaudRate=9600;

 

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

 

USART_InitStructure.USART_StopBits=USART_StopBits_1;

 

USART_InitStructure.USART_Parity=USART_Parity_No;

 

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

 

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

 

/*ConfigureUSARTy*/

 

USART_Init(USARTy,&USART_InitStructure);

 

/*ConfigureUSARTz*/

 

USART_Init(USARTz,&USART_InitStructure);

 

/*EnableUSARTyReceiveandTransmitinterrupts*/

 

USART_ITConfig(USARTy,USART_IT_RXNE,ENABLE);

 

USART_ITConfig(USARTy,USART_IT_TXE,ENABLE);

 

/*EnableUSARTzReceiveandTransmitinterrupts*/

 

USART_ITConfig(USARTz,USART_IT_RXNE,ENABLE);

 

USART_ITConfig(USARTz,USART_IT_TXE,ENABLE);

 

/*EnabletheUSARTy*/

 

USART_Cmd(USARTy,ENABLE);

 

/*EnabletheUSARTz*/

 

USART_Cmd(USARTz,ENABLE);

  上面的这段的程序配合注释可以很容易理解,USART_InitTypeDef定义了一个包括USART主要参数的结构体,因此首先对USART的相关参数进行配置,使用标准外设库进行配置的优势就体现出来了,通过程序可以很容易读出这个串口的配置:

l波特率9600Kbps

l数据长度8

l停止位1

l奇偶校验:

l硬件流控制:

l工作模式:

收、发

然后利用USART_Init函数进行初始化,这段程序中设置了两个串口,使用同样的配置,然后配置相应的中断。

最后通过USART_Cmd函数使能相应的串口,前面有过介绍,这些例程里的程序是针对官方的开发套件的,因此程序中并没有指名具体的端口,而是使用了宏定义USARTy、USARTz。

通过这段程序就可以很方便的更改相关的参数得到我们需要的配置程序。

这儿只是完成了USART的配置,下面来看一下对应的I/O设置,仍然在这个文件中可以找到GPIO_Configuration(void)这个函数,程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

void GPIO_Configuration(void)

 

{

 

GPIO_InitTypeDefGPIO_InitStructure;

 

#ifdefUSE_STM3210C_EVAL

 

/*EnabletheUSART3PinsSoftwareRemapping*/

 

GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);

 

/*EnabletheUSART2PinsSoftwareRemapping*/

 

GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);

 

#elifdefinedUSE_STM3210B_EVAL||definedUSE_STM32100B_EVAL

 

/*EnabletheUSART2PinsSoftwareRemapping*/

 

GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);

 

#endif

 

/*ConfigureUSARTyRxasinputfloating*/

 

GPIO_InitStructure.GPIO_Pin=USARTy_RxPin;

 

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

 

GPIO_Init(USARTy_GPIO,&GPIO_InitStructure);

 

/*ConfigureUSARTzRxasinputfloating*/

 

GPIO_InitStructure.GPIO_Pin=USARTz_RxPin;

 

GPIO_Init(USARTz_GPIO,&GPIO_InitStructure);

 

/*ConfigureUSARTyTxasalternatefunctionpush-pull*/

 

GPIO_InitStructure.GPIO_Pin=USARTy_TxPin;

 

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

 

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

 

GPIO_Init(USARTy_GPIO,&GPIO_InitStructure);

 

/*ConfigureUSARTzTxasalternatefunctionpush-pull*/

 

GPIO_InitStructure.GPIO_Pin=USARTz_TxPin;

 

GPIO_Init(USARTz_GPIO,&GPIO_InitStructure);

 

}

  

这段函数完成了相关的I/O配置,首先通过宏定义判断是官方的哪一款开发套件,然后进行相应的端口映射(端口映射请参加官方的数据手册),然后进行相应的端口配置,同串口配置一样,这段程序中德端口用的也是宏定义USARTy_RxPin替代的,改为我们使用的实际I/O,端口时钟设置为50MHz,串口所使用到的端口设置为复用(GPIO_Mode_AF_PP)完成端口初始化。

另外仍然通过观察这个例程可以很容易发现,在使用一个外设时还需要首先打开对应的外设时钟,这部分程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

void RCC_Configuration(void)

 

{

 

/*EnableGPIOclock*/

 

RCC_APB2PeriphClockCmd(USARTy_GPIO_CLK|USARTz_GPIO_CLK|RCC_APB2Periph_AFIO,ENABLE);

 

#ifndefUSE_STM3210C_EVAL

 

/*EnableUSARTyClock*/

 

RCC_APB2PeriphClockCmd(USARTy_CLK,ENABLE);

 

#else

 

/*EnableUSARTyClock*/

 

RCC_APB1PeriphClockCmd(USARTy_CLK,ENABLE);

 

#endif

 

/*EnableUSARTzClock*/

 

RCC_APB1PeriphClockCmd(USARTz_CLK,ENABLE);

 

}

  

这段程序中需要注意两点,首先,GPIO、USART等都是连在APB1、APB2两条总线上的,各外设具体的总线连接情况参见图52,因此首先应该确定外设对应的总线,例如USART1是APB2总线,而USART2是APB1总线。

其次使能相应的时钟时不光要使能对应的I/O端口,还要使能总线的复用端口,这点也容易忽略。

最后根据库中的例程,借鉴库中例程的编写风格,就可以得出我们需要的程序,程序在工程的mian.c中编写,函数如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

#include"stm32f10x.h"

 

void USART_Configuration(void);

 

void GPIO_Configuration(void);

 

void Delay(__IOuint32_tnCount);

 

void USART1_Puts(char *str);

 

int main(void)

 

{

 

USART_Configuration();

 

GPIO_Configuration();

 

USART1_Puts("HelloWrold!

\n");

 

while 

(1)

 

{

 

GPIOF->BSRR=0x000000C0;

 

Delay(0xAFFFF);

 

GPIOF->BRR=0x000000C0;

 

Delay(0xAFFFF);

 

USART1_Puts("HelloWrold!

\n");

 

}

 

}

 

void USART_Configuration(void)

 

{

 

GPIO_InitTypeDefGPIO_InitStructure;

 

USART_InitTypeDefUSART_InitStructure;

 

//使能串口、串口所用的I/O口以及端口复用时钟

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);

 

/*A9USART1_Tx*/

 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;

 

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

 

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽输出-TX

 

GPIO_Init(GPIOA,&GPIO_InitStructure);

 

/*A10USART1_Rx*/

 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;

 

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入-RX

 

GPIO_Init(GPIOA,&GPIO_InitStructure);

 

USART_InitStructure.USART_BaudRate=9600;

 

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

 

USART_InitStructure.USART_StopBits=USART_StopBits_1;

 

USART_InitStructure.USART_Parity=USART_Parity_No;

 

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

 

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

 

USART_Init(USART1,&USART_InitStructure);

 

/*EnabletheUSARTx*/

 

USART_Cmd(USART1,ENABLE);

 

}

 

void GPIO_Configuration(void)

 

{

 

GPIO_InitTypeDefGPIO_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);

 

/*设置LED对应的引脚*/

 

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;

 

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

 

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

 

GPIO_Init(GPIOF,&GPIO_InitStructure);

 

}

 

void Delay(__IOuint32_tnCount)

 

{

 

for(;nCount!

=0;nCount--);

 

}

 

void USART1_Puts(char *str)

 

{

 

while(*str)

 

{

 

USART_SendData(USART1,*str++);

 

/*Loopuntiltheendoftransmission*/

 

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

 

}

 

}

  

至此完成了主函数的编写。

接下来还需要到stm32f10x_conf.h文件中选择相应的头文件,这儿去掉需要使用的头文件之前的注释,去掉注释的头文件如下:

l#include"stm32f10x_gpio.h"

l#include"stm32f10x_gpio.h"

l#include"stm32f10x_usart.h"

这样,我们的程序编写就完成了,下面可以进行我们的编译与调试了。

2.程序的编译

在KeilMDK的工具栏上自左至右依次有

三个图标,分别为编译指定文件、生成工程、重新生成所有工程。

首先在mian.c下点击编译图标,如果编译没有错误,则输出窗口如图526所示。

如果编译存在错误,点击错误的地方可以直接定位到错误行,根据错误提示进行修改。

图526编译输出窗口

编译不存在错误后点击

图标生成工程,生成没有错误则输入如图527所示。

如果存在错哦无则可以直接点击对应的错误跳转到对应的文件对应的行,根据错误提示进行再次修改。

图527生成工程输出窗口

第一次生成工程成功以后,如果修改了相应的文件再次点击生成工程时只会对有改动的文件进行重新编译、生成,而重新生成全部工程会重新生成工程中的所有文件。

3.程序的调试

在实际开发时,可以首先利用软件进行仿真,利用软件进行仿真查看具体的寄存器配置,外设的工作情况等,同时通过断点的配合可以查找出程序中绝大多数的错误。

软件仿真完成后可以下载到硬件平台去运行,如果程序仍然没有达到需要的效果,在硬件检查完成后可以使用在线仿真的方式,在硬件平台上直接运行程序,进一步查找问题。

首先,先看一下这个小程序的软件仿真,首先在工程设置Debug选项中选择使用软件模拟,如图528所示。

图528Debug设置选项窗口

点击

图标,或者从菜单栏-Debug启动调试。

启动后界面如图529所示。

调试启动后自动运行到主程序。

图529调试主界面

在工具栏可以找到与调试相关的快捷图标

,同样在菜单栏Debug菜单下可以找到对应的选项,自左向右分别为复位,运行,点击后直接运行程序;停止,运行时点击停止当前运行;单步,单步执行当前程序;跳过,可以直接跳过子函数的运行;跳出,在某个子函数中运行时可以直接跳出当前函数;运行到光标位置处。

在程序行号的左侧直接双击可以非常方便的添加或者取消断点,如图530所示。

图530断点的添加与取消

在菜单Peripherals中可以打开需要查看的外设,这里点击Peripherals-USART1弹出USART1的相关观察窗口,点击运行后,窗口如图531所示,就会显示运行的程序对USART1所完成的相关配置。

从中可以清晰的看出,程序对USART1的相关寄存器配置,从地面Settings一栏中则可以直观的看出USART1当前的工作状态,从这儿就可以检查我们的相关参数设置正确与否,对应时钟有无开启等。

需要说明的是这里寄存器在进行仿真的时候是可以进行改写的,也就是说允许我们在程序运行的时候直接进行相关的操作来观察运行结果。

但是此时程序本身也是可以对寄存器进行操作的,因此直接更改相应的寄存器观察时还要注意你的操作是否和程序冲突。

例如在本程序的运行过程中如果将寄存器中发送使能TE的勾给去掉,则串口就不会在输出数据。

图531USART1寄存器观察窗口

接下来继续查看I/O的配置,本程序中使用的是F端口,则点击菜单Peripherals-General-PurposeI/O,选择GPIOF,出现GPIOF的配置窗口,程序运行后可以通过窗口查看GPIOF的相关配置,如图532所示。

在这个窗口中可以查看引脚的配置情况,当程序运行时就能看到对应引脚的勾在闪烁。

图532GPIOF寄存器观察窗口

通过这些操作,可以非常方便、直观的查

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

当前位置:首页 > 表格模板 > 书信模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1