2016年2月14日星期日

【NUCLEO-L476RG学习笔记】基于HAL库的GPIO例程介绍

上一篇文章中,我们介绍了搭建Keil开发环境,并建立了第一个LED例程。现在我们来看看这个例程是怎么工作的。

根据NUCLEO-L476RG的原理图,可以看出LD2二极管连接到PA5,USER按键连接到PC13。
使用GPIO的第一步时使能时钟。该功能通过RCC(Reset and clock control)寄存器控制。所有的GPIO连接到AHB2总线。HAL库提供了专门的函数来启用GPIOA的时钟:
  1. __HAL_RCC_GPIOA_CLK_ENABLE
复制代码
该函数定义可在文件stm32l4xx_hal_rcc.h找到,其实现函数如下:
  1. #define __HAL_RCC_GPIOA_CLK_ENABLE()           do { \
  2.                                                        __IO uint32_t tmpreg; \
  3.                                                       SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOAEN); \
  4.                                                      /* Delay after an RCC peripheral clock enabling */ \
  5.                                                      tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_GPIOAEN); \
  6.                                                      UNUSED(tmpreg); \
  7.                                                      } while(0)
复制代码
通过实现函数可知,主要方式是通过RCC_AHB2ENR寄存器的第0位(GPIOA EN)置位来实现。

接下来我们需要定义一个GPIO_InitTypeDef结构体来设置GPIO的参数设置。
  1. GPIO_InitTypeDef  GPIO_InitStruct;
复制代码
该结构体有5个参数:
1. Pin 选择引脚编号
2. Mode 设置GPIO的工作模式
3. Pull 设置引脚的上拉/下拉
4. Speed 设置GPIO输出的最大频率
5. Alternate 设置选择引脚的复用功能
其中每项都有自己的选项
  Pin:指定需要配置的GPIO管脚,该选项可以是以下的任何值:
     GPIO_PIN_0:  选择引脚0;
     GPIO_PIN_1: 选择引脚1;
     GPIO_PIN_2:  选择引脚2;
     GPIO_PIN_3:  选择引脚3;
     GPIO_PIN_4:  选择引脚4;
     GPIO_PIN_5:  选择引脚5;
     GPIO_PIN_6:  选择引脚6;
     GPIO_PIN_7:  选择引脚7;
     GPIO_PIN_8:  选择引脚8;
     GPIO_PIN_9:  选择引脚9;
     GPIO_PIN_10:  选择引脚10;
     GPIO_PIN_11:  选择引脚11;
     GPIO_PIN_12:  选择引脚12;
     GPIO_PIN_13:  选择引脚13;
     GPIO_PIN_14:  选择引脚14;
     GPIO_PIN_15:  选择引脚15;
     GPIO_PIN_All: 选择所有的引脚;
     GPIO_PIN_MASK:引脚掩码;
  Mode:指定选择引脚的工作模式
     GPIO_MODE_INPUT:悬浮输入模式
     GPIO_MODE_OUTPUT_PP:推挽输出模式
     GPIO_MODE_OUTPUT_OD:漏极开路输出模式
     GPIO_MODE_AF_PP:复用功能推挽模式
     GPIO_MODE_AF_OD:复用功能漏极开路模式
     GPIO_MODE_ANALOG:模拟模式
     GPIO_MODE_ANALOG_ADC_CONTROL:模拟模式,用于ADC转换
     GPIO_MODE_IT_RISING:上升沿触发检测的外部中断模式
     GPIO_MODE_IT_FALLING:下降沿触发检测的外部中断模式
     GPIO_MODE_IT_RISING_FALLING:上升/下降沿触发检测的外部中断模式
     GPIO_MODE_EVT_RISING:上升沿触发检测的外部事件模式
     GPIO_MODE_EVT_FALLING:下降沿触发检测的外部事件模式
     GPIO_MODE_EVT_RISING_FALLING:上升/下降沿触发检测的外部事件模式
     Pull:指定引脚的上拉/下拉
     GPIO_NOPULL:无上拉/下拉电阻
     GPIO_PULLUP:带有上拉电阻
     GPIO_PULLDOWN:带有下拉电阻
  Speed:指定引脚的输出频率:
    ■  GPIO_SPEED_FREQ_LOW:输出频率最大为5MHz
    ■  GPIO_SPEED_FREQ_MEDIUM:输出频率范围5MHz-25MHz   
    ■  GPIO_SPEED_FREQ_HIGH:输出频率范围25MHz-50MHz
    ■  GPIO_SPEED_FREQ_VERY_HIGH::输出频率范围50MHz-80MHz

