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

[复制链接]
 楼主| 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

图20

图21

图21

图22

图22

图23

图23

图24

图24

图25

图25

图26

图26
 楼主| zhjb1 发表于 2017-1-20 07:03 | 显示全部楼层
自己发的怎么给分?请管理帮忙解决分还给我,谢谢
hhxf1 发表于 2017-1-23 22:18 | 显示全部楼层
做得不错,跟帖鼓励
linshifaa 发表于 2017-2-1 15:10 | 显示全部楼层
能不能分享一下 ....改好的工程模板
linshifaa 发表于 2017-2-1 21:32 | 显示全部楼层
谢谢指点,已经搞定。引脚对应改正
  1. /* mbed Microcontroller Library
  2. *******************************************************************************
  3. * Copyright (c) 2014, STMicroelectronics
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions are met:
  8. *
  9. * 1. Redistributions of source code must retain the above copyright notice,
  10. *    this list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright notice,
  12. *    this list of conditions and the following disclaimer in the documentation
  13. *    and/or other materials provided with the distribution.
  14. * 3. Neither the name of STMicroelectronics nor the names of its contributors
  15. *    may be used to endorse or promote products derived from this software
  16. *    without specific prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  19. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  21. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  22. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  23. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  24. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  25. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  26. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  27. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. *******************************************************************************
  29. */
  30. #ifndef MBED_PINNAMES_H
  31. #define MBED_PINNAMES_H

  32. #include "cmsis.h"

  33. #ifdef __cplusplus
  34. extern "C" {
  35. #endif

  36. // See stm32f4xx_hal_gpio.h and stm32f4xx_hal_gpio_ex.h for values of MODE, PUPD and AFNUM
  37. #define STM_PIN_DATA(MODE, PUPD, AFNUM)  ((int)(((AFNUM & 0x0F) << 7) | ((PUPD & 0x07) << 4) | ((MODE & 0x0F) << 0)))
  38. #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)))
  39. #define STM_PIN_MODE(X)   (((X) >> 0) & 0x0F)
  40. #define STM_PIN_PUPD(X)   (((X) >> 4) & 0x07)
  41. #define STM_PIN_AFNUM(X)  (((X) >> 7) & 0x0F)
  42. #define STM_PIN_CHANNEL(X)  (((X) >> 11) & 0x1F)
  43. #define STM_PIN_INVERTED(X) (((X) >> 16) & 0x01)
  44. #define STM_MODE_INPUT              (0)
  45. #define STM_MODE_OUTPUT_PP          (1)
  46. #define STM_MODE_OUTPUT_OD          (2)
  47. #define STM_MODE_AF_PP              (3)
  48. #define STM_MODE_AF_OD              (4)
  49. #define STM_MODE_ANALOG             (5)
  50. #define STM_MODE_IT_RISING          (6)
  51. #define STM_MODE_IT_FALLING         (7)
  52. #define STM_MODE_IT_RISING_FALLING  (8)
  53. #define STM_MODE_EVT_RISING         (9)
  54. #define STM_MODE_EVT_FALLING        (10)
  55. #define STM_MODE_EVT_RISING_FALLING (11)
  56. #define STM_MODE_IT_EVT_RESET       (12)

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

  61. typedef enum {
  62.     PIN_INPUT,
  63.     PIN_OUTPUT
  64. } PinDirection;

  65. typedef enum {
  66.      PA_0  = 0x00,
  67.     PA_1  = 0x01,
  68.     PA_2  = 0x02,
  69.     PA_3  = 0x03,
  70.     PA_4  = 0x04,
  71.     PA_5  = 0x05,
  72.     PA_6  = 0x06,
  73.     PA_7  = 0x07,
  74.     PA_8  = 0x08,
  75.     PA_9  = 0x09,
  76.     PA_10 = 0x0A,
  77.     PA_11 = 0x0B,
  78.     PA_12 = 0x0C,
  79.     PA_13 = 0x0D,
  80.     PA_14 = 0x0E,
  81.     PA_15 = 0x0F,

  82.     PB_0  = 0x10,
  83.     PB_1  = 0x11,
  84.     PB_2  = 0x12,
  85.     PB_3  = 0x13,
  86.     PB_4  = 0x14,
  87.     PB_5  = 0x15,
  88.     PB_6  = 0x16,
  89.     PB_7  = 0x17,
  90.     PB_8  = 0x18,
  91.     PB_9  = 0x19,
  92.     PB_10 = 0x1A,
  93.     PB_11 = 0x1B,
  94.     PB_12 = 0x1C,
  95.     PB_13 = 0x1D,
  96.     PB_14 = 0x1E,
  97.     PB_15 = 0x1F,

  98.     PC_0  = 0x20,
  99.     PC_1  = 0x21,
  100.     PC_2  = 0x22,
  101.     PC_3  = 0x23,
  102.     PC_4  = 0x24,
  103.     PC_5  = 0x25,
  104.     PC_6  = 0x26,
  105.     PC_7  = 0x27,
  106.     PC_8  = 0x28,
  107.     PC_9  = 0x29,
  108.     PC_10 = 0x2A,
  109.     PC_11 = 0x2B,
  110.     PC_12 = 0x2C,
  111.     PC_13 = 0x2D,
  112.     PC_14 = 0x2E,
  113.     PC_15 = 0x2F,

  114.     PD_0  = 0x30,
  115.     PD_1  = 0x31,
  116.     PD_2  = 0x32,
  117.     PD_3  = 0x33,
  118.     PD_4  = 0x34,
  119.     PD_5  = 0x35,
  120.     PD_6  = 0x36,
  121.     PD_7  = 0x37,
  122.     PD_8  = 0x38,
  123.     PD_9  = 0x39,
  124.     PD_10 = 0x3A,
  125.     PD_11 = 0x3B,
  126.     PD_12 = 0x3C,
  127.     PD_13 = 0x3D,
  128.     PD_14 = 0x3E,
  129.     PD_15 = 0x3F,

  130.     PE_0  = 0x40,
  131.     PE_1  = 0x41,
  132.     PE_2  = 0x42,
  133.     PE_3  = 0x43,
  134.     PE_4  = 0x44,
  135.     PE_5  = 0x45,
  136.     PE_6  = 0x46,
  137.     PE_7  = 0x47,
  138.     PE_8  = 0x48,
  139.     PE_9  = 0x49,
  140.     PE_10 = 0x4A,
  141.     PE_11 = 0x4B,
  142.     PE_12 = 0x4C,
  143.     PE_13 = 0x4D,
  144.     PE_14 = 0x4E,
  145.     PE_15 = 0x4F,

  146.     PF_0  = 0x50,
  147.     PF_1  = 0x51,
  148.     PF_2  = 0x52,
  149.     PF_3  = 0x53,
  150.     PF_4  = 0x54,
  151.     PF_5  = 0x55,
  152.     PF_6  = 0x56,
  153.     PF_7  = 0x57,
  154.     PF_8  = 0x58,
  155.     PF_9  = 0x59,
  156.     PF_10 = 0x5A,
  157.     PF_11 = 0x5B,
  158.     PF_12 = 0x5C,
  159.     PF_13 = 0x5D,
  160.     PF_14 = 0x5E,
  161.     PF_15 = 0x5F,

  162.     PG_0  = 0x60,
  163.     PG_1  = 0x61,
  164.     PG_2  = 0x62,
  165.     PG_3  = 0x63,
  166.     PG_4  = 0x64,
  167.     PG_5  = 0x65,
  168.     PG_6  = 0x66,
  169.     PG_7  = 0x67,
  170.     PG_8  = 0x68,
  171.     PG_9  = 0x69,
  172.     PG_10 = 0x6A,
  173.     PG_11 = 0x6B,
  174.     PG_12 = 0x6C,
  175.     PG_13 = 0x6D,
  176.     PG_14 = 0x6E,
  177.     PG_15 = 0x6F,

  178.     PH_0  = 0x70,
  179.     PH_1  = 0x71,

  180.     // ADC internal channels
  181.     ADC_TEMP = 0xF0,
  182.     ADC_VREF = 0xF1,
  183.     ADC_VBAT = 0xF2,

  184.     // Arduino connector namings
  185.     A0          = PA_3,
  186.     A1          = PC_0,
  187.     A2          = PC_3,
  188.     A3          = PC_1,
  189.     A4          = PC_4,
  190.     A5          = PC_5,
  191.     D0          = PG_9,
  192.     D1          = PG_14,
  193.     D2          = PF_15,
  194.     D3          = PE_13,
  195.     D4          = PF_14,
  196.     D5          = PE_11,
  197.     D6          = PE_9,
  198.     D7          = PF_13,
  199.     D8          = PF_12,
  200.     D9          = PD_15,
  201.     D10         = PD_14,
  202.     D11         = PA_7,
  203.     D12         = PA_6,
  204.     D13         = PA_5,
  205.     D14         = PB_9,
  206.     D15         = PB_8,

  207.     // Generic signals namings
  208.     LED1        = PB_0,
  209.     LED2        = PB_7,
  210.     LED3        = PB_14,
  211.     LED4        = LED1,
  212.     LED_RED     = LED1,
  213.     USER_BUTTON = PC_13,
  214.     SERIAL_TX   = PD_8,
  215.     SERIAL_RX   = PD_9,
  216.     USBTX       = SERIAL_TX,
  217.     USBRX       = SERIAL_RX,
  218.     I2C_SCL     = D15,
  219.     I2C_SDA     = D14,
  220.     SPI_MOSI    = D11,
  221.     SPI_MISO    = D12,
  222.     SPI_SCK     = D13,
  223.     SPI_CS      = D10,
  224.     PWM_OUT     = D9,
  225.     // Not connected
  226.     NC = (int)0xFFFFFFFF
  227. } PinName;

  228. typedef enum {
  229.     PullNone  = 0,
  230.     PullUp    = 1,
  231.     PullDown  = 2,
  232.     OpenDrain = 3,
  233.     PullDefault = PullNone
  234. } PinMode;

  235. #ifdef __cplusplus
  236. }
  237. #endif

  238. #endif


