1 只要按照下面的一步步来,绝对能从0开始建立一个STM32工程。不仅包括工程建立过程,还有Jlink设置方法。本文使用芯片为STM32F103CB。
1 下载stm32F10x的官方库
2 新建工程
工程名设为stm32_demo,选择芯片型号为STM32F103B,如图:
因为下载的stm32库中有启动代码,所以这里选择"否",不拷贝启动代码。
在工程文件下,新建Startup 、Headers、User、Libraries、CMSIS、Lists、Output文件夹。
至此,stm32的工程文件结构如下
3 库文件拷贝
把下载stm32库中文件拷贝到新建工程中
文件拷贝完成后的工程文件目录结构如下:
4 将文件添加到工程
点击Keil右上角的工程分组按钮,在Group一列添加分组,分组和工程的文件名可以一一对应。
5 工程配置
点击右上角的工程配置按钮,弹出对话框,有多个选项卡,按照下面截图逐一配置。
6 编译链接
原来的main.c从库文件中拷贝过来的,把其中的内容都删除,添加最简单的main函数:
#include "stm32f10x.h"
int main(void)
{
while(1) {
}
}
修改配置文件stm32f10x_conf.h,通过注释添加或取消注释删除需要的功能模块,这里根据自己需要配置。
编译
7 Jlink调试配置
接上Jlink及开发板,
至此,STM32的工程搭建和Jlink调试配置都设置好了。为了方便,在工程成中添加了includes.h、types.h、gpio_bits.h等提供基本功能。
8 测试程序——LED流水灯程序
在工程文件目录下新建Drivers与Devices文件夹,
工程中File->New,新建以上一些文件。
led.c
/*
* LED example
* Author : xiahouzuoxin
* Date : 2013.08
*/
#include "LED.h"
GPIO_InitTypeDef LED_InitStructure;
/********************************************************************
Function Name: Init_LED
Author : 夏侯佐鑫
Date : 2011-09-28
Description :
Inputs : None
Outputs : None
Notes :
Revision :
********************************************************************/
void InitLED(void)
{
//使能PA端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//端口配置推挽输出
LED_InitStructure.GPIO_Pin = LED1 | LED2 | LED3 | LED4;
LED_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
LED_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &LED_InitStructure);
//初始输出高电平
GPIO_SetBits(GPIOA, LED1 | LED2 | LED3 | LED4);
}
/********************************************************************
Function Name: Flash_LED
Author : xiahouzuoxin
Date : 2011-09-28
Description :
Inputs : None
Outputs : None
Notes :
Revision :
********************************************************************/
void FlashLED(void)
{
GPIO_SetBits(GPIOA, LED2 | LED3 | LED4);
GPIO_ResetBits(GPIOA, LED1);
delay_ms(500);
GPIO_SetBits(GPIOA, LED1 | LED3 | LED4);
GPIO_ResetBits(GPIOA, LED2);
delay_ms(500);
GPIO_SetBits(GPIOA, LED1 | LED2 | LED4);
GPIO_ResetBits(GPIOA, LED3);
delay_ms(500);
GPIO_SetBits(GPIOA, LED1 | LED2 | LED3);
GPIO_ResetBits(GPIOA, LED4);
delay_ms(500);
}
led.h
/*
* LED example
* Author : xiahouzuoxin
* Date : 2013.08
*/
#ifndef __LED_H__
#define __LED_H__
#include "../Headers/includes.h"
#define LED1 GPIO_Pin_4
#define LED2 GPIO_Pin_5
#define LED3 GPIO_Pin_6
#define LED4 GPIO_Pin_7
extern void InitLED(void);
extern void FlashLED(void);
#endif
delay.h
#ifndef _DELAY_H
#define _DELAY_H
#include "includes.h"
extern void delay_ms(UINT32 ms);
#endif
delay.c
#include "delay.h"
/********************************************************************* DELAY_MS
* Discription : delay for 1 ms if ms=1, not accurate
* Author : xiahouzuoxin
* data : 2012-08-01
* inputs : ms -- ms number
* outputs :
* Modified :
********************************************************************/
void delay_ms(UINT32 ms)
{
int i = 0;
int j = 0;
for(i = 0; i < ms; i++)
{
for(j = 0; j < 8040; j++)
{
// Delay n ms
}
}
}
includes.h
#include "../Devices/LED.h"
main.c
#include "includes.h"
int main(void)
{
InitLED();
while(1) {
FlashLED();
}
}
编译下载,运行,OK!