HAL库提供了GPIO的初始化函数HAL_GPIO_Init()。该函数声明位于stm32l4xx_hal_gpio.h文件中。

STM32F746G-DISCO探索板中文用户手册

UM1907用户手册  
STM32F7系列探索套件(STM32F746NG微控制器)

简介

STM32F746G-DISCO探索板是用于评估意法半导体基于ARM Cortex-M7内核的STM32F746NGH6微控制器的完整演示和开发平台。该微控制器具有4个I2C、6个SPI(其中3个可复用为单工I2S)、SDMMC、4个USART、4个UART、2个CAN、3个12位的ADC、2个12位的DAC、2个SAI、8到14位数码相机模块接口、内置320+16+4K字节的SRAM及1M字节的Flash、USB高速OTG、USB全速OTG、以太网MAC、FMC接口、四通道SPI接口、JTAG调试支持。该探索板提供所需的一切,使得用户可以快速上手并且方便地开发应用程序的一切。

探索板上全面的的硬件功能,有助于评估几乎所有的外设(USB高速OTG、USB全速OTG、10/100Mb以太网、microSD卡、USART、带有插孔输入和输出的SAI音频DAC立体声音频、MEMS数字麦克风、SDRAM、四通道SPI Flash存储芯片、带有电容式多点触控面板的4.3寸彩色TFT-LCD、SPDIF RCA输入等),并且开发自己的应用程序。 Arduino Uno V3接口使其能够根据具体应用方便地连接扩展板或者子板。集成的ST-LINK/V2-1提供了一个STM32微控制器的嵌入式调试器和编程器。

图1. STM32F746G-DISCO探索板(顶视图)
STM32F746G-DISCO中文用户手册.jpg

图2. STM32F746G-DISCO探索板(底视图)
001.jpg




UM1974 - STM32 Nucleo-144开发板中文用户手册

简介
STM32 Nucleo-144开发板(NUCLEO-F207ZG、NUCLEO-F303ZE、NUCLEO-F429ZI、NUCLEO-F446ZE、NUCLEO-F746ZG)为用户试验新想法提供了一条成本低廉且灵活的途径,并且用户可以依据从性能、功耗和功能的不同组合中选择出的任何STM32微控制器产品线构建原型。Arduino Uno的扩展接口ST Zio接口可以访问更多的外设,并且通过选择众多的专属扩展板,ST Morpho接口很容易地扩展STM32 Nucleo 开放式开发平台的功能。STM32 Nucleo-144开发板集成了调试器/编程器 ST-LINK/V2-1 ,因此不需要任何单独的仿真器。STM32 Nucleo 板自带 STM32 全面的软件 HAL 库,其中包含各种打包的软件示例,并且直接访问ARM mbed 在线资源。
图1. Nucleo 144开发板(顶视图)
1.jpg

图2. Nucleo 144开发板(底i视图)
DM00244518.jpg




STM32 Nucleo-F746ZG开发板入门指南

全新的Nucleo-F746终于到手上了,这是ST的Nucleo-144产品线的第一个开发套件,而且可以说,如果考虑到一个正品的Arduino DUE价格超过40美元且其MCU只是Cortex-M3内核,Nucleo-F746的街机的价格(大约23美元)大概是一个创客在市场上可以找到的最好的开发套件。

