写第一个STM32程序常见错误及解决方法

写第一个STM32程序常见错误及解决方法
写第一个STM32程序常见错误及解决方法

1.启动KEIL,创建工程以后,先用创建文件,然后什么也不干,直接点击保存,保存

到你的工程文件夹下面,命名为main.c(其他也可以,命名为main.c是为了方便你同其他的C文件快速区分开来)。

然后输入以下几行代码:

#include "stm32f10x.h"

void main(void)

{

}

然后点击Build,会有以下报错信息:

C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(96): error: #35: #error directive: "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"

这是说stm32f10x.h中要求工程在预编译时通过一个字符串,来识别所用的芯片FLASH大小,然后确定头文件中哪些语句有效。ST把STM32按FLASH大小尺寸来归类的,具体在STM32参考手册里面有。

解决办法:请点击

中的

打开的界面中选到选项,然后Define里面输入STM32F10X_MD(因为这个实验板上

用的STM32F103C8T6对应这个“中等容量的FLASH”,换做其他芯片不一定是这个字符串),如图:

然后点击OK。

再,然后会出第二个错误:

C:\Keil\ARM\Inc\ST\STM32F10x\stm32f10x.h(8297): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory

这说明文件包含的路径没有设置好。

解决办法:

按上面所述选到选项。然后在

下选择,再点击,然后打开目录找到固件库里面的

这个文件(最好能把这个文件夹复制出来保存到一个纯英文路径的目录下),然后选择中里面的inc文件夹,然后再如法炮制选中里面的src文件夹。然后点击确定。效果如图:

点击OK,然后出现下图,再点OK保存

再点击OK。然后再Build,你会发现第二个错误已经解决了,但是出现了一个新错误,这个错误我们先不管。

2.我们先添加下面这么一段代码:

void RCC_Config(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_2); /

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /

RCC_PLLCmd(ENABLE);

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource() != 0x08)

{

}

}

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA

|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);

}

先不解释这上面代码的意义。在main函数中调用:

void main(void)

{

RCC_Config();

while(1)

{

}

}

然后点击Build,会出现15处错误。

之所以会出现如此多错误,是因为上面代码中用到的一些函数没有被声明或者定义过。这些函数来自于STM32的标准外设库函数(通常称之为固件库),在stm32f10x_conf.h这个头文件中包含了所有外设的头文件.h,每个外设头文件都有一个对应的.c源文件与之对应。

解决办法:

右键点击

然后Add Group,重命名文件夹为比如lib_src。再右击该文件夹,出现:

选择,然后打开STM32F10x_StdPeriph_Driver文

件夹下的src文件夹,添加以下几个文件:

然后重新Build以后,还会出现一个错误:

.\LED.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).

出现这个错误是因为SystemInit这个符号没有定义,这个其实是一个函数,定义在system_stm32f10x.c中,但是这个文件却在Keil的安装路径下。

解决办法:

还是右击lib_src,然后如图提示:

然后打开目录如下图:

然后把找到的system_stm32f10x.c添加进去。再点Build,就会发现所有错误都已经被解决掉了。这时就可以生成下载.hex文件了。如图:

点击,打开的界面中选择,然后前面的勾选上。再重新点击Build,就可以生成烧录文件了。

最后整个程序如下:

#include "stm32f10x.h"

void RCC_Config(void)

{

ErrorStatus HSEStartUpStatus;

RCC_DeInit();

RCC_HSEConfig(RCC_HSE_ON);

HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_2); /

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK2Config(RCC_HCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); /

RCC_PLLCmd(ENABLE);

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

{

}

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

while(RCC_GetSYSCLKSource() != 0x08)

{

}

}

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB, ENABLE);

}

void GPIO_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/* Configure PE.0,PE.1,PE.2,PE.3,PE.4,PE.5,PE.6,PE.7 as Output push-pull */

GPIO_InitStructure.GPIO_Pin = 0x00ff ;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void Delay_ms(uint16_t counts)

{

uint16_t i;

while(counts--)

{

i=2000;

while(i--);

}

}

void main(void)

{

RCC_Config();

GPIO_Config();

while(1)

{

GPIO_SetBits(GPIOA,0xff);

Delay_ms(500);

GPIO_ResetBits(GPIOA,0xff);

Delay_ms(500);

}

}

相关主题
相关文档
最新文档