准备资料: 登陆意法半导体论坛 下载STM32F10x_StdPeriph_Lib_V3.5.0固件库。如下图: 下载后解压,可以看到如下目录: 开始搭建: 1、 在桌面创建一个文件夹,命名为STM32_TEST(此名字可随意命名),然后分别创建子文件夹USER、CORE和STM32F10x_StdPeriph_Driver分 别用来存放用户文件、启动文件和固件库。如下图:
2、 将STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3CoreSupport路径下的两个文件core_cm3.c 和core_cm3.h拷贝到CORE文件夹下, 并将STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10xstartuparm路径下的所有文件也拷贝到CORE文件夹中。拷贝后如图所示: 3、 把STM32F10x_StdPeriph_Lib_V3.5.0LibrariesSTM32F10x_StdPeriph_Driver路径下的inc文件夹和src文件夹一起拷贝到上面建立的STM32F10x_StdPeriph_Driver文件夹下,如图: 4、将STM32F10x_StdPeriph_Lib_V3.5.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x路径下的stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h文件复制到USER文件夹下。 同时将STM32F10x_StdPeriph_Lib_V3.5.0ProjectSTM32F10x_StdPeriph_Template路径下的stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h文件也拷贝到USER文件夹下。 然后在USER文件夹下创建一个新文件,命名为STM32_TEST.c,并添加如下代码: int main(void) { return 0; }
如下图: 5、 至此准备工作告一段落,接下来开始建工程。打开MDK,新建工程,在STM32_TEST下新建一个文件夹,命名为Project,此文件夹用来放置工程文件和中间文件。将USER、CORE和STM32F10x_StdPeriph_Driver文件夹里的.c文件添加到工程中,CORE 文件夹中的启动文件(.s)文件只需要添加startup_stm32f10x_md.s即可,因为我用的STM32F103RB,是针对中等容量芯片的MCU。读者可以根据自己的MCU容量选择不同的启动文件。在此注意,如果不需要用到STM32F10x_StdPeriph_Driver里面的那么多功能,可以去掉不必要的文件,节省资源。同时还要记得在下图中添加头文件路径,否则包含头文件时要指定完整路径。
点击OK后,编译,发现一大堆报错,找到第一个报错的条目,如下: ..USERstm32f10x.h(96): error: #35: #error directive: "Please select first the target STM32F10x device used in your application (instm32f10x.h file)" 双击该错误,跳转到stm32f10x.h中:
提示你要选择应用程序使用的STM32F10x目标设备。由于我使用的是中等容量的STM32F103RB,所以在此选STM32F10X_MD。在如图中添加:
再次编译,还是报错,拉到最下面,会看到此行: STM32_TEST.axf: Error: L6218E: Undefinedsymbol assert_param (referred from misc.o). 这个错误提示说assert_param没定义,出现这个问题的原因是我们刚才工程中包含了固件库(即STM32F10x_StdPeriph_Driver文件夹下的内容),里面的很多.c文件都调用了assert_param。为了解决此问题,可以在工程中的查找assert_param,可以看到其定义体是在stm32f10x_conf.h文件中,如下图:
继续在工程中查找stm32f10x_conf.h,可以看到如下:
则只需要再定义USE_STDPERIPH_DRIVER宏就可以了。定义后如图: 至此,编译通过。如图: 接下来,可以自己写一个测试程序进行测试了。在STM32_TEST.c中输入以下代码,实现LED的闪烁: #include"stm32f10x.h" void Delay(int x) { int y,z; for(y = 0;y < x;y++) for(z = 0;z < 1000;z++); } void LedInit() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PA端口的时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //LED端口配置 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_1); //PA1 输出高 } int main(void) { SystemInit(); LedInit(); while(1) { GPIO_SetBits(GPIOA,GPIO_Pin_1); //PA.8 输出高 Delay(1000); GPIO_ResetBits(GPIOA,GPIO_Pin_1); Delay(1000); } } 并勾选Output栏下的Create HEX File选项。
编译即可在STM32_TEST文件夹下生成STM32_TEST.hex文件,烧写进开发板即可。
|