nucleo-144-vs-nucleo-64.jpg

和经典的Nucleo-64相比,该开发板更让人印象深刻:更宽并提供了很多更标准的外设。现在用户LED有三个(红、蓝和绿),并且电源指示灯变成了绿色。最大的变化时,该开发板配备了LAN接口、磁力计和SMSC物理层收发器PHY。这意味着,我们可以使用运行在216MHz的功能强大的Cortex-M7内核开始开发物联网应用。和ST的以一个低价的F7开发板STM32F746-Discovery相比,它并没有提供LCD显示屏。但是,Nucleo-144通过Zio接口引出了大多数MCU的信号I/O,而Discovery-F7仅有少量的信号布线到Arduino式的连接器。如果你想要使用Nucleo-144开发一个定制产品,那么它是最好的选择。

在这篇文章中,我将一步步展示开始使用这个奇妙般的硬件。我们将使用LwIP栈在Nucleo上创建一个简单的Web服务器。该Web应用允许我们通过使用bootstrapjQuery和Nucleo板上的LED及用户按键进行交互。以下视频展示了HTTP服务器时如何工作的。

NUCLEO开发板硬件电路分析(四) - ST-LINK编程/调试电路


NUCLEO硬件电路分析(四) - ST-LINK编程/调试电路

NUCLEO板嵌入了ST-LINK V2-1调试仿真器,具有虚拟串口功能、大容量存储功能以及仿真调试,和ST-LINK V2不同的是,板载的仿真器仅支持SWD仿真模式,不支持SWIM接口。
ST-LINK V2-1的MCU采用LQFP48封装的STM32F103CBT6,具有128KB的内部Flash和20KB的SRAM,最高运行主频可达71MHz。外设接口比较丰富,有两个12位的ADC、两个I2C、两个SPI、三个USART、USB和CAN接口。
NUCLEO板识别码(Board Ident):STM32F103的PC13和PC14作为NUCLEO板的识别码,当PC13=0时,认为该板属于NUCLEO系列。
主时钟:STM32F103外接8MHz的晶振,采用外部高速时钟信号HSE作为主时钟。
虚拟串口功能:STM32F103的PA2和PA3作为USART使用,与目标MCU的串口进行通讯,作为虚拟串口的物理实现接口。
SWD调试接口:当CN2的跳线短接时,ST-LINK/ V2-1可以编程调试NUCLEO板,这时用到4个信号:SWCLK、SWDIO、T_NRST和T_SWO。当当CN2的跳线短接时,ST-LINK/ V2-1可以作为独立的编程器通过CN4接口对外部应用程序的MCU进行编程调试。CN4接口的定义如下:
引脚
CN4
描述
1
VDD_TARGET
应用程序的VDD
2
SWCLK
SWD 时钟
3
GND
4
SWDIO
SWD 数据输入/输出
5
NRST
目标MCU的RESET
6
SWO
保留

LED指示灯:ST-LINk通过LED指示灯显示通讯连接状态,可以显示绿色、橙色和红色三种颜色。LED指示灯LD1采用的是安华高科技AVAGO的多色LED灯HSMF-A201-A00J1,该指示灯的手册可以在安华高的官网下载,下载地址:http://docs.avagotech.com/docs/AV02-0501EN。 LD1默认的颜色是红色。 LD1变成绿色,表明PC和ST-LINK / V2-1的通讯正在进行中,其他通讯状态信息可以参考NUCLEO板的用户手册UM1724。LD1由微控制器的PA9控制,实现原理如下:当控制脚PA9输出高电平时,LD1发出红光;当控制脚PA9输出低电平时,LD1发出绿光;当控制脚PA9输出一个1 kHz左右的频率时,高、低电平的变化使得LD1指示灯交替发红、绿光,但因其颜色变化频率较快,人眼所见光为橙色。在设计过程中,应注意,LD1的电流不应低于5mA。

NUCLEO开发板硬件电路分析(三) - 扩展接口部分电路

