GPIO 入门之流水灯

开发前期准备

  • 开发环境:Keil μVision4
  • 奋斗STM32开发板V5 STM32F103VET
  • J-Link。文件夹,命名并保存。

建立工程模块

新建工程

  1. 选择公司和芯片型号(STM32F103VE)GPIO 入门之流水灯_第1张图片
  2. 弹出窗口:Copy STM32 startup code to project folder and add file to project? 选择否。
  3. 工程新建成功,接下来需添加文件。GPIO 入门之流水灯_第2张图片
  4. 在TEST文件夹中新建五个文件夹:USER、FWlib、 CMSIS、Output、Listing,其中USER已存在,不需再建。GPIO 入门之流水灯_第3张图片
  5. USER用来存放工程文件和用户层代码,包括主函数main.c

  6. FWlib用来存放STM32库里面的inc和src这两个文件夹,包含了芯片上所有驱动,这两个文件下文件不需修改。

  7. CMSISI用来存放库为我们自带的启动文件和一些位于CMSIS层的文件。
  8. Output文件夹用来保存软件编译后输出的文件。
  9. Listing用来保存编译后生成的链接文件。
  10. GPIO 入门之流水灯_第4张图片GPIO 入门之流水灯_第5张图片GPIO 入门之流水灯_第6张图片GPIO 入门之流水灯_第7张图片GPIO 入门之流水灯_第8张图片GPIO 入门之流水灯_第9张图片GPIO 入门之流水灯_第10张图片
  11. 回到keil中,在工程中新建四个组(除listing),(Target->Add Group)和刚才四个文件夹名字对应。
  12. GPIO 入门之流水灯_第11张图片GPIO 入门之流水灯_第12张图片GPIO 入门之流水灯_第13张图片GPIO 入门之流水灯_第14张图片GPIO 入门之流水灯_第15张图片GPIO 入门之流水灯_第16张图片GPIO 入门之流水灯_第17张图片GPIO 入门之流水灯_第18张图片GPIO 入门之流水灯_第19张图片
  13. 配置MDK选项卡GPIO 入门之流水灯_第20张图片GPIO 入门之流水灯_第21张图片GPIO 入门之流水灯_第22张图片GPIO 入门之流水灯_第23张图片

流水灯例程

#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
                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

字体大小调不了、代码行号无法显示
以上问题尚未解决

已解决问题:
GPIO 入门之流水灯_第24张图片
GPIO 入门之流水灯_第25张图片
GPIO 入门之流水灯_第26张图片
GPIO 入门之流水灯_第27张图片
原因:
在硬件调试时添加了两次STM32F 10xHigh-density Flash。导致算法地址重叠。
解决方法:
将其中一个remove。

你可能感兴趣的:(stm32)