打印
[STM32F4]

【Nucleo-F413ZH创想】实验二 开始首个实验-点亮LED,理解GPIO

[复制链接]
1545|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhjb1|  楼主 | 2017-1-16 12:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhjb1 于 2017-2-16 14:38 编辑

【Nucleo-F413ZH创想】实验二 开始首个实验-点亮LED,理解GPIO
本人的计算机安装的是64位Windows 7 旗舰版,在安装驱动时,先进入安全模式,安装完成后重新进入正常模式USB驱动就正常了。
由于生成的是STM32F411re的工程,与F413相处甚远,需要做许多工作来搭出我们的新平台,尤其是对KEIL还不太熟悉的I。
有几步需要做:
1. 先下载MDK 5.22版的KEIL,原因是用以前机器上的KEIL 5.18a的在编译后总出现FPU的浮点错误,只好升级到5.22。
2. 到keil网站下载Keil.STM32F4xx_DFP.2.11.0.pack驱动包,并且安装到keil中,这个包比较大460MB左右。
完成上述[因为没人的机器不一样,遇到的问题也许与我的不一样]就可以开始进入keil了。
下边做的工作都是在KEIL中完成的,因为生成的工程文件是STM32F411re而实际的板子是STM32F413ZH,两者相差比较大,需要更改许多东西,下边按部就班地进行操作:
3. 首先点击Project/Open Projece,找到下载解压后的的工程文件夹打开
4. 右击mbed411Blinky/Option选项,Device中选择STM32F413ZHTx芯片,图20
5. 如果有自加的文件夹,文件需要设置C/C++,否则设置Debug,图21
6. Debug 选项中选择工具ST Debugger,图22
7. Debug/Setting/Flash download选项卡,图23
8. Uitilities/setting/Flash download选项,图24
3-8属于基本项目开发设置,必须完成,才能完成工程编译和下载。继续的工作更重要
首先打开工程文件,打开main.cpp,程序如下:
#include "mbed.h"
DigitalOut led1(LED1);
// main() runs in its own thread in the OS
// (note the calls to Thread::wait below for delays)
int main() {
while(true){
  led1 =!led1;
  Thread::wait(500);
}
}
编译开始,首先编译时间非常非常长——对比IAR而言,好像得用好几分钟,其中只有警告没有报错,因此可以下载,单击下载后,按复位键,板子没有任何反应。
开始检查对应的mbed函数
点击main.cpp前边的+号,打开关联文档,找到DigitalOut.h,双击打开,其实例代码:
* #include "mbed.h"
* DigitalOut led(LED1);
* int main() {
*     while(1) {
*         led = !led;
*         wait(0.2);
*     }
* }
除了第六行不一样其他都一样,说明代码没有问题。问题就一定在GPIO的定义上。于是打开:PinNames.h这个文档,其上按照Arduino定义的管脚:
// Arduino connector namings
    A0          = PA_0,
    A1          = PA_1,
    A2          = PA_4,
    A3          = PB_0,
    A4          = PC_1,
    A5          = PC_0,
    D0          = PA_3,
    D1          = PA_2,
    D2          = PA_10,
    D3          = PB_3,
    D4          = PB_5,
    D5          = PB_4,
    D6          = PB_10,
    D7          = PA_8,
    D8          = PA_9,
    D9          = PC_7,
    D10         = PB_6,
    D11         = PA_7,
    D12         = PA_6,
    D13         = PA_5,
    D14         = PB_9,
    D15         = PB_8,
对比STM32 Nucleo-144 F413 board User manual.pdf文档,管脚不一样,因此需要重新定义,见图25
如果,不想重新定义Arduino可以直接引用PinNames.h前边的直接定义管脚[必须看手册将排针坐与GPIO的关系捋顺]:
    PA_0  = 0x00,
    PA_1  = 0x01,
    PA_2  = 0x02,
    PA_3  = 0x03,
    PA_4  = 0x04,    ...
