MDK上可以为多种处理器开发,调试软件。因此在生成项目的时候,需要知道目标处理器,调试工具。
目前将要开发的控制器使用的是 ST32L1XX,STlink开发板。
可以直接在芯片Search 框中输入目标控制器的型号,然后选择一个比较接近的控制器。
这个时候,如果是新项目,那么会把目标startup.s文件复制到项目目录下。
在Debug目录下选择调试工具。如果是 ST-Link,还需要选择是Jtag还是SW。st的Develop板使用的是SW 方式。
这个时候编译时不能通过的。在编译后会提示说找不到_main。
在添加了一个c文件,并加入了main函数后,链接时会报错,错误信息如下:
.\TestL.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32l1xx_md.o).
在网上搜索了一通,发现该函数是一个需要用户实现的函数,用于设置一个基本的寄存器。可以从例子中把这个函数复制过来直接使用。
代码如下:
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
}
加入这个函数后,又出现如下错误代码:
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
然后又出现了错误代码:
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中,当需要使用外设的时候,需要这个头文件
可能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函数的编译。