开发前期准备
- 开发环境:Keil μVision4
- 奋斗STM32开发板V5 STM32F103VET
- J-Link。文件夹,命名并保存。
建立工程模块
新建工程
- 选择公司和芯片型号(STM32F103VE)
- 弹出窗口:Copy STM32 startup code to project folder and add file to project? 选择否。
- 工程新建成功,接下来需添加文件。
- 在TEST文件夹中新建五个文件夹:USER、FWlib、 CMSIS、Output、Listing,其中USER已存在,不需再建。
USER用来存放工程文件和用户层代码,包括主函数main.c
FWlib用来存放STM32库里面的inc和src这两个文件夹,包含了芯片上所有驱动,这两个文件下文件不需修改。
- CMSISI用来存放库为我们自带的启动文件和一些位于CMSIS层的文件。
- Output文件夹用来保存软件编译后输出的文件。
- Listing用来保存编译后生成的链接文件。
- 回到keil中,在工程中新建四个组(除listing),(Target->Add Group)和刚才四个文件夹名字对应。
- 配置MDK选项卡
流水灯例程
#include "stm32f10x.h"
/*
#include "led.h"
*/
#define ON 1
#define OFF 0
#define DELAY_TIME 0x0FFFEF
enum
{
LED1= 0,
LED2,
LED3,
MAX_LED,
};
typedef struct led_gpio_s
{
int num; /* LED编号 */
GPIO_TypeDef *group; /* LED使用的GPIO组别 */
uint16_t pin; /* LED使用的GPIO组中哪一个pin管脚:GPIO_Pin_x */
}led_gpio_t;
led_gpio_t leds_gpio[MAX_LED] =
{
{LED1,GPIOB,GPIO_Pin_5}, /* LED1 用的GPB5 */
{LED2,GPIOD,GPIO_Pin_6}, /* LED2 用的GPD6 */
{LED3,GPIOD,GPIO_Pin_3}, /* LED3 用的GPB3 */
};
void LED_GPIO_Config(void)
{
int i;
/* 定义一个GPIO_InitTypeDef类型的结构体 */
GPIO_InitTypeDef GPIO_InitStructure;
/* 开启GPIOB GPIOD的外设时钟 */
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD , ENABLE);
/*
for(i=0; i<MAX_LED; i++)
{
/* 选择要控制的GPIO引脚 */
GPIO_InitStructure.GPIO_Pin = leds_gpio[i].pin;
/* 设置引脚模式为通用推挽输出 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/* 设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/* 调用库函数,初始化GPIOB GPIOD */
GPIO_Init(leds_gpio[i].group, &GPIO_InitStructure);
}
}
void turn_led(int which,int cmd)
{
if(which<0 || which> MAX_LED)
return;
if(OFF == cmd)
GPIO_ResetBits(leds_gpio[which].group, leds_gpio[which].pin);
else
GPIO_ResetBits(leds_gpio[which].group, leds_gpio[which].pin);
}
/*void Delay(__IO u32 nCount); 精确度不高的延时函数 */
int main(void)
{
/* 初始化系统时钟 */
SystemInit();
/* 初始化LED端口 */
LED_GPIO_Config();
while(1);
{
/* 把LED1点亮,LED2和LED3灭掉 */
turn_led(LED1, ON);
turn_led(LED2, OFF);
turn_led(LED3, OFF);
Delay(DELAY_TIME);
/* 把LED2点亮,LED1和LED3灭掉 */
turn_led(LED2, ON);
turn_led(LED1, OFF);
turn_led(LED3, OFF);
Delay(DELAY_TIME);
/* 把LED3点亮,LED1和LED2灭掉 */
turn_led(LED3, ON);
turn_led(LED2, OFF);
turn_led(LED1, OFF);
Delay(DELAY_TIME);
}
}
void Delay(__IO u32 nCount) /* 精确度不高的延时函数 */
{
for(; nCount !=0; nCount--);
}
遇到问题
Build target ‘stm32_led’
compiling main.c…
main.c(48): warning: #9-D: nested comment is not allowed
main.c(60): error: #169: expected a declaration
main.c(100): warning: #12-D: parsing restarts here after previous syntax error
main.c(101): error: #40: expected an identifier
main.c(101): warning: #77-D: this declaration has no storage class or type specifier
main.c(101): error: #92: identifier-list parameters may only be used in a function definition
main.c(102): error: #40: expected an identifier
main.c(102): warning: #77-D: this declaration has no storage class or type specifier
main.c(102): error: #92: identifier-list parameters may only be used in a function definition
main.c(103): error: #79: expected a type specifier
main.c(103): warning: #77-D: this declaration has no storage class or type specifier
main.c(104): error: #169: expected a declaration
main.c(111): warning: #1-D: last line of file ends without a newline
main.c(111): warning: At end of source: #12-D: parsing restarts here after previous syntax error
Target not created
字体大小调不了、代码行号无法显示
以上问题尚未解决
已解决问题:
原因:
在硬件调试时添加了两次STM32F 10xHigh-density Flash。导致算法地址重叠。
解决方法:
将其中一个remove。