如果想用的管脚没有在定义中,可以比葫芦画瓢的增加定义,例如PC_x,PD_x,...,PA的为0x0X、PB的为0x1X、以此类推,最后的PH只有0,1,2.就可以了。
改完PinNames.h文档后,为了更好地理解GPIO,我们将主程序改为:
#include "mbed.h"
DigitalOut led1(PB_0);//用的是直接GPIO的定义,下同
DigitalOut led2(PB_7);
DigitalOut led3(PB_14);
// main() runs in its own thread in the OS
// (note the calls to Thread::wait below for delays)
int main() {
while(true){
  led1=1;led2=0;led3=1;
  Thread::wait(500);
  led1=0;led2=1;led3=0;
  Thread::wait(500);
}
}
很长的时间编译后,也是只有警告,没有报错,下载运行结果见图26。

20-Option_Device选择.png (75.3 KB )

图20

图20

21-Output选择.png (36.92 KB )

图21

图21

22-Debug选项.png (50.54 KB )

图22

图22

23-Debug_Flash Download选项.png (40.14 KB )

图23

图23

24-Utilities_Flash download选项.png (40 KB )

图24

图24

25-定义的管脚.png (492.85 KB )

图25

图25

26-下载程序后运行的结果.JPG (450.97 KB )

图26

图26
沙发
zhjb1|  楼主 | 2017-1-20 07:03 | 只看该作者
自己发的怎么给分?请管理帮忙解决分还给我,谢谢

使用特权

评论回复
板凳
hhxf1| | 2017-1-23 22:18 | 只看该作者
做得不错,跟帖鼓励

使用特权

评论回复
地板
linshifaa| | 2017-2-1 15:10 | 只看该作者
能不能分享一下 ....改好的工程模板

使用特权

评论回复
5
linshifaa| | 2017-2-1 21:32 | 只看该作者
谢谢指点,已经搞定。引脚对应改正
/* mbed Microcontroller Library
*******************************************************************************
* Copyright (c) 2014, STMicroelectronics
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
*    this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
*    this list of conditions and the following disclaimer in the documentation
*    and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
*    may be used to endorse or promote products derived from this software
*    without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************
*/
#ifndef MBED_PINNAMES_H
#define MBED_PINNAMES_H

#include "cmsis.h"

