建立MDK4 项目

建立MDK4项目时需要知道的信息

MDK上可以为多种处理器开发,调试软件。因此在生成项目的时候,需要知道目标处理器,调试工具。

目前将要开发的控制器使用的是 ST32L1XX,STlink开发板。

选择MCU

可以直接在芯片Search 框中输入目标控制器的型号,然后选择一个比较接近的控制器。

这个时候,如果是新项目,那么会把目标startup.s文件复制到项目目录下。

选择调试工具

在Debug目录下选择调试工具。如果是 ST-Link,还需要选择是Jtag还是SW。st的Develop板使用的是SW 方式。


添加文件,编译

添加main函数

这个时候编译时不能通过的。在编译后会提示说找不到_main。

在添加了一个c文件,并加入了main函数后,链接时会报错,错误信息如下:

.\TestL.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32l1xx_md.o).

添加 SystemInit

在网上搜索了一通,发现该函数是一个需要用户实现的函数,用于设置一个基本的寄存器。可以从例子中把这个函数复制过来直接使用。

代码如下:

void SystemInit (void)
{
  /*!< Set MSION bit */
  RCC->CR |= (uint32_t)0x00000100;

  /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */
  RCC->CFGR &= (uint32_t)0x88FFC00C;
 
  /*!< Reset HSION, HSEON, CSSON and PLLON bits */
  RCC->CR &= (uint32_t)0xEEFEFFFE;

  /*!< Reset HSEBYP bit */
  RCC->CR &= (uint32_t)0xFFFBFFFF;

  /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */
  RCC->CFGR &= (uint32_t)0xFF02FFFF;

  /*!< Disable all interrupts */
  RCC->CIR = 0x00000000;
    
  /* Configure the System clock frequency, AHB/APBx prescalers and Flash settings */
  SetSysClock();

#ifdef VECT_TAB_SRAM
  SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}

添加宏定义 USE_STDPERIPH_DRIVER STM32L1XX_MDP

加入这个函数后,又出现如下错误代码:

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

对比了例子代码后,在C/C++ Define 中加入 如下宏定义 USE_STDPERIPH_DRIVER STM32L1XX_MDP

添加stm32l1xx_conf.h 以及驱动头文件

然后又出现了错误代码:

C:\Keil\ARM\Inc\ST\STM32L1xx\stm32l1xx.h(6638): error:  #5: cannot open source input file "stm32l1xx_conf.h": No such file or directory

在 stm32lxxx.h中,当需要使用外设的时候,需要这个头文件

#ifdef USE_STDPERIPH_DRIVER
  #include "stm32l1xx_conf.h"
#endif

可能Keil认为各个处理器的外设的寄存器地址的定义是不同的,因此不在内部定义这个头文件了,而改为用户自己定义这个头文件。在这个头文件中需包含各个外设的寄存器地址定义。在从例子中加入了这个头文件,并加入了外设定义目录后再次编译。

要注意的是光把这个文件复制到项目目录下还不行,还得把这个文件添加到项目中去才是有效的。

除了这个文件外,还要把例子中的STM32L1xx_StdPeriph_Driver复制到项目目录,并添加到项目中才行。

添加 VECT_TAB_OFFSET

继续编译,又出现如下错误:

Main.c(36): error:  #20: identifier "VECT_TAB_OFFSET" is undefined

    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */

从例子中找到了这个宏定义,添加到我的代码中

#define VECT_TAB_OFFSET  0x0 /*!< Vector Table base offset field.
                                  This value must be a multiple of 0x200. */

终于完成了一个main函数的编译。

烧写,调试

新建立的项目是无法烧写的,把项目设置文件按照例子抄一遍就可以了。我也不记得哪个参数是关键参数,总之抄过去就对了。






你可能感兴趣的:(mdk)