一、简单介绍
最近,通过百度之星拿到了一块STM32F4-DISCOVERY的开发板,这块板子基于STM32F407VGT6芯片,包括一个板载的有嵌入式调试工具接口的ST-LINK/V2,ST MEMS数字加速器,ST MEMS 数字麦克风,音频DAC集成了class D扬声器驱动器,LED灯,按钮和一个USB OTG的micro-AB连接器。这块板子的功能也比较强大,很适合学习,下面是官方资料对这块板子的说明,供参考:
- STM32F4DISCOVERY提供如下个特点:
STM32F407VGT6微控制器有1M的FLASH存储器,192K的RAM,LQFP100封装
板上的ST-LINK/V2可以使用选择的方式把套件切换成一个独立的 ST-LINK/V2来使用(用SWD连接器来编程和调试)
板子电源:通过USB总线或者外部5V电源来供电
外部应用电源:3V和5V
LIS302DL, ST MEMS运动传感器,3轴数字输出加速器
MP45DT02,ST MEMS音频传感器,全向数字麦克风
CS43L22,音频DAC集成了CLASS D扬声器驱动器
8个LED指示灯
- LD1(红/绿)用于USB通讯
- LD2(红)用于3.3V上电
- 4个用户LED灯,LD3(橙),LD4(绿),LD5(红)和LD6(蓝)
- 2个USB OTG的LED灯,LD7(绿)VBus,LD8(红)过流指示 2个按钮,(用户按键和复位健)USB OTG,micro-AB连接器
LQFP100 IO口的扩展头,可以快速连接成原型板,易于探测
和大家一样,刚开始学一块芯片就先拿GPIO来入门一下,写一个LED闪烁的程序,找一找入门的成就感,希望大家多多指点。
二、GPIO介绍
STM32F407系列芯片有PA‐PE 5×16共 80 个复用 IO口, 每个GPIO都有四个32位的配置寄存器(GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR 和GPIOx_PUPDR),两个32位的数据寄存器(GPIOx_IDR 和 GPIOx_ODR),一个32位的set/reset寄存器(GPIOx_BSRR),一个32位的锁存寄存器(GPIOx_LCKR)和两个32位的复用功能选择寄存器(GPIOx_AFRH
和 GPIOx_AFRL)。
主要特性有以下几个:
● 总共有16个I/OS
● 输出状态:推挽输出或者开漏+上拉/下拉输出
● 输出数据可以来自输出寄存器GPIOx_ODR或者来自外设(alternate function output)
● 每个I/O有速率选择
●输入状态:浮空,上拉、下拉,模拟输入
● 输入数据到输入数据寄存器GPIOx_IDR或者输入到外设(alternate function input)
● Bit set and reset register (GPIOx_BSRR) for bitwise write access to GPIOx_ODR
● Locking mechanism (GPIOx_LCKR) provided to freeze the I/O configuration
● Analog function
● Alternate function input/output selection registers (at most 16 AFs per I/O)
● Fast toggle capable of changing every two clock cycles
● Highly flexible pin multiplexing allows the use of I/O pins as GPIOs or as one of several
peripheral functions
懒得翻译了,呵呵。
板上LED说明
LD1 COM:LD1默认状态是红色。LD1变成绿色指示PC和ST-LINK/V2之间的通讯在进
行中
LD2 PWR:红色LED指示板子已供电
用户LD3:橙色LED是用户的LED,连接到STM32F407VGT6的PD13脚
用户LD4:绿色LED是用户的LED,连接到STM32F407VGT6的PD12引脚
用户LD5:红色LED是用户的LED,连接到STM32F407VGT6的PD14引脚
用户LD6:蓝色LED是用户的LED,连接到STM32F407VGT6的PD15引脚
USB LD7:当VBUS在CN5上时,绿色LED指示,连接到STM32F407VGT6的PA9引脚
USB LD8:红色LED指示CN5的VBUS的过流,连接到STM32F407VGT6的PD5引脚
三 程序
直接上程序,使用库函数
- #include "stm32f4xx.h"
- GPIO_InitTypeDef GPIO_InitStructure;
- //initialize the GPIO ports for leds;
- void LED_Init(void)
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOD,&GPIO_InitStructure);
- }
- //delay function
- void Delay(vu32 nCount)
- {
- for(;nCount!=0;nCount--);
- }
- int main(void)
- {
- LED_Init();
- while (1)
- {
- GPIO_SetBits(GPIOD,GPIO_Pin_12);
- Delay(0xfffff);
- GPIO_ResetBits(GPIOD,GPIO_Pin_12);
- Delay(0xfffff);
- GPIO_SetBits(GPIOD,GPIO_Pin_13);
- Delay(0xfffff);
- GPIO_ResetBits(GPIOD,GPIO_Pin_13);
- Delay(0xfffff);
- GPIO_SetBits(GPIOD,GPIO_Pin_14);
- Delay(0xfffff);
- GPIO_ResetBits(GPIOD,GPIO_Pin_14);
- Delay(0xfffff);
- GPIO_SetBits(GPIOD,GPIO_Pin_15);
- Delay(0xfffff);
- GPIO_ResetBits(GPIOD,GPIO_Pin_15);
- Delay(0xfffff);
- }
- // return 0; will be never reachable.
- }