#ifdef __cplusplus
extern "C" {
#endif

// See stm32f4xx_hal_gpio.h and stm32f4xx_hal_gpio_ex.h for values of MODE, PUPD and AFNUM
#define STM_PIN_DATA(MODE, PUPD, AFNUM)  ((int)(((AFNUM & 0x0F) << 7) | ((PUPD & 0x07) << 4) | ((MODE & 0x0F) << 0)))
#define STM_PIN_DATA_EXT(MODE, PUPD, AFNUM, CHANNEL, INVERTED)  ((int)(((INVERTED & 0x01) << 16) | ((CHANNEL & 0x1F) << 11) | ((AFNUM & 0x0F) << 7) | ((PUPD & 0x07) << 4) | ((MODE & 0x0F) << 0)))
#define STM_PIN_MODE(X)   (((X) >> 0) & 0x0F)
#define STM_PIN_PUPD(X)   (((X) >> 4) & 0x07)
#define STM_PIN_AFNUM(X)  (((X) >> 7) & 0x0F)
#define STM_PIN_CHANNEL(X)  (((X) >> 11) & 0x1F)
#define STM_PIN_INVERTED(X) (((X) >> 16) & 0x01)
#define STM_MODE_INPUT              (0)
#define STM_MODE_OUTPUT_PP          (1)
#define STM_MODE_OUTPUT_OD          (2)
#define STM_MODE_AF_PP              (3)
#define STM_MODE_AF_OD              (4)
#define STM_MODE_ANALOG             (5)
#define STM_MODE_IT_RISING          (6)
#define STM_MODE_IT_FALLING         (7)
#define STM_MODE_IT_RISING_FALLING  (8)
#define STM_MODE_EVT_RISING         (9)
#define STM_MODE_EVT_FALLING        (10)
#define STM_MODE_EVT_RISING_FALLING (11)
#define STM_MODE_IT_EVT_RESET       (12)

// High nibble = port number (0=A, 1=B, 2=C, 3=D, 4=E, 5=F, 6=G, 7=H)
// Low nibble  = pin number
#define STM_PORT(X) (((uint32_t)(X) >> 4) & 0xF)
#define STM_PIN(X)  ((uint32_t)(X) & 0xF)

typedef enum {
    PIN_INPUT,
    PIN_OUTPUT
} PinDirection;

typedef enum {
     PA_0  = 0x00,
    PA_1  = 0x01,
    PA_2  = 0x02,
    PA_3  = 0x03,
    PA_4  = 0x04,
    PA_5  = 0x05,
    PA_6  = 0x06,
    PA_7  = 0x07,
    PA_8  = 0x08,
    PA_9  = 0x09,
    PA_10 = 0x0A,
    PA_11 = 0x0B,
    PA_12 = 0x0C,
    PA_13 = 0x0D,
    PA_14 = 0x0E,
    PA_15 = 0x0F,

    PB_0  = 0x10,
    PB_1  = 0x11,
    PB_2  = 0x12,
    PB_3  = 0x13,
    PB_4  = 0x14,
    PB_5  = 0x15,
    PB_6  = 0x16,
    PB_7  = 0x17,
    PB_8  = 0x18,
    PB_9  = 0x19,
    PB_10 = 0x1A,
    PB_11 = 0x1B,
    PB_12 = 0x1C,
    PB_13 = 0x1D,
    PB_14 = 0x1E,
    PB_15 = 0x1F,

    PC_0  = 0x20,
    PC_1  = 0x21,
    PC_2  = 0x22,
    PC_3  = 0x23,
    PC_4  = 0x24,
    PC_5  = 0x25,
    PC_6  = 0x26,
    PC_7  = 0x27,
    PC_8  = 0x28,
    PC_9  = 0x29,
    PC_10 = 0x2A,
    PC_11 = 0x2B,
    PC_12 = 0x2C,
    PC_13 = 0x2D,
    PC_14 = 0x2E,
    PC_15 = 0x2F,

    PD_0  = 0x30,
    PD_1  = 0x31,
    PD_2  = 0x32,
    PD_3  = 0x33,
    PD_4  = 0x34,
    PD_5  = 0x35,
    PD_6  = 0x36,
    PD_7  = 0x37,
    PD_8  = 0x38,
    PD_9  = 0x39,
    PD_10 = 0x3A,
    PD_11 = 0x3B,
    PD_12 = 0x3C,
    PD_13 = 0x3D,
    PD_14 = 0x3E,
    PD_15 = 0x3F,

    PE_0  = 0x40,
    PE_1  = 0x41,
    PE_2  = 0x42,
    PE_3  = 0x43,
    PE_4  = 0x44,
    PE_5  = 0x45,
    PE_6  = 0x46,
    PE_7  = 0x47,
    PE_8  = 0x48,
    PE_9  = 0x49,
    PE_10 = 0x4A,
    PE_11 = 0x4B,
    PE_12 = 0x4C,
    PE_13 = 0x4D,
    PE_14 = 0x4E,
    PE_15 = 0x4F,

    PF_0  = 0x50,
    PF_1  = 0x51,
    PF_2  = 0x52,
    PF_3  = 0x53,
    PF_4  = 0x54,
    PF_5  = 0x55,
    PF_6  = 0x56,
    PF_7  = 0x57,
    PF_8  = 0x58,
    PF_9  = 0x59,
    PF_10 = 0x5A,
    PF_11 = 0x5B,
    PF_12 = 0x5C,
    PF_13 = 0x5D,
    PF_14 = 0x5E,
    PF_15 = 0x5F,

    PG_0  = 0x60,
    PG_1  = 0x61,
    PG_2  = 0x62,
    PG_3  = 0x63,
    PG_4  = 0x64,
    PG_5  = 0x65,
    PG_6  = 0x66,
    PG_7  = 0x67,
    PG_8  = 0x68,
    PG_9  = 0x69,
    PG_10 = 0x6A,
    PG_11 = 0x6B,
    PG_12 = 0x6C,
    PG_13 = 0x6D,
    PG_14 = 0x6E,
    PG_15 = 0x6F,

    PH_0  = 0x70,
    PH_1  = 0x71,

    // ADC internal channels
    ADC_TEMP = 0xF0,
    ADC_VREF = 0xF1,
    ADC_VBAT = 0xF2,

    // Arduino connector namings
    A0          = PA_3,
    A1          = PC_0,
    A2          = PC_3,
    A3          = PC_1,
    A4          = PC_4,
    A5          = PC_5,
    D0          = PG_9,
    D1          = PG_14,
    D2          = PF_15,
    D3          = PE_13,
    D4          = PF_14,
    D5          = PE_11,
    D6          = PE_9,
    D7          = PF_13,
    D8          = PF_12,
    D9          = PD_15,
    D10         = PD_14,
    D11         = PA_7,
    D12         = PA_6,
    D13         = PA_5,
    D14         = PB_9,
    D15         = PB_8,

    // Generic signals namings
    LED1        = PB_0,
    LED2        = PB_7,
    LED3        = PB_14,
    LED4        = LED1,
    LED_RED     = LED1,
    USER_BUTTON = PC_13,
    SERIAL_TX   = PD_8,
    SERIAL_RX   = PD_9,
    USBTX       = SERIAL_TX,
    USBRX       = SERIAL_RX,
    I2C_SCL     = D15,
    I2C_SDA     = D14,
    SPI_MOSI    = D11,
    SPI_MISO    = D12,
    SPI_SCK     = D13,
    SPI_CS      = D10,
    PWM_OUT     = D9,
    // Not connected
    NC = (int)0xFFFFFFFF
} PinName;

typedef enum {
    PullNone  = 0,
    PullUp    = 1,
    PullDown  = 2,
    OpenDrain = 3,
    PullDefault = PullNone
} PinMode;

#ifdef __cplusplus
}
#endif