NUCLEO硬件电路分析(三) -  扩展接口部分电路

在上一篇《NUCLEO硬件电路分析(二) - MCU电路分析》我们分析了NUCLEO的MCU部分设计电路,本篇文章主要介绍一下NUCLEO板的扩展接口电路设计部分。
NUCELO带有两种类型的扩展资源:Arduino Uno V3接口和ST Morpho扩展插头,其中ST Morpho扩展插头支持访问所有STM32的I/O。

Arduino Uno V3接口
下图以NUCLEO-F103为例,展示了Arduino接口对应MCU的IO引脚或功能。

ST Morpho扩展插头
下图以NUCLEO-F103为例,展示了ST Morpho扩展插头对应MCU的IO引脚或功能。
NUCLEO板的扩展接口电路部分位于设计文件Connectors.SchDoc中。Arduino接口由CN5、CN6、CN8和CN9端子共同组成,采用的是单排插座的方式。ST Morpho扩展接口由CN7和CN10组成,采用的是双排19×2插针。

参考资料
2.  MB1136C_schematic_layout图纸 http://www.stmicroelectronics.co ... cleo_64pins_sch.zip

NUCLEO开发板硬件电路分析(二) - MCU电路分析

NUCLEO硬件电路分析(二) - MCU电路分析

在上一篇《NUCLEO硬件电路分析(一) - 概述及电源电路》我们介绍了NUCLEO的整体设计,并对其中的电源部分进行了介绍,本篇文章主要介绍一下NUCLEO板的MCU电路设计部分。

NUCLEO板专为64引脚LQFP封装的STM32微控制器设计。NUCLEO板的MCU部分位于设计文件MCU_64.SchDoc中,从图中可以看出MCU分为两个部分:IO引脚部分U5A和MCU电源部分U5B。

IO引脚部分U5A:
MCU的大多数引脚都连接到到扩展接口,如PA0、PB4、PC7。下面介绍几个特殊的IO引脚使用:PA2和PA3。这两个引脚可以通过连接焊桥SB62和SB63作为普通的IO使用,也可以通过连接焊桥SB13和SB14,连接至ST-LINK,作为虚拟串口的物理通讯方式。默认是作为虚拟串口使用。PA13、PA14和PB3没有作为普通的IO使用,而是作为SWD调试仿真的TMS、TCK和SWO;其中PA13作为SWD的数据输入/输出SWDIO,PA14作为SWD的时钟信号SWCLK。PC13作为USER用户按键的输入端口。

电源部分U5B:
在MCU的电源部分中,每个VDD端口都放置着100nF的去耦电容。在这部分中,主要介绍两个方面:复位和时钟。
MCU可以通过两种方式进行复位,一种是通过使用复位按钮B2,另一种是通过清零NRST信号。ST-LINK的PB0连接至MCU的复位引脚NRST,便于ST-LINK对MCU进行仿真监控。
NUCLEO的时钟源:有四种方法可以配置相应的外部高速时钟外部(HSE)的引脚:来自ST-LINK的MCO: ST-LINK MCU的MCO输出用来作为输入时钟。该时钟频率不能改变,固定为8MHz,连接到STM32微控制器的OSC_IN-PF0/PD0/PH0。 来自板载的X3晶体振荡器;来自外部PF0/ PD0/ PH0的振荡器;通过连接器CN7引脚29的外部振荡器 不使用HSE。

参考资料:
1.  UM1724 - STM32 Nucleo开发板用户手册 http://www.yiboard.com/thread-65-1-1.html
2.  MB1136C_schematic_layout图纸 http://www.stmicroelectronics.co ... cleo_64pins_sch.zip

NUCLEO开发板硬件电路分析(一) - 概述及电源电路

NUCLEO硬件电路分析(一) - 概述及电源电路