iamaiqiyi 发表于 2017-2-1 22:56 | 显示全部楼层
最关键的还是配置IO的性能
hudi008 发表于 2017-2-1 23:01 | 显示全部楼层
学习STM32最基本的就是对IO的学习和操作
linshifaa 发表于 2017-2-2 18:27 | 显示全部楼层
今天SMT32F412  官方已经出了。。。。
 楼主| zhjb1 发表于 2017-2-3 10:00 | 显示全部楼层
linshifaa 发表于 2017-2-2 18:27
今天SMT32F412  官方已经出了。。。。

您是指的ARMmbed吗?
linshifaa 发表于 2017-2-3 15:18 | 显示全部楼层
zhjb1 发表于 2017-2-3 10:00
您是指的ARMmbed吗?

是的! 412和 413 还是有点地方不兼容的。。。
 楼主| zhjb1 发表于 2017-2-4 08:34 | 显示全部楼层
linshifaa 发表于 2017-2-3 15:18
是的! 412和 413 还是有点地方不兼容的。。。

我在做基础实验时还没有遇到不兼容的地方,不知您在哪遇到了?谢谢交流
1988020566 发表于 2017-2-4 23:47 | 显示全部楼层
这个keil5安装真的太大了。
1988020566 发表于 2017-2-4 23:48 | 显示全部楼层
keil4可以安装开发吗?
 楼主| zhjb1 发表于 2017-2-5 13:53 | 显示全部楼层
1988020566 发表于 2017-2-4 23:48
keil4可以安装开发吗?

Keil4中没有这款班子的Device,最多到412的,不过你可以下载驱动包,如果能按上,应该也可以。试试吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

70

主题

305

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:永远好心情 [img]https://bbs.21ic.com/static/image/s

70

主题

305

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部