写第一个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();
dota半人马    GPIO_Config();
    while(1)
    {
        GPIO_SetBits(GPIOA,0xff);
        Delay_ms(500);
        GPIO_ResetBits(GPIOA,0xff);
        Delay_ms(500);
    }
}

本文发布于:2024-09-21 22:06:20,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/570696.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:文件夹   文件   错误   没有   函数   保存   工程
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议