概述
ST的NUCLEO板的设计文件是开源的,所以很容易在官网找到NUCLEO板的原理图及PCB布线图。ST绘图使用的EDA软件是国内比较常见的Altium Designer。官网提供的工程文件名是MB1136C_schematic_layout,下载地址:http://www.stmicroelectronics.co ... cleo_64pins_sch.zip。该图纸使用的MCU是LQFP64的封装形式,适用于全部现有的NUCLEO板系列。
打开下载的文件,可以看到文件夹目录下共包含8个文件,其中:MB1136.PrjPCB是Altium Designer的工程文件;MB1136.SchDoc是NUCLEO板整体设计的原理图及电源电路;MCU_64.SchDoc是MCU部分的设计原理图;Connectors.SchDoc是NUCLEO板的对外接口部分的设计原理图文件;ST_LINK_V2-1.SCHDOC是板载的编程器/调试器ST_LINK_V2-1的原理图;MB1136.PcbDoc是NUCLEO的PCB布线图;MB1136.SCHLIB是工程使用的元件库;MB1136.pdf是原理图的PDF版本。可以看出ST的NUCLEO板提供的资料挺全的。
NUCLEO的原理图采用的是自上而下的层次图设计的方式,MB1136.SchDoc是层次图设计中的模块连接结构图,该原理图中放置着U_MCU_64、U_Connectors和U_ST_LINK_V2-1三个电路方块图,分别对应着MCU_64.SchDoc、Connectors.SchDoc和ST_LINK_V2-1.SCHDOC三个原理图文件。


NUCLEO板的电源设计
NUCLEO板的电源部分的原理图设计电路位于MB1136.SchDoc文件中。原理图如下:
在NUCLEO用户手册UM1724的5.3 电源供电和电源选择章节中提到“电源供电可以由PC主机通过USB电缆提供,也可以外部电源CN6或者CN7的电源引脚VIN(7V-12V),E5V(5V)或+3V3提供”,下面根据原理图依次介绍:

  从USB接口U5V接入电源
STM32 NUCLEO核心板和扩展板的所有部件都可以由ST-LINK的USB连接端口CN1(U5V或VBUS)供电。当JP5的引脚1与引脚2之间的跳线短接时,U5V与+5V的网络连接,NUCLEO板由USB提供的电源(U5V)供电。
这里应当注意,如果NUCLEO板由USB充电器供电,这时因为没有USB枚举过程,所以LD3指示灯将会永久处于灭状态,而且目标MCU未通电。正常情况下,USB枚举成功后,ST-LINK发出一个信号,使能PWR_ENn(低电平有效)。PWR_ENn控制P沟道的MOS管T2(STS7PF30L)导通,U5V才会与+5V相连。
STS7PF30L的门限电压Vgs在1V-2.5V之间,典型值是1.6V,能够提供7A的Id电流,而且在导通时,DS之间的电阻Rds非常小。具体参数可以参考STS7PF30L的数据手册。

  外接电源输入:VIN和EV5
电源VIN连接着CN6的8脚CN7的24脚,通过低压差线性稳压器U3(LD1117S50TR)输出恒定的电压5V,当JP5的引脚2与引脚3之间的跳线短接时,NUCLEO板由外部输入电源供电。LD1117S50TR最大支持输出800mA的电流,具体的电气参数如下:
电源EV5连接CN7的6脚,与+5V直接相连。EV5与U3之间有一个二极管D4,防止电流倒灌至U3,引起U3损坏。


以上的两种外部电源输入都会通过U4(LD39050PU33R)转换成+3.3V,通过JP6连接至VDD,向NUCLEO的MCU部分供电。

2016年2月6日星期六

2016年最热门的与PCB相关的论坛,值得关注

1. 中国PCB论坛网http://www.pcbbbs.com/

中国PCB论坛作为国内的最老的PCB论坛,其积累的技术及帖子的含金量还是很高的。论坛中的高手也是很多,印象最深的是@wanghanq。其在很多帖子的回复都是很中肯的。同时,发布的论坛主题贴也经常是精华帖。


2. EDA365电子工程师论坛http://www.eda365.com/