#endif


使用特权

评论回复
6
iamaiqiyi| | 2017-2-1 22:56 | 只看该作者
最关键的还是配置IO的性能

使用特权

评论回复
7
hudi008| | 2017-2-1 23:01 | 只看该作者
学习STM32最基本的就是对IO的学习和操作

使用特权

评论回复
8
linshifaa| | 2017-2-2 18:27 | 只看该作者
今天SMT32F412  官方已经出了。。。。

使用特权

评论回复
9
zhjb1|  楼主 | 2017-2-3 10:00 | 只看该作者
linshifaa 发表于 2017-2-2 18:27
今天SMT32F412  官方已经出了。。。。

您是指的ARMmbed吗?

使用特权

评论回复
10
linshifaa| | 2017-2-3 15:18 | 只看该作者
zhjb1 发表于 2017-2-3 10:00
您是指的ARMmbed吗?

是的! 412和 413 还是有点地方不兼容的。。。

使用特权

评论回复
11
zhjb1|  楼主 | 2017-2-4 08:34 | 只看该作者
linshifaa 发表于 2017-2-3 15:18
是的! 412和 413 还是有点地方不兼容的。。。

我在做基础实验时还没有遇到不兼容的地方,不知您在哪遇到了?谢谢交流

使用特权

评论回复
12
1988020566| | 2017-2-4 23:47 | 只看该作者
这个keil5安装真的太大了。

使用特权

评论回复
13
1988020566| | 2017-2-4 23:48 | 只看该作者
keil4可以安装开发吗?

使用特权

评论回复
14
zhjb1|  楼主 | 2017-2-5 13:53 | 只看该作者
1988020566 发表于 2017-2-4 23:48
keil4可以安装开发吗?

Keil4中没有这款班子的Device,最多到412的,不过你可以下载驱动包,如果能按上,应该也可以。试试吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:永远好心情 [img]https://bbs.21ic.com/static/image/s

59

主题

271

帖子

1

粉丝