首页资源分类嵌入式开发ARM MPU > 神舟王STM32F407ZGT用户手册

神舟王STM32F407ZGT用户手册

已有 453308个资源

下载专区

上传者其他资源

嵌入式开发热门资源

本周本月全部

文档信息举报收藏

标    签: 神舟王STM32F407ZGT

分    享:

文档简介

神舟王STM32F407ZGT用户手册20140228 详尽的用户手册,包括成百个例程,注释详尽,很有参考借鉴价值。

文档预览

STM32 神舟王 407ZGT 开发板用户手册 2014 年 2 月版本 作者:WWW.ARMJISHU.COM STM32神舟ARM系列技术开发板产品目录: ● 神舟51单片机开发板(51+ARM)开发板 ● 神舟I号:STM32F103RBT6 + 2.8"TFT 触摸彩屏 ● 神舟II号:STM32F103VCT6 + 3.2"TFT 触摸彩屏 ● 神舟III号:STM32F103ZET6 + 3.2"TFT 触摸彩屏 ● 神舟IV号:STM32F407ZGT6 + 3.2"TFT 触摸彩屏 ● STM32核心板:四层核心板(STM32F103ZET+207ZGT+407ZGT+407IGT) ● 神舟王103系列(STM32F103ZET核心板) ● 神舟王207系列(STM32F207ZGT核心板) ● 【神舟王407系列(STM32F407ZGT/407IGT核心板) 】 ● 神舟王全系列(STM32F103ZET/207ZGT/407ZGT核心板): 全功能底板(支 持MP3,以太网,收音机,无线,SRAM,Nor/Nand Flash,鼠标,键盘,红 外接收,CAN,示波器,电压表,USB HOST,步进电机,RFID物联网等) ●神舟 51 开发板(STC 51 单片机+STM32F103C8T6 核心板):全功能底板(支 持音频播放,无线,鼠标,键盘,红外收发,CAN,温度传感器,直流电机, 步进电机,实时时钟,两路 485,两路继电器,小喇叭,热敏光敏电阻,RFID 物联网等) ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第 2 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第 3 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第 4 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 声明 本手册版权归属 ARMJISHU.COM 所有, 并保留一切权利。非经 ARMJISHU.COM 书面同意,任何单位或个人不得擅自摘录本手册部 分或全部内容,违者我们将追究其法律责任。 本文档为 ARMJISHU.COM 网站推出的神舟王 STM32F407ZGT 开发板配套用户手册,详细介绍 STM32F407ZGT 芯片的开发过程和 神舟王开发板的使用方法。 本文档如有升级恕不另行通知,欢迎您访问www.armjishu.com 论坛获取最新手册文档及最新固件代码。 第 5 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 目录 第一章 硬件篇 ..................................................................................................................................................... 27 1.1 神舟王STM32F407ZGT开发板简介........................................................................................................... 27 1.2 神舟王STM32 开发板硬件详解............................................................................................................ 49 1.2.1 MCU处理器........................................................................................................................................ 49 1.2.2 JTAG/SWD调试下载接口 .................................................................................................................. 53 1.2.3 10M/100M以太网接口 ....................................................................................................................... 55 1.2.4 USB 2.0 OTG电路 .............................................................................................................................. 58 1.2.4 触摸TFT彩屏接口.......................................................................................................................... 61 1.2.5 VS1003 MP3 音频编解码+放大+录音电路 ..................................................................................... 62 1.2.6 Nor Flash ............................................................................................................................................ 64 1.2.7 NAND Flash........................................................................................................................................ 65 1.2.8 SRAM .................................................................................................................................................. 66 1.2.9 SD卡SDIO接口................................................................................................................................... 67 1.2.10 315M无线模块接口 ....................................................................................................................... 67 1.2.11 两块 2.4G无线模块接口................................................................................................................ 68 1.2.12 CAN总线接口................................................................................................................................. 69 1.2.13 RS232C串口 ................................................................................................................................... 69 1.2.14 485 总线接口.................................................................................................................................. 70 1.2.15 SPI FLASH...................................................................................................................................... 71 1.2.16 I2C EEPROM.................................................................................................................................. 71 1.2.17 蜂鸣器电路..................................................................................................................................... 72 1.2.18 复位电路 ........................................................................................................................................ 72 1.2.19 LED指示灯 ..................................................................................................................................... 73 1.2.20 按键输入 ........................................................................................................................................ 74 1.2.21 RTC实时时钟电路 ......................................................................................................................... 74 1.2.22 电位器AD电路 ............................................................................................................................... 75 1.2.23 双通道示波器接口电路................................................................................................................. 75 1.2.24 电压表位器AD电路 ....................................................................................................................... 76 1.2.25 DA转换和PWM接口 ...................................................................................................................... 76 1.2.26 USB HOST模块接口电路 .............................................................................................................. 77 1.2.27 板载FM收音机及音频放大电路 ................................................................................................... 77 1.2.28 PS2 键盘鼠标电路 ......................................................................................................................... 78 1.2.29 红外线接收和发送电路................................................................................................................. 78 第 6 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.30 DS18B20 温度传感器电路 ............................................................................................................ 79 1.2.31 步进电机模块接口电路................................................................................................................. 79 1.2.32 电源电路 ........................................................................................................................................ 80 1.2.33 TTL_UART扩展接口 ...................................................................................................................... 82 1.2.34 扩展GPIO接口 ............................................................................................................................... 82 第二章 软件篇 ....................................................................................................................................................... 83 2.1 RVMDK简介 .......................................................................................................................................... 83 2.2 MDK 4.22 集成开发环境的组成 ........................................................................................................... 83 2.3 MDK工程的编辑.................................................................................................................................... 83 2.3.1 新建RVMDK工程........................................................................................................................... 83 2.3.2 建立文件 ........................................................................................................................................ 87 2.3.3 添加文件到工程............................................................................................................................. 88 2.3.4 管理工程目录以及源文件............................................................................................................. 90 2.3.5 编译和连接工程............................................................................................................................. 94 2.3.6 打开旧工程..................................................................................................................................... 97 2.4 RVMDK使用技巧 .................................................................................................................................. 98 2.4.1 快速定位函数/变量被定义的地方................................................................................................ 98 2.4.2 快速注释与快速消注释............................................................................................................... 101 2.4.3 快速打开头文件........................................................................................................................... 103 2.5 JLINK V8 仿真器的安装与应用 ......................................................................................................... 104 2.5.1 JLINK V8 仿真器简介...................................................................................................................... 104 2.5.2 JLINK ARM主要特点 ....................................................................................................................... 104 2.5.3 如何安装JLINK软件 .................................................................................................................... 105 2.5.4 JLINK V8 仿真器配置(MDK KEIL环境) ................................................................................... 107 2.5.5 使用KEIL的DOWNLOAD功能.....................................................................................................110 2.6 在MDK开发环境中JLINK V8 的调试技巧 .........................................................................................111 2.7 在MDK开发环境中调试.......................................................................................................................113 2.7.1 KEIL仿真的应用 ...............................................................................................................................113 2.7.2 KEIL软件仿真 ...................................................................................................................................113 2.7.3 硬件仿真 ...................................................................................................................................... 121 2.7.4 DEBUG模式下不能watch的解决办法............................................................................................ 125 2.8 如何设置程序空间在CPU内部FLASH,变量空间在CPU内部RAM运行 ........................................ 126 2.9 如何设置程序空间和变量空间都在CPU内部RAM运行................................................................... 127 2.10 如何设置程序空间和变量空间都在外部SRAM运行 ........................................................................ 130 第三章 STM32 神舟王 407ZG开发板硬件使用基础篇 ................................................................................... 138 3.1 如何给神舟王 407ZG开发板供电....................................................................................................... 138 第 7 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 3.1.1 使用USB供电 ............................................................................................................................... 138 3.1.2 使用外接电源供电....................................................................................................................... 138 3.1.3 使用JLINK V8 供电...................................................................................................................... 138 3.2 如何使用JLINK软件下载固件到神舟开发板 .................................................................................... 139 3.2.1 如何使用J-FLASH ARM 烧写固件到芯片FLASH..................................................................... 139 3.2.2 使用J-Link command 设置和查看相关调试信息 ...................................................................... 146 3.3 如何通过串口下载一个固件到神舟王STM32 开发板 ...................................................................... 148 3.2 如何通过USB接口下载固件到神舟王STM32 开发板 ...................................................................... 154 3.4 生成USB下载应用程序映像*.DFU文件 .............................................................................................. 162 3.5 如何在IAR开发环境中使用JLINK在线调试 ..................................................................................... 170 3.6 如何在MDK开发环境中使用JLINK在线调试................................................................................... 171 3.7 神舟王STM32 开发板跳线含义.......................................................................................................... 176 3.7.1 启动模式选择跳线....................................................................................................................... 176 3.7.2 RS-232 串口 1 与USB选择跳线....................................................................................................... 177 3.7.3 RS-232 串口 2 与RS-485 选择跳线 ................................................................................................. 177 3.7.4 音频放大数据源跳线................................................................................................................... 177 3.7.5 5V电源选择跳线 .............................................................................................................................. 178 3.7.6 神舟王STM32 两块 2.4G无线模块连接说明 ............................................................................. 178 第四章 STM32 快速入门篇 ................................................................................................................................ 179 4.1 理解芯片控制的原理 ........................................................................................................................... 179 4.2 芯片管脚控制LED灯原理图解释 ....................................................................................................... 180 4.3 STM32 相关的芯片手册有哪些?我们如何阅读这些资料 .............................................................. 181 4.4 STM32 芯片各个管脚是怎么控制以及被管理的?(如何阅读芯片手册) .................................. 182 4.5 STM32 芯片单个管脚是怎么被控制以及被管理的?(如何阅读芯片寄存器)........................... 186 4.6 分析一个最简单的例程 ....................................................................................................................... 188 4.6.1 例程硬件原理图说明................................................................................................................... 188 4.6.2 例程main.c源代码(可以直接运行): ...................................................................................... 189 4.6.3 例程环境搭建............................................................................................................................... 193 4.6.4 实验现象 ...................................................................................................................................... 198 4.6.5 例程软件架构和代码分析(只有一个main.c文件) ................................................................ 199 4.6.6 代码的定义和声明如何与芯片内部资源挂钩 ........................................................................... 207 4.6.7 代码如何映射到芯片内部的寄存器........................................................................................... 208 4.6.8 Main函数寄存器级分析(重点)................................................................................................... 209 4.6.9 库函数与我们这个例程之间的关系........................................................................................... 216 4.7 STM32 的内存管理研究(KEIL编程环境下) ................................................................................. 217 4.7.1 研究意义 ...................................................................................................................................... 217 第 8 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 4.7.2 举例说明并详细分析................................................................................................................... 217 4.7.3 举例分析 ...................................................................................................................................... 217 4.7.4 观察堆栈 ...................................................................................................................................... 220 4.8 STM32 重映射功能.............................................................................................................................. 222 4.8.1 什么是STM32 的重映射 .............................................................................................................. 222 4.8.2 所有的管脚都可以重映射吗....................................................................................................... 222 4.8.3 为什么要有STM32 重映射这个功能 .......................................................................................... 222 4.8.4 STM32 重映射举例说明 .................................................................................................................. 222 4.8.5 深入分析STM32 重映射内部架构原理 ...................................................................................... 223 4.8.6 STM32 重映射关键指点 .................................................................................................................. 225 4.9 STM32 芯片加密解密.......................................................................................................................... 226 4.9.1 关于芯片加密的定义................................................................................................................... 226 4.9.2 关于芯片解密方法的理论总结................................................................................................... 227 4.9.3 常规芯片解密过程....................................................................................................................... 228 4.9.4 增加芯片解密难度的一些建议总结........................................................................................... 228 4.9.5 STM32 加密思路-01 串口ISP设置加密 ......................................................................................... 229 4.9.6 STM32 加密思路-02 软件加密 ....................................................................................................... 229 4.9.7 STM32 加密思路-03 外置ID芯片................................................................................................... 230 4.9.8 STM32 加密思路-04 程序自毁 ....................................................................................................... 230 4.9.9 STM32 加密思路-05 磨IC型号 ....................................................................................................... 230 4.9.10 STM32 加密思路-06 高端硬件加密 ........................................................................................... 230 4.9.11 STM32 加密思路-07 AES加密 ..................................................................................................... 230 4.10 STM32 低功耗经验总结...................................................................................................................... 231 4.10.1 STM32 低功耗实战项目案例故事(转载) .............................................................................. 231 4.10.2 STM32 低功耗三种模式 .............................................................................................................. 235 4.10.3 STM32 低功耗需注意的地方 ...................................................................................................... 235 4.11 STM32 的中断与事件关系的区别...................................................................................................... 235 第五章 实战篇(寄存器版本).......................................................................................................................... 237 5.1 通用输入/输出(GPIO)点灯............................................................................................................. 237 5.1.1 管脚特性 ...................................................................................................................................... 237 5.1.2 GPIO应用领域 ................................................................................................................................. 237 5.1.3 管脚分配 ...................................................................................................................................... 237 5.1.4 GPIO管脚内部硬件电路原理剖析 ................................................................................................. 238 5.1.5 STM32 的GPIO管脚深入分析......................................................................................................... 241 5.1.6 在STM32 中如何配置片内外设使用的IO端口 .......................................................................... 248 5.1.7 例程 01 单个LED点灯闪烁程序 ................................................................................................ 249 第 9 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 5.1.8 例程 02 LED双灯闪烁实验 ...................................................................................................... 253 5.1.9 例程 03 LED三个灯同时亮同时灭 .......................................................................................... 255 5.1.10 例程 04 LED流水灯程序 ............................................................................................................. 256 5.2 时钟....................................................................................................................................................... 259 5.2.1 什么是时钟................................................................................................................................... 259 5.2.2 STM32 的时钟 .................................................................................................................................. 259 5.2.3 STM32 的时钟深入分析 .................................................................................................................. 261 5.2.4 例程 01 STM32 芯片 32MHZ频率下跑点灯程序 ....................................................................... 265 5.2.5 例程 02 STM32 芯片 40MHZ频率下跑点灯程序 ....................................................................... 272 5.2.6 例程 03 STM32 芯片 72MHZ频率下跑点灯程序 ....................................................................... 273 5.3 独立按键............................................................................................................................................... 273 5.3.1 按键的分类................................................................................................................................... 273 5.3.2 按键属性 ...................................................................................................................................... 274 5.3.3 STM32 的位带操作........................................................................................................................ 275 5.3.4 例程 01 STM32 芯片按键点灯(无防抖).................................................................................. 279 5.3.5 例程 02 STM32 芯片按键点灯-增加了防抖的代码.................................................................... 283 第六章 STM32 库函数架构剖析 ........................................................................................................................ 284 6.1 STM32 库函数到底是什么.................................................................................................................. 285 6.2 STM32 库函数的好处.......................................................................................................................... 285 6.3 千人大项目如何分配工作 ................................................................................................................... 285 6.4 STM32 库结构剖析.............................................................................................................................. 286 6.4.1 CMSIS标准 ....................................................................................................................................... 286 6.4.2 库目录,文件简介....................................................................................................................... 287 6.4.3 关于core_cm3.h文件 .................................................................................................................... 288 6.4.4 system_stm32f4xx.c文件 ................................................................................................................... 289 6.4.5 stm32f4xx.h文件................................................................................................................................ 290 6.4.6 启动文件 ...................................................................................................................................... 291 6.4.7 STM32F4xx_StdPeriph_Driver文件夹............................................................................................. 292 6.4.8 stm32f4xx_it.c、 stm32f4xx_conf.h文件.......................................................................................... 294 6.4.9 库各文件间的关系....................................................................................................................... 295 6.4.10 常用官方资料............................................................................................................................... 297 6.4.11 库函数帮助文档使用................................................................................................................... 297 第七章 实战篇 ..................................................................................................................................................... 299 7.1 LED流水灯实验 ................................................................................................................................... 299 7.1.1 流水灯试验的意义与作用........................................................................................................... 299 7.1.2 实验原理 ...................................................................................................................................... 299 第 10 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.1.3 硬件设计 ...................................................................................................................................... 300 7.1.4 软件设计 ...................................................................................................................................... 301 7.1.5 下载与验证................................................................................................................................... 306 7.1.6 实验现象 ...................................................................................................................................... 307 7.2 蜂鸣器实验........................................................................................................................................... 307 7.2.1 蜂鸣器的简介............................................................................................................................... 307 7.2.2 蜂鸣器的结构............................................................................................................................... 308 7.2.3 蜂鸣器实验的意义与作用........................................................................................................... 308 7.2.4 实验原理 ...................................................................................................................................... 309 7.2.5 硬件设计 ...................................................................................................................................... 309 7.2.6 软件设计 ...................................................................................................................................... 310 7.2.7 下载与测试................................................................................................................................... 312 7.2.8 实验现象 ...................................................................................................................................... 313 7.3 按键检测实验....................................................................................................................................... 313 7.3.1 按键的介绍................................................................................................................................... 313 7.3.2 单片机检测小弹性按键的原理................................................................................................... 314 7.3.3 意义与作用................................................................................................................................... 316 7.3.4 实验原理 ...................................................................................................................................... 316 7.3.5 硬件设计 ...................................................................................................................................... 316 7.3.6 软件设计 ...................................................................................................................................... 317 7.3.7 下载与验证................................................................................................................................... 321 7.3.8 实验现象 ...................................................................................................................................... 321 7.4 BITBAND按键扫描检测........................................................................................................................ 322 7.4.1 什么是位带操作........................................................................................................................... 322 7.4.2 为什么要用位带操作................................................................................................................... 322 7.4.3 如何设计和实现位带操作的....................................................................................................... 322 7.4.4 STM32 中位带操作的具体部署情况 .............................................................................................. 323 7.4.5 如何用代码来实现位带操作....................................................................................................... 324 7.4.6 软件设计 ...................................................................................................................................... 326 7.4.7 下载与验证................................................................................................................................... 330 7.4.8 实验现象 ...................................................................................................................................... 330 7.5 EXTI外部按键中断实验...................................................................................................................... 330 7.5.1 什么是中断................................................................................................................................... 330 7.5.2 什么是单片机的中断?............................................................................................................... 330 7.5.3 STM32 中断的初步理解 .................................................................................................................. 331 7.5.4 STM32 中断的初始化过程以及手册的查询................................................................................... 333 第 11 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.5.5 STM32 中断优先级 .......................................................................................................................... 335 7.5.6 硬件设计 ...................................................................................................................................... 337 7.5.7 软件设计 ...................................................................................................................................... 338 7.5.8 下载与验证................................................................................................................................... 345 7.5.9 实验现象 ...................................................................................................................................... 345 7.6 SYSTICK系统滴答实验......................................................................................................................... 346 7.6.1 基本概念和原理........................................................................................................................... 346 7.6.2 实验原理 ...................................................................................................................................... 347 7.6.3 硬件设计 ...................................................................................................................................... 347 7.6.4 软件设计 ...................................................................................................................................... 347 7.6.5 下载与验证................................................................................................................................... 351 7.6.6 实验现象 ...................................................................................................................................... 351 7.7 USART串口 1 通信(神舟王STM32F407-库函数版) .......................................................................... 352 7.7.1 串口printf打印输出实验的意义与作用 ...................................................................................... 352 7.7.2 串口printf打印输出实验原理...................................................................................................... 352 7.7.3 关于TTL电平................................................................................................................................ 360 7.7.4 STM32 的异步串口通讯协议 .......................................................................................................... 361 7.7.5 交叉线和直连线........................................................................................................................... 362 7.7.6 串口工作流程............................................................................................................................... 362 7.7.7 硬件设计 ...................................................................................................................................... 364 7.7.8 例程 01 UART串口 1 Printf打印输出字符................................................................................. 366 7.7.9 软件设计 ...................................................................................................................................... 366 7.7.10 下载与验证................................................................................................................................... 373 7.7.11 实验现象 ...................................................................................................................................... 373 7.7.12 例程 02 UART串口 1-带SYSTICK中断Printf()........................................................................... 375 7.7.13 软件设计 ...................................................................................................................................... 375 7.7.14 实验现象 ...................................................................................................................................... 375 7.7.15 例程 03 UART串口 1 输入和输出.............................................................................................. 375 7.7.16 软件设计 ...................................................................................................................................... 375 7.7.17 实验现象 ...................................................................................................................................... 376 7.8 USART串口 2 通信 .............................................................................................................................. 379 7.8.1 意义与作用................................................................................................................................... 379 7.8.2 串口 2 与串口 1 的区别............................................................................................................... 379 7.8.3 多个串口如何同时接收源源不断发送给每个串口的数据 ....................................................... 380 7.8.4 两个串口同时来数据了 这个时候只能进入一个中断,会丢失数据吗 ................................. 380 7.8.5 硬件设计 ...................................................................................................................................... 381 第 12 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.8.6 例程 01 UART串口 2Printf()打印 .......................................................................................... 383 7.8.7 软件设计 ...................................................................................................................................... 384 7.8.8 下载与验证................................................................................................................................... 384 7.8.9 实验现象 ...................................................................................................................................... 384 7.8.10 例程 02 UART串口 2-带SYSTICK中断Printf()........................................................................... 386 7.8.11 例程 03 UART串口 1Printf输出和scanf输入 ............................................................................. 386 7.9 UART串口 1 和串口 2 同时格式化输出输入..................................................................................... 386 7.9.1 下载与验证................................................................................................................................... 386 7.9.2 实验现象 ...................................................................................................................................... 386 7.10 串口高级例程之PRINTF中断收发实验................................................................................................ 389 7.10.1 意义与作用................................................................................................................................... 389 7.10.2 实验原理 ...................................................................................................................................... 390 7.10.3 硬件设计 ...................................................................................................................................... 390 7.10.4 软件设计 ...................................................................................................................................... 391 7.10.5 下载与验证................................................................................................................................... 396 7.10.6 实验现象 ...................................................................................................................................... 396 7.11 产品唯一身份标识(UNIQUE DEVICE ID)实验(96 位唯一ID实验)................................................. 398 7.11.1 意义与作用................................................................................................................................... 398 7.11.2 实验原理 ...................................................................................................................................... 398 7.11.3 硬件设计 ...................................................................................................................................... 398 7.11.4 软件设计 ...................................................................................................................................... 398 7.11.5 下载与验证................................................................................................................................... 399 7.11.6 实验现象 ...................................................................................................................................... 399 7.12 ADC模数转换实验 (神舟王STM32F407-库函数版)......................................................................... 401 7.12.1 ADC模数转换实验的意义与作用................................................................................................. 401 7.12.2 AD转换原理 ................................................................................................................................. 401 7.12.3 STM32 的ADC特点 ...................................................................................................................... 403 7.12.4 实验原理 ...................................................................................................................................... 404 7.12.5 硬件设计 ...................................................................................................................................... 405 7.12.6 软件设计 ...................................................................................................................................... 406 7.12.7 下载与测试................................................................................................................................... 410 7.12.8 实验现象 ...................................................................................................................................... 410 7.13 CALENDAR实时时钟与年月日与闹钟(神舟王STM32F407-库函数版) ............................................. 410 7.13.1 意义与作用....................................................................................................................................411 7.13.2 实验原理 .......................................................................................................................................411 7.13.3 硬件设计 ...................................................................................................................................... 412 第 13 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.13.4 软件设计 ...................................................................................................................................... 413 7.13.5 下载与测试................................................................................................................................... 414 7.13.6 实验现象 ...................................................................................................................................... 414 7.14 CALENDAR实时时钟与农历与与闹钟(神舟王STM32F407-库函数版) ............................................. 415 7.14.1 软件设计 ...................................................................................................................................... 415 7.14.2 下载与测试................................................................................................................................... 415 7.14.3 实验现象 ...................................................................................................................................... 416 7.15 TIMER定时器中断实验....................................................................................................................... 419 7.15.1 意义与作用................................................................................................................................... 419 7.15.2 实验原理 ...................................................................................................................................... 419 7.15.3 硬件设计 ...................................................................................................................................... 422 7.15.4 软件设计 ...................................................................................................................................... 422 7.15.5 下载与验证................................................................................................................................... 425 7.15.6 实验现象 ...................................................................................................................................... 425 7.16 IWDG独立看门狗 ................................................................................................................................ 426 7.16.1 什么是看门狗............................................................................................................................... 426 7.16.2 为什么是独立看门狗呢............................................................................................................... 426 7.16.3 怎么使用独立看门狗IWDG ........................................................................................................ 426 7.16.4 启动STM32 的独立看门狗 .......................................................................................................... 428 7.16.5 软件设计 ...................................................................................................................................... 429 7.16.6 下载与验证................................................................................................................................... 429 7.16.7 实验现象 ...................................................................................................................................... 430 7.17 窗口看门狗........................................................................................................................................... 430 7.17.1 什么是窗口看门狗....................................................................................................................... 430 7.17.2 窗口看门狗的特性....................................................................................................................... 430 7.17.3 窗口看门狗的计算公式:........................................................................................................... 431 7.17.4 窗口看门狗要用到哪些寄存器................................................................................................... 432 7.17.5 窗口看门狗与独立看门狗的区别............................................................................................... 434 7.17.6 怎么使用窗口看门狗................................................................................................................... 434 7.17.7 硬件设计 ...................................................................................................................................... 435 7.17.8 软件设计 ...................................................................................................................................... 435 7.17.9 实验现象 ...................................................................................................................................... 438 7.18 315M无线模块(神舟王STM32F407-库函数版) ................................................................................. 439 7.18.1 按键检测与 315M无线模块实验 ................................................................................................ 439 7.18.2 按键检测与无线模块实验的意义与作用................................................................................... 441 7.18.3 实验原理 ...................................................................................................................................... 441 第 14 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.18.4 硬件设计 ...................................................................................................................................... 442 7.18.5 软件设计 ...................................................................................................................................... 443 7.18.6 下载与测试................................................................................................................................... 449 7.18.7 实验现象 ...................................................................................................................................... 449 7.19 硬件CRC循环冗余检验实验 ............................................................................................................... 452 7.19.1 意义与作用................................................................................................................................... 452 7.19.2 实验原理 ...................................................................................................................................... 452 7.19.3 硬件设计 ...................................................................................................................................... 453 7.19.4 软件设计 ...................................................................................................................................... 454 7.19.5 下载与验证................................................................................................................................... 455 7.19.6 实验现象 ...................................................................................................................................... 455 7.20 PVD电源电压监测实验 ....................................................................................................................... 457 7.20.1 意义与作用................................................................................................................................... 457 7.20.2 实验原理 ...................................................................................................................................... 457 7.20.3 硬件设计 ...................................................................................................................................... 459 7.20.4 软件设计 ...................................................................................................................................... 459 7.20.5 下载与验证................................................................................................................................... 462 7.20.6 实验现象 ...................................................................................................................................... 462 7.21 STM32 低功耗之- STANDBY待机模式实验 ..................................................................................... 462 7.21.1 意义与作用................................................................................................................................... 462 7.21.2 STM32 低功耗模式介绍 .............................................................................................................. 463 7.21.3 待机模式 ...................................................................................................................................... 463 7.21.4 进入待机模式............................................................................................................................... 463 7.21.5 待机模式寄存器介绍................................................................................................................... 464 7.21.6 待机唤醒步骤............................................................................................................................... 465 7.21.7 硬件设计 ...................................................................................................................................... 466 7.21.8 软件设计 ...................................................................................................................................... 466 7.21.9 下载与验证................................................................................................................................... 471 7.21.10 实验现象 .................................................................................................................................. 472 7.22 STM32 低功耗之--STOP停止模式实验.............................................................................................. 472 7.22.1 意义与作用................................................................................................................................... 472 7.22.2 实验原理 ...................................................................................................................................... 472 7.22.3 硬件设计 ...................................................................................................................................... 473 7.22.4 软件设计 ...................................................................................................................................... 473 7.22.5 下载与验证................................................................................................................................... 477 7.22.6 实验现象 ...................................................................................................................................... 477 第 15 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.23 TFT彩色液晶屏只显示红色 ................................................................................................................ 477 7.23.1 术语解释 ...................................................................................................................................... 478 7.23.2 液晶彩屏原理简介....................................................................................................................... 478 7.23.3 液晶彩屏图像像素分析............................................................................................................... 478 7.23.4 控制器命令分析........................................................................................................................... 479 7.23.5 FSMC介绍 .................................................................................................................................... 482 7.23.6 FSMC函数初始化 ........................................................................................................................ 487 7.23.7 硬件设计 ...................................................................................................................................... 489 7.23.8 软件分析 ...................................................................................................................................... 491 7.23.9 下载与测试................................................................................................................................... 497 7.23.10 实验现象 .................................................................................................................................. 497 7.24 TFT彩色液晶屏显示蓝色.................................................................................................................... 498 7.24.1 硬件设计 ...................................................................................................................................... 498 7.24.2 软件分析 ...................................................................................................................................... 498 7.24.3 下载与测试................................................................................................................................... 499 7.24.4 实验现象 ...................................................................................................................................... 500 7.25 FT彩色液晶屏如何显示一个点 .......................................................................................................... 500 7.25.1 扫描的简要分析........................................................................................................................... 500 7.25.2 硬件设计 ...................................................................................................................................... 500 7.25.3 软件分析 ...................................................................................................................................... 500 7.25.4 下载与测试................................................................................................................................... 503 7.25.5 实验现象 ...................................................................................................................................... 503 7.26 TFT彩色液晶屏显示一个数字 1 ......................................................................................................... 503 7.26.1 扫描的简要分析........................................................................................................................... 503 7.26.2 什么是字模................................................................................................................................... 504 7.26.3 ASCII码的字符解释..................................................................................................................... 504 7.26.4 硬件设计 ...................................................................................................................................... 507 7.26.5 软件分析 ...................................................................................................................................... 507 7.26.6 下载与测试....................................................................................................................................511 7.26.7 实验现象 .......................................................................................................................................511 7.27 TFT彩色液晶屏显示变异的数字 1 ..................................................................................................... 512 7.27.1 简要分析 ...................................................................................................................................... 512 7.27.2 软件分析 ...................................................................................................................................... 512 7.27.3 软件分析 ...................................................................................................................................... 513 7.28 TFT彩色液晶屏显示数字 9 ................................................................................................................. 514 7.28.1 简要分析 ...................................................................................................................................... 514 第 16 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.28.2 软件分析 ...................................................................................................................................... 514 7.28.3 下载测试 ...................................................................................................................................... 515 7.28.4 实验现象 ...................................................................................................................................... 515 7.29 TFT彩色液晶屏显示一个英文 ............................................................................................................ 516 7.29.1 简要分析 ...................................................................................................................................... 516 7.29.2 硬件设计 ...................................................................................................................................... 516 7.29.3 软件分析 ...................................................................................................................................... 516 7.29.4 下载与测试................................................................................................................................... 517 7.29.5 实验现象 ...................................................................................................................................... 518 7.30 TFT彩色液晶屏显示 26 个英文字母 .................................................................................................. 518 7.30.1 简要分析 ...................................................................................................................................... 518 7.30.2 硬件设计 ...................................................................................................................................... 518 7.30.3 软件分析 ...................................................................................................................................... 518 7.30.4 下载与测试................................................................................................................................... 519 7.30.5 实验现象 ...................................................................................................................................... 520 7.31 TFT彩色液晶屏显示中文字 ................................................................................................................ 520 7.31.1 使用工具将中文字转换成二进制码........................................................................................... 520 7.31.2 硬件设计 ...................................................................................................................................... 522 7.31.3 软件分析 ...................................................................................................................................... 522 7.31.4 下载与测试................................................................................................................................... 524 7.31.5 实验现象 ...................................................................................................................................... 524 7.32 TFT彩色液晶屏显示中英文字 ............................................................................................................ 525 7.32.1 硬件设计 ...................................................................................................................................... 525 7.32.2 软件分析 ...................................................................................................................................... 525 7.32.3 下载与测试................................................................................................................................... 525 7.32.4 实验现象 ...................................................................................................................................... 525 7.33 TFT彩色液晶屏显示图片.................................................................................................................... 526 7.33.1 图片格式介绍............................................................................................................................... 526 7.33.2 深入了解BMP图片 ...................................................................................................................... 526 7.33.3 使用工具将图片转换成二进制码............................................................................................... 527 7.33.4 硬件设计 ...................................................................................................................................... 529 7.33.5 软件分析 ...................................................................................................................................... 529 7.33.6 下载与测试................................................................................................................................... 532 7.33.7 实验现象 ...................................................................................................................................... 532 7.34 TFT彩色液晶屏显示图片并刷屏 ........................................................................................................ 532 7.34.1 硬件设计 ...................................................................................................................................... 532 第 17 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.34.2 软件分析 ...................................................................................................................................... 532 7.34.3 下载与测试................................................................................................................................... 532 7.34.4 实验现象 ...................................................................................................................................... 532 7.35 开机TFT液晶屏图片自动左右移动实验 ............................................................................................ 533 7.35.1 简要分析 ...................................................................................................................................... 533 7.35.2 硬件设计 ...................................................................................................................................... 533 7.35.3 软件分析 ...................................................................................................................................... 533 7.35.4 下载与测试................................................................................................................................... 534 7.35.5 实验现象 ...................................................................................................................................... 534 7.36 神舟王_LCD触摸屏(神舟王STM32F407-库函数版)......................................................................... 534 7.36.1 TFT触摸屏实验的意义与作用.................................................................................................... 535 7.36.2 实验原理 ...................................................................................................................................... 535 7.36.3 硬件设计 ...................................................................................................................................... 536 7.36.4 软件分析 ...................................................................................................................................... 540 7.36.5 下载与测试................................................................................................................................... 543 7.36.6 实验现象 ...................................................................................................................................... 543 7.37 图片跟触摸点移动实验 ....................................................................................................................... 543 7.37.1 简要分析 ...................................................................................................................................... 543 7.37.2 硬件设计 ...................................................................................................................................... 543 7.37.3 软件分析 ...................................................................................................................................... 544 7.37.4 下载与测试................................................................................................................................... 544 7.37.5 实验现象 ...................................................................................................................................... 544 7.38 点击图片小图标显示小图标外框实验 ............................................................................................... 545 7.38.1 简要分析 ...................................................................................................................................... 545 7.38.2 硬件设计 ...................................................................................................................................... 545 7.38.3 软件分析 ...................................................................................................................................... 545 7.38.4 下载与测试................................................................................................................................... 546 7.38.5 实验现象 ...................................................................................................................................... 546 7.39 双击小图标触发实验 ........................................................................................................................... 546 7.39.1 简要分析 ...................................................................................................................................... 546 7.39.2 硬件设计 ...................................................................................................................................... 546 7.39.3 软件分析 ...................................................................................................................................... 547 7.39.4 下载与测试................................................................................................................................... 548 7.39.5 实验现象 ...................................................................................................................................... 548 7.40 双击小图标触发实验 ........................................................................................................................... 548 7.40.1 简要分析 ...................................................................................................................................... 548 第 18 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.40.2 硬件设计 ...................................................................................................................................... 548 7.40.3 软件分析 ...................................................................................................................................... 548 7.40.4 实验现象 ...................................................................................................................................... 549 7.41 CAN总线回环实验 .............................................................................................................................. 550 7.41.1 意义与作用................................................................................................................................... 550 7.41.2 实验原理 ...................................................................................................................................... 556 7.41.3 实验原理 ...................................................................................................................................... 559 7.41.4 硬件设计 ...................................................................................................................................... 564 7.41.5 软件设计 ...................................................................................................................................... 566 7.41.6 下载与验证................................................................................................................................... 573 7.41.7 实验现象 ...................................................................................................................................... 573 7.42 SPI_FLASH_W25X16_ (神舟王STM32F407-库函数版) ................................................................... 574 7.42.1 SPI FLASH(W25X16)读写程序实验的的意义与作用........................................................... 574 7.42.2 实验原理 ...................................................................................................................................... 574 7.42.3 硬件设计 ...................................................................................................................................... 577 7.42.4 软件设计 ...................................................................................................................................... 578 7.42.5 下载与测试................................................................................................................................... 580 7.42.6 实验现象 ...................................................................................................................................... 580 7.43 SRAM访问程序(神舟王STM32F407-库函数版)................................................................................ 581 7.43.1 SRAM访问实验的意义与作用..................................................................................................... 581 7.43.2 FSMC的优点 ................................................................................................................................ 581 7.43.3 FSMC的内部结构 ........................................................................................................................ 581 7.43.4 FSMC的映射地址空间 ................................................................................................................ 582 7.43.5 实验原理 ...................................................................................................................................... 583 7.43.6 硬件设计 ...................................................................................................................................... 583 7.43.7 软件设计 ...................................................................................................................................... 586 7.43.8 下载与测试................................................................................................................................... 593 7.43.9 实验现象 ...................................................................................................................................... 593 7.44 NOR_FLASH访问(神舟王STM32F407-库函数版)............................................................................ 594 7.44.1 Nor Flash与Nand Flash的区别.................................................................................................... 594 7.44.2 FSMC扩展Nor Flash配置............................................................................................................ 596 7.44.3 Nor Flash访问实验的意义与作用 .............................................................................................. 597 7.44.4 实验原理 ...................................................................................................................................... 598 7.44.5 硬件设计 ...................................................................................................................................... 598 7.44.6 软件设计 ...................................................................................................................................... 600 7.44.7 下载与测试................................................................................................................................... 602 第 19 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.44.8 实验现象 ...................................................................................................................................... 602 7.45 NAND_FLASH访问(神舟王STM32F407-库函数版)......................................................................... 604 7.45.1 Nand Flash访问实验的意义与作用 ............................................................................................ 604 7.45.2 实验原理 ...................................................................................................................................... 604 7.45.3 硬件设计 ...................................................................................................................................... 607 7.45.4 软件设计 ...................................................................................................................................... 609 7.45.5 下载与测试................................................................................................................................... 610 7.45.6 实验现象 ...................................................................................................................................... 610 7.46 EEPROM读写程序彩屏显示(神舟王STM32F407-库函数版)............................................................611 7.46.1 EEPROM访问试验的意义与作用................................................................................................611 7.46.2 实验原理 .......................................................................................................................................611 7.46.3 硬件设计 ...................................................................................................................................... 613 7.46.4 软件设计 ...................................................................................................................................... 614 7.46.5 下载与测试................................................................................................................................... 617 7.46.6 实验现象 ...................................................................................................................................... 617 7.47 DMA传输实验...................................................................................................................................... 619 7.47.1 STM32 DMA简介 ......................................................................................................................... 620 7.47.2 实验原理 ...................................................................................................................................... 620 7.47.3 硬件设计 ...................................................................................................................................... 622 7.47.4 软件设计 ...................................................................................................................................... 622 7.47.5 下载验证 ...................................................................................................................................... 625 7.48 STM32 内部温度传感器实验.............................................................................................................. 626 7.48.1 STM32 内部温度传感器简介 ...................................................................................................... 626 7.48.2 实验原理 ...................................................................................................................................... 627 7.48.3 硬件设计 ...................................................................................................................................... 628 7.48.4 软件设计 ...................................................................................................................................... 628 7.48.5 下载验证 ...................................................................................................................................... 632 7.49 DS18B20 温度传感实验(神舟王STM32F407-库函数版) .................................................................. 632 7.49.1 为什么会有温度传感器出现....................................................................................................... 632 7.49.2 什么是温度传感器....................................................................................................................... 632 7.49.3 18B20 温度传感器的特性 ........................................................................................................... 633 7.49.4 18B20 温度传感器的实现原理 ................................................................................................... 633 7.49.5 硬件设计 ...................................................................................................................................... 637 7.49.6 软件设计 ...................................................................................................................................... 638 7.49.7 下载与测试................................................................................................................................... 640 7.49.8 实验现象 ...................................................................................................................................... 640 第 20 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.50 2.4G无线通信实验两个模块间通信(神舟王STM32F407-库函数版) ............................................... 643 7.50.1 2.4G无线模块通讯实验的意义与作用 ....................................................................................... 643 7.50.2 2.4G无线模块特性....................................................................................................................... 643 7.50.3 nRF24L01 无线模块的工作原理................................................................................................. 643 7.50.4 硬件设计 ...................................................................................................................................... 649 7.50.5 软件设计 ...................................................................................................................................... 650 7.50.6 下载与测试................................................................................................................................... 653 7.50.7 实验现象 ...................................................................................................................................... 654 7.51 PS2 键盘实验(神舟王STM32F407-库函数版) ................................................................................... 657 7.51.1 PS/2 接口简介 .............................................................................................................................. 657 7.51.2 PS/2 键盘鼠标的硬件接口 .......................................................................................................... 657 7.51.3 PS/2 的协议 .................................................................................................................................. 658 7.51.4 键盘与PS/2 协议实例分析 .......................................................................................................... 659 7.51.5 实验原理 ...................................................................................................................................... 661 7.51.6 硬件设计 ...................................................................................................................................... 661 7.51.7 软件设计 ...................................................................................................................................... 662 7.51.8 下载与测试................................................................................................................................... 666 7.51.9 实验现象 ...................................................................................................................................... 666 7.52 IR红外线接收发送实验 (神舟王STM32F407-库函数版) ................................................................. 668 7.52.1 红外收发的简介........................................................................................................................... 668 7.52.2 红外收发的特点与用途............................................................................................................... 669 7.52.3 红外的发送工作原理................................................................................................................... 670 7.52.4 红外的接收工作原理................................................................................................................... 672 7.52.5 硬件设计 ...................................................................................................................................... 676 7.52.6 软件设计 ...................................................................................................................................... 676 7.52.7 下载与测试................................................................................................................................... 678 7.52.8 实验现象 ...................................................................................................................................... 679 7.53 VS1003 示例音乐播放(神舟王STM32F407-库函数版)..................................................................... 681 7.53.1 VS1003 芯片介绍 ......................................................................................................................... 681 7.53.2 实验原理 ...................................................................................................................................... 684 7.53.3 硬件设计 ...................................................................................................................................... 685 7.53.4 软件设计 ...................................................................................................................................... 686 7.53.5 下载与测试................................................................................................................................... 689 7.53.6 实验现象 ...................................................................................................................................... 689 7.54 神舟王 407 读取U盘实验(神舟王STM32F407-库函数版) ................................................................ 690 7.54.1 意义与作用................................................................................................................................... 690 第 21 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.54.2 实验原理 ...................................................................................................................................... 691 7.54.3 硬件设计 ...................................................................................................................................... 693 7.54.4 软件设计 ...................................................................................................................................... 695 7.54.5 下载与测试................................................................................................................................... 704 7.54.6 实验现象 ...................................................................................................................................... 704 7.55 神舟王 407 使用SD卡USB读卡器实验(神舟王STM32F407-库函数版) .......................................... 706 7.55.1 SD卡读卡器实验的意义与作用.................................................................................................. 706 7.55.2 SD卡基本知识.............................................................................................................................. 706 7.55.3 实验原理 ...................................................................................................................................... 708 7.55.4 硬件设计 ...................................................................................................................................... 708 7.55.5 软件设计 .......................................................................................................................................711 7.55.6 下载与测试................................................................................................................................... 712 7.55.7 实验现象 ...................................................................................................................................... 712 7.56 神舟王 407 使用DFU固件升级(神舟王STM32F407-库函数版) ....................................................... 714 7.56.1 意义与作用................................................................................................................................... 714 7.56.2 实验原理 ...................................................................................................................................... 714 7.56.3 硬件设计 ...................................................................................................................................... 714 7.56.4 软件设计 ...................................................................................................................................... 714 7.56.5 下载与测试................................................................................................................................... 717 7.56.6 实验现象 ...................................................................................................................................... 717 7.57 神舟王 407 使用USB鼠标_按键控制(神舟王STM32F407-库函数版) ............................................. 728 7.57.1 意义与作用................................................................................................................................... 728 7.57.2 实验原理 ...................................................................................................................................... 728 7.57.3 关于OTG的基础知识................................................................................................................... 729 7.57.4 硬件设计 ...................................................................................................................................... 730 7.57.5 下载与测试................................................................................................................................... 732 7.57.6 实验现象 ...................................................................................................................................... 732 7.58 神舟王 407 使用USB鼠标_触摸屏控制(神舟王STM32F407-库函数版) ......................................... 732 7.58.1 意义与作用................................................................................................................................... 732 7.58.2 实验原理 ...................................................................................................................................... 732 7.58.3 硬件设计 ...................................................................................................................................... 734 7.58.4 下载与测试................................................................................................................................... 734 7.58.5 实验现象 ...................................................................................................................................... 734 7.59 神舟王 407 以太网TFTPSERVER文件传输((神舟王STM32F407-库函数版) ...................................... 736 7.59.1 以太网实现tftpserver文件传输实验 ........................................................................................... 736 7.59.2 意义与作用................................................................................................................................... 736 第 22 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 7.59.3 实验原理 ...................................................................................................................................... 737 7.59.4 硬件设计 ...................................................................................................................................... 744 7.59.5 软件设计 ...................................................................................................................................... 745 7.59.6 下载与测试................................................................................................................................... 748 7.59.7 实验现象 ...................................................................................................................................... 749 7.60 神舟王 407 之FREERTOS操作系统HTTPSERVER_NETCONN网页 ........................................................ 750 7.60.1 下载与测试................................................................................................................................... 750 7.60.2 实验现象 ...................................................................................................................................... 751 7.61 神舟王FREERTOS操作系统HTTPSERVER_SOCKET网页....................................................................... 759 7.61.1 下载与测试................................................................................................................................... 759 7.61.2 实验现象 ...................................................................................................................................... 759 7.62 神舟王FREERTOS操作系统UDPTCP_ECHO_SERVER网页 .................................................................... 762 7.62.1 下载与测试................................................................................................................................... 762 7.62.2 实验现象 ...................................................................................................................................... 762 第 23 页 共 771 页 ARM 技术论坛 www.armjishu.com 图表目录: 神舟王 STM32F407 用户手册 V2.0 图表 1 神舟王开发板通用底板资源图 ······························································································· 8 图表 2 神舟王开发板 407ZGT 核心板正面资源图 ············································································ 9 图表 3 神舟王开发板 407ZGT 核心板反面资源图 ············································································ 9 图表 4 神舟王开发板外正面观图 ····································································································· 10 图表 5 神舟王开发板反面外观图 ····································································································· 10 图表 6 STM32 家族主要产品系列家谱 ····························································································· 13 图表 7 STM32F407 的产品列表········································································································· 13 图表 8 STM32 F2 系列与其它系列的性能比较 ················································································ 14 图表 9 STM32 F2 与其它系列的地址空间映射比较········································································· 15 图表 10 STM32 F2 与其它系列的时钟模块特性比较······································································· 15 图表 11 STM32F407 内部的 MAC 结构图 ························································································ 16 图表 12 神舟王 STM32 使用 RMII 与外部 PHY 连接示意图 ························································· 18 图表 13 RJ45 接口引脚信号定义 ······································································································· 18 图表 14 STM32F407 的产品列表······································································································· 28 图表 15 神舟王 STM32F407ZGT 开发板 MCU 部分原理图 ··························································· 28 图表 16 BOOT 启动模式电路 ············································································································ 29 图表 17 电源滤波电路······················································································································· 30 图表 18 电源转换电路······················································································································· 30 图表 19 晶振电路 ······························································································································ 31 图表 20 RTC 实时时钟及备份区供电原理图 ···················································································· 31 图表 21 神舟王 JTAG/SWD 调试下载接口原理图········································································· 33 图表 22 核心板以太网接口原理图 ··································································································· 34 图表 23 底板以太网接口原理图 ······································································································· 35 图表 24 RJ45 接口引脚信号定义 ······································································································· 35 图表 25 USB OTG 电路接口原理图 ·································································································· 39 图表 26 触摸 TFT 彩屏接口原理图 ·································································································· 40 图表 27 VS1003 音频编解码电路原理图 ·························································································· 41 图表 28 音频功放方案一电路原理图 ······························································································· 42 图表 29 音频功放方案一电路原理图 ································································································ 42 图表 30 NOR FLASH 接口原理图 ····································································································· 43 图表 31 NAND FLASH 接口原理图 ·································································································· 44 图表 32 SRAM 接口原理图················································································································ 45 图表 33 SD 卡接口原理图·················································································································· 46 图表 34 315M 无线接口原理图·········································································································· 47 第 24 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 35 2.4G 无线模块 1 接口原理图 ······························································································· 47 图表 36 2.4G 无线模块 2 接口原理图 ······························································································· 47 图表 37 CAN 总线接口原理图··········································································································· 48 图表 38 RS232C 串口原理图 ············································································································· 49 图表 39 RS-485 原理图 ······················································································································ 49 图表 40 SPI FLASH 电路原理图········································································································ 50 图表 41 EEPROM 原理图··················································································································· 50 图表 42 蜂鸣器电路··························································································································· 51 图表 43 复位电路 ······························································································································ 51 图表 44 LED 指示灯电路 ··················································································································· 52 图表 45 按键输入电路······················································································································· 53 图表 46 RTC 实时时钟电路 ··············································································································· 53 图表 47 电位器 AD 电路 ··················································································································· 54 图表 48 双通道示波器接口电路 ······································································································· 54 图表 49 电压表电路··························································································································· 55 图表 50 USB HOST 模块接口电路 ···································································································· 56 图表 51 板载 FM 收音机及音频放大电路························································································ 56 图表 52 PS2 键盘鼠标接口电路········································································································· 57 图表 53 红外线接收和发送电路 ······································································································· 57 图表 54 DS18B20 温度传感器电路 ··································································································· 58 图表 55 步进电机模块接口电路 ······································································································· 58 图表 56 核心板 3.3V 电源电路 ········································································································· 59 图表 57 底板 3.3V 电源电路 ············································································································· 60 图表 58 -5V 电源电路 ························································································································ 60 图表 3-1 “Flash Loader Demo”软件的运行界面 ········································································· 101 图表 3-2 选择好文件的 DfuSe Demo 的运行界面·········································································· 102 图表 3-3 DfuSe Demo 的确认对话框 ···························································································· 103 图表 3-4 MDK 的 OPTION 的 Target 属性页设置 ·········································································· 105 图表 3-5 OPTION 选项卡中的 Output Converter 选项 ································································ 106 图表 3-6 OPTION 选项卡中的 Linker 选项 ····················································································· 107 图表 3-7 DFU File Manager 程序 ·································································································· 108 图表 3-8 DFU File Manager 程序功能对话框 ··············································································· 108 图表 3-9 DFU File Manager 程序运行界面··················································································· 108 图表 3-10 文件选择对话框·············································································································· 109 图表 3-11 文件选择对话框设置 ······································································································ 109 第 25 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 3-12 选择好文件后的 DFU File Manager 程序运行界面······················································· 109 图表 3-13 保存 DFU 文件对话框·····································································································110 图表 3-14 DFU 文件保存提示框····································································································110 图表 3-15 串口 1 跳线位置图···········································································································117 图表 3-16 两块 2.4G 无线模块连说明图 ·························································································118 第 26 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第一章 硬件篇 本章将详细介绍神舟王 STM32F407ZGT 开发板的硬件资源,使大家对该开发板的功 能及特点有个详细的了解。 本章将分为如下几个部分: 1,神舟王 STM32F407ZGT 开发板简介; 2,神舟王 STM32F407ZGT 开发板硬件详解; 3,神舟王 STM32F407ZGT 开发板使用注意事项; 1.1 神舟王STM32F407ZGT开发板简介 神舟王开发板是 ARM 技术论坛开发的一款基于 STM32F407ZGT 的开发板,面向企 业和广大爱好者,开发板功能强大,外围资源齐全,例程丰富,采用底板+核心板(四层) 的扣板方式,底板尺寸为 132mm*188mm,核心板尺寸为 69mm*59mm。底板设计为可以 搭配不同型号的处理器核心板,通用底板资源如下图所示: 图表 1 神舟王开发板通用底板资源图 第 27 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 2 神舟王开发板 407ZGT 核心板正面资源图 图表 3 神舟王开发板 407ZGT 核心板反面资源图 第 28 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 4 神舟王开发板外正面观图 图表 5 神舟王开发板反面外观图 第 29 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 神舟王STM32F407ZGT开发板板载资源如下: 1. ◆ STM32F407ZGT6高性能32位处理器,基于ARM Cortex-M4F内核,以168MHz主频 达到210DMIPS的处理能力,内含1M字节的FLASH和196K字节的SRAM,LQFP144封装 ◆ 标配1G比特容量的Nand Flash ◆ 标配16M比特容量的Nor Flash,最大可支持128M比特容量Nor Flash ◆ 标配4M比特容量的SRAM ◆ 标配16M比特容量的SPI Flash芯片 ◆ 标配2K比特容量的I2C接口的EEPROM芯片 2. ◆ 1个10M/100M以太网接口,STM32F407处理器内部IEEE 1588 v2硬件配合国半 的工业级DP83848C以太网PHY芯片标准RJ45接口,支持平行交叉网线自适应 3. ◆ 1个USB 2.0 OTG接口,可以作为USB SLAVE,板载有ESD专用防护芯片。 4. ◆ 1个标准的3.2/4.3寸TFT LCD接口,带触摸功能,3.2寸分辨率320X240, 26万色 5. ◆ 1个VS1003B高性能MP3音频解码芯片,支持多种音乐格式文件的播放与录制, 6. 板载咪头麦克风以及音频输出输入3.5mm音频插座 7. ◆ 1个大功率双3.5W音频功率放大电路,左右双声道放大,可驱动两个纸盆喇叭 ◆ 1个主流收音机模块,并板载双声道功率放大器芯片,提供收音机功能 8. ◆ 1个SD卡接口,采用高性能SDIO接口 9. ◆ 2个2.4G无线通信模块接口,在板内实现就可以实现无线收发实验 10. ◆ 1个315M无线通信模块接口 11. ◆ 1个CAN 2.0总线接口 12. ◆ 1个RS-485接口 13. ◆ 2个RS-232C串口(使用DB9公头,线序与PC机相同) 14. ◆ 1个PS/2键盘鼠标接口 15. ◆ 1个DS18B20温度传感器接口 16. ◆ 1个红外线接收接口和1个红外线接发送接口 17. ◆ 2路带运算放大器的示波器接口,ADC模数转换实验 18. ◆ 1路带运算放大器的万用表接口,ADC模数转换实验 19. ◆ 1个USB HOST扩展SPI模块接口,可以连接CH376模块(选配) 20. ◆ 1个步进电机扩展模块接口(选配) 21. ◆ 1个锂电池供电接口(选配) 22. ◆ 1个蜂鸣器 23. ◆ 1个复位按钮,控制整板硬件复位 24. ◆ 4个功能按钮,其中包括WAKEUP唤醒功能和TEMPER入侵功能 25. ◆ 1个电源指示灯(绿色) 26. ◆ 4个用户状态指示灯(LED1~LED4:绿色) 27. ◆ 2个启动模式选择配置接口 28. ◆ 1个RTC实时时钟后备电池座,并带电池 29. ◆ 1个标准的20针SWD仿真调试下载接口 30. ◆ 1路电位器可调电阻模拟输入,可以做ADC模数转换实验 31. ◆ 2个DAC数模转换接口连接到接线端子 32. ◆ 2个PWM/TIM接口连接到接线端子 33. ◆ 1个DC5V电源接口,1个电源开关,可以选择从USB取电或DC5V电源接口取电 第 30 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 34. ◆ 支持从JLINK取5V电源或3.3V电源 35. ◆ 除晶振占用的IO管脚外,其余所有IO口全部引出到扩展双排插针 从上面的板载资源可以看出,神舟王STM32F407ZGT开发板的板载资源是很丰富的, 加上灵活的设计以及丰富的例程,让您的开发设计变得更加简单。 神舟王STM32F407ZGT开发板的特点包括: 1) 外观大气。采用核心板+大尺寸底板的扣板方式,底板尺寸为132mm*188mm, 核心板尺寸为69mm*59mm。 2) 信号完整性好。核心板采用四层PCB工艺,完整的地平面和独立的电源层保证信号 的完整性以及提高产品的抗干扰性。 3) 快速二次开发。四层PCB工艺的核心板可独立运行,若底板不满足客户要求,客户 只需配合万用板或简单的底板即可方便快速的实现二次开发的验证。 4) 设计灵活。板上除晶振外的所有的IO口全部引出,可以极大的方便大家扩展及使用。 5) 资源丰富。板载十多种外设及接口,让你畅游STM32。 6) 调试方便。和主流调试仿真工具JLINK V8完美结合,让您快速找到代码的BUG。 7) 触摸彩屏。320X240分辨率, 26万色TFT LCD,带触摸功能,让您设计出迷人的GUI。 8) 畅游网络。100M以太网+移植好的协议栈,支持DHCP、Telnet、TFTP、HTTP等协 议,缩短您的开发周期,而且支持网络固件更新,降低您的维护成本。 9) 无线体验。板载两个2.4G无线模块接口之间即可通信,同时支持315M无线模块。 10) 教程齐全。共计三十多个实例,使用ST标准库,方便用户修改升级。 第 31 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 接下来我们详细介绍神舟王STM32F407ZGT开发板的各个部分,我们将按上图中的 标注顺序依次介绍。 1) STM32F407ZGT6 处理器 MCU 神舟王 STM32F407ZGT 开发板的处理器是 STM32F407ZGT6,该处理器基于 ARM V7 架构的 Cortex-M4F 内核,主频 168Mhz,内部含有 1024K(1M)字节的 FLASH 和 196K 字 节的 SRAM,LQFP144 封装。 STM32 家族主要产品系列家谱如图表 6 STM32 家族主要产品系列家谱所示, STM32F407 属于Cortex-M4 内核的顶级性能系列,以 168MHz高速运行时可达到 210DMIPS的处理能力,资源非常丰富。 图表 6 STM32 家族主要产品系列家谱 神舟王 STM32F407ZGT 开发板选用的是外设资源和管脚资源最丰富的 144 脚 LQFP 封装的 STM32F407ZGT6 芯片,充分满足企业和广大爱好者的评估开发需求。 第 32 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 7 STM32F407 的产品列表 第 33 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 神舟王 STM32F407ZGT 开发板选用处理器是 STM32 F4 系列,该系列与 STM32 其 它系列的性能比较如下图所示。 图表 8 STM32 F2 系列与其它系列的性能比较 下图是 STM32 F4 与其它系列的地址空间映射比较,可以看出与 F1 系列相比将更多资源有慢速的 APB 总线转移到了高速的 AHB 总线,以提高访问速度。 第 34 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 9 STM32 F4 与其它系列的地址空间映射比较 下图是 STM32 F4 与其它系列的时钟模块比较,可以看出与 F1 系列相比主频和性能有所提升。 图表 10 STM32 F4 与其它系列的时钟模块特性比较 Cortex 的各个型号指令集比较如下图所示,STM32F407ZGT6 是基于 ARM Cortex-M4F 内核。 第 35 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 更多STM32F407 的最新资料访问ST官方网页STM32F407ZGT.html和神舟板官方论 坛ARM技术论坛。 2) 10M/100M 以太网接口 神舟王 STM32F407 开发板采用国半(National Semiconductor Corporation)低功耗和 高性能的 DP83848C 芯片作为 10M/100M 以太网 PHY 芯片,采用 RMII 接口与处理器 STM32F407 连接,对外采用标准 RJ45 接口,支持平行交叉网线自适应(Auto-MDIX)。 神舟王STM32F407开发板的处理器STM32F407ZGT内部集成有高性能以太网模块,支 持通过以太网收发数据,符合IEEE 802.3-2002标准。该以太网模块灵活可调,使之能适 应各种不同的客户需求。该模块支持两种标准接口,连接到外接的物理层(PHY)模块:IEEE 802.3协议定义的独立于介质的接口(MII)和简化的独立于介质的接口(RMII)。适用于各类 应用,如交换机、网络接口卡等。 内部集成的以太网模块符合以下标准: ● IEEE 802.3-2002标准的以太网MAC协议 ● IEEE 1588-2002的网路精确时钟同步标准 ● AMBA2.0标准的AHB主/从端口 ● RMII协会定义的RMII标准 神舟王STM32F407开发板的处理器内部集成的MAC结构图如图表 11 STM32F407内 部的MAC结构图所示。 第 36 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 11 STM32F407内部的MAC结构图 神舟王STM32F407开发板的处理器内部集成的MAC有以下特性: ● 通过外接的PHY接口,支持10/100M位/秒的数据传输速率。 ● 通过兼容IEEE 802.3标准的MII接口,外接高速以太网PHY。 ● 支持全双工和半双工操作: ─ 支持符合CSMA/CD协议的半双工操作 ─ 支持符合IEEE 802.3流控的全双工操作 ─ 在全双工模式下,可以选择性地转发接收到的PAUSE控制帧到用户的应用程序 ─ 支持背压流控的半双工操作 ─ 在全双工模式下当输入流控信号失效时,会自动发送PAUSE帧。 ● 在发送时插入前导符和帧开始数据(SFD),在接收时去掉这些域。 ● 以帧为单位,自动计算CRC和产生可控制的填充位。 ● 在接收帧时,自动去除填充位/CRC为可选项。 ● 可对帧长度进行编程,支持最长为16K字节的标准帧。 ● 可对帧间隙进行编程(40~96位,以8位为单位改变) ● 支持多种灵活的地址过滤模式: ─ 多达4个48位完美的目的地址(DA)过滤器,可在比较时屏蔽任意字节。 ─ 多达3个48位源地址(SA)比较器,可在比较时屏蔽任意字节。 ─ 64位Hash过滤器(可选的),用于多播和单播(目的)地址。 ─ 可选的令所有的多播地址帧通过 ─ 混杂模式,支持在做网络监测时不过滤,允许所有的帧直接通过。 ─ 允许所有接收到的数据包通过,并附带其通过每个过滤器的结果报告。 ● 对于发送和接收的数据包,返回独立的32位状态信息。 ● 支持检测接收到帧的IEEE 802.1Q VLAN标签。 ● 应用程序有独立的发送、接收和控制接口。 ● 支持使用RMON/MIB计数器(RFC2819/RFC2665)进行强制性的网络统计。 ● 使用MDIO接口对PHY进行配置和管理。 ● 检测LAN唤醒帧和AMD的Magic PacketTM帧。 ● 对IPv4和由以太网帧封装的TCP数据包的接收校验和卸载分流功能。 ● 对IPv4报头校验和以及对IPv4或IPv6数据格式封装的TCP、UDP或ICMP的校验和进行检 查的高级接收功能。 ● 支持由IEEE 1588-2002标准定义的以太网帧时间戳,在每个帧的接收或发送状态中加 上64位的时间戳。 ● 两套FIFO:一个2K字节的传输FIFO,带可编程的发送阈值,和一个2K字节的接收FIFO, 第 37 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 带可编程的接收阈值(默认值是64字节)。 ● 在接收FIFO的EOF后插入接收状态信息,使得多个帧可以存储在同一个接收FIFO中, 而不需要开辟另一个FIFO来储存这些帧的接收状态信息。 ● 可以滤掉接收到的错误帧,并在存储-转发模式下,不向应用程序转发错误的帧。 ● 可以转发“好”的短帧给应用程序。 ● 支持产生脉冲来统计在接收FIFO中丢失和破坏(由于溢出)的帧数目。 ● 对于MAC控制器的数据传输,支持存储-转发机制。 ● 根据接收FIFO的填充程度(阈值可编程),自动向MAC控制器产生PAUSE帧或背压信号。 ● 在发送时,如遇到冲突可以自动重发。 ● 在迟到冲突、冲突过多、顺延过多和欠载(underrun)情况下丢弃帧。 ● 软件控制清空发送FIFO。 ● 在存储-转发模式下,在要发送的帧内,计算并插入IPv4的报头校验和及TCP、UDP或 ICMP的校验和。 ● 支持MII接口的内循环,可用于调试。 ● DMA(直接内存访问)传输功能 ● 支持PTP功能(Precision Time Protocol (IEEE1588)) 神舟王STM32F407开发板的使用RMII接口与外部PHY芯片DP83848C连接的示意图 如下图图表 12 神舟王STM32使用RMII与外部PHY连接示意图所示。外部一个50M的有 源晶振为PHY芯片和STM32的MAC侧提供时钟。 图表 12 神舟王 STM32 使用 RMII 与外部 PHY 连接示意图 DP83848C 是国半 (National Semiconductor Corporation) 的低功耗 10/100M 以太网 PHY 芯片。支持平行交叉网线自适应(Auto-MDIX)、支持 RMII 版本 1.2 接口、串行管 理接口 (MDC 和 MDIO)支持 IEEE 802.3u、主动和冲突检测、3.3V 供电、48-引脚 LQFP 封装 (7mm) x (7mm)。 第 38 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 神舟王STM32F407开发板的以太网接口对外采用RJ45接口引脚信号定义如下表所示: Pin Name Description 1 TX+ Tranceive Data+ (发信号+) 2 TX- Tranceive Data- (发信号-) 3 RX+ Receive Data+ (收信号+) 4 n/c Not connected (空脚) 5 n/c Not connected (空脚) 6 RX- Receive Data- (收信号-) 7 n/c Not connected (空脚) 8 n/c Not connected (空脚) 图表 13 RJ45 接口引脚信号定义 RJ45对于网线的线序排序方法有两种,一种是橙白、橙、绿白、蓝、蓝白、绿、棕白、 棕;另一种是绿白、绿、橙白、蓝、蓝白、橙、棕白、棕;因此使用RJ45接头的线也有 两种即:平行线和交插线,如下图所示。神舟王开发板使用的DP83848C芯片支持平行线 网线和交叉网线自适应,所以无论哪种网线都可以连接到神舟王STM32F407开发板。 第 39 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 以上硬件配合我们提供的移植好的TCP/IP协议栈代码成功实现了HTTP内嵌网页和 TFTP文件传输等应用实例。协议同时支持DHCP协议,自动获取IP地址并在液晶屏上显示 出来。支持平行交叉网线自适应,一根网线就可以很方便的与路由器或PC连接,连接后 可以通过网络访问和控制板上的资源,从而实现以太网远程控制功能。 3) USB 2.0 OTG 全速接口 神舟王STM32F407开发板含有一个USB 2.0 OTG全速接口,接口速率12Mbps,它既 可 以 作 为 OTG 与 其 它 OTG 设 备 相 连 通 过 ID 信 号 协 商 主 从 角 色 ; 也 可 以 固 定 作 为 USB SLAVE从设备与PC等主设备相连实现USB读卡器,USB鼠标,USB固件升级等功能;还 可以固定作为USB HOST连接U盘,USB键鼠等从设备。当作为USB从设备设备时通过 D+、D-引脚上的1500Ω上拉电阻可向主机发出设备已连接的信号,并指示设备的工作 速度。电阻上拉至D+表示全速运行,电阻上拉至D-表示低速运行。当作为USB主设备 时内部D+和D-含有15kΩ下拉电阻用于检测上拉电阻的状态。 STM32F407 芯片还有一个 USB 2.0 OTG 高速 480M 接口,需要从底板的扩展接口 连接。 神舟王 STM32 开发板支持 USB 规范定义的四种传输类型:1、控制传输:适用于 突发性、非周期性的传输,常用于命令和状态的传输。 (非周期性传输 );2、同步传 输:适用于周期性、持续性的传输,常用于与时间相关的事件、信息的传送,并在传输 的数据中保存时间信息(周期性传输 );3、中断传输:适用于传输频率低、数据量小的 传输。 (周期性传输);4、大容量传输:适用于非周期性的、数据是大量并突发的传输 , 常用于那些需要占据大量带宽,但又容许时延的数据传输(非周期性传输 )。 OTG就是On The Go,正在进行中的意思。USB OTG使USB装置摆脱了原来主从 第 40 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 架构的限制,实现了端对端的传输模式。USB OTG标准在完全兼容USB2.0标准的基 础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设 操作(两用OTG)。OTG两用设备完全符合USB2.0标准,并可提供一定的主机检测能 力,支持主机通令协议(HNP)和对话请求协议(SRP)。在OTG中,初始主机设备 称为A设备,外设称为B设备。可用电缆的连接方式来决定初始角色。mini-AB插座增 添了ID引脚,以用于识别不同的电缆端点。mini-A插头中的ID引脚接地,mini-B插头 中的ID引脚浮空。当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主机), 而检测到ID引脚浮空的设备则认为是B设备(外设)。系统一旦连接后,OTG的角色 还可以更换。主机与外设采用新的HNP,A设备作为默认主机半提供VBUS电源,并在 检测到有设备连接时复位总线、枚举并配置B设备。OTG标准为USB增添的第二个新 协议称为对话请求协议(SRP)。SRP允许B设备请求A设备打开VBUS电源并启动一 次对话。一次OTG对话可通过A设备提供VBUS电源的时间来确定(注:A设备总是为 VBUS供电,即使作为外设)。也可通过A设备关闭VBUS电源来结束会话以节省功耗, 这在电池供电产品中是非常重要的。例如,在两台OTG设备通过连接互相交换信息时, 一台连接在mini-A端,是A设备,默认为主机。另一台是B设备,默认为外设。当在不 需要USB通信时,A设备可以关闭VBUS线,此时B设备就会检测到该状态并进入功低 耗模式。 MiniAB USB连接器的外形结构图和管脚线序如下图所示: MiniAB USB连接器的信号定义如下表所示 引脚 功能 颜色 备注 1 VBUS 红色 USB电源(4.4–5.25V): VCC、Power、5V、5VSB字样 2 D− 白色 USB数据线(负): DATA-、USBD-、PD-、USBDT- 3 D+ 绿色 USB数据线(正): DATA+、USBD+、PD+、USBDT+ 4 ID 用于协商主从角色 第 41 页 共 771 页 5 接地 表格 1 MiniAB USB 连接器信号定义 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 黑色 地线: GND、Ground 神舟王STM32F407开发板含有一个USB 2.0 OTG控制器接口特性如下: ● USB-IF认证,符合Universal Serial Bus Specification Revision2.0标准 ● 完 全 支 持 在 (OTG_FS 控 制 器 的 物 理 层 (PHY))USB On-The-Go Supplement , Revision1.3规范中定义为可选项目OTG协议。 ─ 对插入的A-B类设备的辨认(ID线) ─ 支持主机协商协议(HNP)和会话请求协议(SRP) ─ 在OTG应用中,允许主机关闭VBUS以节省耗电 ─ OTG控制器使用内部比较器监视VBUS电平 ─ 可以动态的切换主机/设备角色 ● 可以通过软件配置,完成以下设计: ─ 支持SRP协议的USB全速设备(B类设备) ─ 支持SRP协议的USB全速/低速主机(A类设备) ─ USB OTG全速双重角色设备 ● 支持全速通信的SOF信号和低速通信的保持有效信号 ─ SOF的脉冲可以输出到引脚 ─ SOF在内部连接到定时器2(TIM2) ─ 可配置的帧周期 ─ 可配置的帧结束中断 ● 提供省电功能:如在USB挂起时停止系统,关闭数字部分,PHY和DFIFO电源管 理部分的内部时钟系统。 ● 提供1.25K字节的专用RAM和高级的FIFO管理 ─ 通过软件为不同的FIFO配置不同的RAM区域,以便灵活有效的使用RAM ─ 每个FIFO可以存储多个数据包 ─ 允许动态的分配存储区 ─ 不限定FIFO的长度一定是2的幂次,以便可以连续的使用存储区 ● 不需要系统的介入就可以保证一个帧(1ms)的最大数据流量。 4) 4.3/3.2 TFT LCD 触摸屏接口 神舟王STM32开发板含一个目前比较通用的LCD液晶触摸屏接口,一个32/36芯LCD 接口引出了LCD控制器和触摸屏的全部信号,它的线序兼容市面上在售的主流触摸屏模 块,比如ARMJISHU.COM推出的液晶模块。 320 X 240的显示分辨率64万色可以逼真的显示图片、文字和菜单等,配合触摸功能 实现灵活的控制,我们提供已经调试成功的LCD液晶屏和触摸屏的示例代码。 5) SRAM 神舟王开发板的处理器是STM32F407ZGT6内部含有128K字节的SRAM,同时板载有 512K字节或者1024字节的外部SRAM芯片。 SRAM是Static Random Access Memory的缩写,中文为静态随机访问存储器,它是一 种类型的半导体存储器。“静态”是指只要不掉电,存储在SRAM中的数据就不会丢失。 第 42 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 神舟王STM32开发板通过FSMC总线扩展了8M比特或4M比特容量的SRAM,可用于 系统或程序运行过程中的临时数据的存取,即作为RAM使用。 6) NOR FLASH NOR FLASH的特点是芯片内执行,这样应用程序可以直接在flash闪存内运行,不必 再把代码读到系统RAM中。另外,NOR FLASH的传输效率很高,在1~4MB的小容量时 具有很高的成本效益。 神舟王STM32开发板通过FSMC总线扩展了16M/128M比特容量的Nor Flash,可用于 保存应用程序或操作系统及一些重要数据。 7) NAND FLASH Nand Flash和NorFlash都是Flash的一种,都是闪存,但是Nand Flash一般比较大,而 Nor Flash比较小,并且NorFlash比较贵,并且Nor Flash写的速度比较慢,但读的速度比较 快,而Nand Flash读的速度比较慢,写的速度比较快。Nand Flash一般是用来存储数据, 而Nor Flash是用来执行程序。 神舟王STM32开发板通过FSMC总线扩展了1个2G比特的Nand Flash, 可用于图片及 其他数据的保存。 8) SPI DATA FLASH SPI Flash存储器它具有掉电数据不丢失、快速数据存取速度、电可擦除、容量大、在 线可编程、价格低廉以及足够多的擦写次数(一百万次)和较高的可靠性等诸多优点,在 嵌入式应用得到广泛引用。 神舟王STM32开发板通过SPI总线连接了一个16Mbit的SPI FLASH芯片W25X16或者 新一代的芯片W25Q16,该芯片的容量和AT45DB161是一样的,非常适合我们存储一些不 常修改的数据,例如存放静态网页、示例歌曲或汉字字库等功能。 9) MP3 解码芯片 VS1003 音频播放电路 神舟王 STM32 开发板具有音频播放功能,使用专业的 MP3 解码芯片 VS1003,可以 将保存在 NAND FLASH 或者 SD 卡中的音频文件通过 SPI 接口传送到 VS1003 解码后播 放出来,可以直接驱动耳机,也可以通过板载咪头或者外置麦克风实现录音功能,板载 有音频运放和音频功放,可以驱动纸盆喇叭。 第 43 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 VS1003 芯片能解码 MPEG1 和 MPEG2 音频层 III(CBR+VBR+ABR);以及 WMA 4.0/4.1/7/8/9 5-384kbps 所有流文件;WAV(PCM+IMA AD-PCM);产生 MIDI/SP-MIDI 文件。 还可以对话筒输入或线路输入的音频信号进行 IMA ADPCM 编码。 10) 两颗音频功放芯片 神舟王STM32开发板板载有一个2.4W的立体声音频功放芯片CM2038B(2.4W Audio Amplifier Stereo)可以驱动8Ω或4Ω的喇叭、音响或耳机,在开发板上连接到VS1003的输 出。同时神舟王STM32开发板板载有另一颗音频功放芯片LM386,可以通过跳线选择连 接到VS1003或者STM32的DAC输出。 11) SD 卡接口电路(SDIO 模式) SD卡以其高性价比成为最常见的存储设备,是很多数码设备的存储媒介,比如数码 相框、数码相机、MP5等。神舟王STM32开发板自带了SD卡接口,可以用于SD卡实验, 方便大家学习SD卡,TF卡通过转接座也可以很方便的接到我们的开发板上。 SD支持两种接口访问方式SDIO和SPI,通过SDIO接口的访问SD卡速度是SPI的几倍 甚至十几倍,神舟王STM32开发板就是使用高速的SDIO接口的访问SD卡的。 有了它,我们的开发板就相当于拥有了一个大容量的外部存储器,不单可以用来提 供数据,也可以用来存储数据,使得我们的板子可以完成更多的功能。 SD卡+板载音频电路+触摸屏就可以打造出属于自己的MP3,开发学习过程充满乐趣。 12) I2C EEPROM IIC EEPROM常用于掉电数据保存,和配置数据储存等场合,神舟王STM32开发板板 载有一颗24C02芯片,用于存储重要数据,也可以用来做IIC实验及实现其他应用。 13) 2.4G 无线通信模块接口 神舟王STM32开发板提供两个2.4G无线模块接口,可以连接两个NRF24L01+模块, 板载的两个2.4G无线模块之间可以完成无线通信实验。本模块作为可选配件。模块外观 图和光绘图如下: 第 44 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 NRF24L01+模块2.4Ghz 全球开放ISM 频段免许可证使用,最高工作速率2Mbps,最 低工作速率250K ,高效GFSK调制,抗干扰能力强,特别适合工业控制场合, 126 频道, 满足多点通信和跳频通信需要,内置硬件CRC 检错和点对多点通信地址控制,还有低功 耗等诸多优点。带您加入无线数传的世界。 14) 315M 无线通信模块接口 神舟王STM32开发板板载315M无线模块接口,可通过遥控控制进行远程无线控制, 相关产品和模块如下所示。 15) CAN 总线接口 CAN是控制器局域网络(Controller Area Network, CAN)的简称,是ISO国际标准化的 串行通信协议,是国际上应用最广泛的现场总线之一。它的高性能和可靠性和良好的错 误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强 和振动大的工业环境。CAN总线当今自动化领域技术发展的热点之一,被誉为自动化领域 的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提 供了强有力的技术支持。 神舟王STM32开发板提供CAN总线接口,采用MCP2551或者VP230物理接口芯片。 16) RS-485 接口 神舟王STM32开发板提供一组485接口,采用SP3485接口芯片实现。RS-485采用平衡 发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检 测低至200mV的电压,故传输信号能在千米以外得到恢复。 RS-485采用半双工工作方式, 任何时候只能有一点处于发送状态,因此,发送电路须由使能信号加以控制。RS-485用 于多点互连时非常方便,可以省掉许多信号线,其最大传输距离约为1219米,最大传输 速率为10Mbps。 17) RS-232C 串口 神舟王STM32开发板提供两个3线串口。由STM32F407ZGT6的USART1和USART2通 过MAX3232转换成232电平的串口,接口方式为DB9公头,实现了两个3线串口。DB9公 第 45 页 共 771 页 头的管脚定义如下: ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 18) 双路示波器接口 神舟王STM32开发板板载双路示波器接口,标准的BNC接口,配有高性能运算放大 器电路对信号做放大衰减调理后送给STM32的AD接口做模数转换后通过LCD输出波形。 STM32的AD接口是一个12位ADC是一种逐次逼近型模拟数字转换器,转换速率达到1M 次每秒(rate up to Msamples/s),支持DMA传输模式。 19) 电压表接口 神舟王STM32开发板板载一个电压表接口,可连接通用的万用表表笔来测量电压。 20) 蜂鸣器 神舟王STM32开发板板载一个无源蜂鸣器。一般用于产品告警或声音提醒。 21) 收音机和音频运放 采用主流的收音机模块,TEA5767实现收音机功能,通过这个模块,可了解收音机 的基本原理与TEA5767芯片的配置与访问;同时收音机模块输出的音频信号通过飞利浦 的TDA1308耳机驱动器进行放大后连接到音频插座。 22) PS/2 鼠标键盘接口 神舟王STM32开发板板载一个PS/2鼠标键盘接口,可以连接PC电脑上通用常见的 PS/2鼠标或键盘。PS/2鼠标或键盘通用性强,性价比高,配合产品就不需要再设计键盘以 节约成本。 23) DS18B20 温度传感器 神舟王STM32开发板板载一个DS18B20温度传感器接口。DS18B20独特的单线接口, 只需1个接口引脚即可通信,测量范围从-55℃至+125℃,9位或12位数字值方式读出温度 值,多点(multidrop)能力使分布式温度检测应用得以简化。 24) IR 红外线接收和发射电路 神舟王STM32开发板板载一个IR红外线接收和发射,使用我们提供的代码,IR红外 线接收器可以接收来自遥控器的按键指令;IR红外线发射电路可以模拟家电的遥控直线 家电的控制;IR红外线接收和发射对还可以实现红外数据传输信息。 25) 复位按钮 该按钮是神舟王STM32开发板整板硬件复位按钮,当按键按下时,STM32处理器, 第 46 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 液晶,以太网,以及音频解码芯片都将复位。 26) 通用按键 神舟王STM32开发板除了前面提到的复位按键这一特殊功能按键外,还提供四个按 键,其中两个按键分别为WAKEUP唤醒按键,以及TAMPER按键,另两个为用户可自定 义功能的通用按键USER1和USER2。(说明:这四个按键,可依据实际产品,定义成产品 的功能按键,包括WAKEUP按键与TAMPER按键)。 27) 指示灯 神舟王STM32开发板提供了1个电源指示灯和4路通用LED指示灯。电源指示灯指示 3.3V电源是否正常。4路通用LED指示灯可以用于指示STM32开发板的状态。 28) 启动模式选择 STM32F4xx处理器一共有三种启动模式,可以通过这两组跳线进行选择,具体的跳 帽设置与启动模式选择关系如下表: BOOT1(J18) BOOT0(J19) 功能 ANY 2-3 User(默认模式) 2-3 1-2 System 1-2 1-2 SRAM 表格 2 启动模式选择列表 29) RTC 实时时钟 神舟王STM32开发板内置RTC实时时钟,我们提供支持年月日时分秒星期的例程。 30) 可调电阻 神舟王STM32开发板提供了一路可调电阻作为模拟信号输入,通过这一路可调电阻 可以学习STM32处理器的AD功能。 31) JTAG/SWD 仿真调试 神舟王STM32开发板提供标准的20针JTAG接口,可以直接和ULINK或者JLINK等主 流仿真器连接,同时支持两线SWD接口。可以用于调试STM32,更方便的开发软件。 32) DC5V 电源接口 神舟王STM32开发板提供5V直流电源输入接口,DC电源座符合常见电源适配器接口 标准,DC电源座的里面为电源正极,外面为电源负极 33) 电源选择开关 通过电源选择开关可以控制3.3V供电,实现电源的通断,还可以选择由USB提供5V 电源供电或外部电源输入5V电源。 第 47 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 34) 灵活的供电途径 神舟王STM32开发板支持4种供电方式:1、DC5V提供5V;2、USB提供5V;3、JLINK 提供5V;4、JLINK提供3.3V。 35) 电源芯片 神舟王STM32开发板板上使用3.3V电源,所以我们需要将USB的5V或DC电源座的 5V或者Jlink提供的5V电压转换为3.3V。为了保证核心板有更“干净”的电源供给,神舟 王STM32开发板的核心板3.3V转换芯片与底板3.3V转换芯片独立,即神舟王STM32开发 板上有两颗5V转3.3V的转换芯片,分别为核心板和底板提供3.3V电源。 36) 扩展接口 神舟王STM32开发板将除晶振占用的IO管脚外的所有GPIO的使用标准双排插针引 出,方便大家的实验和测试,调试其他模块或功能扩展。 第 48 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2 神舟王STM32开发板硬件详解 本节将向大家详细介绍神舟王STM32开发板的各部分硬件原理与实现。 1.2.1 MCU处理器 STM32F407ZGT 的产品列表如下图所示,作为一款最高端开发板,神舟王开发板选 用的是外设资源和管脚资源最丰富的 144 脚 LQFP 封装的 STM32F407ZGT6 芯片,该芯 片充分满足企业和广大爱好者的评估开发需求。 图表 14 STM32F407 的产品列表 MCU部分原理图如下图所示: 第 49 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 15 神舟王 STM32F407ZGT 开发板 MCU 部分原理图 1) 启动模式 上图中的BOOT0, BOOT1用于设置STM32的启动方式,其对应启动模式如下表所示: 启动模式选择引脚 BOOT1 BOOT0 启动模式 说明 X 0 主闪存存储器 主闪存存储器,也就是内部 FLASH 被选为 启动区域,一般使用此模式。 0 1 1 1 表格 3 BOOT 启动模式 系统存储器 内置 SRAM 系统存储器被选为启动区域,运行出厂自 举固件升级程序,用于串口下载固件; 内置 SRAM 被选为启动区域,用于在 SRAM 中调试代码。 ● 从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000),但仍然能 够在它原有的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访问, 0x0000 0000或0x0800 0000。 ● 从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),但仍然能够在 它原有的地址访问它,神舟王STM32F407ZGT原有地址为0x1FFF0000 - 0x1FFF77FF。 ● 从内置SRAM启动:只能在0x2000 0000开始的地址区访问SRAM。 ● 通过软件修改寄存器可以将FSMC的地址段映射到启动空间(0x0000 0000)。 如果内部Flash已经烧录了程序,一般正常运行时选择从主闪存存储器启动。 如果要升级固件可以有多种方式,常见的有通过工具烧录和外设接口烧录两种方式。 常用的烧录调试仿真工具如JLINK、STLink、Ulink等。通过修改启动模式为从系统存储 器 启 动 , 神 舟 王 STM32F407ZGT 的 外 设 接 口 烧 录 可 以 通 过 USART1(PA9/PA10) 接 口 、 USART3(PB10/11 and PC10/11)、CAN2(PB5/13)、USB OTG FS(PA11/12) in Device mode (DFU: device firmware upgrade)启用固件更新程序。系统启动依靠内部16MHz振荡器 (HSI)。 第 50 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 16 BOOT 启动模式电路 2) 滤波电容 为STM32F407ZGT6及神舟王核心板上其他芯片提供必要的储能电容,滤波和退耦。其 中10uF电容起到储能和滤除低频干扰或杂波的作用,0.1uF电容起到滤除高频干扰或杂波 的作用。为整个系统提供一个干净的电源,保证整个系统的稳定可靠运行。 图表 17 电源滤波电路 3) 模拟电源 VDDA与VREF是STM32处理器数字/模拟转换(ADC)电路需要使用到的模拟参考电源和 模拟电源输入。 相关管脚定义如下: 第 51 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 在STM32F407ZGT6及神舟王核心板上,VREF和VDDA电源相关电路如下图所示,为保证 其稳定性需要隔离并增加独立的滤波储能电容。 图表 18 电源转换电路 4) 晶振电路 STM32F407ZGT6内部已经包含了16MHz高速内部RC振荡电路,但是其精准度不是很高, 为此我们在外部增加了25MHz的晶振电路,为系统的可靠工作提供时序基准。 STM32F407ZGT6内部已经包含了32kHz左右低速内部RC振荡电路LSE,但是其精准度不 是很高,为此我们在外部增加了32.768KHz的晶振电路,可以用于驱动独立看门狗和通过 程序选择驱动RTC实时时钟。 图表 19 晶振电路 5) 实时时钟 第 52 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 STM32的VBAT采用CR1220纽扣电池和VCC3.3混合供电的方式,在有外部电源(VCC3.3) 的时候,BT1不给处理器的VBAT供电,而在外部电源断开的时候,则由BT1给VBAT供电。 这样,VBAT总是有电的,以保证RTC的持续运行以及后备寄存器的内容不丢失。 相关电 路如下: 图表 20 RTC 实时时钟及备份区供电原理图 当安装了电池后,如果系统3.3V电源存在,由于电池电压低于3.3V,所以双二极管的 2脚和3脚导通,VBAT管脚间接由系统3.3V电源供电,以延长电池使用寿命。如果系统3.3V 电源掉电,所以双二极管的1脚和3脚导通,VBAT管脚间接由电池供电。 1.2.2 JTAG/SWD调试下载接口 JTAG(Joint Test Action Group)联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容)。标准的JTAG接口包括TMS、TCK、TDI和TDO等信号。通过JTAG接口, 我们可以烧录和调试程序,神舟王STM32开发板在核心板上对JTAG接口信号做了必要的 上拉或下拉,在底板上将信号连接到接口连接器。其中根据STM32数据手册,神舟王 STM32开发板核心板上上拉或下拉的硬件连接如下图: 注意:由于JTAG的部分信号被复用作SPI接口信号,为了保证SPI实验不受影响,默认核 心板上R1、R2和R5不安装,所以默认只能使用SWD接口调试与下载。如果要使用JTAG 第 53 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 调试接口,请用户自行焊接R1、R2和R5电阻,并评估对使用这些管脚的SPI实验的影响 以及SPI芯片对JTAG信号的影响。 JTAG/SWD接口的信号定义如下: 神舟王STM32开发板在底板上的JTAG接口的硬件连接如下图所示,同时还有一个四 线的SWD连接座(默认不安装),可以与目前主流的JLINK V8仿真器配合使用。STM32 同时还支持SWD调试接口,SWD只需要最少2跟线(SWCLK和SWDIO)就可以下载并调 试代码了,它与JTAG接口是共用的,只要接上JTAG,你就可以使用SWD模式了。 图表 21 神舟王 JTAG/SWD 调试下载接口原理图 第 54 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.3 10M/100M以太网接口 神舟王 STM32F407 开发板采用国半(National Semiconductor Corporation)低功耗和 高性能的 DP83848C 芯片作为 10M/100M 以太网 PHY 芯片,采用 RMII 接口与处理器 STM32F407 连接,对外采用标准 RJ45 接口,支持平行交叉网线自适应(Auto-MDIX)。 神舟王STM32F407开发板的处理器STM32F407ZGT内部集成有高性能以太网模块,支 持通过以太网收发数据,符合IEEE 802.3-2002标准。该以太网模块灵活可调,使之能适 应各种不同的客户需求。该模块支持两种标准接口,连接到外接的物理层(PHY)模块:IEEE 802.3协议定义的独立于介质的接口(MII)和简化的独立于介质的接口(RMII)。适用于各类 应用,如交换机、网络接口卡等。 神舟王 STM32F407 开发板核心开发板的处理器 STM32F407ZGT6 的 RMII 总线与 DP83848C 以太网 PHY 芯片的连接图如下所示: 图表 22 核心板以太网接口原理图 神舟王 STM32 开发板的 10M/100M 以太网采用带变压器的 RJ45 接口,位于底板上, 其原理图如所示。 第 55 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 23 底板以太网接口原理图 RJ45接口引脚信号定义如下表所示: Pin Name Description 1 TX+ Tranceive Data+ (发信号+) 2 TX- Tranceive Data- (发信号-) 3 RX+ Receive Data+ (收信号+) 4 n/c Not connected (空脚) 5 n/c Not connected (空脚) 6 RX- Receive Data- (收信号-) 7 n/c Not connected (空脚) 8 n/c Not connected (空脚) 图表 24 RJ45 接口引脚信号定义 RJ45对于网线的线序排序不同的法有两种,一种是橙白、橙、绿白、蓝、蓝白、绿、 棕白、棕;另一种是绿白、绿、橙白、蓝、蓝白、橙、棕白、棕;因此使用RJ45接头的 线也有两种即:平行线(直通线)和交插线,如下图所示。神舟王开发板使用的DM9000A 以太网芯片支持平行线和交叉网线自适应,所以无论哪种网线都可以连接到神王开发板。 第 56 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 以上硬件配合我们提供的移植好的TCP/IP协议栈代码成功实现了TFTP文件传输和内 嵌网页HTTP等应用实例。协议同时支持DHCP协议,自动获取IP地址并在液晶屏上显示 出来。支持平行交叉网线自适应,一根网线就可以很方便的与路由器或PC连接,连接后 可以通过网络访问和控制板上的资源,从而实现以太网远程控制功能。 第 57 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.4 USB 2.0 OTG电路 神舟王STM32F407开发板含有一个USB 2.0 OTG全速接口,接口速率12Mbps,它既 可 以 作 为 OTG 与 其 它 OTG 设 备 相 连 通 过 ID 信 号 协 商 主 从 角 色 ; 也 可 以 固 定 作 为 USB SLAVE从设备与PC等主设备相连实现USB读卡器,USB鼠标,USB固件升级等功能;还 可以固定作为USB HOST连接U盘,USB键鼠等从设备。当作为USB从设备设备时通过 D+、D-引脚上的1500Ω上拉电阻可向主机发出设备已连接的信号,并指示设备的工作 速度。电阻上拉至D+表示全速运行,电阻上拉至D-表示低速运行。当作为USB主设备 时内部D+和D-含有15kΩ下拉电阻用于检测上拉电阻的状态。 神舟王STM32开发板的OTG全速接口作为设备接口时支持USB规范定义的四种传输 类型:1、控制传输:适用于突发性、非周期性的传输,常用于命令和状态的传输。 (非 周期性传输 );2、同步传输:适用于周期性、持续性的传输,常用于与时间相关的事件、 信息的传送,并在传输的数据中保存时间信息(周期性传输 );3、中断传输:适用于传输 频率低、数据量小的传输。 (周期性传输);4、大容量传输:适用于非周期性的、数据是 大量并突发的传输 ,常用于那些需要占据大量带宽,但又容许时延的数据传输(非周期性 传输 )。 OTG就是On The Go,正在进行中的意思。USB OTG使USB装置摆脱了原来主从 架构的限制,实现了端对端的传输模式。USB OTG标准在完全兼容USB2.0标准的基 础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设 操作(两用OTG)。OTG两用设备完全符合USB2.0标准,并可提供一定的主机检测能 力,支持主机通令协议(HNP)和对话请求协议(SRP)。在OTG中,初始主机设备 称为A设备,外设称为B设备。可用电缆的连接方式来决定初始角色。mini-AB插座增 添了ID引脚,以用于识别不同的电缆端点。mini-A插头中的ID引脚接地,mini-B插头 中的ID引脚浮空。当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主机), 而检测到ID引脚浮空的设备则认为是B设备(外设)。系统一旦连接后,OTG的角色 还可以更换。主机与外设采用新的HNP,A设备作为默认主机半提供VBUS电源,并在 检测到有设备连接时复位总线、枚举并配置B设备。OTG标准为USB增添的第二个新 协议称为对话请求协议(SRP)。SRP允许B设备请求A设备打开VBUS电源并启动一 次对话。一次OTG对话可通过A设备提供VBUS电源的时间来确定(注:A设备总是为 VBUS供电,即使作为外设)。也可通过A设备关闭VBUS电源来结束会话以节省功耗, 这在电池供电产品中是非常重要的。例如,在两台OTG设备通过连接互相交换信息时, 一台连接在mini-A端,是A设备,默认为主机。另一台是B设备,默认为外设。当在不 需要USB通信时,A设备可以关闭VBUS线,此时B设备就会检测到该状态并进入功低 耗模式。 第 58 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 MiniAB USB连接器的外形结构图和管脚线序如下图所示: MiniAB USB连接器的信号定义如下表所示 引脚 功能 颜色 备注 1 VBUS 红色 USB电源(4.4–5.25V): VCC、Power、5V、5VSB字样 2 D− 白色 USB数据线(负): DATA-、USBD-、PD-、USBDT- 3 D+ 绿色 USB数据线(正): DATA+、USBD+、PD+、USBDT+ 4 ID 用于协商主从角色 5 接地 黑色 地线: GND、Ground 表格 4 MiniAB USB 连接器信号定义 神舟王407号开发板含有一个USB 2.0 OTG控制器接口特性如下: ● 由USB-IF认证,符合Universal Serial Bus Specification, Revision2.0 标准 ● 完 全 支 持 在 (OTG_FS 控 制 器 的 物 理 层 (PHY))USB On-The-Go Supplement , Revision1.3规范中定义为可选项目OTG协议。 ─ 对插入的A-B类设备的辨认(ID线) ─ 支持主机协商协议(HNP)和会话请求协议(SRP) ─ 在OTG应用中,允许主机关闭VBUS以节省耗电 ─ OTG控制器使用内部比较器监视VBUS电平 ─ 可以动态的切换主机/设备角色 ● 可以通过软件配置,完成以下设计: ─ 支持SRP协议的USB全速设备(B类设备) ─ 支持SRP协议的USB全速/低速主机(A类设备) ─ USB OTG全速双重角色设备 ● 支持全速通信的SOF信号和低速通信的保持有效信号 ─ SOF的脉冲可以输出到引脚 ─ SOF在内部连接到定时器2(TIM2) 第 59 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 ─ 可配置的帧周期 ─ 可配置的帧结束中断 ● 提供省电功能:如在USB挂起时停止系统,关闭数字部分,PHY和DFIFO电源管 理部分的内部时钟系统。 ● 提供1.25K字节的专用RAM和高级的FIFO管理 ─ 通过软件为不同的FIFO配置不同的RAM区域,以便灵活有效的使用RAM ─ 每个FIFO可以存储多个数据包 ─ 允许动态的分配存储区 ─ 不限定FIFO的长度一定是2的幂次,以便可以连续的使用存储区 ● 不需要系统的介入就可以保证一个帧(1ms)的最大数据流量。 神舟王407号开发板的USB 2.0 OTG接口的原理图如下图所示,支持从USB接口取电 或通过PB8控制对USB设备供电。 图表 25 USB OTG 电路接口原理图 第 60 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.4 触摸TFT彩屏接口 神舟王STM32开发板载有3.2寸/4.3寸带触摸液晶显示模块,通过FPC软排线将核心板 的相关信号与底板相连,支持触摸,其原理图如下: 图表 26 触摸 TFT 彩屏接口原理图 神舟王STM32开发板通过FSMC总线对屏进行访问操作,实现图形界面的显示。神舟 系列3.2/4.3寸LCD支持触摸功能,LCD模块有触摸芯片,将电阻式触摸屏的模拟信号转化 为数字信号,处理器通过SPI接口读取芯片转换后的数字,支持查询方式和中断方式。 第 61 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.5 VS1003 MP3音频编解码+放大+录音电路 神舟王 STM32 开发板具有音频播放功能,使用专业的 MP3 解码芯片 VS1003,可以 将保存在 NAND FLASH 或者 SD 卡中的音频文件通过 SPI 接口传送到 VS1003 解码后播 放出来,可以直接驱动耳机,也可以通过板载咪头或者外置麦克风实现录音功能,板载 有音频运放和音频功放,可以驱动纸盆喇叭。 VS1003 芯片能解码 MPEG1 和 MPEG2 音频层 III(CBR+VBR+ABR);以及 WMA 4.0/4.1/7/8/9 5-384kbps 所有流文件;WAV(PCM+IMA AD-PCM);产生 MIDI/SP-MIDI 文件。 还可以对话筒输入或线路输入的音频信号进行 IMA ADPCM 编码。 神舟王 STM32 开发板 VS1003 部分电路如下图所示: 图表 27 VS1003 音频编解码电路原理图 神舟王 STM32 底板板载有咪头,可以实现录音功能,也可以通过麦克风接口使用外 置麦克风达到更好的效果。 神舟王 STM32 开发板 VS1003 可以直接驱动耳机,为了体验外放效果,我们在底板 上提供了两套功放电路供用户参考 第 62 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 28 音频功放方案一电路原理图 图表 29 音频功放方案一电路原理图 第 63 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.6 Nor Flash 神舟王STM32核心板板载有16M比特的Nor Flash, 最大支持128M比特容量Nor Flash。 下图为16M/128M Nor Flash兼容的连接原理图,STM32F407ZGT通过FSMC总线访问Nor Flash。Nor Flash可以作为程序存储器ROM使用,这种情况可以认为是内部FLASH的扩展。 也可以原来存储用户数据。 图表 30 NOR FLASH 接口原理图 第 64 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.7 NAND Flash 神舟王STM32核心板板载有1G比特的Nand Flash,下图为Nand Flash部分的原理图, STM32F407ZGT通过FSMC总线访问Nand Flash,最大支持32G比特容量NAND Flash。NAND Flash可以作为用户数据存储器使用。 图表 31 NAND FLASH 接口原理图 第 65 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.8 SRAM 神舟王STM32核心板板载有4M比特的SRAM, ISSI的IS61LV25616是一个8M容量,结构为 256K*16位字长的高速率SRAM,下图为SRAM部分的原理图,STM32F407ZGT通过FSMC总线访 问SRAM,最大支持8M比特容量SRAM。Nor Flash可以作为随机数据存储器RAM使用,这种 情况可以认为是内部SRAM的扩展。也可以在SRAM中运行程序。 图表 32 SRAM 接口原理图 第 66 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.9 SD卡SDIO接口 神舟王STM32底板板载有标准的SD卡接口,采用STM32的高速SDIO接口访问SD卡,有 了这个接口,我们就可以外扩大容量存储设备,可以用来记录数据。其原理图如下: 图表 33 SD 卡接口原理图 SD卡可通过SPI接口或者SDIO接口来通信,其中SDIO模式通信速率更高,在这里我们 即是使用的SDIO模式进行通信。 1.2.10 315M无线模块接口 神舟王STM32底板板载了2款无线模块的接口,分别是315M无线模块和2.4G无线模块 NRF24L01+。其中315M无线模块,可以接受遥控器的信号,当遥控的一个按键按下时,对 应的无线模块的D0~3管脚变为有效。需要指出的是,无线模块当输出为高电平有效。而 神舟王STM32开发板通过三极管将315M无线模块与板上的按键进行了资源复用。 当无线模块的VT脚有效(低电平)时,表示无线模块接收到遥控的按键信号;当VT 管脚无效(高电平)时,表示无线模块没有接收到遥控的按键信号,与无线模块连接的 几个管脚的电平变化是按键引起的。 第 67 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 34 315M 无线接口原理图 1.2.11 两块2.4G无线模块接口 神舟王STM32底板板载两个个无线模块为2.4G数传模块NRF24L01+(或 NRF24L01) 模块,NRF24L01+模块的最大通信速率为2Mbps。NRF24L01+无线模块通过SPI与 STM32F407ZGT6相连,其接口原理图如下所示。两块2.4G数传模块之间可以无线通信。 图表 35 2.4G 无线模块 1 接口原理图 图表 36 2.4G 无线模块 2 接口原理图 第 68 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.12 CAN总线接口 神舟王 STM32 底板板载了 CAN 总线接口,支持 CAN 协议 2.0A 和 2.0B,板上兼容 5V 电压的 CAN 物理层接口芯片和 3.3V 电压 CAN 物理层接口芯片来实现 CAN。原理图如下图 所示: 图表 37 CAN 总线接口原理图 1.2.13 RS232C串口 神舟王STM32底板载了2个串口,串口1和串口2,位置分别如下图所示。 串口 1(默认串口) 串口 2 使用串口1时需要将跳线J22和J23跳到1ÅÆ2选择支持RS-232接口。 串口2可通过跳线选择支持RS-232接口或RS-485接口,跳线定义如下: J20 J21 串口2功能选择 1-2 1-2 串口2 RS-485接口 2-3 2-3 串口2 RS-232接口 第 69 页 共 771 页 串口1和串口2的原理图如下图所示: ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 38 RS232C 串口原理图 1.2.14 485总线接口 神舟王STM32底板板载有RS485物理芯片,它与处理器的UART2连接,与串口2复用, 可通过跳线选择支持RS-232接口或RS-485接口,跳线定义如下: J20 J21 串口2功能选择 1-2 1-2 串口2 RS-485接口 2-3 2-3 串口2 RS-232接口 RS485的原理图如下图所示: 图表 39 RS-485 原理图 神舟王STM32开发板默认是安装了RS-485接口的120欧终端匹配电阻。对应上图的 R25,请依据实际应用选择是否安装此匹配电阻。 第 70 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.15 SPI FLASH 神舟王STM32开发板载有SPI FLASH芯片W25X16或者W25Q16,该芯片的容量为2M 字节(16MBit),与AT45DB161属于同一级别,其原理图如下: 注意由于神舟王STM32开发板上W25X16(或者W25Q16)和VS1003卡公用了SPI,通 过不同的CS进行区分,请勿同时使用使能这两个接口的CS,引起芯片读写访问失败。 图表 40 SPI FLASH 电路原理图 1.2.16 I2C EEPROM 神舟王STM32开发板自带了24C02的EEPROM芯片,该芯片的容量为2Kbit,也就是256 个字节,对于我们普通应用来说是足够了的。你也可以选择换大的芯片,因为在原理上 是兼容24C02~24C512全系列的EEPROM芯片的。其原理图如下: 图表 41 EEPROM 原理图 这里我们把A0~A2均接地,对24C02来说也就是把地址位设置成0了,写程序的时候 要注意这点。 第 71 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.17 蜂鸣器电路 神舟王STM32开发板载有蜂鸣器,与315M的无线模块VT脚复用,当315M的无线遥控 的任意按键按下时蜂鸣器鸣响;器鸣器连接到了处理器的PF6管脚,也可以由处理器控制 其鸣响,当处理器的PF6管脚输出低电平时蜂鸣器开始鸣响,反之处理器的PF6管脚输出 高电平或OD开漏时蜂鸣器停止鸣响,其原理图如下: 图表 42 蜂鸣器电路 1.2.18 复位电路 神舟王STM32开发板使用RC加按键来实现手动复位和上电复位。STM32芯片内部已 经集成有上电复位和电压检测复位电路,所以外部的复位主要是实现手动复位功能,其 原理图如下。 图表 43 复位电路 第 72 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.19 LED指示灯 神舟王 STM32 开发板核心板上有一个 3.3V 电源指示灯,如下图所示: 神舟王 STM32 开发板底板上总共有 5 个 LED 指示灯,其中 1 个是 3.3V 电源指示灯, 其它 4 个是用户 LED 指示灯。用户 LED 指示灯由 GPIO 管脚控制 LED 灯的亮灭,当 GPIO 管脚输出低电平时,LED 指示灯亮。反之,当 GPIO 管脚输出高电平时,LED 指示灯灭。 这四个LED指示灯分别由PF7、PF8、PF9和PF10控制。 图表 44 LED 指示灯电路 第 73 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.20 按键输入 神舟王STM32开发板总共有4个功能按键,分别是WAKEUP按键和TAMPER按键及两个用 于自定义功能按键,在不使用第二功能的情况下,这四个按键都可以作为通用的按键, 由用户自定义其功能。这四个按键分别与PA0、PA1、PC3和PC13四个GPIO管脚连接,当 按键按下时,对应的GPIO管脚为低电平,反之,当没有按键按下时,对应的GPIO管脚为 高电平。其中PA0 (STM32的WKUP引脚)可以作为WK_UP功能,它除了可以用作普通输 入按键外,还可以用作STM32的唤醒输入。PC13可以实现备份区寄存器的入侵功能。 图表 45 按键输入电路 1.2.21 RTC实时时钟电路 神舟王STM32开发板的STM32处理器内部带有RTC实时时钟,使用我们的代码可以实 现年月日时分秒及星期等计算与输出功能。 内部的RTC实时时钟在系统正常运行时使用系统的3.3V电源,而在系统断电时则电池 供电保证时间信息持续不丢失。其供电VBAT采用CR1220纽扣电池,相关电路如下: 图表 46 RTC 实时时钟电路 第 74 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.22 电位器AD电路 神舟王STM32开发板载有电位器可以实现AD模数转换实现。其原理图如下: 图表 47 电位器 AD 电路 1.2.23 双通道示波器接口电路 神舟王STM32开发板载有两路示波器接口电路,通过将外部模拟信号放大后送给内 部AD做模数转换实现。其原理图如下: 图表 48 双通道示波器接口电路 第 75 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.24 电压表位器AD电路 神舟王STM32开发板载有电压表表笔接口电路,通过将外部模拟信号放大后送给内 部AD做模数转换实现,与示波器通道二共用放大电路。其原理图如下: 图表 49 电压表电路 1.2.25 DA转换和PWM接口 神舟王STM32开发板将处理器的两组DA管脚和PWM连接到了接线端子上方便用户 使用。其原理图如下: 第 76 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.26 USB HOST模块接口电路 神舟王STM32开发板支持外接USB HOST模块(选配),其原理图如下: 图表 50 USB HOST 模块接口电路 1.2.27 板载FM收音机及音频放大电路 神 舟 王 STM32 开 发 板 使 用 目 前 主 流 的 TEA5767 收 音 机 模 块 提 供 FM 收 音 功 能 , STM32F407ZGT6处理器通过I2C接口访问和配置TEA5767模块,TEA5767模块输出的音 频结果音频功放后输出到耳机接口,其原理图如下: 图表 51 板载 FM 收音机及音频放大电路 第 77 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.28 PS2键盘鼠标电路 神舟王STM32开发板板载一个标准的PS2键盘鼠标座,可以连接PS2键盘或者PS2鼠 标,电路如下: 图表 52 PS2 键盘鼠标接口电路 1.2.29 红外线接收和发送电路 神舟王STM32开发板板载一对红外线收发接口电路(模块选配)。他们之间可以通 过红外线无线通信,也可以单独使用红外线发射电路控制家用电器;或者使用红外线接 口电路接收遥控器按键数据,电路如下: 图表 53 红外线接收和发送电路 第 78 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.30 DS18B20温度传感器电路 神舟王STM32开发板板载一个DS18B20温度传感器接口电路(DS18B20选配)。可 以用于采集环境温度或设备温度,电路如下: 图表 54 DS18B20 温度传感器电路 1.2.31 步进电机模块接口电路 神舟王STM32开发板板载一个步进电机模块接口电路(步进电机模块选配),可以 由STM32的4路定时器输出控制步进电机的运转速度,并且可以通过红外对管监控反馈实 际转速。步进电机模块接口电路电路如下: 图表 55 步进电机模块接口电路 第 79 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.32 电源电路 神舟王 STM32 开发板支持的供电方式主要有三种,分别是: ¾ USB 接口供电,最大 500mA ¾ 外部直流 DC5V 供电 ¾ JLINK V8 供电,包括 5V 或 3.3V 如上图所示,当 CON1 电源开关拨到 1ÅÆ2 侧位置时,神舟王 STM32 开发板由 J25 选择 USB 或者外部 DC5V 接口供电。当 CON1 电源开关拨到左侧位置时,神舟王 STM32 开发板可以有电池组供电(电池组不是标配)。 神舟王 STM32 开发板底板上有两套电源转换电路将输入的 5V 电源转换成 3.3V 的电 源,一路是供核心板专用,另一路是底板上的电路使用。下图为神舟王 STM32 开发板核 心板的 5V 电源转换成 3.3V 的电路。 图表 56 核心板 3.3V 电源电路 下图为神舟王 STM32 开发板底板的 5V 电源转换成 3.3V 的电路。 第 80 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图表 57 底板 3.3V 电源电路 神舟王 STM32 开发板底板上的示波器电路放大芯片需要+5V 和-5V 电压,下图为神 舟王 STM32 开发板+5V 电源转换成-5V 的电路。 图表 58 -5V 电源电路 第 81 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.2.33 TTL_UART扩展接口 神舟王STM32开发板有一个TTL_UART扩展接口,可以连接用户的设备,电路如下。 1.2.34 扩展GPIO接口 神舟王STM32开发板将除晶振占用的IO管脚外的所有GPIO的使用标准双排插针引 出,方便大家的实验和测试,调试其他模块或功能扩展。 第 82 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第二章 软件篇 本章以的RVMDK 4.22版本为例,详细介绍RVMDK(以下简称MDK)这一主流的开发环境的使 用。包括MDK工程的建立,代码的编译和调试,以及程序下载等。通过这一章节,我们将了解MDK 的基本操作,熟悉基于MDK软件的STM32开发流程。 2.1 RVMDK简介 RVMDK源自德国的KEIL公司,是RealView MDK的简称,RealView MDK集成了业内最领先的 技术,包括μVision4集成开发环境与 RealView编译器。支持ARM7、ARM9和最新的Cortex-M3核、 Cortex-M4核处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模拟,性能分析 等功能,与ARM之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超过20%。 2.2 MDK 4.22集成开发环境的组成 MDK又称叫RVMDK,源自德国的KEIL公司,是RealView MDK的简称,RealView MDK集成了 业内最领先的技术,包括μVision4集成开发环境与 RealView编译器。支持ARM7、ARM9和最新的 Cortex-M3、Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的Simulation设备模 拟,性能分析等功能,与ARM之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超 过20%。 2.3 MDK工程的编辑 2.3.1 新建RVMDK工程 1)点击 WINDOWS 操作系统的【开始】Æ【程序】Æ【Keil uVision4】启动 Keil uVision 或在桌 面双击【Keil uVision4】快捷方式启动。启动 MDK4.22 如图所示: 第 83 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2)点击之后,出现启动画面: 1) 点击“project---New uVision Project”新建一个工程 第 84 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2) 在对话框,选择放在刚才建立的“新建文件夹”下,给这个工程取个名后保存,不需要填后缀: 第 85 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 3) 弹出一个框,在 CPU 类型下我们找到并选中“STMicroelectronics”下的 STM32F407ZGT6: 第 86 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 4) 出现一个提示框,是否复制 STM32 启动代码到工程文件夹,我们选择【是】,就可以看到 STM32 的启动代码自动添加进来了: 5) 到这里工程全部建立完毕 2.3.2 建立文件 建立一个文本文件,以便输入用户程序。点击【File】Æ【New…】图标按钮, 第 87 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 然后在新建的文件中编写程序,点击“Save”图标按钮将文件存盘,输入文件全名,如 demo.c。 注意,请将文件保存到相应工程的目录下,以便于管理和查找。 当然,您也可以使用其他文本编辑器建立或编辑源文件。 2.3.3 添加文件到工程 选择 Target1 下面的组,这里是“Source Group1”,单击右键,选择【Add File to Group….】,选定 想要添加到文件,确认即可。 第 88 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第 89 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.3.4 管理工程目录以及源文件 当我们的项目比较庞大时,我们就需要一个管理平台来管理我们的工程文件,以及将一些同类型 的工程文件分好类,放入相对应的文件夹中,而这个管理工程文件以及目录的平台就是下面介绍到的: 1. 右击工程窗口中的 Target1 选择“Manage Components……” 2. 在 Project Target 中双击 Target1,把 Target1 改成你想要的名字,可以不改,这里改为:神舟王 STM32F407,然后在 groups 单击新建按钮,这些组对应我们实实在在的文件夹,方便源文件的分 第 90 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 类和管理,例如我们这里新建 User,CMSIS,和 MDK-ARM 等四个组: 3. 先选中一个组之后,在 Files 点击 Add Files,例如在 STM32F4xx_StdPeriph 组添加源文件,添加 完成该文件就成功添加到工程中了: 第 91 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第 92 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第 93 页 共 771 页 2.3.5 编译和连接工程 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 1.编译的几个选项介绍: 下面是编译程序的三种情况,具体请看上图: ¾ 编译当前文件:如果只是确认当前文件是否存在问题,可以选择这个按键 ¾ 编译修改过的文件并链接:如果只是确认最近的修改是否存在问题,可以选择这个按键 ¾ 编译所有文件:选择这个按键将将重新编译链接整个工程文件。 1、关于工程设置框: 上面还有个红框是工程设置相关的,例如工程设置,如地址设置,输出文件设置,编译选项等; 如果我们点击它,就会出现下面的图框,我们可以在这里面根据需要进行一系列详细的设置。 第 94 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2、 调试时输出的错误: 对于简单的软件调试,可以不进行连接地址的设置,直接点击工程窗口的“build”图标按钮, 即可完成编译连接。若编译出错,会有相应的出错提示,双击出错提示行信息,编辑窗即会使用光标 指出当前出错的源代码行。 4.清除编译之后的垃圾: 第 95 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 重新编译之前,建议将原来生成的目标文件都删除,方法如下,点选“project”下拉选择“Clean Target”,删除所有旧目标文件后再进行编译: 5.按 键,编译工程,得到结果如下图所示(不同工程显示内容大同小异): 可以看到没有错误,也没有警告。从编译信息可以看出,我们的代码占用 FLASH 大小为:580 字节(328+252) 这里我们解释一下,编译结果里面的几个数据的意义: Code:表示程序所占用 FLASH 的大小(FLASH) RO-data:即 Read Only-data,表示程序定义的常量(FLASH) RW-data:即 Read Write-data,表示已可以读写的变量(SRAM) ZI-data:即 Zero Init-data,表示已被初始化为 0 的变量(SRAM) 有了这个就可以知道当前使用的 flash 和 sram 大小了,所以,大家不要误解程序的大小就是.hex 文件的大小,这是不对的,程序的大小是编译后的 Code 和 RO-data 之和。 第 96 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.3.6 打开旧工程 点击【File】菜单,选择【Open】即弹出”打开”对话框,找到相应的工程文件(*.uvproj),单击【打 开】即可: 在工程窗口中,双击源程序的文件名即可打开该文件进行编辑: 第 97 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.4 RVMDK使用技巧 前面介绍了 RVMDK 的基本使用,接下来简单的介绍一下 RVMDK 的几个使用技巧。 2.4.1 快速定位函数/变量被定义的地方 你在调试代码或编写代码的时候,一定有想看看某个函数是在那个地方定义的,具体里面的内容 是怎么样的,也可能想看看某个变量或数组是在哪个地方定义的等。尤其在调试代码或者看别人代码 的时候,如果编译器没有快速定位的功能的时候,你只能慢慢的自己找,代码量比较少还好,如果代 码量一大,那就郁闷了,有时候要花很久的时间来找这个函数到底在哪里。幸好 MDK 提供了这样的 快速定位的功能。只要你把光标放到这个函数/变量的上面,然后右键,如下图所示 : 第 98 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图 2.8.2.3 快速定位 在上图,我们点击 Go To Definition of ‘GPIO_Pin_10’,跳转查看 GPIO_Pin_10 是在何处,如何被 定义的。如下图所示 第 99 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 上面是演示的是一个变量的定义的查找,对于函数,我们也可以按这样的操作快速来定位函数被 定义的地方,大大缩短了你查找代码的时间。 第 100 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.4.2 快速注释与快速消注释 接下来,我们介绍一下快速注释与快速消注释的方法。在调试代码的时候,你可能会想注释某一片的 代码,来看看执行的情况,MDK 提供了这样的快速注释/消注释块代码的功能。也是通过右键实现的。 这个操作比较简单,首先选中你要注释的代码区,然后右键,选择 Advanced->Comment Selection 就可 以了。 以下图所示代码为例,比如我要注释掉下图中所选中区域的代码,如下图所示: 我们只要在选中了之后,选择右键,再选择 Advanced->Comment Selection 就可以把这段代码注释掉了。 执行这个操作以后的结果如下图所示: 第 101 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 这样就快速的注释掉了一片代码,而在某些时候,我们又希望这段注释的代码能快速的取消注释,MDK 也提供了这个功能。与注释类似,先选中被注释掉的地方,然后通过右键->Advanced,不过这里选择 的是 Uncomment Selection。 第 102 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.4.3 快速打开头文件 将光标放到要打开的引用头文件上,然后右键选择 Open Document“XXX”,就可以快速打开这个文件 了(XXX 是你要打开的头文件名字)。如下图所示: 图 2.8.2.7 快速打开头文件 关于 MDK 软件的使用就介绍到此,如需更深入和全面的了解请用户查看 KEIL 软件用户使用手册。 第 103 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.5 JLINK V8仿真器的安装与应用 在代码编译通过后,我们需要验证程序是否与我们的设计预期相符合,一般有几种方式来验证。 第一种,软件仿真。在没有硬件环境的情况下,我们可以使用 MDK 的软件仿真功能来对代码的 功能进行初步验证。关于软件仿真功能的使用,在本文档中不在详细描述,有兴趣的朋友,可以常看 MDK 相关手册和说明文档。 第二种,在线仿真。如果硬件环境允许的情况下,建议使用在线仿真来进行调试,完全与实际应 用相符。神舟王 407ZGT6 号所以实验程序都使用 JLINK 仿真器仿真调试通过。 JLINK 是一款主流的支持 ARM 内核芯片的 JTAG 仿真器,配合 IAR,KEIL,WINARM,RealView 等集成开发环境,支持所有 ARM7/ARM9/Cortex-M3/Cortex-M4 内核芯片的仿真。在这里,我们以神 舟王 407ZGT6 的入门程序为例,说明如何在 MDK 开发环境中,搭配 JLINK 仿真器,在线仿真调试 程序。 首先按下图,连接 JLINK 仿真器与神舟王 407ZGT6 开发板。并给神舟王 407ZGT6 开发板上电。 2.5.1 JLINK V8仿真器简介 J-LINK 是 SEGGER 公司为支持仿真 ARM 内核芯片推出的 JTAG 通用仿真器。配合 IAR EWARM, ADS,KEIL,WINARM,RealView 等集成开发环境,支持所有 ARM7/ARM9/ARM11 和 Cortex-M0/M1/M3/M4 核内核芯片的仿真,通过 RDI 接口和 IAR EWARM,ADS,KEIL,WINARM, RealView 等各集成开发环境无缝连接,操作方便、连接方便、简单易学,是学习开发 ARM 最好最实 用的开发工具。 2.5.2 JLINK ARM主要特点 —   USB 接口符合 USB2.0 规范 —   标准 20 芯 JTAG 接口 —   支持全系列 ARM 7/9/11,Cortex_M0/M1/M3 /M4ARM 核,包括 Thumb 模式 —   IAR EWARM 集成开发环境无缝连接的 JTAG 仿真器 —   USB 接口供电,无需外接电源 第 104 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 —   J-LINK 支持对目标板 5V(300mA),3.3V(400mA)供电 —   带 USB 连接线和 20 芯扁平电缆 —   支持 RDI 接口,J-LINK 可用于具有 RDI 接口的开发环境,支持主流的开发环境,包括 ADS,IAR,KEIL,WINARM,REALVIEW 等。 —   下载速度高达 ARM7:600kB/s,ARM9:550kB/s,通过 DCC 最高可达 800 kB/s —   最高 JTAG 速度 12 MHz —   目标板电压范围 1.2V – 3.3V —   自动速度识别功能 —   监测所有 JTAG 信号和目标板电压 —   完全即插即用 —   支持多 JTAG 器件串行连接 —   支持两种下载仿真调试接口:JTAG 接口方式和 SWD 两线接口方式 2.5.3 如何安装JLINK软件 JLINK 仿真器驱动程序可以从配套光盘(文件路径:神舟王STM32F407ZG光盘\JLINK驱动 \Setup_JLinkARM_V420p.zip)或SEGGER 网站(http://www.segger.com/cms/jlink-software.html)获取最 新的安装文件(目前最新安装版本为Software and documentation pack V4.20p ),解压后双击执行,出 现下图所示的安装界面,根据界面安装向导的提示,完成JLINK仿真器驱动程序的安装。 点击Yes继续安装 第 105 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 点击Next继续安装 如果你还在以前装了 IAR 的集成开发环境将出现下图提示,提示你选择更新 IAR JLINK 仿真器的 动态链接库文件,一般选上后按 OK 完成 JLINK 仿真器的安装。 第 106 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.5.4 JLINK V8仿真器配置(MDK KEIL环境) 按下图所示,连接 JLINK 和目标设备。 使用 J-LINK 进行 DEBUG 的设置 打开 KEIL 工程后,选择项目设置的 Debug 菜单。如下图选择“Cortex-M/R J-LINK/J-Trace”,点 击“Settings” 这里选择“SWD 模式”: 第 107 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 第 108 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 因为 STM32F407ZGT 的内部 ROM 大小事 1024K 的,所以这里设置 1M 的大小。 第 109 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 最后设置好之后,点击’OK’按钮即可 2.5.5 使用KEIL的DOWNLOAD功能 如果要使用KEIL 提供的 即“DOWNLOAD”功能则在完成前一步的设置外,还需要在“Utilities” 菜单里面进行和“Debug”一样的设置: 第 110 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.6 在MDK开发环境中JLINK V8的调试技巧 接下来,点击 启动在线仿真。软件窗口如下图所示。 第 111 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 可以发现,多出了一个工具条,这个工具条对于我们仿真是非常有用的,下面简单介绍一下工具 条相关按钮的功能,工具条部分按钮的功能如下图所示: ¾ 复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。代码重新执行。 ¾ 执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是 想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能。 ¾ 挂起:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入 到单步调试状态。 ¾ 执行一条指令:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于 执行当前行执行过去按钮的。 ¾ 执行当前行:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数 单步执行。 ¾ 跳出当前函数:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余 部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。 ¾ 执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但 是两者是有区别的,断点可以有多个,但是光标所在处只有一个。 ¾ 汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。 ¾ 观看变量窗口:该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量 值,也是很常用的一个调试窗口。 ¾ 串口打印窗口:该按钮按下,会弹出一个串口调试助手界面的窗口,用来显示从串口打印出来的 内容。 其他几个按钮用的比较少,以上是比较常用的,当然也不是每次都用得着这么多,具体看你程序 第 112 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 调试的时候有没有必要观看这些东西,来决定要不要看。 关于如何一步一步进行仿真调试,请查看 MDK 相关资料。 2.7 在MDK开发环境中调试 单片机软件开发过程中,软件调试遇到的各种问题常令初学者感到不知所措。实际上。各种仿真 开发软件的程序调试基本方法和技巧大同小异,掌握正确的程序调试基本技巧。对于排查这些程序错 误问题可以起到举一反三、事半功倍的效果。软件调试是单片机技术人员必须掌握的重要基本技能。 在这一节里,我们将学习 STM32 在 MDK 下的软件仿真与利用 JLINK 对 STM32 进行在线调试。 2.7.1 KEIL仿真的应用 MDK 的一个强大的功能就是仿真功能,分为硬件仿真与软件仿真。通过软件仿真,我们可以发 现很多将要出现的问题,避免了下载到 STM32 里面来查这些错误,这样最大的好处是能很方便的检 查程序存在的问题,因为在 MDK 的仿真下面,你可以查看很多硬件相关的寄存器,通过观察这些寄 存器,你可以知道代码是不是真正有效。而且软件仿真是不必频繁的刷机,从而延长了 STM32 的 FLASH 寿命(STM32 的 FLASH 寿命≥1W 次)。 而硬件仿真是使用附加的硬件来替代用户系统的单片机并完成单片机全部或大部分的功能。使用 了附加硬件后用户就可以对程序的运行进行控制,例如单步,全速,查看资源断点等。硬件仿真是开 发过程中所必须的。 下面我们通过实际的例子来详细来了解下软件仿真与硬件仿真的使用。 2.7.2 KEIL软件仿真 在做软件仿真的时候,我们先打开一个我们的工程,验证我们的工程是否是有问题的,在这里我 们就使用神舟王 STM32F407ZG 是最简单的 LED 流水灯的工程来做我们的例子说明。如下图为我们打 开工程后的页面 第 113 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 在开始软件仿真之前,先检查一下配置是不是正确,在project里面点击我们的工程选项“Options for Target‘神舟王STM32F407’”或者是我们的快捷按钮 ,在“Device”和“Target”选项卡 中先看下处理器与晶振是否是和我们的板子晶振相符的,神舟王407开发板使用的处理器是 STM32F407ZGT6,而外部晶振是25MHz的,所以我们也要设置为25MHz的,其他的默认即可,如下图所 示: 第 114 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 接下来,我们在这个配置选项中点击Debug选项卡,该选项卡是用来配置调试的,调试有两种, 一种是基于软件的模拟调试,另一种是通过仿真器在线调试。我们这节主要就是使用这个选项卡。如 下图所示,这里分左右两部分,左边为软件仿真,右边为硬件仿真,而我们这里要用的是软件仿真, 所以选择左部分的“Use Simulator”模拟仿真。其他默认就行,点击OK退出Options for Target对话框。 第 115 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 退出之后就能进入我们的软件模拟仿真的功能了,接下来,我们点击快捷按钮 仿真按钮),开始仿真,出现如下图所示界面: (开始/停止 第 116 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 图中我们可以看到,快捷按钮比我们仿真之前多了一个工具条,这个就是我们Debug仿真的时候 用到的工具条,下面我们简单的介绍一下Debug工具条各个按钮的功能。如下图所示: 复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从 头开始执行。 全速运行、运行到断点:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的, 而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地 方设置了断点。 停止:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单 步调试状态。 单步进入函数:该按钮用来实现执行到某个函数里面去的功能 单独执行完函数:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数 单步执行。 执行到函数结束:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部 分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。 第 117 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 运行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两 者是有区别的,断点可以有多个,但是光标所在处只有一个。 汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。 观看变量/堆栈窗口:该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量 值,也是很常用的一个调试窗口。 串口打印窗口:该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的 内容。 逻辑分析窗口:按下该按钮会弹出一个逻辑分析窗口,通过SETUP按钮新建一些IO口,就可以观察这 些IO口的电平变化情况,以多种形式显示出来,比较直观。 Debug工具条上的其他几个按钮用的比较少,我们这里就不介绍了。以上介绍的是比较常用的, 当然也不是每次都用得着这么多,具体看你程序调试的时候有没有必要观看这些东西,来决定要不要 看。 断点设置 在要设置断点的地方双击下鼠标左键即可,可以看到在左边会出现了一个红框,即表示设置了一 个断点(也可以通过鼠标右键弹出菜单来加入),再次双击则取消)。然后我们点击 点处,如下图所示: ,执行到该断 调试的时候,可以看到对寄存器的修改,但是在实际操作的时候会需要修改某些外设控制寄存器 或者 memoery 中的数据,那么还需要其他的窗口来支持,这些窗口都在 view 菜单下,如下图: 第 118 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 这里重点介绍下面几个窗口: Command windows 命令窗口 Disassembly windows 反汇编窗口 Symbol windows 符号窗口 Register windows 寄存器窗口 Call Stack windows 函数调用栈显示窗口 Watch windows 变量观察窗口 Memory windows 存储器观察窗口 Serial windows 串行数据输出观察窗口 Analysis windows 分析窗口 Trace 轨迹跟踪观察窗口 这里有这么多的窗口,实际上比较常用的是 Watch 窗口和 Memory 窗口。如下图: 第 119 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 在这个 memory 观察窗口下,只要输入地址就可以看到从这个地址之后的若干个地址的数据。 当然观察窗口同样是支持修改对应的值的。 调试是对代码执行的验证过程,所以具体的调试方法每个人有不同的想法,而且实际的问题不同操作 也会不同。 而我们在程序运行的时候,在左边的窗口可以看到寄存器的变化以及运行的时间,方便分析程序 第 120 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.7.3 硬件仿真 硬件仿真的话需要用到我们的仿真器进行一个硬件仿真的操作,在这里我使用的是 J-Link 仿真器,打 开我们刚才的 Debug 选项,选择右边的硬件仿真,选择你的仿真器,我这里用的是 J-link 仿真器。 第 121 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 点击 Settings 进入我们的仿真器设置参数,如下图所示 第 122 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 这里我们能设置仿真模式为 SW 模式仿真调试,这里我们设置的调试速度为 3Mhz,单击 OK,完成此 部分设置,接下来我们还需要在 Utilities 选项卡里面设置下载时的目标编程器,如图 第 123 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 我们选择 J-LINK 来调试 Cortex M4,然后点击 Settings,设置如图 第 124 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 这里要根据不同的MCU选择FLASH的大小,因为我们开发板使用的是STM32F407ZGT6,其FLASH大 小为1024KB,所以我们点击Add,并在Programming Algorithm里面选择1M型号的STM32。然后选中 Reset and Run选项,以实现在编程后自动启动,其他默认设置即可。在设置完之后,点击OK,然后再 点击OK,回到IDE界面,编译一下工程。再点击 ,开始仿真(如果开发板的代码没被更新过,则 会先更新代码,再仿真,你也可以通过按 ,只下载代码,而不进入仿真。 其他的则和软件仿真差不多了,只不过硬件仿真能在设备上运行我们执行程序的效果,方便我们的调 试。 2.7.4 DEBUG模式下不能watch的解决办法 感谢网友王里十一提供解决办法,花了不少时间: 打开该窗口,尝试设置此选项里的 level0 或 level1、 level2、level3,再尝试 watch 参数的设置,来 检测 watch 变量: 第 125 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 2.8 如何设置程序空间在CPU内部Flash,变量空间在CPU内部RAM运行 将程序空间定位在 CPU 内部 Flash,变量空间定位在 CPU 内部 RAM。这是最通用的设置,一般最终 发布的软件就是按照这种设置。 关键设置界面为: 第 126 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 IROM1 设置为 0x80000000,IRAM1 设置为 0x20000000。. 该设置的程序可以用于下载到 Flash,脱离仿真器运行。也可以直接使用仿真器器进行调试跟踪 2.9 如何设置程序空间和变量空间都在CPU内部RAM运行 该设置的程序只能使用仿真器进行调试。 优点: 1)下载速度快; 2)不改写 CPU 内部 Flash 已有的程序; 3)无需拨动启动模式选择开关(即拨打 CPU 内部 Flash 启动也可以下载到 RAM 进行调试; 4)程序执行速度和在 CPU 内部 Flash 一样快。 缺点: 1)开发板掉电会丢失程序; 2)暂时无法使用调试界面的复位按钮进行复位。 3)程序空间最大 32K 字节,变量空间最大限制在 32K 字节。(用户也可以自行调整)  重要说明:编译、连接完毕后,不要使用 按钮下载程序。因为这个按钮只针对下载程序到 CPU 第 127 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 内部 Flash 有效。请直接点击按钮 启动调试即可。IDE 会自动将程序装入 CPU 内部 RAM。  首先设置 Target 定位地址,设置界面如下: IROM1 =0x20000000,Size=0x10000,这是 CPU 内部 RAM 区的前 64K 字节空间; IRAM1 =0x20010000,Size=0x10000,这是 CPU 内部 RAM 区的后 64K 字节空间。 然后设置 Debug 调试接口,界面如下: 第 128 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 a) 取消“LoadApplicationatStartup”前面的钩。在 CpuRAM.ini 初始化脚本中自动装入程序 b) 在“InitializationFiles:“编辑框指定”.\CpuRAM.ini“。 .\ 表示工程文件所在的当前目录。 c) 请将 CpuRAM.ini 文件和工程文件放在同一个文件夹下。CpuRAM.ini 文件是一个文本格式的 初始化脚本文件。当启动调试时,IDE 会执行这个脚本中的命令。 初始化脚本文件说明: a) 新建一个 CpuRAM.ini 的空文件,然后使用记事本将如下内容复制到这文件保存即可。 b) CpuRAM.ini 的内容如下: 本脚本完成的功能是 (1) 装载目标程序到 CPU 内部 RAM (2) 设置堆栈指针 SP (3) 修改 PC 指针 脚本的语法: FUNC void Setup (void) { SP = _RDWORD(0x20000000) + 4; // 设置堆栈指针 PC = _RDWORD(0x20000004); // 设置 PC 指针 } 第 129 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 LOAD obj\output.axf INCREMENTAL // 先装载代码到 CPU 内部 RAM Setup(); // 再调用 Setup 函数修改堆栈和 PC 指针 g, main // 运行到 main()函数 IDE 控制调试器将程序装入 CPU 内部 RAM 后,0x20000000 单元存储了程序的堆栈初值(堆栈区 域的最大值+4,向下增长)。0x20000004 单元存储了复位向量地址。 2.10 如何设置程序空间和变量空间都在外部SRAM运行 该设置的程序只能使用仿真器进行调试。 优点: 1)下载速度快; 2)不改写 CPU 内部 Flash 已有的程序; 3)无需拨动启动模式选择开关(即拨打 CPU 内部 Flash 启动也可以下载到外部 RAM 进行调试。 缺点: 1)开发板掉电会丢失程序; 2)无法使用调试界面的复位按钮进行复位。 3)空间最大 512K 字节,变量空间最大 512K 字节(用户也可以自行调整); 4)程序执行速度比 CPU 内部 Flash 慢很多。  要说明:编译、连接完毕后,不要使用 按钮下载程序。因为这个按钮只针对下载程序到 CPU 内部 Flash 有效。请直接点击 按钮启动调试即可。IDE 会自动将程序装入 CPU 外部 RAM。 首先设置 Target 定位地址,设置界面如下: 第 130 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 IROM1 =0x68000000,Size=0x80000,这是 CPU 外部 RAM 区的前 512K 字节空间; IRAM1 =0x68080000,Size=0x80000,这是 CPU 外部 RAM 区的后 512K 字节空间。  然后设置 C/C++编译器编译选项,界面如下: 第 131 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 由于 STM32 这款 CPU 只能将中断向量表定位在 CPU 内部 Flash 或者 CPU 内部 RAM,不支持将 中断向量表定位在 CPU 外部存储器(外部 SRAM 或外部 NORFlash)。因此,我们需要通过调试脚本 将外部 RAM 的中断向量表复制到 CPU 内部 RAM。 “Define”编辑框需要添加宏“VECT_TAB_SRAM“,这个宏表示中断向量表定位在 CPU 内部 RAM 。 ST 固件库提供的 system_stm32f4xx.c 文件中,voidSystemInit(void) 函数会改写中断向量表 地址寄存器 SCB->VTOR。函数中的关键代码如下: #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ #endif 最后设置“Debug“选项: 第 132 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 a) 取消“LoadApplicationatStartup”前面的钩。在 CpuRAM.ini 初始化脚本中自动装入程序。 b) 在“InitializationFiles:“编辑框指定”.\ExtSRAM.ini“。 .\ 表示工程文件所在的当前目录。  c) 请将 ExtSRAM.ini 文件和工程文件放在同一个文件夹下。ExtSRAM.ini 文件是一个文本格式的 初始化脚本文件。当启动调试时,IDE 会执行这个脚本中的命令。 初始化脚本文件说明: a) 新建一个 ExtSRAM.ini 的空文件,然后使用记事本将如下内容复制到这文件保存即可。 b) ExtSRAM.ini 的内容如下: /* 本脚本完成的任务是: (1) 配置 CPU 的 FSMC 总线,使 CPU 能够访问外部 SRAM,已便于后面装入程序 (2) 复制外部 SRAM 的中断向量表(0x130 字节)到 CPU 内部 RAM (3) 设置堆栈指针 SP (4) 修改 PC 指针 注意:工程选项 IRAM1 的起始地址必须是 0x20000200 开始 脚本的语法: 参见 MDK 的 HELP, 搜索关键字 “uv3 Library Routines” 可以看到 uv3 支持的脚本命令 */ FUNC void Setup (void) { 第 133 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 SP = _RDWORD(0x68000000); // 设置堆栈指针 PC = _RDWORD(0x68000004); // 设置 PC 指针(程序计数器) _WDWORD(0xE000ED08, 0x20000000); // 设置中断向量表地址寄存器 = 0x20000000 } // 初始化 FSMC,用于外部 SRAM FUNC void InitSRAM (void) { //InitRCCC _WDWORD(0x40021000, 0x00005083); _WDWORD(0x40021004, 0x00000000); _WDWORD(0x40021004, 0x00000000); _WDWORD(0x40021000, 0x00005083); _WDWORD(0x40021004, 0x00000000); _WDWORD(0x40021008, 0x009F0000); _WDWORD(0x40021000, 0x00015083); _sleep_ (100); // Wait for PLL lock _WDWORD(0x40022000, 0x00000030); _WDWORD(0x40022000, 0x00000030); _WDWORD(0x40022000, 0x00000032); _WDWORD(0x40021004, 0x00000000); _WDWORD(0x40021004, 0x00000000); _WDWORD(0x40021004, 0x00000400); _WDWORD(0x40021004, 0x00000400); _WDWORD(0x40021004, 0x001D0400); _WDWORD(0x40021000, 0x01035083); _sleep_ (100); _WDWORD(0x40021004, 0x001D0400); _WDWORD(0x40021004, 0x001D0402); _sleep_ (100); _WDWORD(0x40021014, 0x00000114); /* Enable AHBPeriphClock */ _WDWORD(0x40021018, 0x000001E0); /* Enable APB2PeriphClock */ /* GPIO Configuration for FSMC */ _WDWORD(0x40011400, 0xB8BB44BB); _WDWORD(0x40011404, 0xBBBBBBBB); _WDWORD(0x40011800, 0xBBBBB4BB); /* NBL0, NBL1 & adress configuration */ _WDWORD(0x40011804, 0xBBBBBBBB); _WDWORD(0x40011C00, 0x33BBBBBB); 第 134 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 _WDWORD(0x40011C04, 0xBBBB3333); _WDWORD(0x40012000, 0x48BBBBBB); _WDWORD(0x40012004, 0x444B4BB4); /* NE3 configuration */ _WDWORD(0xA0000010, 0x00001010); /* FSMC Configuration */ _WDWORD(0xA0000014, 0x00000200); /* FSMC_DataSetupTime = 2; */ _WDWORD(0xA0000010, 0x00001011); /* Enable FSMC Bank1_SRAM Bank */ _sleep_ (200); } /* 复制中断向量表 中断向量表地址必须是 512 字节的整数倍。 中断向量表实际大小 :0x00000130 */ FUNC void CopyVectTable(void) { _WDWORD(0x20000000, _RDWORD(0x68000000)); _WDWORD(0x20000004, _RDWORD(0x68000004)); _WDWORD(0x20000008, _RDWORD(0x68000008)); _WDWORD(0x2000000C, _RDWORD(0x6800000C)); _WDWORD(0x20000010, _RDWORD(0x68000010)); _WDWORD(0x20000014, _RDWORD(0x68000014)); _WDWORD(0x20000018, _RDWORD(0x68000018)); _WDWORD(0x2000001C, _RDWORD(0x6800001C)); _WDWORD(0x20000020, _RDWORD(0x68000020)); _WDWORD(0x20000024, _RDWORD(0x68000024)); _WDWORD(0x20000028, _RDWORD(0x68000028)); _WDWORD(0x2000002C, _RDWORD(0x6800002C)); _WDWORD(0x20000030, _RDWORD(0x68000030)); _WDWORD(0x20000034, _RDWORD(0x68000034)); _WDWORD(0x20000038, _RDWORD(0x68000038)); _WDWORD(0x2000003C, _RDWORD(0x6800003C)); _WDWORD(0x20000040, _RDWORD(0x68000040)); _WDWORD(0x20000044, _RDWORD(0x68000044)); _WDWORD(0x20000048, _RDWORD(0x68000048)); _WDWORD(0x2000004C, _RDWORD(0x6800004C)); _WDWORD(0x20000050, _RDWORD(0x68000050)); _WDWORD(0x20000054, _RDWORD(0x68000054)); 第 135 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 _WDWORD(0x20000058, _RDWORD(0x68000058)); _WDWORD(0x2000005C, _RDWORD(0x6800005C)); _WDWORD(0x20000060, _RDWORD(0x68000060)); _WDWORD(0x20000064, _RDWORD(0x68000064)); _WDWORD(0x20000068, _RDWORD(0x68000068)); _WDWORD(0x2000006C, _RDWORD(0x6800006C)); _WDWORD(0x20000070, _RDWORD(0x68000070)); _WDWORD(0x20000074, _RDWORD(0x68000074)); _WDWORD(0x20000078, _RDWORD(0x68000078)); _WDWORD(0x2000007C, _RDWORD(0x6800007C)); _WDWORD(0x20000080, _RDWORD(0x68000080)); _WDWORD(0x20000084, _RDWORD(0x68000084)); _WDWORD(0x20000088, _RDWORD(0x68000088)); _WDWORD(0x2000008C, _RDWORD(0x6800008C)); _WDWORD(0x20000090, _RDWORD(0x68000090)); _WDWORD(0x20000094, _RDWORD(0x68000094)); _WDWORD(0x20000098, _RDWORD(0x68000098)); _WDWORD(0x2000009C, _RDWORD(0x6800009C)); _WDWORD(0x200000A0, _RDWORD(0x680000A0)); _WDWORD(0x200000A4, _RDWORD(0x680000A4)); _WDWORD(0x200000A8, _RDWORD(0x680000A8)); _WDWORD(0x200000AC, _RDWORD(0x680000AC)); _WDWORD(0x200000B0, _RDWORD(0x680000B0)); _WDWORD(0x200000B4, _RDWORD(0x680000B4)); _WDWORD(0x200000B8, _RDWORD(0x680000B8)); _WDWORD(0x200000BC, _RDWORD(0x680000BC)); _WDWORD(0x200000C0, _RDWORD(0x680000C0)); _WDWORD(0x200000C4, _RDWORD(0x680000C4)); _WDWORD(0x200000C8, _RDWORD(0x680000C8)); _WDWORD(0x200000CC, _RDWORD(0x680000CC)); _WDWORD(0x200000D0, _RDWORD(0x680000D0)); _WDWORD(0x200000D4, _RDWORD(0x680000D4)); _WDWORD(0x200000D8, _RDWORD(0x680000D8)); _WDWORD(0x200000DC, _RDWORD(0x680000DC)); _WDWORD(0x200000E0, _RDWORD(0x680000E0)); _WDWORD(0x200000E4, _RDWORD(0x680000E4)); 第 136 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 STM32F407 用户手册 V2.0 _WDWORD(0x200000E8, _RDWORD(0x680000E8)); _WDWORD(0x200000EC, _RDWORD(0x680000EC)); _WDWORD(0x200000F0, _RDWORD(0x680000F0)); _WDWORD(0x200000F4, _RDWORD(0x680000F4)); _WDWORD(0x200000F8, _RDWORD(0x680000F8)); _WDWORD(0x200000FC, _RDWORD(0x680000FC)); _WDWORD(0x20000100, _RDWORD(0x68000100)); _WDWORD(0x20000104, _RDWORD(0x68000104)); _WDWORD(0x20000108, _RDWORD(0x68000108)); _WDWORD(0x2000010C, _RDWORD(0x6800010C)); _WDWORD(0x20000110, _RDWORD(0x68000110)); _WDWORD(0x20000114, _RDWORD(0x68000114)); _WDWORD(0x20000118, _RDWORD(0x68000118)); _WDWORD(0x2000011C, _RDWORD(0x6800011C)); _WDWORD(0x20000120, _RDWORD(0x68000120)); _WDWORD(0x20000124, _RDWORD(0x68000124)); _WDWORD(0x20000128, _RDWORD(0x68000128)); _WDWORD(0x2000012C, _RDWORD(0x6800012C)); } // 从这里开始执行代码,之前的都是函数定义 InitSRAM(); // 配置 FSMC 用于 SRAM LOAD obj\output.axf INCREMENTAL // 下载程序到外部 SRAM CopyVectTable(); // 将外部 SRAM 的中断向量表复制到 CPU 内部 RAM Setup(); // 配置堆栈和 PC 指针 g, main // 运行到 main()函数后暂停 由于 STM32 的 FSMC 总线缺省是不使能的,外部 SRAM 无法由仿真器直接读写,因此我们需要 先配置 FSMC 总线以保证 SRAM 可以通过 CPU 直接访问。 IDE控制调试器将程序装入CPU外部SRAM后,0x68000000 单元存储了程序的堆栈初值(堆栈区域的 最大值+4,向下增长)。0x68000004 单元存储了复位向量地址。 第 137 页 共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 第三章 STM32神舟王407ZG开发板硬件使用基础篇 本章节主要介绍使用 STM32 神舟王 407ZG 开发板进行学习与试验的基本操作,让 您快速入门。 开发板使用第一步是供电,所以我们先介绍如何给神舟 STM32 开发板供电;上电后 当然是先下载几个示例观察一下实验现象与效果,所以紧接着我们介绍如何使用如何通 过高效 ARM 调试仿真下载工具 Jlink V8 下载一个编译好的固件到开发板;当然不是每个 用户手头都有 Jlink 工具,我们同时提供其它几种下载方式包括串口等方式下载固件到开 发板等内容。最后我们介绍神舟开发板上跳帽的设置方式。 3.1 如何给神舟王407ZG开发板供电 神舟王 STM32F407ZG 开发板一共支持三种供电方式,分别是: ¾ 使用 USB 供电 ¾ 使用外接电源供电 ¾ 使用 JLINK V8 供电 3.1.1 使用USB供电 使用 USB 供电时,先将 J25 跳到“USB”侧,然后请使用随神舟王 STM32 开发板配置的 USB 电 缆连接开发板的 USB 接口(J52 或者 J17)和 PC 机的 USB 接口,将电源开关(CON1)拨到“外部” 侧,选择 USB 供电方式。在正常情况下,电源转换芯片附近的 LED 灯(DS5),将变亮,表示神舟王 STM32 开发板已经正常供电。 3.1.2 使用外接电源供电 神舟王 STM32 开发板也支持使用外接电源供电,先将 J25 跳到“DC5V”侧,将电源开关(CON1) 拨到“外部”侧,选择外接电源供电。 神舟王 STM32 开发板,外接电源电压范围为 4.75V~5.25V,如使用外接电源供电,建议使用 5V 电压,2A 电流输出的电源适配器进行供电,注意电源适配器必须内芯为电源的正极,外侧为电源的 负极。如正负极与之相反,可能损坏神舟王 STM32 开发板。 3.1.3 使用JLINK V8供电 除了前面提到的两种供电方式外,神舟王 STM32 开发板还支持 JLINK V8 供电,以下以 ARMJISHU.COM 推出的 JLINK V8 为例,说明如何使用 JLINK V8 为神舟王 STM32 开发板供电。 首先按下图连接神舟王 STM32 开发板,JLINK V8 与 PC 机。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 138 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 在 PC 机上打开 J-LINK Commander(注:使用 JLINK V8 时,电脑上要求安装相应的驱动,具体 驱动安装说明请见 JLINK V8 用户手册说明文档)。 在弹出的界面中,输入 power On 即可使能 JLINK V8 给 USB 供电。 说明:请勿同时使用这三种供电方式进行供电,以免多组电源同时供电,损坏神舟王 STM32 开发板。 3.2 如何使用JLINK软件下载固件到神舟开发板 关于JLINK软件的安装步骤请参阅2.5.3如何安装JLINK软件章节。 3.2.1 如何使用J-FLASH ARM 烧写固件到芯片FLASH STM32的程序下载有多种方法,可以通过USB、串口、SWD等方式下载。这几种方式都可以用来 给神舟王407ZG开发板下载程序,这里详细介绍通过JLINK 仿真器下载固件到神舟王407ZG开发板的 过程。 JLINK V8是目前主流的JTAG仿真器,支持所有的ARM7/9/11和Cortex-M0/M1/M3/M4处理器。而 且与主流的开发环境,如神舟系列STM32开发板采用的IAR,MDK开发环境完美的结合。通过JLINK仿 真器,我们可以方便的下载,和在线调试代码。因此,推荐神舟王407ZG开发板与JLINK V8搭配使用。 神舟王407ZG提供的官方资源,包括源代码,使用的开发环境为MDK 4.22;使用的仿真调试工具 为JLINK V8。 以下详细描述使用JLINK V8下载固件到神舟王407ZG开发板的过程。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 139 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 第一步,首先按下图连接神舟王 STM32 开发板,JLINK V8 与 PC 机。 第二步,在PC机上打开J-Flash ARM软件. 嵌入式专业技术论坛 (www.armjishu.com)出品 第 140 页,共 771 页 运行 J-Flash ARM,界面如下 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 然后通过“File”菜单下的“Open…”来打开需要烧写的文件,可以是.bin 格式,也可以是.hex 格式, 甚至可以是.mot 格式。注意起始地址。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 141 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 首次使用的时候应该在 File 菜单,选择 Open Project ,选择你的目标芯片: 接下来在“Options”选择“Project settings”在弹出的对话框中,点击 CPU 标签,选择神舟王 407 使 用的处理器 STM32F407ZG。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 142 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 点击 Target Interface 选择使用 JTAG 还是 SWD 接口,JLINK V8 可以选择用 JTAG 或 SWD 接口 来下载,在线调试,而这两种接口 STM32 处理器也都是支持的。JTAG 方式下载的话,使用到的 STM32 的信号线比较多。在神舟王系列开发板中,我们使用的是占用信号线较少的 SWD 下载方式。在这里 选择 SWD 接口来下载: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 143 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 设置好之后,就可以到 Target 里面进行操作,一般步骤是先“Connect”,然后“Erase Chip”,然后 “Program”。大部分芯片还可以加密,主要的操作都在 Target 菜单下完成。为了方便操作,我们可以 直接按 F7 快捷键,自动擦除和烧录固件。 烧录完成 嵌入式专业技术论坛 (www.armjishu.com)出品 第 144 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 关于J-FLASH ARM更详细的操作请参阅JLINK的用户手册。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 145 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3.2.2 使用J-Link command 设置和查看相关调试信息 J-Link command包含了所有设置和查看相关调试信息的命令,它是基于命令行输入方 式。打开J-Link command 界面,显示JLINK的相关版本信息,如果连接了目标板,将显 示目标板的状态和目标CPU内核信息等。如下 J-Link command包含丰富的测试、查看等命令,相关命令的详细信息可在 J-Linkcommand 命令行下输入”?”号然后回车有详细的说明,操作非常方便。JLINK的其 他软件暂不详细介绍,请用户自行参阅JLINK的用户手册即可得到详细的答案。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 146 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 147 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 通过串口下载固件 (首先推荐使用 Jlink 下载) 3.3 如何通过串口下载一个固件到神舟王STM32开发板 STM32的程序下载有多种方法,可以通过芯片的串口1、SWD等方式下载。这几种方 式都可以用来给神舟王STM32开发板下载程序,这里详细介绍通过串口下载固件到神舟 王STM32开发板的过程。通过修改启动模式为从系统存储器启动,神舟王STM32F407ZGT 的外设接口烧录可以通过USART1接口启用固件更新程序。 硬件设置 第一步神舟王STM32开发板启动模式设置为SystemBoot。将跳线JP18短接2ÅÆ3, JP19短接1ÅÆ2,用于串口下载。此模式下,STM32在复位后不会执行用户代码,而是 等待串口更新程序。 跳线与启动模式设置关系如下: BOOT1(JP18) BOOT0(JP19) 功能 ANY 2-3 User Boot(默认) 2-3 1-2 System Boot 1-2 1-2 SRAM Boot STM32的串口下载使用串口1下载,注意串口1跳线J22和J23跳线的位置。 第二步,使用神舟王STM32开发板配套的交叉串口线将神舟开发板与PC连接(或者 与USB转串口线连接),连接到神舟王STM32开发板的串口1(注意使用串口1时将J22和 J23跳到1ÅÆ2),并为神舟开发板供电。 软件使用 接下来,我们介绍如何使用Flash_Loader_Demonstrator软件串口下载过程。 第一步:打开 神舟王STM32开发板光盘\固件升级工具\目录。解压 um0462_Flash_Loader_Demonstrator_V2.0_Setup.zip文件后,双击 Flash_Loader_Demonstrator_V2.0_Setup.exe安装Flash_Loader_Demonstrator软件(按缺 省设置进行安装即可)。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 148 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 第二步,安装好软件后,运行Flash_Loader_Demonstrator软件, 在弹出界面的中,选择正确的PC机使用的串口号,串行通信波特率可以自由选择, 神舟王STM32开发板将自动识别您设置的波特率,当然一般选择高速率的波特率以提高 下载速度,但是如果您使用的串口线较长或者使用的是USB转串口线则会导致通信质量 下降,此时只能尝试选择低速率的波特率多试几次。 按上图设置好以后,先按开发板的复位按键后,再点击Next按键,此时,如下界面。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 149 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 点击Next 点击Next 浏览加载需要下载的HEX文件。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 150 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 151 页,共 771 页 根据需要选择选项: ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 点击Next进行编程。 上图为下载过程 嵌入式专业技术论坛 (www.armjishu.com)出品 第 152 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 上图为下载验证后的界面 至此,HEX 文件已经成功下载了,按照上图如果选择 “下载 后运行”,则程序已经开始运行;如果没有选择该项,我们需要将启动模式设置为 User Boot 模式,即将 JP15 的 2-3 脚短接。复位神舟王 STM32 开发板即可看到程序运行的实验现象。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 153 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3.5 通过 USB 下载固件 (首先推荐使用 Jlink 下载) 3.2 如何通过USB接口下载固件到神舟王STM32开发板 STM32的程序下载有多种方法,这里详细介绍通过USB下载固件到神舟王STM32开发 板的过程。神舟系列STM32的升级过程是类似的,下面以STM32F103为例说明: 准备工作: 要通过USB更新神舟王STM32F407ZGT的固件程序,需要预先烧录好USB设备固件更 新DFU协议软件(DFU协议软件由实验源码27、Device_Firmware_Upgrade(USB下载)例程 提供),可以通过JLINK或者上面讲述的UART1串口下载,然后后从主闪存存储器启动 使 用 USB 升 级 。 ( DFU 下 载 的 内 部 FLASH 目 标 起 始 地 址 可 以 在 实 验 源 码 27 、 Device_Firmware_Upgrade(USB 下 载 ) 例 程 的 hw_config.h 文 件 中 查 找 到 类 似 #define ApplicationAddress 0x08003000宏定义,上例中下载目标起始地址为0x08003000) 硬件设置 神 舟 王 STM32 开 发 板 启 动 模 式 设 置 为 UserBoot 正 常 启 动 方 式 。 将 跳 线 JP18 短 接 2ÅÆ3,JP19短接1ÅÆ2。跳线与启动模式设置关系如下: BOOT1(JP18) BOOT0(JP19) 功能 ANY 2-3 User Boot(默认) 2-3 1-2 System Boot 1-2 1-2 SRAM Boot 软件使用 安装神舟王STM32开发板光盘\\固件升级工具\目录“um0412_DfuSe_Demo_V3.0.zip” 软件。这个软件是通过USB下载更新固件时所需要的上位机服务软件(USB device firmware upgrade)。这个软件安装方法也很简单,安装方法请参考光盘的“\固件升级工 具\”目录下的《UM0412_DfuSe_User_manual.pdf》。 安装好软件后,运行Flash_Loader_Demonstrator软件, 第三步,使用神舟王STM32开发板配套的USB线缆连接PC机与开发板的USB口,并 为开发板上电。 此时PC机右下角会提示“发现新硬件” 嵌入式专业技术论坛 (www.armjishu.com)出品 第 154 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 并弹出如下对话框要求安装驱动: 一般选择“自动安装”即可,如果自动安装失败,则可以选则“从列表或指定位置安 装”按如下方式进行: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 155 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 选择前面安装软件的文件夹的位置,选中“Driver”文件夹点击确定。一般位于 “C:\Program Files\STMicroelectronics\Software\DfuSe\Driver”路径。 点击下一步 嵌入式专业技术论坛 (www.armjishu.com)出品 第 156 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 可能还会弹出以下对话框,选择前面安装软件的文件夹的位置,如果是32位的PC机 选中“Driver\x86\ STTub30.sys”文件。 一 般 位 于 “ C:\Program Files\STMicroelectronics\Software\DfuSe\Driver\x86\ STTub30.sys”路径。 安装完成! 运行Flash_Loader_Demonstrator软件, 嵌入式专业技术论坛 (www.armjishu.com)出品 第 157 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 在弹出界面的中,选择USB(DFU),点击“Next”。 图表 3-1 “Flash Loader Demo”软件的运行界面 嵌入式专业技术论坛 (www.armjishu.com)出品 第 158 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 由上图的运行界面可以看出,软件已经识别出了 Internal Flash,256 个 sectors。选中 Verify after Download,然后点击下方的“Choose”如图所示选择光盘“神舟王 STM32 开 发板光盘\编译好的固件\DFU 固件升级\神舟王 STM32F103--DFU 下载实验流水灯示例 0x08003000.dfu”文件。 图表 3-2 选择好文件的 DfuSe Demo 的运行界面 如上所示,选择好文件后,文件名“神舟王 STM32F103--DFU 下载实验流水灯示例 0x08003000.dfu”出现在界面中部,此时点击“Upgrade”开始下载应用程序固件,此时 会弹出下图所示的确认对话框,点击“是”。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 159 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 图表 3-3 DfuSe Demo 的确认对话框 此时开始擦除、下载和校验过程以及对应的界面如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 160 页,共 771 页 下载成功结束的界面如下图所示: ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 下载成功结束后,我们需要将启动模式设置为 User Boot 模式,即将 J19 的 2-3 脚短 接,复位神舟王 STM32 开发板即可看到程序运行的实验现象。 或者后点击 按钮程序开始运行,会弹出如下所示的界面: 然后程序开始运行。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 161 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3.4 生成USB下载应用程序映像*.dfu文件 下面讲述如果您自己修改的代码,如何得到可以通过 USB 下载的*.dfu 映像文件到神 舟系列开发板。 MDK 下的设置: 首先在项目的 Project 工程名上点击右键选择“OPTION”或者按快捷键“ALT + F7” 打开 OPTION 选项卡: 选择其中的Target属性页,将其中的IROM1 起始地址设置为 0x08003000,如下图表 3-4 MDK的OPTION的Target属性页设置所示的方法 图表 3-4 MDK 的 OPTION 的 Target 属性页设置 嵌入式专业技术论坛 (www.armjishu.com)出品 第 162 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 163 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 IAR 下的设置: 首先在项目的 Workspace 工程名上点击右键选择“OPTION”或者按快捷键“ALT + F7” 打开 OPTION 选项卡, 选择其中的Output Converter 选项并安装如下图表 3-5 OPTION选项卡中的Output Converter 选项所示的方法设置。 图表 3-5 OPTION 选项卡中的 Output Converter 选项 然后在OPTION选项卡,选择其中的Linker选项并安装如下图表 3-6 OPTION选项卡 中的Linker选项所示的方法设置。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 164 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 图表 3-6 OPTION 选项卡中的 Linker 选项 将向量地址和 ROM 起始地址设置为 0x08003000 编译工程后将得到*.Hex 文件(LED 工程得到就是”神舟王 STM32F103--DFU 下载实 验流水灯示例.hex”文件)。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 165 页,共 771 页 DFU 文件生成: ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 首先在项目的 Workspace 工程名上点击右键选择“OPTION”或者按快捷键“ALT + F7” 打开 OPTION 选项卡,选择其中的 Output Converter 选项并安装如下错误!未找到引用 源。所示的方法设置。 图表 0-7 OPTION 选项卡中的 Output Converter 选项 编译工程后将得到*.Hex 文件(MP3 播放器工程得到就是 ARMJISHU_MP3_PLAYER.hex 文件)。 然后打开“DFU File Manager”程序,如错误!未找到引用源。所示,点击后会出现 错误!未找到引用源。,我们选择第一个由 S19、HEX 或 BIN 文件得到 DFU 文件。点击 OK 后会出现图表 2-28 所示的 DFU File Manager 程序运行界面. 嵌入式专业技术论坛 (www.armjishu.com)出品 第 166 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 图表 0-8 DFU File Manager 程序 图表 0-9 DFU File Manager 程序功能对话框 图表 0-10 DFU File Manager 程序运行界面 在错误!未找到引用源。中我们选择“S19 or HEX”会弹出如错误!未找到引用源。, 我们假设编译已经产生了 HEX 文件,且文件名为“ARMJISHU_MP3_PLAYER.hex”,将 其选中并打开,如错误!未找到引用源。所示。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 167 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 图表 0-11 文件选择对话框 图表 0-12 文件选择对话框设置 嵌入式专业技术论坛 (www.armjishu.com)出品 第 168 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 图表 0-13 选择好文件后的 DFU File Manager 程序运行界面 选择好文件后的 DFU File Manager 程序运行界面如错误!未找到引用源。所示,此 时点击“Generate”按钮,出现如错误!未找到引用源。所示,输入文件名后点击“保存” 按钮。保存成功后会出现错误!未找到引用源。。此时就可以通过 USB 下载转换得到的 这个“ARMJISHU_MP3_PLAYER.dfu”映像到神舟系列开发板中运行。 图表 0-14 保存 DFU 文件对话框 图表 0-15 DFU 文件保存提示框 嵌入式专业技术论坛 (www.armjishu.com)出品 第 169 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3.5 如何在IAR开发环境中使用JLINK在线调试 关于如何在 IAR 开发环境中使用 JLINK 在线调试请查阅《错误!未找到引用源。 错 误!未找到引用源。》章节。 更多关于使用 JLINK V8 调试下载工具单步调试 STM32、查看寄存器值、查看变量 值等等技巧,请查阅网络上的视频。例如在百度中输入“armjishu youku”关键字即可看 到链接: Jlink V8 仿真调试STM32(Cortex-M3)(www_armjishu_com) - 视频 视频地址: http://v.youku.com/v_show/id_XMTY0MjMzNzg0.html 嵌入式专业技术论坛 (www.armjishu.com)出品 第 170 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3.6 如何在MDK开发环境中使用JLINK在线调试 利用串口,我们只能下载程序,并不能实时跟踪,而利用调试工具,比如JLINK、ULINK 等就可以实时跟踪程序,使你的开发事半功倍。这里我们以JLINK V8为例,说说如何在 线调试。 JLINK V8支持JTAG和SWD,而STM32也支持JTAG和SWD。JTAG调试的时候,占用 的IO线比较多,而SWD调试的时候占用的IO线很少,只需要2跟即可。我们神舟王系列开 发板,使用的调试方式是SWD模式。 JLINKV8的安装我们这里就不说了,JLINK的光盘里面有详细的资料。在安装了JLINK V8之后,我们接上JLINK-V8,并把JTAG口插到神舟王407开发板上,打开流水灯工程文 件Project.uvproj,点击 ,打开Options for Target‘神舟 王407’选项卡,在Debug栏选择仿真工具为Cortex-M/R J-LINK/J-Trace,如下图所示: 点击右侧的Setting,配置JLINK 下载参数,主要是选择目标处理器的系列,添加目标芯 片对应的烧写算法。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 171 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 上图中,我们使用J-LINK V8的进行SWD模式调试,只要我们在Port处选择SW即。Max Clock,可以点击Auto Clk来自动设置,上图中JLINK自动设置最大时钟为2Mhz(注意这 里不能设置的太大,但SWD模式的时候,可以设置最大10Mhz)。 单击OK,完成此部分设置。接下来,点击Utilities,进行公共参数设置如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 172 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 在设置完之后,点击OK,然后再点击OK,回到IDE界面,编译一下工程。再点击 , 开始仿真(如果开发板的代码没被更新过,则会先更新代码,再仿真,你也可以通过按 , 只下载代码,而不进入仿真),如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 173 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 可以看到都是一些汇编码的查看,如果我们要快速运行到main函数,可以在main函数的 第一句语句处放入断点,然后点击 ,来快速执行到该处。如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 174 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 接下来,我们就可以和软件仿真一样的开始仿真了,不过这是真正的在硬件上的仿真, 其结果更可信。如何在 MDK 开发环境中使用 JLINK 在线仿真就介绍到这里。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 175 页,共 771 页 3.7 神舟王STM32开发板跳线含义 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3.7.1 启动模式选择跳线 BOOT1(J18) BOOT0(J19) 功能 ANY 2-3 User Boot(默认) 2-3 1-2 System Boot 1-2 1-2 SRAM Boot 说明 用主闪存存储器,即Flash启动 系统存储器启动,用于串口下载 SRAM启动,用于SRAM中调试 代码 — 从主闪存存储器启动:主闪存存储器被映射到启动空间(0x0000 0000),但仍然能够 在它原来的地址(0x0800 0000)访问它,即闪存存储器的内容可以在两个地址区域访 问,0x0000 0000或0x0800 0000。 — 从系统存储器启动:系统存储器被映射到启动空间(0x0000 0000),但仍然能够在它原 有的地址(0x1FFF F000)访问它。 — 从内置SRAM启动:只能在0x2000 0000开始的地址区访问SRAM。 使用JLINK调试下载时,一般是下载到内部flash(用主闪存存储器)区域,所以请将 启动模式设置为User Boot模式。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 176 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3.7.2 RS-232串口1与USB选择跳线 RS-232串口2与USB OTG接口,跳线定义如下: J22 J22 串口2功能选择 1ÅÆ2 1ÅÆ2 串口1 RS-232接口 2ÅÆ3 2ÅÆ3 USB OTG接口(103不适用) 图表 3-15 串口 1 跳线位置图 3.7.3 RS-232串口2与RS-485选择跳线 串口2可通过跳线选择接口定义如下: J20 1ÅÆ2 2ÅÆ3 J210 1ÅÆ2 2ÅÆ3 串口2功能选择 串口2 RS-485接口 串口2 RS-232接口 3.7.4 音频放大数据源跳线 神舟王STM32开发板的音频放大的数据源可以选择为VS1003的输出,或者STM32的DAC。 跳线如下图所示,1ÅÆ2时数据源选择为STM32的DAC的输出,2ÅÆ3时数据源选择为 VS1003的输出。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 177 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3.7.5 5V电源选择跳线 神舟王 STM32 开发板支持通过电源适配器从 DC5V 插座提供 5V 电源,也支持通过 USB 接口提供 5V 电源。跳线如下图所示,1ÅÆ2(左侧,默认 1 脚为方孔)时 5V 电源选择为电源适配器从 DC5V 插座 提供,2ÅÆ3 时电源选择为 USB 接口提供。 3.7.6 神舟王STM32两块2.4G无线模块连接说明 两块 2.4G 无线模块连接说明图如下图所示: 图表 3-16 两块 2.4G 无线模块连说明图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 178 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 第四章 STM32快速入门篇 4.1 理解芯片控制的原理 如果要说做单片机很难吗?其实并不难,用 3 句话就可以讲明白: 第 1 句话:芯片管脚不是输入,就是输出。 我们所有的程序,用单片机控制的产品,以及外设,无非就是控制芯片的各个管脚输 入或者输出两个状态;例如,芯片发送数据就是输出;芯片驱动一个产品,也是输出; 芯片接收数据就是输入;单片机对一个存储芯片写输入,可以理解为单片机与存储芯片 连接的管脚输出状态,输出数据到存储芯片的管脚上,而存储芯片此时它的芯片对应管 脚被配置成输入,将数据写入到芯片内部。 所以说,芯片管脚不是输入,就是输出,当然,如果你不使用这个管脚,也可以将它 配置成某一种中间状态,免得干扰了外界,影响了 PCB 板上的其他元器件状态。 第 2 句话:芯片管脚不是高电平,就是低电平。 芯片管脚不是高电平就是低电平两种状态,当然也有第三种,既不高电平也不是低电 平的状态,这样的管脚状态表示没有任何内容和数据;无论管脚是输入还是输出,它的 目的都是传输数据、传输信息,所以管脚的高电平我们将它表示为“1”,低电平表示“0”, 通过 0 和 1 这样的数据来传输它想传输的内容,这个就是所谓的二进制。 例如:假如复位芯片管脚是低电平进行复位,我们将该管脚一直拉高为高电平“1” 的时候,芯片可以正常工作,如果将管脚拉低至低电平“0”的时候,芯片通过检测这个 管脚状态为低电平,芯片内部就会自动进行复位;我们通过控制这个管脚拉高和拉低, 从而就可以达到控制芯片的工作;其他的管脚也是同样的道理。 第 3 句话:传输协议。 什么是传输协议,比如与串口芯片通信,那么就要是串口协议的;如果是 I2C 协议的 EERPOM,那么就是 I2C 协议;还有其他一些比如 485 协议,CAN 协议,USB 协议,SD 卡的 SDIO 协议…….等等数不胜数。 而这些协议,无非就是按照预先规定的表达方式进行通信,比如举个例子,我约定先 连续发 4 个 1,,然后再发 4 个 0,就表示芯片 A 要开始发数据给芯片 B 了,即芯片 A 通 过它的芯片管脚发‘11110000’给到芯片 B 的时候,那么芯片 B 就知道芯片 A 要给它真 正的数据,它就要做好准备工作,准备好之后,芯片 B 就会给芯片 A 一个回应,当芯片 A 收到芯片 B 的回应,就正式开始发数据。 这样通信双方之间的协商规定,就构成了协议,经过这么多年,就形成了我们所常见 到的串口协议,CAN 协议,USB 协议(像 USB 协议又分为 USB1.0 协议,USB2.0 协议, USB3.0 协议,版本越高,速度就越快,协议进行优化后,通信效率也变高了)。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 179 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 不知道大家理解了没有呢?所以总结下来, 一个芯片最简单的外设莫过于 I/O 口的 高低电平控制,我们这里将详细讲解一下如何用一个 I/O 口去控制一个 LED 灯的亮灭。 4.2 芯片管脚控制LED灯原理图解释 下面有个原理图,(用 LED1 举例,仅点亮 LED4)这个原理图是用 STM32 的 PF10 管脚连 LED 灯的负极,用正 3.3V 电源端连 LED 灯的正极,再串联一个限流电阻限制电 流(电阻的作用就是限流、降压;如果线路上电阻很小,那么电压不变的情况下,电流 就会变得很大,有可能会烧坏 LED 灯,所以这里我们串联一个电阻进行降压)降压防止 LED 灯被烧掉,这个串联电阻的阻值要计算好,使得在恒定电压的情况下,电流的大小 刚好足够驱动 LED 灯点亮,点亮这个 LED 灯大概需要 10ma~20ma(毫安)的电流。 原理图中 STM32 的 PF10 管脚如何控制这个 DS1 的灯呢?可以看到,PF10 输出高电 平的时候,LED 灯不会亮;只有当 PF10 输出低电平的时候,LED 灯才会点亮。所以我 们想用 STM32 的管脚 PF10 去驱动 DS1 这个 LED 灯亮,只要使得 PF10 输出低电平就可 以,这样就知道如何控制这个 LED 灯了。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 180 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 为什么这么接呢?为什么不让 PF10 管脚接 LED 的正极,而 LED 灯的负极去接 GND 地呢?这样才是最常规的接法不对吗?答案是当然是,但是在这里这样的接法有助于芯 片的长久使用,芯片的总体驱动能力是有限的,它可以驱动一个 LED 灯,但驱动不了 100 个,1000 个。 在这里需要重复上面已经说过的内容,首先我们要知道 LED 的发光工作条件,不同 的 LED 其额定电压和额定电流不同,一般而言,红或绿颜色的 LED 的工作电压为 1.7V~2.4V,蓝或白颜色的 LED 工作电压为 2.7~4.2V, 直径为 3mm LED 的工作电流 2mA~10mA,在这里采用绿色的 LED;STM32 单片机(如本实验板中所使用的 STM32F407ZGT 芯片)的 I/O 口作为输出口时,向外输出电流的能力是 25mA 左右,勉 强是可以点亮一个发光二极管,但是如果我们用 STM32 去点亮很多个 LED 灯的时候, 就有可能造成芯片本身输出电流不足(因为芯片能输出的总电流大小是恒定的)。 其次,PF10 的这种接法是一种灌电流(要 VCC 往内输入电流)的方式,这种方式使 得 STM32 的芯片管脚让一个 LED 灯亮非常轻松,利用灌电流的方式驱动发光二极管是 比较常见的一种用法,无论接多少 LED,芯片管脚的负荷都非常轻。当然,现今的一些 增强型单片机,是采用拉电流输出的,只要单片机的输出电流能力足够强即可,不过接 多了也是不可取的,单片机的总体驱动电流是有限的;上图中的电阻用的是 1K 阻值主 要为了限制电流,让发光二极管的工作电流限定在 2mA~10mA。 4.3 STM32相关的芯片手册有哪些?我们如何阅读这些资料 STM32 神舟王 407 开发板的主芯片 STM32F407ZGT 芯片相关的资料和例程都可以在 ST 的官方网站上找到,STM32F407ZGT 芯片的网址为“ http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1575/LN9/PF245082”。 首先介绍两个最重要的两个文档,芯片手册和参考手册。 1、芯片手册。芯片手册在网页“DATASHEET”那一栏。芯片手册详细介绍了所选择的 芯片型号的功能规格,内核型号,运行主频,外设资源以及其性能,芯片封装种类信息 以及各种封装的管脚定义,芯片的电气特性,外设的时序要求,订购信息和器件的机械 特。这份文档因为芯片型号的不同而不同,比如 STM32F407ZG 和 STM32F407ZC 和 STM32F215 以及 STM32F217 等等,他们的功能外设资源不同,所以芯片手册都不相同。在芯片的选 型阶段,这份文档是判断芯片功能和性能是否满足项目需求的关键文档。在原理图阶段 这份文档更是尤为重要。后续开发调试阶段这份文档也不可或缺。这份文档将伴随着你 从项目开始一直走到项目结束。 2、参考手册。参考手册在网页“REFERENCE MANUALS”那一栏,也称为技术参考手册。 这份参考手册是有关如何使用该产品的具体信息,包含各个功能模块的内部结构、所有 可能的功能描述、各种工作模式的使用和寄存器配置等详细信息。参考手册不涉及某个 具体的芯片,他是将一个系列的芯片。STM32F407ZG 属于 STM32F4xx 这一大类,所以我们 下载的文档名为“RM0090 Reference manual STM32F405xx, STM32F407xx, STM32F415xx and STM32F417xx advanced ARM-based 32-bit MCUs”。也就是说无论你在 STM32F405xx 和 STM32F407xx 和 STM32F415xx 以及 STM32F417xx 等芯片的网页页面下载的参考手册都 是相同的。这也注定这份文档介绍的功能资源是 STM32F4xx 这一大类芯片所有功能资源 的交集。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 181 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 这两份文档都很重要,相对来说,硬件开发人员更多关注芯片手册,软件开发人员更 多关注参考手册。 其次介绍芯片相关的一些文档资料。 z 处理器内核相关文档。STM32F407ZG 芯片的性能是 ARM 公司的 Cortex-M4。所以 如果需要了解内核的资料,可以参考 ARM 公司的“Cortex™-M4 技术参考手册”以及其他 Cortex-M4 的技术书籍。 z ST 的应用笔记“APPLICATION NOTES”。充分利用 ST 网页中的资源,可以加快产 品设计调试进度。 z 外设资源相关资料。例如 TIM 定时器、UART 串口以及 USB 等等。这些接口的资料 可以参考 ST 网页中的 STM32 应用文档以及示例程序。由于很多接口都是各自的协议标准, 所以可以查阅这些标准协议的相关资料文献,例如 I2C、SPI、USB 这些都有各自的规范 可以查阅。 z 相关外部芯片资料。STM32 的接口对外连接了什么器件,就需要查阅相关的文档 资料。同样是 I2C 接口,既可以连接 EEPROM 也可以连接温度传感器或其他;同样是 SPI 接口,既可以连接 DATA FLASH 也可以连接 WIFI 模块或者触摸屏等等。这些已经不属于 STM32 的范围了,所以这块资料在 STM32 的网页一般找不到,或者只能找到对应的参考设 计。 z STM32 神舟系列用户手册。 z www.armjishu.com 论坛帖子。 z STM32 神舟系列开发板博客:http://blog.sina.com.cn/u/1989261580 z STM32 神舟系列开发板微博:http://weibo.com/u/1989261580 4.4 STM32芯片各个管脚是怎么控制以及被管理的?(如何阅读芯片手册) 那么我们怎么来访问这些寄存器呢? 如果是通过标准库访问,只要调用相关函数即可。 如果是寄存器操作,首先要得到寄存器的地址,寄存器的地址是芯片厂商一开始就定 好了的,固定的不能改变,大家看下图(在数据手册中): 嵌入式专业技术论坛 (www.armjishu.com)出品 第 182 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 寄存器的地址是基址+偏移量的和。基址在芯片数据手册“存储器映像”章节,正如 上图那样,比如 SYSCFG 的基地址是‘4000 0000’;EXTI 的基址是‘0x4001 3C00’;以 此类推。 从芯片上电后工作正常开始,所有寄存器都会有一个默认数值,保证处理器处于确定 的状态。这个初始值正如上图所描述的这样,这个重要内容我们可以在技术参考手册中 嵌入式专业技术论坛 (www.armjishu.com)出品 第 183 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 获得。 现在我们打开参考手册《STM32F4xx 参考手册》 到这是一个 1315 页的参考手册,我们截图看看: ,可以看 比如我们要访问 GPIO 管脚 PF10,那么首先就要找到端口 F 的位置,即 Port F,我们 首先查看文档的目录,找到第 6.4 节 GPIO 寄存器描述章节,可以看到从 144 页开始到 149 页都是描述 GPIO 端口的,我们查看 6.4.1 节查看一下(GPIOx_MODER),这个里的 x=A…I 表示,GPIOx_MODER 可以是 GPIOA_MODER、GPIOB_MODER、......、GPIOI_MODER 中的任意 一个;在这里我只关心端口 F,就可以把它看成 GPIOF_MODER: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 184 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们可以找到 PortF 在内存中的基地址的 0x4002 1400。 控制端口 F 的各个寄存器的偏移地址应该怎么确定呢?可以查看具体的寄存器描述 (PortF 属于 GPIO 端口中的 F 端口): 可以看到该文档写了’偏移地址:0x00’,这表示 GPIOF_MODER 这个寄存器的地址 等于 Port F 的位置+偏移地址就可以算出它的地址,即: GPIOF_MODER 寄存器地址:0x4002 1400(PortF 的地址) + 0x00(GPIOx_MODER 的偏 移地址) = 0x4002 1400 嵌入式专业技术论坛 (www.armjishu.com)出品 第 185 页,共 771 页 我们再看一个地址: ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 GPIOF_OTYPER 寄存器地址:0x4002 1400(PortF 的地址) + 0x04(GPIOx_OTYPER 的偏移地址) = 0x4002 1404 也就是说,当我们访问 0x4002 1404 这个地址所指向的内容时,实际上就是在访问 GPIOF_OTYPER 这个寄存器了,就这么简单。 4.5 STM32芯片单个管脚是怎么被控制以及被管理的?(如何阅读芯片寄存器) 这里主要是如何去查看 CPU 芯片单个管脚的寄存器表。 实际上,点亮这个 LED 灯,只需要使得我们的 STM32 芯片的 PF10 管脚输出低电平 就可以了,那么如何控制一个 PF10 管脚的状态呢? 我们来举个例子,实际上 STM32 的 PF10 管脚的状态是由 STM32 芯片内部的一些寄 存器来控制的,通过这些寄存器,可以控制将管脚配置成输出或者输入,拉高还是拉低。 芯片通过获取寄存器不同的值,对应我们的 STM32 芯片手册寄存器说明书,就可以知道 芯片就相当于获得了不同的命令,获取命令后就开始执行命令,大家可以看下图,还是 看这个《STM32F4xx 参考手册》 文档: (注意:手册可以从 STM32 神舟王 407 开发板的光盘里获得。也可以从 ST 官网下载) 可以看到文档的 6.4 节,注意文档目录红框里的这些寄存器,现在我们就开始仔细来研究 一下它们,这是专门描述 GPIO 寄存器的章节,具体内容大家自己打开文档阅读一下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 186 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们进入文档,浏览到第 148 页,我们看其中一个寄存器到底写了些什么: 我们看到如下内容,我们逐个列出来: 1)GPIOx_MODER 这个寄存器一共是 32 个比特,从 0-31bit,有 32 个位 2)GPIOx_MODER 寄存器的偏移地址是 0x00;表示在 GPIO 端口的基地址加上这个 偏移地址 0x00 就可以访问到这个寄存器的内容。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 187 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3)GPIOx_MODER 寄存器的复位值 A 端口是 0Xa800 000, B 端口是 0x0000 0280, 其他端口的是 0x0000 0000. 4)GPIOx_MODER 寄存器其中第 0 和 1 位,2 和 3 位……28 和 29 位,30 和 31 位每 两个位为一个组,叫做 MODEy 组;主要功能是设置这个管脚是输入模式,还是 输出模式(如果是输出模式,还要确定是 General purpose out put mode 还是 Alternate function mode 或是 Analog mode)。 5)其他的寄存器也是这样查看表和状态,我们寄存器复位值(A 端口和 B 端口除外) 是 0x0000 0000,十六制的 0 转换成二进制是 0000,即每个 MODE=00,我们可以 查表知道 MODE=00 表示这个管脚复位后是输入模式。 是不是看得有点头晕了,但是没有办法,我们就是通过改变这些寄存器的值来设置芯 片管脚的,使得芯片管脚按照寄存器手册里的规定来进行相应的工作;可以是输出或输 入,可以是高电平或是低电平(这个是另外一个寄存器来控制,大家可以对应看手册里 的寄存器说明),从而达到我们控制一个 LED 灯亮和灭; 像寄存器 GPIOx_OTYPER、GPIOx_OSPEEDR 等等都是同样的分析和阅读方法,我们接 下来再来举例子详细说明。 4.6 分析一个最简单的例程 4.6.1 例程硬件原理图说明 现在,知道可以访问处理器所有的寄存器了,我们可以通过改写这些寄存器的值,控 制芯片做不同的功能和操作。 下面我们正式写个例程来感受一下.这个例程用 C 语言来修改这个内存地址的内容, 从而控制寄存器,通过寄存器控制 STM32 芯片的 PF10 管脚使得一个灯亮和灭的。 原理图如下,上面已经有介绍: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 188 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 4.6.2 例程main.c源代码(可以直接运行): 以下是 main.c 的源文件,读者可以直接粘贴编译: /******************* 此段代码直接拷贝进去可以直接运行 开始 #define __IO volatile typedef unsigned int uint32_t; typedef __IO uint32_t vu32; typedef unsigned short int uint16_t; #define GPIO_Pin_0 #define GPIO_Pin_1 #define GPIO_Pin_2 #define GPIO_Pin_3 #define GPIO_Pin_4 #define GPIO_Pin_5 #define GPIO_Pin_6 #define GPIO_Pin_7 #define GPIO_Pin_8 #define GPIO_Pin_9 #define GPIO_Pin_10 #define GPIO_Pin_11 #define GPIO_Pin_12 #define GPIO_Pin_13 ((uint16_t)0x0001) /*!< Pin 0 selected */ ((uint16_t)0x0002) /*!< Pin 1 selected */ ((uint16_t)0x0004) /*!< Pin 2 selected */ ((uint16_t)0x0008) /*!< Pin 3 selected */ ((uint16_t)0x0010) /*!< Pin 4 selected */ ((uint16_t)0x0020) /*!< Pin 5 selected */ ((uint16_t)0x0040) /*!< Pin 6 selected */ ((uint16_t)0x0080) /*!< Pin 7 selected */ ((uint16_t)0x0100) /*!< Pin 8 selected */ ((uint16_t)0x0200) /*!< Pin 9 selected */ ((uint16_t)0x0400) /*!< Pin 10 selected */ ((uint16_t)0x0800) /*!< Pin 11 selected */ ((uint16_t)0x1000) /*!< Pin 12 selected */ ((uint16_t)0x2000) /*!< Pin 13 selected */ 嵌入式专业技术论坛 (www.armjishu.com)出品 第 189 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 #define GPIO_Pin_14 #define GPIO_Pin_15 #define GPIO_Pin_All ((uint16_t)0x4000) /*!< Pin 14 selected */ ((uint16_t)0x8000) /*!< Pin 15 selected */ ((uint16_t)0xFFFF) /*!< All pins selected */ #define RCC_AHB1Periph_GPIOA #define RCC_AHB1Periph_GPIOB #define RCC_AHB1Periph_GPIOC #define RCC_AHB1Periph_GPIOD #define RCC_AHB1Periph_GPIOE #define RCC_AHB1Periph_GPIOF ((uint32_t)0x00000001) ((uint32_t)0x00000002) ((uint32_t)0x00000004) ((uint32_t)0x00000008) ((uint32_t)0x00000010) ((uint32_t)0x00000020) /************ GPIOF <*************/ typedef struct { __IO uint32_t MODER; __IO uint32_t OTYPER; __IO uint32_t OSPEEDR; __IO uint32_t PUPDR; __IO uint32_t IDR; __IO uint32_t ODR; __IO uint16_t BSRRL; __IO uint16_t BSRRH; __IO uint32_t LCKR; __IO uint32_t AFR[2]; } GPIO_TypeDef; typedef struct { __IO uint32_t CR; __IO uint32_t PLLCFGR; __IO uint32_t CFGR; __IO uint32_t CIR; __IO uint32_t AHB1RSTR; __IO uint32_t AHB2RSTR; __IO uint32_t AHB3RSTR; uint32_t RESERVED0; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 190 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 __IO uint32_t APB1RSTR; __IO uint32_t APB2RSTR; uint32_t RESERVED1[2]; __IO uint32_t AHB1ENR; __IO uint32_t AHB2ENR; __IO uint32_t AHB3ENR; uint32_t RESERVED2; __IO uint32_t APB1ENR; __IO uint32_t APB2ENR; uint32_t RESERVED3[2]; __IO uint32_t AHB1LPENR; __IO uint32_t AHB2LPENR; __IO uint32_t AHB3LPENR; uint32_t RESERVED4; __IO uint32_t APB1LPENR; __IO uint32_t APB2LPENR; uint32_t RESERVED5[2]; __IO uint32_t BDCR; __IO uint32_t CSR; uint32_t RESERVED6[2]; __IO uint32_t SSCGR; __IO uint32_t PLLI2SCFGR; } RCC_TypeDef; /********* GPIOF 管脚的内存对应地址 *******/ #define PERIPH_BASE ((uint32_t)0x40000000) #define AHB1PERIPH_BASE (PERIPH_BASE + 0x20000) #define GPIOF_BASE (AHB1PERIPH_BASE+ 0x1400) #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) /************ RCC 时钟 <*************/ #define AHB1PERIPH_BASE (PERIPH_BASE + 0x20000) #define RCC_BASE (AHB1PERIPH_BASE + 0x3800) #define RCC ((RCC_TypeDef *) RCC_BASE) /************ www.armjishu.com *******/ 嵌入式专业技术论坛 (www.armjishu.com)出品 第 191 页,共 771 页 void Delay(vu32 nCount); int main(void) { ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF; /*配置输入输出模式和输入输出的速度*/ GPIOF->MODER &= 0xFFCFFFFF; GPIOF->MODER |= 0x00100000; GPIOF->OTYPER &= 0xFFFFBFFF; GPIOF->OTYPER |= 0x0000000; GPIOF->OSPEEDR &= 0xFFCFFFFF; GPIOF->OSPEEDR |= 0x00200000; GPIOF->PUPDR &= 0xFFCFFFFF; GPIOF->PUPDR |= 0x0000000; /* Infinite loop 主循环 */ while (1) { GPIOF->BSRRL=GPIO_Pin_10; //GPIOF->BSRR=0x00000400; Delay(0x2FFFFF); GPIOF->BSRRH=GPIO_Pin_10; //GPIOF->BSRR=0x04000000; Delay(0x2FFFFF); } } void Delay(vu32 nCount) //通过不断 for 循环 nCount 次,达到延时的目的口 { for(; nCount != 0; nCount--); } 嵌入式专业技术论坛 (www.armjishu.com)出品 第 192 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 /******************* 此段代码直接拷贝进去可以直接运行 结束 ****************************/ 4.6.3 例程环境搭建 1. 点击桌面UVision4图标,启动软件,如下图。如果是第一次使用的话会打开一个自带 的工程文件,我们可以通过工具栏Project->Close Project选项把它关掉。 2. 在工具栏Project->New μVision Project…新建我们的工程文件,我们将新建的工程 文件保存在桌面的“STM32神舟开发板模板工程”(先在电脑桌面上新建一个“STM32 神舟开发板模板工程”,在该文件夹里面新建一个Project文件夹),文件名取为神 舟STM32-DEMO(英文DEMO的意思是例子),名字可以随取,点击保存。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 193 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 3. 接下来的窗口是让我们选择公司跟芯片的型号,我们用的是神舟王 407 的板子,因为 我们的神舟王 407 用的芯片是 ST 公司的 STM32F407ZG,有 196K SRAM,1M Flash,属 于高集成度的芯片。按如下选择即可。 4. 接下来的窗口问我们是否需要拷贝STM32的启动代码到工程文件中,这份启动代码在 M4系列中都是适用的,一般情况下我们都点击是,但我们这里用的是ST的库,库文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 194 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 里面也自带了这一份启动代码,所以为了保持库的完整性,我们就不需要开发环境为 我们自带的启动代码了,稍后我们自己手动添加,这里我们点击否。 5. 此时我们的工程新建成功,如下图所示。但我们的工程中还没有任何文件,接下来我 们需要在我们的工程中添加所需文件。 6.可以看到目前工程里只有一个文件: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 195 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 7.新建一个 main.c 文件存放在路径 STM32 神舟王 407 开发板第 1 个例程\Project\main.c 下,然后 按照以下图标操作过程把 main.c 文件添加到工程里: 这个例程,我们将所有的代码都写到了一个 mian.c 文件,不涉及到任何库函数,也没有包含任何 的头文件,下面我们的截图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 196 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 8.把 5.61 节的代码直接全盘拷贝到 main.c 文件里 嵌入式专业技术论坛 (www.armjishu.com)出品 第 197 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 9.编译成功,我们可以看到编译后的 HEX 文件,我们可以直接在光盘中找到这个文件,直接进入 Project 文件夹,打开即可: 10.该代码可以直接下载到神舟王 407 开发板中,按一下复位按键,可以看到 LED 灯一亮一灭,具体 下载方式我们推荐有三种,具体下载设置请参考手册其他章节: 1)JLINK V8 仿真器下载(我们推荐) 2)ULINK2 仿真器下载 3)串口下载 11.或者直接打开我们已经编译好的例程“STM32 神舟王 407 开发板第 1 个例程”,在 http://blog.sina.com.cn/s/blog_7691b90c0101edpx.html链接中,STM32 神舟王 407 号开发板区域 可以找到。 4.6.4 实验现象 可以看到 STM32 神舟王 407 开发板的 DS1 灯一亮一灭的闪烁。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 198 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 4.6.5 例程软件架构和代码分析(只有一个main.c文件) 1.STM32 神舟王 407 号开发板中的第一部分的代码分析: 分析 1:volatile 是什么?怎么用? 答:简单的说,就是不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存或者寄 存器中读取或者修改,防止从缓存处读取的值是过期了的,所以加了这个 volatile 可以保证每次读的 值绝对是实时的: 一般说来,volatile 用在如下的几个地方: 1.中断服务程序中修改的供其它程序检测的变量需要加 volatile; 2.多任务环境下各任务间共享的标志应该加 volatile; 3.存储器映射的硬件寄存器通常也要加 volatile 说明,因为每次对它的读写都可能由不同意义。 我认为这是区分 C 程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、 中断、RTOS 等等打交道,所有这些都要求用到 volatile 变量。不懂得 volatile 的内容将会带来灾 难。假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这 家伙是不是直正懂得 volatile 完全的重要性。 分析 2:__I、 __O 、__IO 是什么? 答:如下: __I :输入口。既然是输入,那么寄存器的值就随时会外部修改,那就不能进行优化,每次都要重新 从寄存器中读取。也不能写,即只读,不然就不是输入而是输出了。 __O :输出口,也不能进行优化,不然你连续两次输出相同值,编译器认为没改变,就忽略了后面那 一次输出,假如外部在两次输出中间修改了值,那就影响输出。 __IO:输入输出口,同上。 分析 3:为什么加下划线? 答:原因是避免命名冲突,一般宏定义都是大写,但因为这里的字母比较少,所以再添加下划线来区 分。这样一般都可以避免命名冲突问题,因为很少人这样命名,这样命名的人肯定知道这些是有什么 用的。 经常写大工程时,都会发现老是命名冲突,要不是全局变量冲突,要不就是宏定义冲突,所以我们要 尽量避免这些问题,不然出问题了都不知道问题在哪里。 分析 4:typedef 是什么意思,怎么使用? 答:typedef 为 C 语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部 数据类型(int,char 等)和自定义的数据类型(struct 等);在编程中使用 typedef 目的一般有两个, 一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 1) typedef 的最简单使用,例如:typedef long byte_4;表示给已知数据类型 long 起个新名字,叫 嵌入式专业技术论坛 (www.armjishu.com)出品 第 199 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 byte_4 2) typedef 与结构结合使用 例如:typedef struct tagMyStruct { int iNum; long lLength; } MyStruct; 这语句实际上完成两个操作 操作 1:定义一个新的结构类型 tagMyStruct, struct 关键字和 tagMyStruct 一起,构成了这个结构 类型,不论是否有 typedef,这个结构都存在。我们可以用 struct tagMyStruct varName 来定义变量, 但要注意,使用 tagMyStruct varName 来定义变量是不对的,因为 struct 和 tagMyStruct 合在一起 才能表示一个结构类型。 struct tagMyStruct { int iNum; long lLength; }; 操作 2:typedef 为这个新的结构起了一个名字,叫 MyStruct。 typedef struct tagMyStruct MyStruct; 因此,MyStruct 实际上相当于 struct tagMyStruct,我们可以使用 MyStruct varName 来定 义变量。 分析 5:所以具体的 typedef 代码解释如下: 1)例:typedef unsigned int uint32_t; 表示使用 uint32_t 符号表示 unsigned int 符号 2)例:typedef __IO uint32_t vu32; 表示使用 vu32 符号表示 typedef __IO 符号 3)例:typedef unsigned short int uint16_t; 表示使用 uint16_t 符号表示 unsigned short int 符号 2.初始化宏定义详细分析分解: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 200 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 201 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 分析 1:可以看出规律,GPIO_Pin_0、GPIO_Pin_1 到 GPIO_Pin_15 总共 16 个 define 定义每个都是一 个 16 比特(uint16_t)的对象。 每个端口都有 16 个 GPIO 管脚,比如 GPIOA,GPIOB,GPIOC 等,我们用 16bit 的位来表示,即 2 个字节,每个 bit 表示 16 个 GPIO 管脚中的一个,可以看下面 2 个寄存器,就是控制 GPIO 对应的具 体管脚是高电平还是低电平的,通过对设置对应位为 0 或为 1,就可以使得管脚的电平为高或低。 每个 GPIO_Pin_x 占用这 16 个比特中的 1 个位,其他剩余的 15 个位都是 0,这 16 个 GPIO_Pin_x 就被用来表示芯片各个不同端口的 16 个管脚,比如 PA0、PA1 一直到 PA15 分别对应 GPIO_Pin_0、 GPIO_Pin_1 到 GPIO_Pin_15,这样定义好之后具体如何使用我们后面还会再说。 #define GPIO_Pin_0 ((uint16_t)0x0001) 0000 0000 0000 0001 #define GPIO_Pin_1 ((uint16_t)0x0002) 0000 0000 0000 0010 #define GPIO_Pin_2 ((uint16_t)0x0004) 0000 0000 0000 0100 #define GPIO_Pin_3 ((uint16_t)0x0008) 0000 0000 0000 1000 #define GPIO_Pin_4 ((uint16_t)0x0010) 0000 0000 0001 0000 #define GPIO_Pin_5 ((uint16_t)0x0020) 0000 0000 0010 0000 #define GPIO_Pin_6 ((uint16_t)0x0040) 0000 0000 0100 0000 #define GPIO_Pin_7 ((uint16_t)0x0080) 0000 0000 1000 0000 #define GPIO_Pin_8 ((uint16_t)0x0100) 0000 0001 0000 0000 #define GPIO_Pin_9 ((uint16_t)0x0200) 0000 0010 0000 0000 #define GPIO_Pin_10 ((uint16_t)0x0400) 0000 0100 0000 0000 #define GPIO_Pin_11 ((uint16_t)0x0800) 0000 1000 0000 0000 #define GPIO_Pin_12 ((uint16_t)0x1000) 0001 0000 0000 0000 嵌入式专业技术论坛 (www.armjishu.com)出品 第 202 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 #define GPIO_Pin_13 #define GPIO_Pin_14 #define GPIO_Pin_15 #define GPIO_Pin_All ((uint16_t)0x2000) ((uint16_t)0x4000) ((uint16_t)0x8000) ((uint16_t)0xFFFF) 0010 0000 0000 0000 0100 0000 0000 0000 1000 0000 0000 0000 1111 1111 1111 1111 分析 2:这里是定义 GPIO 端口 F 的一些初始化变量,后面那些具体的地址需要查看芯片参考手册 1)定义总线的基地址(这个需要参考手册) #define PERIPH_BASE ((uint32_t)0x40000000) 2)AHB1PERIPH_BASE(AHB1 时钟总线)的地址是在总线基地址上加多 0x20000,具体可以看参考 手册 #define AHB1PERIPH_BASE (PERIPH_BASE + 0x10000) 3)定义 GPIO 端口 F 的基地址,该地址是 0x4002 1400。 #define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) 4)定义一个 GPIO_TypeDef 的 struct 结构,从 GPIO 端口 F 的基地址开始进行覆盖 #define GPIOF ((GPIO_TypeDef *) GPIOB_BASE) 分析 3:这里是初始化 RCC 时钟总线的基地址,详细分析与上面同原理,具体的地址需要查看芯片参 考手册 嵌入式专业技术论坛 (www.armjishu.com)出品 第 203 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 分析 4:设置端口的偏移量,后面我们会详细解释 3.定义这两个结构体与芯片参考手册中的寄存器进行对应,芯片参考手册中对应的寄存器都是 32bit 的,所以在这个结构体的各个对象都被定义成 uint32_t 类型,并且是__IO 类型,表示每次操作寄存 器都是实时获取数据: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 204 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 205 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 4.下面是 main 函数的剖析,总共来说分为 4 个步骤,下面一一介绍: 步骤 1:使能 APB1 总线的时钟。 对 GPIO 的端口 F 时钟使能,这个是芯片厂家所规定的操作,我们先按照这样来操作就可以,具 体实现方式也是将对应 GPIOF 寄存器使能,同时,也有 RCC,串口接口,CAN 接口,485 接口等时 钟的使能寄存器,使用前都需要先对时钟总线使能的。 使能操作完毕,就相当于我们对要使用的这个接口功能进行使能和激活,每个接口在使用前都必 须要求使能和激活,只有激活后才可以使用。 步骤 2:配置 GPIO 端口的状态。 输入还是输出,速度多少,和大家可以参考对应的芯片寄存器手册,可以看到我们将 PF10 设置 成:通用推挽输出模式,并且速度是:最大速度 50MHz。 具体可以参考 GPIOF_ MODER、GPIOF_OTYPER、GPIOF_OSPEEDR、 GPIOF_PUPDR 寄存器。 步骤 3:进入 while 死循环 可以使得我们的点灯程序一直不会退出,达到重复一亮一灭的功能。 步骤 4:GPIO 输入和输出使得灯亮灭 GPIOF_BSRRL(BSRR 寄存器的低十六位)对应位设置 1,可以使得对应管脚的 ODR 位为 1; GPIO_BSRRH(BSRR 寄存器的高十六位)的对应位设置 1,可以使得对应管脚的 ODR 位为 0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 206 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 那么 ODR 位是什么呢?这个就是端口输出数据寄存器 GPIOF_ODR,实际上这个寄存器里的对应 位的变化才是真正 GPIO 管脚高低电平的变化;而寄存器 GPIOF_BSRRL 和寄存器 GPIOF_BSRRH 则 可以间接影响到它。 当然上面程序,我们也可以改成直接操作 GPIOF_ODR 的代码,这个留个大家来做练习吧。 4.6.6 代码的定义和声明如何与芯片内部资源挂钩 C 语言程序代码如何真正访问芯片内部寄存器的呢?大家看下面这些定义: 通过这几个 define 可以算出来一下地址: GPIOF = 0x4000 0000 + 0x2 0000 + 0x1400 = 0x4002 1400 刚好与 PortB 在内存中的位置对应上 RCC = 0x4000 0000 + 0x2 0000 + 0x3800 = 0x4002 3800 刚好也与 RCC 在内存中的位置对应上 更多内存映射可以找 STM32F407ZG 的数据手册资料,如下图,可以详细的进行了解 了解: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 207 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 通过以上这个存储器映像图,我们就可以通过代码与存储器地址关联起来了。 4.6.7 代码如何映射到芯片内部的寄存器 这也是从库函数中摘抄出来的一种实现方式,我们通过 struct 结构可以完成对 GPIO,RCC 等外设模 块中各个寄存器的管理,比如,一个 GPIO 模块中,有很多个寄存器,我们可以用 C 语言中的 struct 来对应这些寄存器。 在芯片中,一个寄存器连着一个寄存器,每个寄存器都是 32 位的(4 个字节);我们在 struct 结 构中的成员每个也都是 32 位的,一个连着一个,刚好一一对应,大家可以看下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 208 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 可以看到上图,每个寄存器都是 32 位的,左边是而且顺序刚好分别对应,结构体是会分配内存的, 这样这些 C 语言中的 struct 结构体中定义的成员会对应映射到对应的寄存器上,那么我们就可以通 过操纵程序中的该结构体的对应成员,就相当于操作的是对应的寄存器,这个是 C 语言和单片机软硬 件对应上的又一大关键点,请不熟悉的读者好好理解一下,如实在不理解,可以致电 STM32 神舟系列 开发板的官方工程师。 4.6.8 Main函数寄存器级分析(重点) 1.LED 灯为什么会一亮一灭呢? 嵌入式专业技术论坛 (www.armjishu.com)出品 第 209 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们看一下参考手册中的 GPIOx_BSRR 寄存器(BSRRL, BSRRH 分别对应 BSRR 寄存器中的低 16 位, 和高 16 位): 分析1:从以上两个寄存器里的内容可以知道到: z ODRy = 1就会输出高电平,如果是高电平,我们查看了原理图,这个LED灯灭,可以通过操作 GPIOx_BSRRL 寄存器的对应位来改变 z ODRy = 0就会输出低电平,如果是低电平,我们查看了原理图,这个LED灯亮,可以通过操作 GPIOx_BSRRH 寄存器的对应位来改变 嵌入式专业技术论坛 (www.armjishu.com)出品 第 210 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 分析2:进一步分析,我们如何通过代码来改变这个ODRy呢?大家请看下面: z 代码GPIOF->BSRRH = GPIO_Pin_10;可以使得GPIOx_BSRR寄存器的BR10位为1,这样就是的GPIO端口F 的对应ODR10=0,即PF10管脚输出低电平,使得DS1亮。 z 代码GPIOF->BSRRL= GPIO_Pin_10;可以使得GPIOx_BSRR寄存器的BS10位为1,这样就是的GPIO端口F的 对应ODR10=1,即PF10管脚输出高电平,使得DS1灭。 2.要使用 PF10 管脚需要做哪些初始化的工作呢? 分析1:使能AHB1总线上的GPIO端口F的时钟,我们可以看下系统图,可以看到GPIOF是属于AHB1总线 管理的,那么如何初始化这个是ST公司要求的,而不是我们STM32神舟系列开发板官方规定的,一切 都是STM32芯片厂家ST公司制定的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 211 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 分析 2:代码 RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF;是使能 GPIOF 的时钟,我们找到寄存器 RCC_AHB1ENR,仔细看看是什么操作的 嵌入式专业技术论坛 (www.armjishu.com)出品 第 212 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 点击进入文档第 110 页可以看到 5.3.10 节,可以看到 GPIOF 端口的时钟设置选项: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 213 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们通过代码 RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF;来对 RCC->AHB1ENR 寄存器的位 6 进行操 作置位,那么 RCC_AHB1Periph_GPIOF 的值请见: 代码:#define RCC_AHB1Periph_GPIOF ((uint32_t)0x00000020) 从这句代码可以知道 0x00000020 的 20 化成二进制是 0010 0000,刚好是对 RCC->AHB1ENR 寄存器 的第 6 位置位,使得 GPIOFE 为 1,使得 IO 端口 F 时钟使能。 分析 3:配置 GPIO 端口 F 的工作模式,我们这里可以看到它配置改变了下图中的四个寄存器。 我们找到这个 MODER 寄存器完整的名称叫 GPIOx_MODER 寄存器的内容: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 214 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们开始分析一下代码: z GPIOF->MODER &= 0xFFCFFFFF; GPIOF->MODER &= 0xFFCFFFFF = 1111 1111 1100 1111 1111 1111 1111 1111 可以看到将 MODER 寄存器的第 20、21 位清 0,其他位默认值不变,看上表可以知道,这 2 位刚好是管 脚 PF10 的配置寄存器 嵌入式专业技术论坛 (www.armjishu.com)出品 第 215 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 z GPIOF->MODER |= 0x00100000; GPIOF->MODER |= 0x00100000; = 0000 0000 0001 0000 0000 0000 0000 0000 可以看到将 CRH 寄存器的第 20、21 位 分别置成 0、1,其他位的 GPIO 端口值都 清 0,意思就是只配置 PH10 这个管脚,其他 PF 口的管脚配置寄存器都全部变成 0,这样 MODER10=01; 查表可以知道: 这样配置后 PF10 被配置成通用输出模式,因为我们这个例程中需要点 LED 灯,这是 一种输出模式。 另外三个寄存器的配置也是类似的。 4.6.9 库函数与我们这个例程之间的关系 库函数同我们这个例程的原理是一样,后续的例程,都是源自库函数的,阅读原理一样,只是我们 将一些相关功能比较密切的代码封装到一起,变成一个完整的函数。 后续该神舟文档还会升级,库函数分析版本请见下个版本的书籍。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 216 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 4.7 STM32的内存管理研究(KEIL编程环境下) 4.7.1 研究意义 4.7.2 举例说明并详细分析 以 M3 的核为例,非常简单的一个工程,没有用到任何 IO 操作,与 STM32 有关的仅 仅只有芯片的选择,即其 SRAM 大小有区别。上图是工程示意图,从图中可以看出,除 了自己编写的代码外,仅仅增加了 2 个文件,即 system_stm32f10x.c 和 startup_stm32f10x_hd.s,其中为了对 startup_stm32f10x_hd.s 进行修改,将其从库文件夹复 制到了项目文件夹中。M3 的核也是一样的道理。 4.7.3 举例分析 代码 1 int main() { int a,b,c,d; a=10;b=20; c=a+b; for(;;); } myex1.c(3): warning: #550-D: variable "c" was set but never used linking... Program Size: Code=796 RO-data=336 RW-data=20 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 1 Warning(s). 代码 2 int main() { 嵌入式专业技术论坛 (www.armjishu.com)出品 第 217 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 const int x=16; int a,b,c,d; a=10;b=20; c=a+b; for(;;); } myex1.c(2): warning: #177-D: variable "x" was declared but never referenced myex1.c(3): warning: #550-D: variable "c" was set but never used linking... Program Size: Code=800 RO-data=336 RW-data=20 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 2 Warning(s). 说明: (1)Code 增加了 4 字节 (2)其余没有任何变化 代码 3 int main() { const int x=16; int myArry[100]; int i; int a,b,c,d; a=10;b=20; c=a+b; for(i=0;i<100;i++) myArry[i]=i; for(;;); } myex1.c(2): warning: #177-D: variable "x" was declared but never referenced myex1.c(3): warning: #550-D: variable "myArry" was set but never used myex1.c(5): warning: #550-D: variable "c" was set but never used myex1.c(5): warning: #177-D: variable "d" was declared but never referenced linking... Program Size: Code=816 RO-data=336 RW-data=20 ZI-data=1636 嵌入式专业技术论坛 (www.armjishu.com)出品 第 218 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 4 Warning(s). 分析:程序中增加了数组 myArry,Code 增加为 816 字节,但是 RO-data 等仍未变化 代码 4 int main() { const int x=16; int myArry[100]={1,2,3,4,5,6}; int i; int a,b,c,d; a=10;b=20; c=a+b; for(i=0;i<100;i++) myArry[i]=i; for(;;); } myex1.c(2): warning: #177-D: variable "x" was declared but never referenced myex1.c(3): warning: #550-D: variable "myArry" was set but never used myex1.c(5): warning: #550-D: variable "c" was set but never used myex1.c(5): warning: #177-D: variable "d" was declared but never referenced linking... Program Size: Code=1024 RO-data=360 RW-data=20 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 4 Warning(s). 分析: (1)由于 myArry 作了初始化,因此 RO-data 增加了 360-336=24 字节。原因是 32 位 机中 int 型变量是 32 位的,占 4 字节,所以初始 6 个值后,增加了 24 字节。 (2)再增加初始化变量的数量,则 RO-data 随之增加,而 Code 不再变化,也就是 Code 由代码 3 的 816 字节增加到 1024 字节,是增加了初始化处理的代码量。 根据以上分析,似乎与已知资料有冲突。 *************************************************** RO 是程序中的指令和常量 RW 是程序中的已初始化变量 嵌入式专业技术论坛 (www.armjishu.com)出品 第 219 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 ZI 是程序中的未初始化的变量 由以上 3 点说明可以理解为: RO 就是 readonly, RW 就是 read/write, ZI 就是 zero **************************************************** 如果按此说明,增加变量应该增加 RO,但从代码 1 到代码 2 的变化来看,仅是增加 了 Code,却没有增加 RO。 初始化变量时,应该增加 RW,但是从代码 2~代码 4,RW 却没有任何变化。 看来这个说法只能适用于 ARM 芯片,即运行时需要将代码调入 RAM 运行的芯片, 对于 STM32 这类芯片并不完全适用。 4.7.4 观察堆栈 1) 当使用 int myArray[300]时: 2) 当使得 int myArray[100]时: 3) 当使得 int myArray[450]时: 当然,执行是错误的,当 int myArray[409]时:正指向 0x2000000,去掉其他变量,对于这个地址 没有影响; 堆栈应该是向下生成的,而且与芯片无关,无论选择 6K RAM 还是 48K RAM 都是如此,且当数 组再大时,就会将地址置于小于 0x2000000 的地址,但编译并不报错。 4)代码 5 int myArray[400]={1,2,3,4,5,6,7,8,9,10,11,12,13,14}; int main() { const int x=16; int a,b,c,d; int i; a=10;b=20; c=a+b; for(i=0;i<100;i++) myArray[i]=i; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 220 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 for(i=0;i<100;i++) c+=myArray[i]; d+=x; for(;;); } 编译结果: compiling myex1.c... linking... Program Size: Code=876 RO-data=336 RW-data=1620 ZI-data=1636 FromELF: creating hex file... "myex1.axf" - 0 Error(s), 0 Warning(s). 分析: 本段程序将数组作为全局变量来定义,情况立即发生了变化。RW-data 变成了 1620。其中的 1600 应该是这个数组增加的 4*400=1600,而 20 则是代码 1~代码 4 中一直都有的。 经查验资料,栈的大小应该在启动代码中修改。 更改这个:startup_stm32f10x_hd.s 可以更改栈的大小。 RO 是程序中的指令和常量(Code + RO Data);RW 是程序中的已初始化变量;ZI 是程序中的未初 始化的变量;由以上 3 点说明可以理解为: 1)RO 就是 readonly, 2)RW 就是 read/write, 3)ZI 就是 zero 简单的说就是在烧写完的时候是:FLASH 中:Code+RO Data+RW Data,运行的时候: RAM: RW Data + ZI Data,当然还要有堆栈的空间。 Program Size: Code=876 RO-data=336 RW-data=1620 ZI-data=1636 FLASH 占 Total ROM Size (Code + RO Data + RW Data) = 876 + 336 +1620 = 2832 = 2.8KB SRAM 占 Total RW Size (RW Data + ZI Data) = 1620 + 1636 = 3256 = 3.3KB 如果你对 ZI-Data 理解还有疑问,可以尝试一下: int myArray[400]={1,2,3,4,5,6,7,8,9,10,11,12,13,14}; 会增加 RW, 但是 int 嵌入式专业技术论坛 (www.armjishu.com)出品 第 221 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 myArray[400]={0}; 就可以增加 ZI 了。 4.8 STM32重映射功能 4.8.1 什么是STM32的重映射 就好像乾坤大挪移,移动穴位,把芯片这个管脚的功能移到另外一个管脚上。 重映射的作用简单的说就是把管脚的外设功能映射到另一个管脚,但是不是可以随便映射的,具 体对应关系参考手册上的管脚说明。比如 USART2_TX 默认在 PA2 管脚,当启用复用功能后就会将 PD5 管脚作为 USART2_TX。 4.8.2 所有的管脚都可以重映射吗 大部分都可以,但不是所有的管脚功能都能重映射,比如 ADC1_IN0 就只能在 PA0,这个具体要 看芯片的数据手册。 4.8.3 为什么要有STM32重映射这个功能 我们知道每个内置外设都有若干个输入输出引脚,一般这些引脚的输出脚位都是固定不变的,为 了让设计工程师可以更好地安排引脚的走向和功能,在 STM32 中引入了外设引脚重映射的概念,即 一个外设的引脚除了具有默认的脚位外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映 射到其它的脚 位。 比如设计的这个电路板,要 3 个串口接口,并且这 2 个串口要连在一起,那么 STM32 芯片本身 的 2 个串口接口的管脚分布到各处的,如果按照实际管脚功能来设计电路板,可能不太好走线,这样 可以通过重映射的功能,把另外好连的管脚连在一起,我们通过程序去把原来不是串口的管脚初重映 射成串口即可;这样就只需要修改软件就可以,根本不用改变硬件,这样就增加了芯片的灵活性,也 增加了硬件设计者以及产品的灵活性。 4.8.4 STM32重映射举例说明 在这里我们随便举一个例子,可能我们的芯片不是这个型号,但是都是同样的原理,就跟九阳神 功一样,神舟团队认为,这样举的例子才更有可重用性,你学懂了就是真的懂了,大家可以查看一下 STM32 芯片手册,我们这里举的是 STM32F103xC 中有关 USART3 引脚的摘要片段: 从这里可以看出,USART3_TX 的默认引出脚是 PB10,USART3_RX 的默认引出脚是 PB11;但 嵌入式专业技术论坛 (www.armjishu.com)出品 第 222 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 经过重映射后,可以变更 USART3_TX 的引出脚为 PD8,变更 USART3_RX 的引出脚为 PD9。 STM32 中的很多内置外设都具有重映射的功能,比如 USART、定时器、CAN、SPI、I2C 等,详 细请看 STM32 参考手册(RM0008)和 STM32 数据手册。 有些模块(内置外设)的重映射功能还可以有多种选择,下面是 RM0008 上有关 USART3 输入输出 引脚的重映射功能表: 从这个表中可以看出,USART3 的 TX 和 RX 引脚默认的引出脚位是 PB10 和 PB11,根据配置位 的设置,可以重映射到 PC10 和 PC11,还可以重映射到 PD8 和 PD9。 4.8.5 深入分析STM32重映射内部架构原理 一个模块的功能引脚不管是从默认的脚位引出还是从重映射的脚位引出,都要通过 GPIO 端口模 块实现,相应的 GPIO 端口必须配置为输入(对应模块的输入功能,如 USART 的 RX)或复用输出(对应 模块的输出功能,如 USART 的 TX),对于输出引脚,可以按照需要配置为推挽复用输出或开漏复用 输出。 这里就好比,你可以把土地的白菜移到另外一块有土的菜地,它还是可以继续茁壮的成长;但你 不能把白菜放在被子里睡觉,让它跟你一样成长,至少要有最基本的土壤;在 STM32 里,一个芯片 管脚无非就是输入或者输出,这个基本的属性一定要配对,一个串口打印输出,如果你把管脚配置成 输入,那一定是不行的,也不可能配置成功的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 223 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 上图是 STM32 的 GPIO 端口模块,使用复用功能时的配置。从图中可以看出,配置为复用输出时, 该端口对应的 GPIO 输出功能将不起作用。例如当配置 PB10 对应的引脚为复用输出功能时,操作 PB10 对应的输出寄存器将不影响引脚上的信号。 从图中还可以看出,普通的 GPIO 端口输入功能与复用的输入功能的配置方式没有分别,这意味 着在使用引脚的复用输入功能时,可以在这个引脚的输入寄 存器上读出引脚上的信号。例如在使能 了 USART3 模块时,可以读 GPIOB_IDR 寄存器,得到 PB11 信号线上的当前状态。 有不少引脚上配备了来自多个模块的复用功能引出脚,例如本文第一张图中显示的 PB10,默认 复用功能就有 I2C2_SCL 和 USART3_TX 两个功能,TIM2 重映射后,TIM2_CH3 也使用 PB10 的复用 功能。 在使用引脚的复用功能时,需要注意在软件上只可以使能一个外设模块,否则在引出脚上可能产 生信号冲突。例如,如果使能了 USART3 模块,同时没有 对 USART3 进行重映射配置,则不可以使 能 I2C2 模块;同理如果需要使用 I2C2 模块,则不能使能 USART3 模块。但是如果配置了 USART3 的引 脚重映射,USART3 的 TX 和 RX 信号将从 PC10 和 PC11,或 PD8 和 PD9 引出,避开了 I2C2 使用的 PB10 和 PB11,这时就可以同时使用 I2C2 模块和 USART3 模块了。 USART3 模块共有 5 个信号,分别为 TX、RX、CK、CTS 和 RTS,从上面给出的第二张图中可 以看出,重映射是对所有信号同时有效。 这 5 个信号中,在使能了 USART3 模块后,只有 TX 和 RX 是始终与对应的引出脚相连,而其它 3 个信号分别有独立的控制位,控制它们是否与外部引脚 相连,如果程序中不使用某个信号的功能, 则可以关闭这个信号的功能,对应的引脚可以做为其它功能的引出脚。例如,当关闭了 USART3 的 CK、CTS 和 RTS 功能并且没有重映射 USART3 时,PB12、PB13 和 PB14 可以作为通用输入输出端口使用,也可以作为其它模块的复用功能引出脚。 下面这张图是一个内部控制连接的等效示意图,它并不表示真正的内部连接,但可以有效地帮助 理解重映射和复用引脚的概念。图中右边引出的信号,分别连接到了本文第三张图的输入输出模块。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 224 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 4.8.6 STM32重映射关键指点 1)首先为什么要开启时钟? 答:因为要对寄存器进行读写!而在 STM32 中对寄存器的读写都是要打开寄存器对应的时钟才可以 的【就像人一样,有了跳动的脉搏手臂才能有能量才能进行各种动作】。 然后就什么时候 AFIO 时钟开启(所有时钟都是这样)就清楚了:当需要对“AFIO 时钟管理的 寄存器”进行读写时 AFIO 时钟打开!当然不对“AFIO 时钟管理的寄存器”读写时也可以打开 AFIO 时钟,此时只是白白增加能耗、写无用代码(白白浪费程序存储器空间)而已! 2)接下来:跟 AFIO 相关的寄存器有哪些呢? 答:根据《STM32 中文参考手册_V10》有:①事件控制寄存器(AFIO_EVCR)、②复用重映射和调试 I/O 配置寄存器(AFIO_MAPR)、③外部中断配置寄存器 1(AFIO_EXTICR1)、④外部中断配置寄存器 2(AFIO_EXTICR2)、⑤外部中断配置寄存器 3(AFIO_EXTICR3)、⑥外部中断配置寄存器 4(AFIO_EXTICR4)。 3)应用:在 usart1 串口通信没有端口重映射时为什么不打开 AFIO 时钟?PA9、PA10 作为通用 I/O 口 也复用了,为什么不打开复用时钟? 答:AFIO 全称:Alternate function I/O alternate 备用的、替代的、交替的,所以 AFIO 可翻译为“备 用功能 I/O”,原英文手册上解释很清楚:[《STM32 英文手册》] To optimize the number of peripherals available for the 64-pin or the 100-pin or the 144-pin package, it 嵌入式专业技术论坛 (www.armjishu.com)出品 第 225 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 is possible to remap some alternate functions to some other pins. This is achieved by software, by programming the AF remap and debug I/O configuration register(AFIO_MAPR) on page 159. In this case, the alternate functions are no longer mapped to their original assignations. 可见 AFIO 就设计用来 remap some alternate functions to some other pins 的,所以根本就没有什么 “复用”之说,看来都是翻译惹的祸!另外看一下 I/O 复用时的情况就更清楚了。 [STM32 中文参考手册_V10》]: 可见,当设置“PA9 为 GPIO_Mode_AF_PP(只是一个常数 0x18)、PA10 为 GPIO_Mode_IN_FLOATING(只是一个常数 0x04)”时 PA9、PA10 就已经直接跟串口的相应寄存器连接 上了,而串口的寄存器不需要 AFIO 时钟、PA9/PA10 也不许要 AFIO 时钟,同时有没有对 AFIO 相应 的寄存器操作所以根本不用开启 AFIO 时钟! 4)最后的总结 这里所说明的原理,如果没看明白没有关系,可以先继续往下学习,这样的概念有个映像就可以, 这个知识说明透彻之后,其他的只能在实际的代码中学习;你完全可以打开 STM32 的芯片手册,然 后请注意观察那些管脚第一个主功能,以及重映射功能是什么,然后看看代码如何去控制他们的,有 疑问再回来查看这一个章节,这才是真正的学习成功之道。 4.9 STM32芯片加密解密 4.9.1 关于芯片加密的定义 芯片解密是指从已经被加密了的芯片里,把存储的代码拷贝出来。嵌入了程序代码的芯片有很多 种,而 MCU 只是其中一种。单片机(MCU)一般都有内部 EEPROM/FLASH 供用户存放程序和工作 数据。为了防止未经授权访问或拷贝单片机的机内程序,大部分单片机都带有加密锁定位或者加密字 节,以保护片内程序。如果在编程时加密锁定位被使能(锁定),就无法用普通编程器直接读取单片 机内的程序,这就叫单片机加密或芯片加密。单片机攻击者借助专用设备或者自制设备,利用单片机 芯片设计上的漏洞或软件缺陷,通过多种技术手段,就可以从芯片中提取关键信息,获取单片机内程 序这就叫芯片解密。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 226 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 芯片解密又叫单片机解密,单片机破解,芯片破解,IC 解密,但是这严格说来这几种称呼都不科 学,但已经成了习惯叫法,我们把 CPLD 解密,DSP 解密都习惯称为芯片解密。单片机只是能装载程 序芯片的其中一个类。能烧录程序并能加密的芯片还有 DSP,CPLD,PLD,AVR,ARM 等。也有专 门设计有加密算法用于专业加密的芯片或设计验证厂家代码工作等功能芯片,该类芯片也能实现防止 电子产品复制的目的。 4.9.2 关于芯片解密方法的理论总结 1.软件攻击 该技术通常使用处理器通信接口并利用协议、加密算法或这些算法中的安全漏洞来进行攻击。软 件攻击取得成功的一个典型事例是对早期 ATMEL AT89C 系列单片机的攻击。攻击者利用了该系列单 片机擦除操作时序设计上的漏洞,使用自编程序在擦除加密锁定位后,停止下一步擦除片内程序存储 器数据的操作,从而使加过密的单片机变成没加密的单片机,然后利用编程器读出片内程序。 至于在其他加密方法的基础上,可以研究出一些设备,配合一定的软件,来做软件攻击。 近期国内出现了一种泰斗科技 51 芯片解密设备(成都一位高手搞出来的),这种解密器主要针对 SyncMos. Winbond,在生产工艺上的漏洞,利用某些编程器定位插字节,通过一定的方法查找芯片中是 否有连续空位,也就是说查找芯片中连续的 FF FF 字节,插入的字节能够执行把片内的程序送到片外的 指令,然后用解密的设备进行截获,这样芯片内部的程序就被解密完成了。 2.电子探测攻击 该技术通常以高时间分辨率来监控处理器在正常操作时所有电源和接口连接的模拟特性,并通过 监控它的电磁辐射特性来实施攻击。因为单片机是一个活动的电子器件,当它执行不同的指令时,对 应的电源功率消耗也相应变化。这样通过使用特殊的电子测量仪器和数学统计方法分析和检测这些变 化,即可获取单片机中的特定关键信息。 至于 RF 编程器可以直接读出老的型号的加密 MCU 中的程序,就是采用这个原理。 3.过错产生技术 该技术使用异常工作条件来使处理器出错,然后提供额外的访问来进行攻击。使用最广泛的过错 产生攻击手段包括电压冲击和时钟冲击。低电压和高电压攻击可用来禁止保护电路工作或强制处理器 执行错误操作。时钟瞬态跳变也许会复位保护电路而不会破坏受保护信息。电源和时钟瞬态跳变可以 在某些处理器中影响单条指令的解码和执行。 4.探针技术 该技术是直接暴露芯片内部连线,然后观察、操控、干扰单片机以达到攻击目的。 为了方便起见,人们将以上四种攻击技术分成两类,一类是侵入型攻击(物理攻击),这类攻击 需要破坏封装,然后借助半导体测试设备、显微镜和微定位器,在专门的实验室花上几小时甚至几周 时间才能完成。所有的微探针技术都属于侵入型攻击。另外三种方法属于非侵入型攻击,被攻击的单 片机不会被物理损坏。在某些场合非侵入型攻击是特别危险的,这是因为非侵入型攻击所需设备通常 可以自制和升级,因此非常廉价。 大部分非侵入型攻击需要攻击者具备良好的处理器知识和软件知识。与之相反,侵入型的探针攻 击则不需要太多的初始知识,而且通常可用一整套相似的技术对付宽范围的产品。因此,对单片机的 攻击往往从侵入型的反向工程开始,积累的经验有助于开发更加廉价和快速的非侵入型攻击技术。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 227 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 4.9.3 常规芯片解密过程 侵入型攻击的第一步是揭去芯片封装(简称“开盖”有时候称“开封”,英文为“DECAP”, decapsulation)。有两种方法可以达到这一目的:第一种是完全溶解掉芯片封装,暴露金属连线。第二 种是只移掉硅核上面的塑料封装。第一种方法需要将芯片绑定到测试夹具上,借助绑定台来操作。第 二种方法除了需要具备攻击者一定的知识和必要的技能外,还需要个人的智慧和耐心,但操作起来相 对比较方便,完全家庭中操作。 芯片上面的塑料可以用小刀揭开,芯片周围的环氧树脂可以用浓硝酸腐蚀掉。热的浓硝酸会溶解 掉芯片封装而不会影响芯片及连线。该过程一般在非常干燥的条件下进行,因为水的存在可能会侵蚀 已暴露的铝线连接 (这就可能造成解密失败)。 接着在超声池里先用丙酮清洗该芯片以除去残余硝酸,并浸泡。 最后一步是寻找保护熔丝的位置并将保护熔丝暴露在紫外光下。一般用一台放大倍数至少 100 倍 的显微镜,从编程电压输入脚的连线跟踪进去,来寻找保护熔丝。若没有显微镜,则采用将芯片的不 同部分暴露到紫外光下并观察结果的方式进行简单的搜索。操作时应用不透明的纸片覆盖芯片以保护 程序存储器不被紫外光擦除。将保护熔丝暴露在紫外光下 5~10 分钟就能破坏掉保护位的保护作用, 之后,使用简单的编程器就可直接读出程序存储器的内容。 对于使用了防护层来保护 EEPROM 单元的单片机来说,使用紫外光复位保护电路是不可行的。 对于这种类型的单片机,一般使用微探针技术来读取存储器内容。在芯片封装打开后,将芯片置于显 微镜下就能够很容易的找到从存储器连到电路其它部分的数据总线。由于某种原因,芯片锁定位在编 程模式下并不锁定对存储器的访问。利用这一缺陷将探针放在数据线的上面就能读到所有想要的数 据。在编程模式下,重启读过程并连接探针到另外的数据线上就可以读出程序和数据存储器中的所有 信息。 还有一种可能的攻击手段是借助显微镜和激光切割机等设备来寻找保护熔丝,从而寻查和这部分 电路相联系的所有信号线。由于设计有缺陷,因此,只要切断从保护熔丝到其它电路的某一根信号线 (或切割掉整个加密电路)或连接 1~3 根金线(通常称 FIB:focused ion beam),就能禁止整个保护 功能,这样,使用简单的编程器就能直接读出程序存储器的内容。 虽然大多数普通单片机都具有熔丝烧断保护单片机内代码的功能,但由于通用低档的单片机并非 定位于制作安全类产品,因此,它们往往没有提供有针对性的防范措施且安全级别较低。加上单片机 应用场合广泛,销售量大,厂商间委托加工与技术转让频繁,大量技术资料外泻,使得利用该类芯片 的设计漏洞和厂商的测试接口,并通过修改熔丝保护位等侵入型攻击或非侵入型攻击手段来读取单片 机的内部程序变得比较容易。 4.9.4 增加芯片解密难度的一些建议总结 任何一款单片机从理论上讲,攻击者均可利用足够的投资和时间使用以上方法来攻破。这是系统 设计者应该始终牢记的基本原则。因此,作为电子产品的设计工程师非常有必要了解当前单片机攻击 的最新技术,做到知己知彼,心中有数,才能有效防止自己花费大量金钱和时间辛辛苦苦设计出来的 产品被人家一夜之间仿冒的事情发生。根据解密实践提出下面建议: (1)在选定加密芯片前,要充分调研,了解芯片解密技术的新进展,包括哪些单片机是已经确认可 以破解的。尽量不选用已可破解或同系列、同型号的芯片选择采用新工艺、新结构、上市时间较短的 单片机,如可以使用 ATMEGA88PA,这种国内破解的费用一需要 6K 左右,另外相对难解密的有 ST12 系列,dsPIC30F 系列等;其他也可以和 CPLD 结合加密,这样解密费用很高,解密一般的 CPLD 也要 1 万左右。 (2)尽量不要选用 MCS51 系列单片机,因为该单片机在国内的普及程度最高,被研究得也最透。 (3)产品的原创者,一般具有产量大的特点,所以可选用比较生僻、偏冷门的单片机来加大仿冒者 采购的难度,选用一些生僻的单片机,比如 ATTINY2313,AT89C51RD2,AT89C51RC2,motorola 单片 嵌入式专业技术论坛 (www.armjishu.com)出品 第 228 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 机等比较难解密的芯片,目前国内会开发使用熟悉 motorola 单片机的人很少,所以破解的费用也相当 高,从 3000~3 万左右。 (4)在设计成本许可的条件下,应选用具有硬件自毁功能的智能卡芯片,以有效对付物理攻击;另 外程序设计的时候,加入时间到计时功能,比如使用到 1 年,自动停止所有功能的运行,这样会增加 破解者的成本。 (5)如果条件许可,可采用两片不同型号单片机互为备份,相互验证,从而增加破解成本。 (6)打磨掉芯片型号等信息或者重新印上其它的型号,以假乱真(注意,反面有 LOGO 的也要抹掉, 很多芯片,解密者可以从反面判断出型号,比如 51,WINBOND,MDT 等)。 (7)可以利用单片机未公开,未被利用的标志位或单元,作为软件标志位。 (8)利用 MCS-51 中 A5 指令加密,其实世界上所有资料,包括英文资料都没有讲这条指令,其实这是 很好的加密指令,A5 功能是二字节空操作指令加密方法在 A5 后加一个二字节或三字节操作码,因为 所有反汇编软件都不会反汇编 A5 指令,造成正常程序反汇编乱套,执行程序无问题仿制者就不能改变 你的源程序。 (9)你应在程序区写上你的大名单位开发时间及仿制必究的说法,以备获得法律保护;另外写上你的 大名的时候,可以是随机的,也就是说,采用某种算法,外部不同条件下,你的名字不同,比如等, 这样比较难反汇编修改。 (10)采用高档的编程器,烧断内部的部分管脚,还可以采用自制的设备烧断金线,这个目前国内几 乎不能解密,即使解密,也需要上万的费用,需要多个母片。 (11)采用保密硅胶(环氧树脂灌封胶)封住整个电路板,PCB 上多一些没有用途的焊盘,在硅胶中 还可以掺杂一些没有用途的元件,同时把 MCU 周围电路的电子元件尽量抹掉型号。 (12)对 SyncMos,Winbond 单片机,将把要烧录的文件转成 HEX 文件,这样烧录到芯片内部的程序空 位自动添 00,如果你习惯 BIN 文件,也可以用编程器把空白区域中的 FF 改成 00,这样一般解密器也 就找不到芯片中的空位,也就无法执行以后的解密操作。 (13)比较有水平的加密例如:18F4620 有内部锁相环可以利用 RC 震荡产生高精度的时钟,利用上电 时擦除 18F4620 的内部数据,所以导致解密出来的文件根本不能用。 (14) NEC 系列单片机作为日系芯片的代表,单片机中设计了充足的保护措施来保证其程序代码的安 全,同时,该系列单片机没有 PROGRAM READ 功能,因此无法利用编程器将程序读出。(注:用编 程器给芯片编程时的校验功能并不是将程序读出来进行校验,而是编程器将数据送给芯片,由芯片内 核独立完成与存储区数据的比较,然后将比较结果返回给编程器)。 当然,要想从根本上防止单片机被解密,那是不可能的,加密技术不断发展,解密技术也不断发展, 至今不管哪个单片机,只要有人肯出钱去做,基本都可以做出来,只不过代价高低和周期长短的问题, 编程者还可以从法律的途径对自己的开发作出保护(比如专利)。 4.9.5 STM32加密思路-01 串口ISP设置加密 STM32 的加密,最基本的方法是置读保护,这样可以防止外部工具非法访问,在 STM32 官网发 布的 串口 ISP 软件中有置读保护和加密选项,选择一个就可以了,这样外部工具就无法对 FLASH 进 行读写操作,但我要重新烧写 FLASH 怎么办?只能清读保护,而清读保护后,芯片内部会自动擦除 FLASH 全部内容。 4.9.6 STM32加密思路-02 软件加密 在软件里做加密,比如利用 CPU 的唯一的 96 位 ID(请见神舟王 407 的例程“产品唯一身份标识 (Unique Device ID)实验(96 位唯一 ID 实验)”),或者甚至利用网卡的 MAC,如果你说人家反汇编破 解你的程序,那是可以做到的,但是成本没法估算,没人愿意出钱尝试,也就起到保护作用了,软件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 229 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 加密,可以看它的闪存编程手册。 利用 STM32 的 UID 加密,具体程序可以做到比如 main 函数开始的时候,可以加一句: if(UID == 正确的 UID)运行后面代码; else 不理会/运行错误的代码; 这里还可以迷惑对手,可以运行一段的假的代码,模拟产品正常启动的样子,但就是不运行核心 部分的代码,这样可以使得解密人员误认为解密成功了,为对手造成一些经济上的成本。 采用芯片内的唯一 ID 来加密,在程序里识别芯片的 ID,如果 ID 不对,则程序不运行,当然, 这样也是有缺陷的,因为每个芯片的 ID 不一样,因此对应的程序也应该不一样,那如何处理呢?有 人建议说:采购的时候,产品同批生产的 ID 号应该是连续的,可以通过判别 ID 的范围;还有人说, 在烧录工具里做一个算法,读取芯片 ID,再修改相应的二进制文件。当然还会有很多种方法,这里不 展开讨论。 4.9.7 STM32加密思路-03 外置ID芯片 可以考虑外置 ID 芯片,如果成本没有问题,可以考虑增加一颗 CPU,两颗 CPU 相互进行验证, 才执行真正的程序,增加解密的成本和难度,而且这颗芯片可以是不常用的芯片,或者是型号不同的 芯片,这里面很多的想象空间,可以利用产品的特点,来寻找合适的芯片进行处理。 4.9.8 STM32加密思路-04 程序自毁 可以考虑设置某种检测机制,发现异常时程序自毁,比如程序一启动,如果发现芯片某几个管脚 的电平出现变化,比如已经封死的 JTAG 管脚出现了其他异常的电平进入,那么就自毁程序,拷贝一 段 FF 去刷自己的 FLASH,只要覆盖一小段程序就足以让破解者无法成功破解。 这些预先可以根据自身的产品来设置一些场景,出现这些情况就做相应的急救措施。 4.9.9 STM32加密思路-05 磨IC型号 磨掉 IC 的型号,重新打一个错误的上去;还可以在周围的电阻电容上动手脚,打错的值上去, 使得破解成功后,周围的电路有个关键部分的配件的值不对,导致产品运行不正常,增加破解的难度。 4.9.10 STM32加密思路-06 高端硬件加密 目前 STM32 更多高端的芯片增加了硬件的加密,比如 STM32F4XXX 具有个 PDR 寄存器,可以 设置三级加密,如果你代码都写好了,直接设置到 LEVE2,那就 stm32 就下载不进去了,直接封锁死, 暂时没有听说解决办法,以后有没有不清楚。 还有像 STM32F4XXX 推出的 417 系列带哈希加密的,这些都是 ST 厂商提供的一些解决办法, 另外的我们与时俱进进行相应的增加吧。 4.9.11 STM32加密思路-07 AES加密 我们知道,STM32 的内部 FLASH 是用户可编程的,也就是说它支持 IAP,而 IAP 中的 APP 代码 一般是需要开放的,那么只有保证 BOOT 的代码安全,才能确保不被破解。 前面提到,当 IC 置读保护后,外部工具不能访问内部 FLASH,但 CPU 可以访问,破解者完全可 以自已编写一段代码通过 BOOT 下载到 IC 运行,然后在程序中读出你的 BOOT 代码。 所以解决办法就只能加以限制想办法使别人的代码运行不了,才能保证 BOOT 不被读出。 常用的方法是采用加密算法,如 AES;流程如下: APP 代码加密,下载时,在 BOOT 中解密,这样,只有通过正确加密的 APP 代码才能正常的运 行,因此加密的算法就成了你的密钥,而这个是你独有的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 230 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 而且这样做的好处也可以方便客服人员去客户那升级,也为了保证程序的安全;程序分为两部分, 一是 boot 引导程序,二是 app 应用程序部分,产品在出厂时,先用串口 ISP 烧写 boot,烧写的时候置 读保护,写完后,可以用 JLINK 测试了一下,确认程序读不出来,说明 FLASH 保护位有效,没有因 为后面烧写 APP 而清掉。 关键之处到了,为了安全,这里还需要把 APP 程序用 AES 之类的加密,在 BOOT 中解密写到 APP 区,这样就是说 BOOT 部分需要加入一段解密的代码,这样人家拿到你加密后的 APP 也没用。 ST 官方有一个公开源码版本的 bootloader,很稳定,再找个 AES 在 STM32 进行移植,合体变身, 这样一个强大好用的 bootloader 就诞生了;关于 AES 的密码可以由每颗 STM32 都有唯一的 ID 来作为 一个唯一输入进行产生,这样可以直接将加密后的文件交给客户自己去下载也是放心的。 这样 BOOT 代码确保不会被读出,APP 也加密了,这样就是目前最安全的模式。 4.10 STM32低功耗经验总结 4.10.1 STM32低功耗实战项目案例故事(转载) 前两个月在公司做了一个低功耗项目,现在功耗最低 10uA 不到,平均功耗 40uA 左右,算是 达标了。因为是公司产品,就不方便贴代码、原理图了,该产品是一个小模块,可以方便的嵌入到各 种系统里面。跟 NRF2401 类似,是一个读卡器。 做这个项目中间也请了技术支持,因为外围电路芯片的功耗一直降不下来,经过与对方的反复 交流,对方提供了低功耗的测试结果、硬件方案、软件方案,经过修改测试,最终成为我们的产品, 功耗比较满意。 硬件方案选择的是 STM32,外加某公司的读卡芯片。前期完成了读卡等功能的开发,最后一项 开发内容是最艰巨也是最困难的---低功耗。在开发过程中,从硬件设计上不断裁剪元器件,软件上不 断精简代码,功耗最低也都保持在 3-4mA 左右,经过许多努力,才解决问题,解决过程如下。 电路设计上,只用到了一个 LED、串口 1、一个模拟 SPI、一个中断线、一个读卡芯片 RESET 线,硬件上就只剩下这么点东西了,这个时候我采用的是待机模式,使用的是读卡芯片的中断接 PA0 唤醒 STM32,在此之前要先使得读卡芯片进入低功耗、然后 STM32 进入低功耗,这一步完成了,貌 似没什么问题,功耗确实从几十 mA 骤降到 3mA 左右,开始还挺满意的,但是测试厂商提供的样板, 功耗却只有几十 uA,有点郁闷了。为什么会这样? 反复查看硬件、程序,都找不出原因,而且这个时候的工作效果很烂,根本就不能唤醒,所以我 就怀疑是读卡芯片一端低功耗有问题,因为我将 PA0 脚直接短接 VCC,这样就可以产生一个边沿触 发 STM32 唤醒了,但是用读卡芯片无法唤醒,所以我怀疑是读卡芯片的 RESET 脚电平不对,经检查, 确实是因为 RESET 脚加了上拉电阻,读卡芯片是高电平复位,在 STM32 进入待机后,管脚全都浮空 了,导致 RESET 被拉高,一直在复位;我去掉上拉电阻,觉得很有希望解决问题了,但是测试结果 是:有时候能唤醒,有时候不能,我仔细一想难道是因为 STM32 待机后管脚电平不确定,导致读卡 芯片 RESET 脚电平不定,而工作不正常,看样子只有换用其他方案了。后面确实验证了我的想法, 使用 STOP 模式后,唤醒问题引刃而解。 就在关键时刻,芯片原厂火种送炭,送来急需的技术支持资料,一个包含低功耗源代码,赶紧 拿过来测试,先研读下代码,使用的是 STOP 模式,而不是待机模式,使用的是任意外部中断唤醒, 这个时候就相当激动啊,赶快下载测试啊,结果功耗确实降了,但还是有 1mA,跟人家一比多了几十 倍啊。。。 我第一反应是硬件不对,经过测试修改,首先找到第一个原因,读卡芯片 RESET 管脚上拉电阻 又给焊上去了...,拆掉后功耗骤降到几百 uA,还是不行。。 测试过程中,为了去掉 LDO 的干扰,整 板采用 3.3V 供电,但是后面经过测试,LDO 的功耗其实也只有 5uA 不到,这 LDO 功耗值得赞一个; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 231 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 虽然结果还是没达到预期,但是看到了希望,胜利就在眼前啊。 为此我反复看了技术支持提供的程序,发现他们的 STM32 的所有管脚的设置都有所考究:(因为 公司保密原则,代码中删除掉了关于该读卡芯片的前缀信息等) GPIO_InitTypeDef GPIO_InitStructure; /* GPIOA Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* GPIOB Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* GPIOC Periph clock enable */ //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //#################################################### //USART1 Port Set //TXD GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //RXD GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); //RST output pushpull mode GPIO_InitStructure.GPIO_Pin = TRST; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(PORT1, &GPIO_InitStructure); //IRQ input pull-up mode GPIO_InitStructure.GPIO_Pin = TIRQ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(PORT1, &GPIO_InitStructure); //MISO input pull-up mode GPIO_InitStructure.GPIO_Pin = MISO; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 232 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(PORT2, &GPIO_InitStructure); //NSS,SCK,MOSI output pushpull mode GPIO_InitStructure.GPIO_Pin = (NSS|SCK|MOSI); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(PORT2, &GPIO_InitStructure); //############################################################################ //TEST Port set //TESTO input pushpull mode GPIO_InitStructure.GPIO_Pin = TESTO; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(TEST_PORT, &GPIO_InitStructure); //############################################################################ //TEST Port set //TESTI output pushpull mode GPIO_InitStructure.GPIO_Pin = TESTI; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(TEST_PORT, &GPIO_InitStructure); //############################################################################ //LED Port Set //LED output pushpull mode GPIO_InitStructure.GPIO_Pin = LED; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(LED_PORT, &GPIO_InitStructure); //############################################################ GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_ 15); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8| GPIO_Pin_9|GPIO_Pin_10); 嵌入式专业技术论坛 (www.armjishu.com)出品 第 233 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOC, &GPIO_InitStructure); 首先,想 MOSI、SCK、CS、LED、RST 这些管脚应该设置为推挽输出,TXD 设置为复用输出, 而 IRQ、RXD、MISO 设置浮空输入,什么都没接的管脚全都设置为下拉输入,而 TESTI、TESO 我 一直不解是什么东东,开始就没管,而开始的时候 MISO 我也没怎么注意,设置成上拉输入(而不是浮 空输入),反正大部分按照厂家提供的参考,我并没有照搬,测试效果一样,但功耗确是还有 80-90uA, 期间我找了好久没找到原因,给技术支持一看,原来是因为 MISO 没有设置成浮空输入,我是设置成 了上拉输入,上拉电阻一直在消耗大约 40uA 的电流。。。 好吧,这是自己不够细心导致的,以后做低功耗的项目管脚配置是个大问题,不能再这么马虎 了!!! 我将 MISO 设置成浮空输入之后,最低功耗还是有 40+,离 10uA 的最低功耗还有段距离,到 底是为什么呢? 最后我发现,该读卡芯片有个 TESTIN/TESTOUT 管脚,是用来测试用的,出厂后也就用不上了, 我也一直以为这两个脚确实没什么用,就没接;可是我发现厂家提供的样板居然接了这两个脚,但是 厂商也没说这两个脚接或不接会影响功耗啊,抱着试一试的心态,我我把 TESTIN/TESTOUT 两个管 脚接到单片机上进行相应的配置,接下来是见证奇迹的时刻了,功耗居然真的、真的降到 10uA 了。。。。。。。。。。。 此处省略 n 个字 这时候真的很激动,真的很想骂人啊,坑爹的厂家,为什么不给提示说这两个脚不接单片机会 消耗电流呢?(也许是文档里面提到了,但是几百页的文档,还是全英文的,一堆堆的文字,我再看一 遍,确实没有提到这两个管脚会有漏电流。) 项目就这样完工了,中间最重要的是技术支持的强力支持,不然项目不能完工了,这个项目低功 耗 STM32 方面难度不高,主要是读卡芯片上面的低功耗调试起来问题很多,还是人家原厂的出马才 解决了问题,因为众多原因,不能公布该芯片的资料,包括该芯片怎么进入低功耗也无法公开,所以 抱歉~~。 关于 STM32 进入低功耗,我简单的总结了一下: 1.管脚设置,这个很关键,还是跟你电路有关系,外加上拉、下拉电阻切记不能随便加 2.STM32 的 systick clock、DMA、TIM 什么的,能关就全都关掉,STM32 低功耗很简单,关键是外 围电路功耗是关键 3.选择一个低功耗的 LDO,这个项目用到的 LDO 功耗就很不错,静态功耗 10uA 都不到。 4.确定 STM32 设置没问题,进入低功耗有好几种情况可以选择(睡眠、停机、待机),我还是推荐选 择 STOP 模式,这个我觉的比较好是因为可以任意外部中断都可以唤醒,而且管脚可以保留之前的设 置,进入停机模式的代码使用库函数自带的,就一句: PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); 意思是,在进入停机模式之前,也关掉电压调节器,进一步降低功耗,使用 WFI 指令(任意中断 唤醒),但是经过测试,使用 WFE(任事件唤醒)指令效果、功耗一模一样。 最后一步是从 STOP 模式怎么恢复了,恢复其实也很简单,外部中断来了会进入中断函数,然后 STM32 就被唤醒,唤醒还要做一些工作,需要开启外部晶振(当然你也可以选择使用内部自带振荡器)、 开启你需要的外设等等。 总之,低功耗关键我觉得还是在于管脚配置,以及你对于外围电路的掌握。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 234 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 4.10.2 STM32低功耗三种模式 . STM32F10xxx 有三种低功耗模式: ●睡眠模式(Cortex-M3 内核停止,外设仍在运行) ●停止模式(所有的时钟都以停止) ●待机模式(1.8V 电源关闭) 此处主要是一些经验的总结,后面带有一些基础例程,大家可以进一步深入进行熟悉,如果遇到 看不懂的地方,可以先去学习例程代码,然后再回头来查看此处文档。 4.10.3 STM32低功耗需注意的地方 1) 时钟问题: STM32 被唤醒以后的时钟自动切换到内部 HIS RC 振荡器,大家都是知道的,RC 振荡器的精度 是不高的。而且,休眠前对于时钟的设置都是恢复到复位状态,只是时钟这个地方复位,其他的没有。 这也会带来一个问题,可能你休眠前使用的是内部时钟,可是休眠后,时钟却变了,带来的问题就是 UART 和定时器。或许你想不使用 PLL,就是 8M,这样醒来后的时钟 HIS 也是 8M,这样虽然在时钟 上没有差别了,但是时钟却不稳定了。UART 波特率肯定不能太高,否则通信会有问题。 2)醒来时间:这个问题也是个非常大的问题, datasheet 上给出的醒来时间是 7us,这个可能真的不假,但是醒来,不能马上干你的活,为什么。 初始化 IO,你可能问,我不初始化不行吗,回答应该是否定的。因为,如果你想使用低功耗的话,休 眠前 IO 口都应该设置为模拟输入,这样才能达到 datasheet 上的 14uA,但是这样也带来一个问题,那 就是初始化 IO,醒来必须要初始化 IO。如果你还想把时钟切换到外部时钟,耗时会更加长,接近 200ms, 因为 STM32 会等待外部时钟稳定后才能工作,然后还要在重新初始化所有 IO,这个非常的耗时。可 能我只需要醒来 10ms,但是这些活干完就需要 100ms。 3) RTC 唤醒: RTC 这个也是个问题,为什么?大家需要注意的是 RTC 只能使用报警才能唤醒 MCU,秒中断是 不可以唤醒的。并且报警中断必须不停的设置,设置一次只生效一次,中断完了,还需要设置下次中 断的时间。并且还有个问题,报警中断必须等待到秒中断到了之后才能设置,也就是正好秒寄存器更 新了一次的时候设置,这就带来一个问题,等待秒中断。如果睡前还想再能被报警唤醒的话必须重新 设置报警中断,而且设置报警中断的时候需要等到秒中断才能设置新的值。这个等待的时间是不定的。 可能会几百个毫秒。说以要空空的耗费几百个毫秒等到秒中断标志来设置报警中断。可能我的 MCU 只需要执行 10ms 就需要休眠了。还是要空空的耗费掉几百个毫秒 4.11 STM32的中断与事件关系的区别 嵌入式专业技术论坛 (www.armjishu.com)出品 第 235 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志 19 字 样的注释,表示这样的线路共有 19 套。 图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号 1 的芯片管脚进 入,经过编号 2 的边沿检测电路,通过编号 3 的或门进入中断“挂起请求寄存器”,最后经过编号 4 的与门输出到 NVIC 中断控制器;在这个通道上有 4 个控制选项,外部的信号首先经过边沿检测电路, 这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边 沿产生中断,因为选择上升沿或下降沿是分别受 2 个平行的寄存器控制,所以用户可以同时选择上升 沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。 接下来是编号 3 的或门,这个或门的另一个输入是“软件中断/事件寄存器”,从这里可以看出, 软件可以优先于外部信号请求一个中断或事件,既当“软件中断/事 件寄存器”的对应位为“1”时, 不管外部信号如何,编号 3 的或门都会输出有效信号。 一个中断或事件请求信号经过编号 3 的或门 后,进入挂起请求寄存器,到此之前,中断和事件的信号传输通路都是一致的,也就是说,挂起请求 寄存器中记录了外部信号的电平变化。 外部请求信号最后经过编号 4 的与 NVIC 中断控制器发出一 个中断请求,如果中断屏蔽寄存器的对应位为“0”,则该请求信号不能传输到与门的另一端,实现了 中断的屏蔽。 明白了外部中断的请求机制,很容易理解事件的请求机制了。图中红色虚线箭头,标 出了外部事件信号的传输路径,外部请求信号经过编号 3 的或门后,进入编号 5 的与门,这个号 4 的 与门,用于引入事件屏蔽寄存器的控制;最后脉冲发生器把一个跳变的信号转变为一个单脉冲,输出 到芯片中的其它功能模块。 在这张图上我们也可以知道,从外部激励信号来看,中断和事件是没有分别的,只是在芯片内 部分开,一路信号会向 CPU 产生中断请求,另一路信号会向其它功能模块发送脉冲触发信号,其它 功能模块如何相应这个触发信号,则由对应的模块自己决定。在图上部的 APB 总线和外设模块接口, 是每一个功能模块都有的部分,CPU 通过这样的接口访问各个功能模块,这里就不再赘述了。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 236 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 第五章 实战篇(寄存器版本) 5.1 通用输入/输出(GPIO)点灯 5.1.1 管脚特性 z STM32F407ZGT6 总共有 114 个通用输入/输出(GPIO)口 z 每个 I/O 端口位可以自由编程 z I/O 端口寄存器可按 32 位字被访问(不允许半字或字节访问) 5.1.2 GPIO应用领域 1. 通用 I/O 口 2. 驱动 LED 或其他指示器 3. 控制片外器件或片外器件通信 4. 检测静态输入 5.1.3 管脚分配 表 1:端口 A GPIO 管脚描述 管脚名称 类型 描述 PA[12:0] I/O 通用输入/输出 PA0 到 PA12 管脚名称 PB[12:0] 表 2:端口 B GPIO 管脚描述 类型 描述 I/O 通用输入/输出 PB1 到 PB12 管脚名称 PC[15:0] 类型 表 3:端口 C GPIO 管脚描述 描述 I/O 通用输入/输出 PC0 到 PC15 表 4:端口 D GPIO 管脚描述 嵌入式专业技术论坛 (www.armjishu.com)出品 第 237 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 管脚名称 PD[15:0] 类型 描述 I/O 通用输入/输出 PD0 到 PD15 管脚名称 PD[15:0] 表 5:端口 E GPIO 管脚描述 类型 描述 I/O 通用输入/输出 PE0 到 PE15 管脚名称 NRST PB2/BOOT1 JTMS-SWDIO JTCK-SWDIO JTDI JTDO NJTRST 类型 I/O 复位 I/O I/O I/O I/O I/O I/O 描述 5.1.4 GPIO管脚内部硬件电路原理剖析 I/O 接口是一颗微控制器必须具备的最基本外设功能。通常在 ARM 里,所有 I/O 都是通用的,称 为 GPIO(General Purpose Input/Output)。在 STM32 中,每个 GPIO 端口包含 16 个管脚,如 PA 端口 是 PA0~PA15。GPIO 模块支持多种可编程输入/输出管脚,GPIO 模块包含以下特性: 1) 可编程控制 GPIO 中断 ----- 包括屏蔽中断发生 ----- 边沿触发(上升沿、下降沿、双边沿触发) ----- 电平触发(高电平触发、低电平触发) 2) 输入/输出管脚最大可承受 5V 电压 3) 可通过编程控制 GPIO 管脚配置: ----- 弱上拉或弱下拉电阻 ----- 2mA、4mA、8mA 驱动,STM32 芯片管脚驱动最大是 25mA GPIO 管脚可以被配置为多种工作模式,配置不同的模式实际就是内部的驱动电路有不一样,下 面我们分析几种,大家可以从这里了解原理知识: 1. 高阻输入 高阻态是一个数字电路里常见的术语,指的是电路的一种输出状态,既不是高电平也不是低电平, 如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样。 电路分析时高阻态可做开路理解。你可以把它看作输出(输入)电阻非常大。他的极限可以认为 悬空。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。而实际应用上与引脚的 悬空几乎是一样的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 238 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 如上图所示,为 GPIO 管脚在高阻输入模式下的等效结构示意图, 表示 GPIO 管脚;这 是一个管脚的情况,其它管脚的结构也是同样的,输入模式的结构比较简单,就是一个带有施密特触 发输入(Schmitt-triggered input)的三态缓冲器(U1),并具有很高的阻抗。施密特触发输入的作用是 能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。执行 GPIO 管脚读操作 时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。 在不执行读操作时,它可以变成高阻抗的状态,使得外部管脚与内部总线之间是隔离的。 为什么会产生这种高阻抗的管脚设计呢?因为是很多管脚都连在同一根总线上,为了不干扰其他 管脚,当某一个管脚在传送数据的适合,其他管脚配置成高阻抗,就不会干扰正在传送数据的管脚了, 这样可以很多管脚同时共用一根总线,分时复用。 为减少信息传输线的数目,大多数计算机中的信息传输线采用总线形式,即凡要传输的同类信息 都在同一组传输线,且信息是分时传送的。在计算机中一般有三组总线,即数据总线、地址总线和控 制总线。为防止信息相互干扰,要求凡挂到总线上的寄存器或存储器等,它的输入输出端不仅能呈现 0、1 两个信息状态,而且还能产生一种高阻抗状态,即好像它们的输出被开关断开,对总线状态不起 作用,此时总线可由其他器件占用。三态缓冲器即可实现上述功能,它除具有输入输出端之外,还有 一控制端,就像一个开关一样,可以控制使其变成高阻抗状态。 2. 推挽输出 推挽输出可以提高输出功率,能够更好驱动外部的设备;推挽输出的原理:在功率放大器电路中 大量采用推挽放大器电路,这种电路中用两只三极管构成一级放大器电路,两只三极管分别放大输入 信号的正半周和负半周,即用一只三极管放大信号的正半周,用另一只三极管放大信号的负半周,两 只三极管输出的半周信号在放大器负载上合并后得到一个完整周期的输出信号。 推挽放大器电路中,一只三极管工作在导通、放大状态时,另一只三极管处于截止状态,当输入 信号变化到另一个半周后,原先导通、放大的三极管进入截止,而原先截止的三极管进入导通、放大 状态,两只三极管在不断地交替导通放大和截止变化,所以称为推挽放大器。 如上图所示,为 GPIO 管脚在推挽输出模式下的等效结构示意图。U1 是输出锁存器,执行 GPIO 嵌入式专业技术论坛 (www.armjishu.com)出品 第 239 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 管脚写操作时,在写脉冲(WritePulse)的作用下,数据被锁存到 Q 和/Q。T1 和 T2 构成 CMOS 反 相器,T1 导通或 T2 导通时都表现出较低的阻抗,但 T1 和 T2 不会同时导通或同时关闭,最后形成 的是推挽输出。在推挽输出模式下,GPIO 还具有回读功能,实现回读功能的是一个简单的三态门 U2。 注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚 Pin 的状态。 推挽电路是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中,各负责正负半周的波形 放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既 可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。 推挽放大器的输出级有两个“臂”(两组放大元件),一个“臂”的电流增加时,另一个“臂”的 电流则减小,二者的状态轮流转换。对负载而言,好像是 一个“臂”在推,一个“臂”在拉,共同 完成电流输出任务。 3. 开漏输出 开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电 平时电压会拉到上拉电阻的电源电压,如果开漏输出的管脚被上拉了,那么这个管脚将一直默认是输 出高电平的。 一般来说,开漏是用来连接不同电平的器件,匹配电平用的,因为开漏引脚不连接外部的上拉电 阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻,很好的一个优点 是通过改变上拉电源的电压,便可以改变传输电平,比如加上上拉电阻就可以提供 TTL/CMOS 电平 输出等。 如上图所示,为 GPIO 管脚在开漏输出模式下的等效结构示意图。开漏输出和推挽输出相比结构 基本相同,但只有下拉晶体管 T1 而没有上拉晶体管。同样,T1 实际上也是多组可编程选择的晶体管。 开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻)。回 读功能:读到的仍是输出锁存器的状态,而不是外部管脚 Pin 的状态。因此开漏输出模式是不能用来 输入的。 开漏输出的优点是 IC 内部仅需很小的驱动电流就可以了,因为它主要是利用外部电路的驱动能 力,这样可以减少 IC 内部的驱动,并且外部需要什么样的电压,就上拉到相应的电压,需要多大的 电流,也可以通过改变上拉电阻来调节电流,所以开漏输出是非常灵活的一种输出。 4. 钳位二极管(用来保护 GPIO 管脚) GPIO 内部具有钳位保护二极管,如下图所示。其作用是防止从外部管脚 Pin 输入的电压过高或 者过低。VDD 正常供电是 3.3V,如果从 Pin 输入的信号(假设任何输入信号都有一定的内阻)电压 超过 VDD 加上二极管 D1 的导通压降(假定超过 VDD 电压 0.6V 的时候,那么二极管 D1 导通需要 嵌入式专业技术论坛 (www.armjishu.com)出品 第 240 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 0.6V 的压降),则二极管 D1 导通,这样就会把多于的电流引到 VDD,而真正输入到内部的信号电压 不会超过 3.9V(3.3v+0.6v=3.9v)。同理,如果从 Pin 输入的信号电压比 GND 还低,则由于二极管 D2 的作用,会把实际输入内部的信号电压钳制在-0.6V 左右。 假设 VDD=3.3V,GPIO 设置在开漏模式下,外接 10kΩ上拉电阻连接到 5V 电源,在输出“1” 时,我们通过测量发现:GPIO 管脚上的电压并不会达到 5V,而是在 4V 上下,这正是内部钳位二极 管在起作用。虽然输出电压达不到满幅的 5V,但对于实际的数字逻辑通常 3.5V 以上就算是高电平了。 如果确实想进一步提高输出电压,一种简单的做法是先在 GPIO 管脚上串联一只二极管(如 1N4148),然后再接上拉电阻。参见下图,框内是芯片内部电路。向管脚写“1”时,T1 关闭,在 Pin 处得到的电压是 3.3+VD1+VD3=4.5V,电压提升效果明显;向管脚写“0”时,T1 导通,在 Pin 处得到的电压是 VD3=0.6V,仍属低电平。 以上这节就是主要介绍芯片管脚的基本驱动原理,下面开始剖析具体的 STM32 芯片管脚。 5.1.5 STM32的GPIO管脚深入分析 上节我们介绍了芯片管脚实现的硬件原理,以及一个芯片管脚被配置成不同的模式实际是不同的 驱动电路,这些驱动电路可以适用于不同的场合。STM23 的每个 GPIO 引脚都可以由软件配置成输出 (推挽或开漏),输入(带或不带上拉或下拉)或复用的外设功能端口。多数 GPIO 引脚与数字或模拟 的复用外设共用;除了具有模拟输入(ADC)功能的管脚之外,其他的 GPIO 引脚都有大电流通过能 力,这些具体如下 8 种模式: ¾ 1)输入浮空(这个输入模式,输入电平必须由外部电路确定,要根据具体电路,加外部上 嵌入式专业技术论坛 (www.armjishu.com)出品 第 241 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 拉电阻或下拉电阻,可以做按键识别) ¾ 2)输入上拉(打开 IO 内部上拉电阻) ¾ 3)输入下拉(打开 IO 内部下拉电阻) ¾ 4)模拟输入(应用 ADC 模拟输入) ¾ 5)开漏输出(输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于 做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内).能驱动大电流和大电压,LED 就 使用这种模式。) ¾ 6)推挽式输出(可以输出高,低电平,连接数字器件。推挽式输出输出电阻小,带负载能力强) ¾ 7)推挽式复用功能(复用是指该引脚打开 remap 功能) ¾ 8)开漏复用功能(复用是指该引脚打开 remap 功能) 每个 IO 口可以自由编程,单 IO 口寄存器必须要按 32 位 bit 被访问。STM32 的很多 IO 口都是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势,具体哪些 IO 口是 5V 兼容的,可以从 该芯片的数据手册管脚描述章节查到(I/O Level 标 FT 的就是 5V 电平兼容的),我们打开 STM32F407ZGT 的芯片手册,看到 48 页,对 FT 有详细的解释: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 242 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 STM32407 的每个 IO 端口都有 10 个寄存器来控制(这里要注意的是关于芯片硬件管脚的信息可 以通过芯片手册找到资料,有关控制某个管脚寄存器的说明需要参考《STM32F4 用户手册》;我们可 以从手册截图的目录看到 7 个控制 GPIO 管脚的寄存器: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 243 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 他们分别是 3 个端口配置寄存器,一个端口有 0~15 总共 16 个管脚;寄存器分别描述输入和输出 的,类型和速度等。还有一个端口设置/清除寄存器来负责管脚是输出高电平还是低电平,一个端口清 除寄存器和端口配置锁定寄存器。在需要的情况下,I/O 引脚的外设功能可以通过一个特定的操作锁 定,以避免意外的写入 I/O 寄存器,这里我们仅介绍常用的几个寄存器,来完成我们的 LED 灯点灯实 验的操作;在此,我们可以总结一下 STM32 的 IO 控制寄存器的作用: ¾ STM32 的 MODER 寄存器主要是用来设置 IO 管脚的方向 ¾ STM32 的 OTYPER 寄存器主要是用来设置输入、输出类型的 ¾ STM32 的 OSPEEDR 寄存器主要是用来设置速率的 ¾ STM32 的 PUPDR 寄存器主要是用来设置何种驱动模式 ¾ STM32 的 ODR 寄存器是用来控制 IO 口的输出高电平还是低电平 ¾ STM32 的 IDR 寄存器主要是用来存储 IO 口当前的输入状态(高低电平)的。 ¾ STM32 的 BSRR 寄存器主要是用来直接对 IO 端某一位直接进行设置和清除操作,通过这个寄 存器可以方便的直接修改一个引脚的高低电平 ¾ STM32 的 BRR 寄存器用来清除某端口的某一位位 0,如果该寄存器某位为 0,那么它所对应 的那个引脚位不产生影响;如果该寄存器某位为 1,则清除对应的引脚位。 ¾ STM32 的 LCKR 用来锁定端口的配置,当对相应的端口位执行了 LOCK 序列后,在下次系统 复位之前将不能再更改端口位的配置。 下面开始分析常用的四个 32 位配置寄存器 GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR,它们控制着每个 IO 口的模式及输出速率,我们下面来介绍一下四个寄存器,接下 来我们看看寄存器 MODER 的描述,如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 244 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 MODER 寄存器其中第 0、1 位和 4、5 位和 8、9 位和 12、13 位以此类推到 28、29 每两个位为一个组,叫做 MODEy 组;主要功能是设置这个管脚是输入模式,还是输 出模式 接下来我们看看寄存器 OTYPER 的描述,如下图所示: OTYPER 寄存器主要功能是设置具体哪种输入输出的模式;例如如果是管脚输出,那 么要确定是通用推挽输出模式,还是开漏输出模式,还是复用功能推挽输出模式,还是 复用功能开漏输出模式;如果是管脚输入,是模拟输入模式还是浮空输入模式,还是上 拉/下拉输入模式等。接下来我们再看看寄存器 OSPEEDR 的描述,如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 245 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 该寄存器配置的是速率的,如配置为 10 时,GPIO 输入输出的速率为 50MHz,他的偏移地址为: 0*08 接下来我们再看看寄存器 PUPDR 的描述,如下图所示: 该寄存器配置的是输入、输出状态的,如配置为 01 时为上拉输入、输出状态 给个实例,比如我们要设置 PORTF 的 10 位为推挽输出代码如下: GPIOF->MODER &= 0xFFCFFFFF;//清掉这 2 个位原来的设置,同时也不影响其他位的设置 GPIOF->MODER |= 0x00100000; //PF10 输出 GPIOF->OTYPER &= 0xFFFFBFFF; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 246 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 GPIOF->OTYPER |= 0x0000000; GPIOF->OSPEEDR &= 0xFFCFFFFF; GPIOF->OSPEEDR |= 0x00200000; GPIOF->PUPDR &= 0xFFCFFFFF; GPIOF->PUPDR |= 0x0000000; 通过这 3 句话的配置,我们就设置了 PF10 为推挽输出. IDR 是一个 GPIOx_IDR 的端口输入数据寄存器的简称(ODR 是输入数据寄存器的简称),要想知 道某个 IO 口的状态,就要读这个寄存器,再从读出的寄存器值分析出某个管脚位的状态,就可以知 道这个管脚的状态了;IDR 寄存器只用了低 16 位。该寄存器为只读寄存器,并且只能以 16 位的形式 读出。该寄存器各位的描述如下图所示: ODR 是一个端口输出数据寄存器,其作用就是控制端口的输出,对 ODR 对应寄存器位置 1 即对 应的 GPIO 管脚就会输出高电平。该寄存器也只用了低 16 位,并且该寄存器可读可写,如果读的话, 从该寄存器读出来的数据都是 0,所以读是没有意义的;只有写是有效的,该寄存器的各位描述如下 图所示: GPIOx_IDR 是端口的输入数据寄存器,GPIOx_ODR 是端口的输出寄存器,我们配置引脚的输入 嵌入式专业技术论坛 (www.armjishu.com)出品 第 247 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 输出模式是通过 GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR 四个寄存 器来配置的,但是每个端口的 16 个引脚它们有的可能是输出模式,有的是输入模式,甚至一会输出 一会输入,而 GPIOx_IDR 和 GPIOx_ODR 两个寄存器是以字模式(读一次就是访问 2 个字节,一个 字等于 2 个字节)访问而不能以 bit 模式(bit 模式表示一次访问一个 bit 位,一个字节等于 8 个 bit, 一个字等于 16 个 bit)访问,GPIOx_IDR 只能读,而 GPIOx_ODR 可以读写。 关于 GPIO 的输出模式下几种速度的区别:2MHz、10MHz、50MHz;这个又可以理解为输出驱 动电路的不同响应速度(芯片内部在 I/O 口的输出部分安排了多个响应速度不同的输出驱动电路,用 户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动电路模块,达到最 佳的噪声控制和降低功耗的目的)。 那为什么要几种速率呢?如果选择了不合适的速率会有什么影响呢?芯片管脚的速度就好比是 信号收发的频率,速度快就表示信号收发的频率高;如果信号频率为 10MHz,而你配置了 2MHz 的带 宽,那么就会丢失很多数据,很多数据点截取不到,这个 10MHz 的方波很可能就变成了正弦波。这 个就好比是公路的设计时速,汽车速度低于设计时速时,可以平稳的运行,如果超过设计时速就会颠 簸,甚至翻车。 所以芯片管脚的输入输出速率可以理解为,输出驱动电路的带宽,即一个驱动电路可以不失真地 通过信号的最大频率;如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。带宽速 度高的驱动器耗电大、噪声也大,带宽低的驱动器耗电小、噪声也小;比如:高频的驱动电路,噪声 也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的 EMI 性能。当然 如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键 是 GPIO 的引脚速度跟应用匹配,比如: z USART 串口,若最大波特率只需 115.2k,1M 等于 1000k,那用 2MHz 的速度就够了,既省 电也噪声小,STM32 最低的速率是 2MHz,已经可以满足要求了。 z I2C 接口,若使用 400k 波特率,也可以选用 2M 的速度够了;当然若想把余量留大些,可以 选用 10M 的 GPIO 引脚速度。 z SPI 接口,若使用 18M 或 9M 波特率,需要选用 50M 的 GPIO 的引脚速度,我们这里一定要 使得 GPIO 的速度大于外部应用的速度,这好像就是在高速上跑公交车,而不是在田埂上开 赛车。高速上跑公交车,公交车可以开最快的速度,而不怕翻车。 这里提到了波特率,那么什么是波特率呢?波特率是指数据信号对载波的调制速率,它用单位时 间内载波调制状态改变的次数来表示。波特率一次传输一个数据对象,而这个数据对象可能是几个比 特(bit),所以波特率跟比特率是有区别的。 比特率在数字信道中,比特率是数字信号的传输速率,它用单位时间内传输的二进制代码的有效 位(bit)数来表示,其单位为每秒比特数 bit/s(bps)、每秒千比特数(Kbps)或每秒兆比特数(Mbps)来表示(此 处 K 和 M 分别为 1000 和 1000000)。 波特率与比特率的关系为:比特率 = 波特率 X 单个调制状态对应的二进制位数。 5.1.6 在STM32中如何配置片内外设使用的IO端口 首先,一个外设在使用前,必须先配置和激活启动该外设的时钟,比如 GPIO 端口 B,那么就要 激活 GPIOB 的时钟,比如 GPIOA,那么使用 PA2 管脚前,必须要前激活 GPIOA 端口的时钟,只有 启动时钟后,这个外设才变得激活可用。 时钟被启动之后,再根据这个具体功能,对这个外设进行相应的设置和配置,这样的好处是可以 降低 STM32 芯片的内部功耗,因为需要用到的外设才被激活,激活的外设会消耗芯片的比较多的功 耗;不需要使用的外设无需初始化,这样设计可以降低芯片的功耗;好处尤其体现在类似手持设备, 功耗比较小,使得电池更加耐用。 那么如何配置管脚采用哪种模式呢?这里粗略总结对应到外设的输入输出功能基本有三种情况: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 248 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 1)管脚输出:需要根据外围电路的配置选择对应的管脚为复用功能的推挽输出或复用功能的开漏 输出。 2)管脚输入:则根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。 3)ADC 对应的管脚:配置管脚为模拟输入。 值得注意的是,这里如果把端口配置成复用输出功能,则该引脚与它当前连的信号电路断开,和 复用功能信号电路连接,所以将管脚配置成复用输出功能后,如果只激活了该引脚的 GPIO 端口的时 钟,而忘记把复用功能的时钟激活,那么它的输出将不确定,这样会产生异常的现象。 5.1.7 例程01 单个LED点灯闪烁程序 a) 示例简介 LED 灯的正极接的是 3.3V 电源,所以我们编程让 LED 负极拉低即 GPIO 引脚端口 D 的管脚 2 拉低,即 PF10 拉低,那么 LED 灯就会变亮,相关电路图如下图所示: 注意到,这里采用GPIO管脚的低电平点灯,原因是:处理器的GPIO管脚只要输出低电平即可点灯, 处理器功耗低;如果LED的一端固定接到GND地上,那么对于处理器的GPIO管脚点灯时,就必须输出高 电平,这样增加处理器的功耗。同时,大家要注意,在设计LED灯限流时,串接的电阻放置的位置, 有人会问,也可以放在LED的右边。一般,我们不会放在右边,主要是LED灯,人手可能会去触摸到, 这样可能会将人体上的静电引导板件上,如果将电阻放在左边,静电经过电阻后,会消弱很多,以致 不会一下子因为静电就将处理器烧毁。 一般的LED灯需要15~20毫安的电流才可以点亮,我们这里是3.3V的电压,经过1K欧姆的限流电阻, 用3.3V除以1000欧姆,理论值是33毫安的电流,足以点亮LED灯了。当然如果电流如果过大,就会使 得经过的电流变下,LED灯可能点不亮或者比较暗;如果电阻过小,就会导致电流过大,可能烧掉LED 灯,所以这个限流电阻选取也是有个范围的。 b) 调试说明 下载代码,并且按下【复位】键,在神舟王 407 板上找到 LED1,可以看到该 LED1 灯一亮一灭。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 249 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 c) 关键代码: 相关代码如下图程序清单: /************ www.armjishu.com *******/ void Delay(vu32 nCount); int main(void) { /*使能 AHB1 总线的时钟,对 GPIO 的端口 F 时钟使能*/ RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF; /*配置输入输出模式和输入输出的速度*/ GPIOF->MODER &= 0xFFCFFFFF; GPIOF->MODER |= 0x00100000; GPIOF->OTYPER &= 0xFFFFBFFF; GPIOF->OTYPER |= 0x0000000; GPIOF->OSPEEDR &= 0xFFCFFFFF; GPIOF->OSPEEDR |= 0x00200000; GPIOF->PUPDR &= 0xFFCFFFFF; GPIOF->PUPDR |= 0x0000000; /* Infinite loop 主循环 */ while (1) { GPIOF->BSRRL=GPIO_Pin_10; /*熄灭 LED 灯*/ 嵌入式专业技术论坛 (www.armjishu.com)出品 第 250 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 Delay(0x2FFFFF); GPIOF->BSRRH=GPIO_Pin_10; /*点亮 LED 灯*/ Delay(0x2FFFFF); } } void Delay(vu32 nCount) //通过不断 for 循环 nCount 次,达到延时的目的口 { for(; nCount != 0; nCount--); } 看原理图可以知道,因为 LED 的正极接的是 3.3V 电源端,所以当 PF10 管脚拉低成低电平的时 候,LED 灯就会亮起来。 这里要注意的是在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟!!!AHB1ENR 寄存器是 AHB1 总线上的外设时钟使能寄存器,其各位的描述如下: 图:寄存器 AHB1ENR 各位描述 嵌入式专业技术论坛 (www.armjishu.com)出品 第 251 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们要使能的是 PORTF 的时钟使能位,大家可以从上表看得到在 bit5 这个位,只需要将这个位 置 1 就可以使能 PORTF 的时钟了,大家可以跟进去看看下面的这句代码,就能看到具体是设置的是 这个 RCC 寄存器了 #define RCC_AHB1Periph_GPIOD ((uint32_t)0x00000020); 这句代码 2 化成二进制是 0010 刚好是 bit5 的这个位,然后对这个 AHB1ENR 的 GPIOF 端口时钟 置位: RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF 时钟使能 */ /* 使能 AHB1 总线的时钟,对 GPIO 的端口 F 这句代码相当于:RCC->AHB1ENR|= 0x00000020;或上以后使得 AHB1ENR 寄存器的第 bit5 这 个位(从 0 开始,32 位寄存器,bit5 实际是在第 6 位)置 1,刚好是对应的 GPIO 端口 F 的时钟位, 那么 GPIOF 的时钟就被使能了。 对 GPIOF->BRR = GPIO_Pin_10;这句代码来说,我们可以看到 GPIO_Pin_10 的定义如下: #define GPIO_Pin_10 ((uint16_t)0x0400) 对 GPIOF_BSRR 这个寄存器进行赋值,我们看下图: 因为 GPIO_Pin_10 是等于 0x0400,所以 GPIOF_BSRRL 寄存器的 BS10 被置 1,可以看到说明,该位 置 1 后,使得 GPIOF_ODR 寄存器的 ODR10 位就为 1 了, PF10 管脚输出高电平,灯灭(前面分析过, LED 灯是低电平点亮,高电平熄灭,具体原因请见前面的原理图分析)。 因为 GPIO_Pin_10 是等于 0x0400,所以 GPIOF_BSRRH 寄存器的 BR10 被置 1,可以看到说明,该位 置 1 后,使得 GPIOF_ODR 寄存器的 ODR10 位就为 0 了, PF10 管脚输出低电平,灯亮 其中 Delay(0x2FFFFF)是延时函数,所以在这个 while 循环里,LED 灯亮一段时间后,就熄灭一 段时间,周而复始,交替进行。整段代码就都分析完了,至于代码中许多 define 的定义,例如: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 252 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 /********* GPIOF 管脚的内存对应地址 *******/ #define PERIPH_BASE ((uint32_t)0x40000000) #define AHB1PERIPH_BASE (PERIPH_BASE + 0x20000) #define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400) #define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) 可以参看前面的基础入门篇,如何将阅读寄存器的入门章节,这些都是于 STM32 芯片参考手册 里的规定对应的。 更多关于这个寄存器的详细说明大家可以看《STM32F4xx 参考手册》的第 7 章。 5.1.8 例程02 LED双灯闪烁实验 1. 示例简介 LED 灯的正极接的是 3.3V 电源,所以我们编程让 LED 负极拉低即 GPIO 引脚端口 F 的 Pin9 和 Pin10 拉低,即 PF9 和 PF10;那么 LED 灯就会变亮;同样将 PF9 和 PF10 管脚拉高时,LED 就会灭掉;亮和灭各经过一段延时,就会变成闪烁的样子,这里我们编程增加了延时程序,相关 电路图如下图所示: 2. 调试说明 下载代码,并且按下【复位】键,在神舟王 407 板上找到 LED1 和 LED2,可以这 2 个 LED 灯不 停的闪烁。 3. 关键代码 /************ www.armjishu.com *******/ void Delay(vu32 nCount); int main(void) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 253 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 { /*使能 AHB1 总线的时钟,对 GPIO 的端口 F 时钟使能*/ RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF; /*配置输入输出模式和输入输出的速度*/ GPIOF->MODER &= 0xFFCCFFFF; GPIOF->MODER |= 0x00140000; GPIOF->OTYPER &= 0xFFFFBFFF; GPIOF->OTYPER |= 0x0000000; GPIOF->OSPEEDR &= 0xFFCCFFFF; GPIOF->OSPEEDR |= 0x00280000; GPIOF->PUPDR &= 0xFFCCFFFF; GPIOF->PUPDR |= 0x0000000; /* Infinite loop 主循环 */ while (1) { GPIOF->BSRRL=GPIO_Pin_10; /*熄灭 LED 灯*/ GPIOF->BSRRL=GPIO_Pin_9; /*熄灭 LED 灯*/ //GPIOF->BSRR=0x00000400; Delay(0x2FFFFFF); GPIOF->BSRRH=GPIO_Pin_10; /*点亮 LED 灯*/ GPIOF->BSRRH=GPIO_Pin_9; /*点亮 LED 灯*/ //GPIOF->BSRR=0x04000000; Delay(0x2FFFFFF); } } void Delay(vu32 nCount) //通过不断 for 循环 nCount 次,达到延时的目的口 { for(; nCount != 0; nCount--); } 嵌入式专业技术论坛 (www.armjishu.com)出品 第 254 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 5.1.9 例程03 LED三个灯同时亮同时灭 1.示例简介 LED 灯的正极接的是 3.3V 电源,所以我们编程让 PF8、PF9、PF10 三个管脚拉低;那么 LED 灯就会变亮;同样让 PF8、PF9、PF10 三个管脚拉高时,LED 就会灭掉;亮和灭各经过一段延时, 就会变成闪烁的样子,这里我们编程增加了延时程序,相关电路图如下图所示: 2.调试说明 下载代码,并且按下【复位】键,在神舟王 407 号板上找到 LED1、LED2 和 LED3,可以这 3 个 LED 灯不停的闪烁。 3.关键代码 /************ www.armjishu.com *******/ void Delay(vu32 nCount); int main(void) { /*使能 AHB1 总线的时钟,对 GPIO 的端口 F 时钟使能*/ RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF; /*配置输入输出模式和输入输出的速度*/ GPIOF->MODER &= 0xFFCCFFFF; GPIOF->MODER |= 0x00150000; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 255 页,共 771 页 GPIOF->OTYPER &= 0xFFFFBFFF; GPIOF->OTYPER |= 0x0000000; GPIOF->OSPEEDR &= 0xFFCCFFFF; GPIOF->OSPEEDR |= 0x002A0000; GPIOF->PUPDR &= 0xFFCCFFFF; GPIOF->PUPDR |= 0x0000000; ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 /* Infinite loop 主循环 */ while (1) { GPIOF->BSRRL=GPIO_Pin_10; /*熄灭 LED 灯*/ GPIOF->BSRRL=GPIO_Pin_9; /*熄灭 LED 灯*/ GPIOF->BSRRL=GPIO_Pin_8; /*熄灭 LED 灯*/ //GPIOF->BSRR=0x00000400; Delay(0x2FFFFFF); GPIOF->BSRRH=GPIO_Pin_10; /*点亮 LED 灯*/ GPIOF->BSRRH=GPIO_Pin_9; /*点亮 LED 灯*/ GPIOF->BSRRH=GPIO_Pin_8; /*点亮 LED 灯*/ //GPIOF->BSRR=0x04000000; Delay(0x2FFFFFF); } } void Delay(vu32 nCount) //通过不断 for 循环 nCount 次,达到延时的目的口 { for(; nCount != 0; nCount--); } 这里和上面程序不同之处是这里使用 PF8、PF9、PF10 三个管脚来同时控制 LED 灯的一亮一灭。 5.1.10 例程04 LED流水灯程序 1) 示例简介 在STM32神舟王407开发板中,一共有五个LED指示灯,其中一个是电源指示灯,上电就点灯的; 另外四个LED是由四个GPIO管脚控制,当GPIO管脚输出低电平时,对应的LED灯亮;当GPIO管脚输 出高电平时,对应的LED灯灭。 下图为 LED 原理图,其中 GPIO 管脚上串的电阻,主要起限流作用。防止电流过大损坏 LED 和 GPIO 管脚: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 256 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 GPIO管脚与对应的LED灯关系如下: LED灯 LED灯对应的GPIO LED1 PF10 LED2 PF9 LED3 PF8 LED4 PF7 2) 调试说明 下载代码,并且按下【复位】键,在神舟王407板上找到LED1,LED2,LED3和LED4四个灯,可 以看到这四个灯轮流闪烁,流水灯。 3) 关键代码 /************ www.armjishu.com *******/ void Delay(vu32 nCount); int main(void) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 257 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 { /*使能 AHB1 总线的时钟,对 GPIO 的端口 F 时钟使能*/ RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF; /*配置输入输出模式和输入输出的速度*/ GPIOF->MODER &= 0xFFCCFFFF; GPIOF->MODER |= 0x00154000; GPIOF->OTYPER &= 0xFFFFBFFF; GPIOF->OTYPER |= 0x0000000; GPIOF->OSPEEDR &= 0xFFCCFFFF; GPIOF->OSPEEDR |= 0x002A8000; GPIOF->PUPDR &= 0xFFCCFFFF; GPIOF->PUPDR |= 0x0000000; /* Infinite loop ??? */ while (1) { GPIOF->BSRRL=GPIO_Pin_10; /*??LED?*/ Delay(0xFFFFFF); GPIOF->BSRRL=GPIO_Pin_9; /*??LED?*/ Delay(0xFFFFFF); GPIOF->BSRRL=GPIO_Pin_8; /*??LED?*/ Delay(0xFFFFFF); GPIOF->BSRRL=GPIO_Pin_7; /*??LED?*/ Delay(0xFFFFFF); GPIOF->BSRRH=GPIO_Pin_10; /*??LED?*/ Delay(0xFFFFFF); GPIOF->BSRRH=GPIO_Pin_9; /*??LED?*/ Delay(0xFFFFFF); GPIOF->BSRRH=GPIO_Pin_8; /*??LED?*/ Delay(0xFFFFFF); GPIOF->BSRRH=GPIO_Pin_7; /*??LED?*/ 嵌入式专业技术论坛 (www.armjishu.com)出品 第 258 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 Delay(0xFFFFFF); } } void Delay(vu32 nCount) //????for??nCount?,???????? { for(; nCount != 0; nCount--); } 程序主要设计思路就是先将所有 LED 灯逐个经过延时后熄灭,然后再逐个被点亮,如此循环, 形成 LED 流水灯。 5.2 时钟 5.2.1 什么是时钟 从 CPU 的时钟说起。 计算机是一个十分复杂的电子设备。它由各种集成电路和电子器件组成,每一块集成电路中都集 成了数以万计的晶体管和其他电子元件。这样一个十分庞大的系统,要使它能够正常地工作,就必须 有一个指挥,对各部分的工作进行协调。各个元件的动作就是在这个指挥下按不同的先后顺序完成自 己的操作的,这个先后顺序我们称为时序。时序是计算机中一个非常重要的概念,如果时序出现错误, 就会使系统发生故障,甚至造成死机。那么是谁来产生和控制这个操作时序呢?这就是“时钟”。“时 钟”可以认为是计算机的“心脏”,如同人一样,只有心脏在跳动,生命才能够继续。不要把计算机 的“时钟”等同于普通的时钟,它实际上是由晶体振荡器产生的连续脉冲波,这些脉冲波的幅度和频 率是不变的,这种时钟信号我们称为外部时钟。它们被送入 CPU 中,再形成 CPU 时钟。不同的 CPU, 其外部时钟和 CPU 时钟的关系是不同的,下表列出了几种不同 CPU 外部时钟和 CPU 时钟的关系。 CPU 时钟周期通常为节拍脉冲或T周期,它是处理操作的最基本的单位。 在微程序控制器中,时序信号比较简单,一般采用节拍电位——节拍脉冲二级体制。就是说它只 要一个节拍电位,在节拍电位又包含若干个节拍脉冲(时钟周期)。节拍电位表示一个CPU周期的 时间,而节拍脉冲把一个CPU周期划分为几个叫较小的时间间隔。根据需要这些时间间隔可以相等, 也可以不等。 指令周期是取出并执行一条指令的时间。 指令周期常常有若干个CPU周期,CPU周期也称为机器周期,由于CPU访问一次内存所花 费的时间较长,因此通常用内存中读取一个指令字的最短时间来规定CPU周期。这就是说,这就是 说一条指令取出阶段(通常为取指)需要一个CPU周期时间。而一个CPU周期时间又包含若干个 时钟周期(通常为节拍脉冲或T周期,它是处理操作的最基本的单位)。这些时钟周期的总和则规定 了一个CPU周期的时间宽度。 5.2.2 STM32的时钟 系统时钟的选择是在启动时进行,复位时内部 16MHZ 的 RC 振荡器被选为默认的 CPU 时钟,随 后可以选择外部的、具失效监控的 4-26MHZ 时钟;当检测到外部时钟失效时,它将被隔离,系统将 自动地切换到内部的 RC 振荡器。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 259 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL,它们都是时钟所提供的来源: — HSI 是高速内部时钟,RC 振荡器,频率默认为 16MHz,可以从 STM32 时钟树中看到 — HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 3MHz~25MHz, 时钟树的截图如下: — LSI 是低速内部时钟,RC 振荡器,频率为 32kHz,可以用于驱动独立看门狗和通过程序选择驱动 RTC(RTC 用于从停机/待机模式下自动唤醒系统),时钟树的截图如下: — LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体,也可以被用来驱动 RTC,时钟树的截图 如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 260 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 — PLL 为锁相环输出,其时钟输入源可选择为 HSI、HSE 和 PLLCLK。,但是其输出频率最大不得超 过 72MHz,时钟树的截图如下: 5.2.3 STM32的时钟深入分析 众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部 晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散 流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端 8 嵌入式专业技术论坛 (www.armjishu.com)出品 第 261 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 位单片机诸如 51,AVR,PIC 等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受 用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态(假设单片机处于正常工作 的状态)。比如 51 单片机使用典型的 12MHz 晶振作为时钟源,则外设如 IO 口、定时器、串口等设备 的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。 而 STM32 微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有 固定的关系,下面来详细解析 STM32 微控制器的时钟树。下图是 STM32 微控制器的时钟树: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 262 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 下表是结合图表明出来的: 标号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 释义 内部低速振荡器(LSI,40Khz) 外部低速振荡器(LSE,32.768Khz) 外部高速振荡器(HSE,3-25MHz) 内部高速振荡器(HSI,8MHz) PLL输入选择位 RTC时钟选择位 PLL1分频数寄存器 PLL1倍频寄存器 系统时钟选择位 USB分频寄存器 AHB分频寄存器 APB1分频寄存器 AHB总线 APB1外设总线 APB2分频寄存器 APB2外设总线 ADC预分频寄存器 ADC外设 PLL2分频数寄存器 嵌入式专业技术论坛 (www.armjishu.com)出品 第 263 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 20 PLL2倍频寄存器 21 PLL 时钟源选择寄存器 22 独立看门狗设备 23 RTC 设备 在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部 8MHz 晶振作为 STM32 的时钟输入源(这也是最常见的一种做法),则这个 8MHz 便是“主干”,而“分支”很显然是 最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”: 3——5——7——21——8——9——11——13 对此条时钟路径做如下解析:   对于 3,首先是外部的 3-25MHz(前文已假设为 8MHz)输入;   对于 5,通过 PLL 选择位预先选择后续 PLL 分支的输入时钟(假设选择外部晶振);   对于 7,设置外部晶振的分频数(假设 1 分频);   对于 21,选择 PLL 倍频的时钟源(假设选择经过分频后的外部晶振时钟);   对于 8,设置 PLL 倍频数(假设 9 倍频);   对于 9,选择系统时钟源(假设选择经过 PLL 倍频所输出的时钟);   对于 11,设置 AHB 总线分频数(假设 1 分频);   对于 13,时钟到达 AHB 总线; 在上一章节中所介绍的 GPIO 外设属于 APB2 设备,即 GPIO 的时钟来源于 APB2 总线,同样在 上图中也可以寻获 GPIO 外设的时钟轨迹: 3——5——7——21——8——9——11——15——16   对于 3,首先是外部的 3-25MHz(前文已假设为 8MHz)输入;   对于 5, 通过 PLL 选择位预先选择后续 PLL 分支的输入时钟(假设选择外部晶振);   对于 7,设置外部晶振的分频数(假设 1 分频);   对于 21,选择 PLL 倍频的时钟源(假设选择经过分频后的外部晶振时钟);   对于 8,设置 PLL 倍频数(假设 9 倍频);   对于 9,选择系统时钟源(假设选择经过 PLL 倍频所输出的时钟);   对于 11,设置 AHB 总线分频数(假设 1 分频);   对于 15,设置 APB2 总线分频数(假设 1 分频)   对于 16,时钟到达 APB2 总线; 现在来计算一下 GPIO 设备的最大驱动时钟速率(各个条件已在上述要点中假设): 1) 由 3 所知晶振输入为 8MHz,由○5——○21 知 PLL 的时钟源为经过分频后的外部晶振时钟, 并且此分频数为 1 分频,因此首先得出 PLL 的时钟源为:8MHz / 1 = 8MHz。 2) 由 8、9 知 PLL 倍频 9,且将 PLL 倍频后的时钟输出选择为系统时钟,则得出系统时钟为 8MHz * 9 = 72MHz。 3) 时钟到达 AHB 预分频器,由 11 知时钟经过 AHB 预分频器之后的速率仍为 72MHz。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 264 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 4) 时钟到达 APB2 预分频器,由 15 经过 APB2 预分频器后速率仍为 72MHz。 5) 时钟到达 APB2 总线外设 上面是原理的剖析,如果再不明白的,可以接下来看例程代码,理论联系实践是最好的老师。 5.2.4 例程01 STM32芯片32MHZ频率下跑点灯程序 5 示例简介 让点灯程序在时钟主频 32MHz 下面运行,LED 灯的正极接的是 3.3V 电源,所以我们编程让 LED 负极拉低即 GPIO 引脚端口 D 的管脚 2 拉低,即 PD2 拉低,那么 LED 灯就会变亮,相关电路图 如下图所示: 6 调试说明: 下载代码,并且按下【复位】键,在神舟王 407 板上找到 LED2,可以看到该 LED1 灯一亮一灭。 7 关键代码: /*************** 程序总共 2 部分之第 1 部分 时钟频率的配置 {开始 *********************************/ /************ www.armjishu.com *******/ int main(void) { /**** 程序总共 2 部分之第 1 部分 时钟频率的配置 ********************/ /***** 以下是关于 RCC 时钟 详细请见《STM32F20XXX 参考手册》5.3 节 RCC 寄存器描述 *******/ unsigned char sws = 0; RCC->CR |= 0X00010000; //使能外部高速时钟 HSEON while(!(RCC->CR>>17)); //将 RCC_CR 寄存器的值右移 17 位,等待 HSERDY 就绪,即外部 时钟就绪 嵌入式专业技术论坛 (www.armjishu.com)出品 第 265 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们在这里,因为 STM32 神舟王 407 开发板上的晶振是 25MHZ 的,我们先 25 分频,再 128 倍频,再 4 分频,输出就能达到 STM32 的 32MHZ 工作频率,分别先后用到了,PLLCFGR 中的 0-5 位、6-14 位、16-17 位。*/ RCC->PLLCFGR |= 0x19; //25 分频 RCC->PLLCFGR |=0x1<<13; //128 倍频 RCC->PLLCFGR |=0x1<<16; //4 分频 FLASH->ACR|=0x1; //CPU 和 FLASH 的频率不一样,所以需要等待 RCC->CR |= 1<<24; //将 PLL 使能 while(!(RCC->CR>>25)); //监控寄存器 CR 的 PLLRDY 位,等待 PLL 时钟就绪 RCC->CFGR |= 1<<1; //将时钟切换寄存器配置成用 PLL 输出作为系统时钟 while(sws != 0x2) //等待 CFGR 寄存器的 2,3 位为 10,系统正式切换到了 PLL 输出作为时 钟 { sws = RCC->CFGR>>2; // 将 CFGR 寄存器右移 2 位,将 2,3 位 SWS 状态移出来, // 详情请见《STM32F20XXX 参考手册》97 页 sws &= 0x3; 为了判断 sws 是不是为 10 //这里的 0x3 为二进制的 11,这个 whlie 循环设计的一个算法, } /*************** 程序总共 2 部分之第 1 部分 时钟频率的配置 结束 *********************************/ /*使能 AHB1 总线的时钟,对 GPIO 的端口 F 时钟使能*/ RCC->AHB1ENR |= RCC_AHB1Periph_GPIOF; /*配置输入输出模式和输入输出的速度*/ GPIOF->MODER &= 0xFFCFFFFF; /*模式*/ GPIOF->MODER |= 0x00100000; GPIOF->OTYPER &= 0xFFFFBFFF; /*类型*/ GPIOF->OTYPER |= 0x00000000; GPIOF->OSPEEDR &= 0xFFCFFFFF; /*速度*/ 嵌入式专业技术论坛 (www.armjishu.com)出品 第 266 页,共 771 页 GPIOF->OSPEEDR |= 0x00200000; GPIOF->PUPDR &= 0xFFCFFFFF; GPIOF->PUPDR |= 0x0000000; ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 /* Infinite loop 主循环 */ while (1) { GPIOF->BSRRL=GPIO_Pin_10; /*熄灭 LED 灯*/ Delay(0x1FFFFFF); GPIOF->BSRRH=GPIO_Pin_10; /*点亮 LED 灯*/ Delay(0x1FFFFFF); } } /** 程序总共 2 部分之第 2 部分 点灯的配置 结束} **/ 这个例程主要是体现在如何设置时钟,点灯的代码和原理图都在通用输入/输出的 GPIO 章节详细 说明了。 STM32 的时钟源有几种,有内部的 RC,也有外部的晶振,该选择哪种,代码里通过语句:RCC->CR |= 0X00010000;使能外部的晶振,那么 CR 这个寄存器全称叫做 STM23 的时钟控制寄存器,在 《STM32F20xxx 参考手册》的 91 页可以看到 RCC_CR 寄存器: 再分析一下 RCC->CR |= 0X00010000 这个语句 16 进制 0x00010000 换成二进制,是第 17 位为 1, 其他 31 个位都为 0,寄存器是从 0 开始,就是 16 位 置位 嵌入式专业技术论坛 (www.armjishu.com)出品 第 267 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 可以看到对 HSE ON 置位就是把外部的高速时钟使能,CPU 所需要的时钟是从外部获取;然后接下继 续看另外一句代码:while(!(RCC->CR>>17)),在 while 循环里,如果为 1,while 就会一直循环,如果 为 0 的话 while 就会继续执行;while 循环里还有!取反的操作,所以这句代码的意思三个是让 while 循环等到 CR 的第 17 位变成 1 才往下执行,那么看下第 17 位是什么,翻到《STM32F4xx 参考手册》 的对应寄存器章节: 可以看到上图,第 17 位置 1 表示外部的高速时钟就绪好了,晶振起振稳定,CPU 从外部晶振稳定的 获取时钟。 接下来,就是操作一个叫做 RCC_PLLCFGR 寄存器,这个寄存器主要负责内部时钟的分频和倍频。 分频就相当于是除法,比如 25M 的主频,25 分频后就是 1M 了;倍频就是加入输入进来是 1M 主频, 经过 128 倍频后就是乘以 128 倍,等于 128M 了,所以倍频就相当于是乘,这是一个非常重要的寄存 器。 这个寄存器是用来配置 PLL 时钟输出。下面来分析我们如何操作这个寄存器的: 1) RCC->PLLCFGR |= 0x19; //25 分频 2)RCC->PLLCFGR |=0x1<<13; //128 倍频 3)RCC->PLLCFGR |=0x1<<16; //4 分频 嵌入式专业技术论坛 (www.armjishu.com)出品 第 268 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 第 1 句代码是设置 PLLCFGR 的 PLLM(0-5 位)。0x19 化为二进制为:0001 1001=25。可以看出刚 好分频了 25 倍。 第 2 句代码是设置 PLLCFGR 的 PLLN(6-14 位),由下图可以看出,它只能半字节或一个字节操作。二 进制 0100 0000 0 刚好等于 128。代码 0x1<<13 就是将第 bits13 置 1,倍频 128 倍。 第 2 句代码是设置 PLLCFGR 的 PLLP(16-17 位), 代码 RCC->PLLCFGR |=0x1<<16; 就是 4 分频的意 思了。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 269 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 这个寄存器主要负责配置 STM32 内部总线上的一些时钟参数,比如时钟切换状态(可以知道目前 哪个时钟作为系统时钟,比如有内部的时钟,也有外部的),这个寄存器还负责 STM32 时钟内部总线 的配置,比如 APB1 时钟总线,APB2 时钟总线是怎么分频(有几种分频方式,例如不分频,2 分频, 4 分频,8 分频,16 分频等);还有 RTC 的分频等;可以看到这个寄存器完成了许多的功能,下面来 分析我们如何操作这个寄存器的: RCC->CFGR |= 1<<1; 这句代码表示将时钟切换到外部时钟,都设置好之后,通知 STM32 的芯片可以将系统的时钟切换 给外部晶振提供时钟了: 程序代码选择的是外部的 HSE 提供时钟;可以从下图看到,RCC_PLLCFGR 寄存器里的 PLLM, 程序代码里配置的是 25 分频,如果这里外部晶振是 25MHz 的,25 倍频后就是 1MHz 的频率。 RCC_PLLCFGR 寄存器里的 PLLN,程序代码里配置的是 128 倍频,1MHz 的 128 倍为 128MHz。 RCC_PLLCFGR 寄存器里的 PLLP,程序代码里配置的是 4 分频,128MHz 的 4 分频为 32MHz。程 序里选择的是 PLLCLK,这个来自 HSE 外部晶振然分频,倍频,再分频后的时钟做为整个 STM32 芯 片的主时钟。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 270 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 上图上面已经经过详细分析了,接下来就是一个 while(sws != 0x2)循环 while(sws != 0x2) { sws = RCC->CFGR>>2; sws &= 0x3; } 上面的代码是将 RCC_CFGR 寄存器右移 2 位后,在与上 0x3 相当于与上二进制的 11,最低两位是 1, 其他高位都是 0;这样的意思就是把 SWS 这个系统时钟切换状态的值单独截取出来,然后用 while(sws != 0x2)语句一直等待 SWS 的值为 0x2,0x2 化成二进制是 10,就是 PLL 输出作为系统时钟, 下图可以知道: 那么这里就奇怪了,为什么不是 HSE 的晶振作为系统时钟呢?而是采用 PLL,因为我们可以看到, 嵌入式专业技术论坛 (www.armjishu.com)出品 第 271 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们在代码里设置的就是走左边这张图的配置路线,因为把外部的晶振进行分频和倍频了的,也有右 边这种选择,只是这个例程我们在代码里没有这么设计,以后大家可以这样设计: 最后代码配置好了,就开始点灯程序,具体细节请见代码,因为上一章节已经有详细分析。 5.2.5 例程02 STM32芯片40MHZ频率下跑点灯程序 1. 示例简介 让点灯程序在时钟主频 40MHz 下面运行,其他不变,同上个例程一样,唯一的改变就是把主频从 32MHz 改成 40MHz 了。 2. 调试说明: 下载代码,并且按下【复位】键,在神舟王 407 开发板上可以看到该 LED 灯一亮一灭。 3. 关键代码: 查看 RCC_PLLCFGR 寄存器的第 6~14 位的 PLLN。 关键代码的改变与上面一模一样,唯一的改变就是将 RCC->PLLCFGR |=0x1<<13; //128 倍频; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 272 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 变成了 RCC->PLLCFGR |=0x5<<11; //160 倍频;这句不同 5.2.6 例程03 STM32芯片72MHZ频率下跑点灯程序 1.示例简介 让点灯程序在时钟主频 72MHz 下面运行,其他不变,同上个例程一样,唯一的改变就是把主频从 40MHz 改成 72MHz 了。 2.调试说明: 下载代码,并且按下【复位】键,在神舟王 407 开发板上可以看到该 LED 灯一亮一灭。 4. 关键代码: 查看 RCC_PLLCFGR 寄存器的第 6~14 位的 PLLN。 关键代码的改变与几乎上面一模一样,唯一的改变就是将 RCC->PLLCFGR |=0x5<<11;变成了 RCC->PLLCFGR |=0x48<<7; //144 倍频。然后把 4 分频改为 2 分频,这两句不同。 5.3 独立按键 5.3.1 按键的分类 目前,按键有多种形式。有机械接触式,电容式,轻触式等。 1. 按制作工艺分: 硬板按键:带弹簧的按键焊接在印刷电路板上 软板键盘:以导电橡胶作为接触材料放在以聚脂薄膜作为基底的印刷电路上所形成的按键。 2. 按工艺原理分: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 273 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 可以将键盘分为编码键盘和非编码键盘,编码键盘的键盘电路内包含有硬件编码器,当按下某— 个键后,键盘电路能直接提供与 该键相对应的编码信息,例如 ASCII 码。 非编码键盘的键盘电路中 只有较简单的硬件,采用软件来识别按下键的位置,并提供与按下 键相对应的中间代码送主机,然 后由软件将中间代码转换成相应的字符编码,例如 ASCII 码;非编码键盘主要靠软件编程来识别的, 在单片机组成的各种系统中,用的较多的是非编码键盘。非编码键盘又分为独立键盘和行列式(又称 矩阵式)键盘。 5.3.2 按键属性 键盘实际上就是一组按键,在单片机外围电路中,通常用到的按键都是机械弹性开关,当开关闭 合时,线路导通,开关断开时,线路断开,下图是几种单片机系统常见的按键: 弹性小按键被按下时闭合,松手后自动断开;自锁式按键按下时闭合且会自动锁住,只 有再次按下时才弹起断开。 单片机的外围输入控制用小弹性按键较好,单片机检测按键的原理是:单片机的 I/O 口既可作为 输出也可作为输入使用,当检测按键时用的是它的输入功能,我们把按键的一端接地,另一端与单片 机的某个 I/O 口相连,开始时先给该 I/O 口赋一高电平,然后让单片机不断地检测该 I/O 口是否变为 低电平,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电平,程序一旦检测到 I/O 口 变为低电平则说明按键被按下,然后执行相应的指令。 从上图可看出,理想波形与实际波形之间是有区别的,为什么呢?因为实际波形在按下和释放的 瞬间会有抖动现象出现,这是因为通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时, 由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。 因而在闭合及断开的瞬间均伴随有一连串的抖动,抖动时间的长短和按键的机械特性有关,一般为 5~ l0ms。为了不产生这种现象而作的措施就是按键消抖。通常我们手动按下键然后立即释放,这个动作 中稳定闭合的时间超过 20ms。因此单片机在检测键盘是否按下时都要加上去抖动操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 274 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。按键的消抖,可用硬件或软件 两种方法,硬件的去抖主要是用专用的去抖动电路,也有专用的去抖动芯片;另外一种方式就是用软 件延时的方法就能很容易解决抖动问题,而没有必要再添加多余的硬件电路。所以软件消抖适合按键 比较多的情况,而硬件消抖适合按键比较少的情况。 如果按键较多,就用软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms 的延时, 让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测 到按键释放后,也要给 5ms~10ms 的延时,待后沿抖动消失后才能转入该键的处理程序,这样就靠软 件模拟整个按键的过程,控制只取最稳定的那个按键状态。 实现方法:一般来说,软件消抖的方法是不断检测按键值,直到按键值稳定。假设检测到按键按 下之后,为了避免检测到很多的抖动,可以先延时 5ms~10ms,再次检测,如果按键还被检测按下, 那么就认为有一次按键输入(因为如果不避开抖动的话,会有很多次按键输入信号出现,通过去抖, 模拟人的按下的过程和时间,按下和松开按键实际也占用了 20ms 以上的时间,记录正确的按键次数。 5.3.3 STM32的位带操作 1. 什么是位带操作 还记得 51 单片机吗? 单片机 51 中也有位的操作,以一位(BIT)为数据对象的操作;例如 51 单片机可以简单的将 P1 端口的第 2 位独立操作,P1.2=0 或者 P1.2=1,就是这样把 P1 口的第三个脚 (bit2)置 0(输出低电平)或者置 1(输出高电平)。 而现在 STM32 的位段、位带别名区这些就是为了实现这样的功能,可以在 SRAM、I/O 外设空间 实现对这些区域的某一位的单独直接操作。 2. 为什么要用位带操作? 那么 51 单片机中间不是有位的操作吗,而 STM32 为什么要提出位带的操作呢?首先,这里不得 不提一个事情就是 STM32 的内部区域访问只能是 32 位的字,不能是字节或者半字,这部分 STM32 在神舟开发板手册的 GPIO 章节中提到过;而 51 单片机里一个 bit(一个字节等于 8 个 bit,一个字是 32 个 bit)。这个是 STM32 的特点决定的,所以 STM32 使用一种新型的方式来解决这个问题,设计 一个办法来解决用一次访问 32bit 的这样的操作达到 51 单片机那种只访问一个 bit 的效果。 3. 如何设计和实现位带操作的? 从编程者这个角度来说,我们操作的对象是一个一个的 bit 位,而对于 STM32 来说,它内内部只 能是 32 位 bit 每次的访问。如果要实现这个技术,必须要做一个映射,也就是从 1 个 bit 映射到 32 个 bit,就是用 STM32 内部的一次访问(32 个 bit)来代表编程者认为的 1 个 bit。 那 STM32 内部是如何解决的呢?它是在支持位带操作的地方,取个别名区空间,而这个别名区空 间可以让一次 32 位来进行访问,对这个别名进行操作就相当于对 SRAM 或者 I/O 存储空间中的位(1 个寄存器里的位就是 1 个 bit,1 个 bit 最后对应别名区空间的 32 个位,因为 STM32 芯片内部只能是 32 位去访问)进行操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 275 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 这样呢,1MB SRAM 就可以 32M 个对应别名区空间,就是 1 位膨胀到 32 位(1bit 变为 1 个字); 我们对这个别名区空间开始的某一字操作,置 0 或置 1,就等于它映射的 SRAM 或 I/O 相应的某地址 的某一位的操作。 4. STM32 中位带操作的具体部署情况是 支持位带操作的两个内存区的范围是: 序号 支持位带操作的两个内存区的范围 1 SRAM 区中的最低 1MB: 0x2000_0000-0x200F_FFFF 2 片上外设区中的最低 1MB: 0x4000_0000-0x400F_FFFF 下面是内部空间映射图: 对应的别名区空间范围 SRAM 所对应的别名区 32MB 空间: 0x2200_0000-0x23FF_FFFF 片上外社区所对应的别名区 32MB 空间: 0x4200_0000-0x43FF_FFFF 嵌入式专业技术论坛 (www.armjishu.com)出品 第 276 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 例如:SRAM 区中的最低 1MB 空间中的 0x2000_0000 的 8 个 bit,分别对应如下: 地址 对应的 bit 位 别名空间 Bit 对应的别名空间 0x2000_00000 Bit1 0x2200_0000 跨度一个字 = 4 个字节 = 32 个 bit Bit2 0x2200_0004 跨度一个字 = 4 个字节 = 32 个 bit Bit3 0x2200_0008 跨度一个字 = 4 个字节 = 32 个 bit Bit4 0x2200_000C 跨度一个字 = 4 个字节 = 32 个 bit Bit5 0x2200_0010 跨度一个字 = 4 个字节 = 32 个 bit Bit6 0x2200_0014 跨度一个字 = 4 个字节 = 32 个 bit Bit7 0x2200_0018 跨度一个字 = 4 个字节 = 32 个 bit Bit8 0x2200_001C 跨度一个字 = 4 个字节 = 32 个 bit 可以看到上表和上图,0x2000_0000 中的一个 bit 位对应了别名区的一个 32 位的字,也就是说 STM32 芯片的内部寄存器的任意一个位,都其实对应的是别名区的 32 个位。 5. 如何用代码与位带操作挂钩 在 STM32 中,一个寄存器是 32 位的,32 个 bit 中的任意其中一个 bit 所对应的别名空间 到底该如何访问呢?首先分为两种情况,一种是在 SRAM,一种是在 FLASH 中,两个别名 空间的起地位置是不同的,SRAM 是从 0x2200_0000 开始,而 FLASH 是从 0x4200_0000 开 始。 假如在 SRAM 中的一个寄存器的地址是 A,访问寄存器 A 中的第 n 个 bit 位。那么该如 何计算呢?我们知道 SRAM 中别名区的起始地址是 0x2200_0000 对应 SRAM 中实际寄存器 地址 0x2000_0000,SRAM 中每 1 个 bit,都会对应别名区中的 32 个 bit,那么实际地址的公 式应该如下: 0x2200_0000 + (SRAM 实际寄存器地址偏移 0x2000_0000 的 bit 数)* 4 因为 0x2200_0000 这个地址每增加 1,实际上就是增加 8 个 bi(t 一个地址对应一个字节), 实际寄存器中的 1 个 bit 对应 32 个 bit,所以就乘以 4,地址本身增加 1 是 8bit,8bit 乘以 4 倍刚好是 32bit。 那么接下来” SRAM 实际寄存器地址偏移 0x2000_0000 的 bit 数”该如何计算呢? 嵌入式专业技术论坛 (www.armjishu.com)出品 第 277 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 对,用寄存器的地址减去这个基地址,然后在乘以 8(因为一个地址对应 8 个 bit),所以就 可以得到以下的公式: (A‐0x20000000)*8 以上这个公式可以知道实际寄存器离基地址有多少个 bit 的距离,访问该寄存器的第 n 个 bit 位还必须加上一个 n,就变成以下的公式: (A‐0x20000000)*8+n 好了,最后整理整个换算公式如下,FLASH 与 SRAM 的原理都是想通的: SRAM :0x22000000 +((A‐0x20000000)*8+n)*4 FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 6. 举例说明: 比如我要访问如下寄存器 GPIOF_BSRR 中的第 12bit 位 BS13,注意因为寄存器内部是从 0 开始计 数到 31 截止,所以第 12bit 相当于是第 13。 可以从下图看到,GPIO 端口 F 的起始地址是 x04002_1400,GPIOF_BSRR 寄存器的偏移地址是 0x10,访问的第 12bit 位的 BS13。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 278 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 那么通过公式: FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 换算 0x4200_0000 + ((0x40011400-0x40000000)*8 + 12)*4 = 实际地址 在这里我们就不具体计算了,SRAM 访问也是同理 7. 如何将理念转化成代码: 由上面几节得出,SRAM 和 FLASH 中别名区的寻址公式如下: SRAM :0x22000000 +((A‐0x20000000)*8+n)*4 FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 可以看到 0x2200_0000 和 0x4200_0000 都共同有个 x200_0000 这个数值;乘以 8 相当于再加上外 面的那个乘以 4,总共是乘以 32,而 n 是乘以 4;乘以 32 相当于是数值向左移 5 位,乘以 4 相当于向 左边移 2 位。 尝试将如下公式化成 #define BITBAND(addr,bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 这样就可以用 BITBAND(addr,bitnum)来表示寄存器里的任何一个 bit 位,大概原理讲到这里, 具体使用方法通过例程来体现。 5.3.4 例程01 STM32芯片按键点灯(无防抖) 1. 示例简介 通过连上 PA0 管脚的按键,学会如何从 PA0 管脚读入一个输入,如何配置 GPIO 口成输入状 态;当 PA0 获取到输入的数据,STM32 对 LED 灯的状态进行取反。按键 KEY1 是一端连接了 GND, 一端连接了 PA0 管脚;当按键按下时,PA0 管脚的电平值被拉低,相关电路图如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 279 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 2.调试说明: 按下 PA5 管脚所连的按键(按钮 1),每按一次,LED 灯会由亮变灭,或者又灭变亮,因为没有 防抖代码(下个例程会增加),会发现,有时候按下去,灯会亮灭好几次。 3.关键代码: int main(void) //main 是程序入口 { unsigned int key_up =1; RCC_init(); //初始化配置时钟频率为 72MHZ LED_init(); //LED 初始化配置 Key_init(); //初始化控制按键的 PC4 端口 while (1) { if(key_up) LEDON; else LEDOFF; // 开灯 // 关灯 If ( KEY0 == 0) key_up = !key_up; } } STM32 芯片的 GPIO 管脚要采集到按键按下,那么它需要被配置成输入模式,之前有讨论 GPIO 管脚的几种模式,我们接下来还是复习一下,我们看看端口配置寄存器的描述,如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 280 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 我们看到如下内容,我们逐个列出来: 1) GPIOx_MODER 这个寄存器一共是 32 个比特,从 0-31bit,有 32 个位 2) GPIOx_MODER 寄存器的偏移地址是 0x00;表示在 GPIO 端口的基地址加上这个偏 移地址 0x00 就可以访问到这个寄存器的内容。 3) GPIOx_MODER 寄存器的复位值是 0x4444 4444 总共 8 个‘4’ 4) GPIOx_MODER 寄存器其中第 0、1 位和 4、5 位和 8、9 位和 12、13 位以此类推到 28、29 每两个位为一个组,叫做 MODEy 组;主要功能是设置这个管脚是输入模 式,还是输出模式 5) GPIOx_OTYPER 寄存器主要功能是设置具体哪种输入输出的模式;例如如果是管 脚输出,那么要确定是通用推挽输出模式,还是开漏输出模式,还是复用功能推 挽输出模式,还是复用功能开漏输出模式;如果是管脚输入,是模拟输入模式还 是浮空输入模式,还是上拉/下拉输入模式等。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 281 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 是不是看得有点头晕了,但是没有办法,我们就是通过改变这些寄存器的值来设置 芯片管脚的,使得芯片管脚按照寄存器手册里的规定来进行相应的工作;可以是输出或 输入,可以是高电平或是低电平(这个是另外一个寄存器来控制,大家可以对应看手册 里的寄存器说明),从而达到我们控制一个 LED 灯亮和灭, 下面看下连接按键的 GPIO 管脚的具体设置,这个函数里的代码: void Key_init() { /*使能 AHB1 总线的时钟,对 GPIO 的端口 A 时钟使能*/ RCC->AHB1ENR |= RCC_AHB1Periph_GPIOA; /*配置输入输出模式和输入输出的速度*/ GPIOA->MODER &= 0xFFFFFFFC; /*将 GPIOA 的 0 引脚配置为输入模式*/ GPIOA->MODER |= 0x00000000; //GPIOA->OSPEEDR &= 0xFFFFFFFC; //GPIOA->OSPEEDR |= 0x00000003; /*将 GPIOA 的 0 引脚配置为 100MHZ 的速度*/ //GPIOA->OTYPER &= 0xFFFFFFFE; /*类型*/ //GPIOA->OTYPER |= 0x00000000; GPIOA->PUPDR &= 0xFFFFFFFC; GPIOA->PUPDR |= 0x00000001; /*将 GPIOA 的 0 引脚配置为上拉输入模式*/ } RCC->AHB1ENR |= RCC_AHB1Periph_GPIOA;首先使能 PORTA 的时钟,接下来开始使用 PA0 管 脚,所以要先初始化 PC 端口的时钟,才可以使用,下面看下原理图: 可以看到 PA0 默认是被上拉到 3.3V 高电平的,GPIOA->MODER |= 0x00000000;这句代码是将 PA0 的 GPIO_MODER 寄存器的 0 到 3 位清 0,然后 GPIOA->MODER |= 0X00000000 这句话是将 GPIO_CRL 寄存器的 0 到 3 位赋值 0x0,化成二进制就是 0000,通过查表: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 282 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 可以知道将 GPIOA_MODER 寄存器的 PA0 管脚配置成 0000,即输入模式,配置好 PA0 管脚之后, 如何才能知道按键按下呢?这时就需要时刻查看和监听 PA0 管脚是否有电平的变化,那就要知道 PA0 的管脚的电平值,而且还要不停的去检测它是否有变化,因为我们希望当按键按下的时候,我们能以 最快的反映速度获取到这一动作。 在代码里,我们使用 if ( KEY0==0 )来判断按键是否按下了,KEY0 就是 PA0,如果按键按下, 从原理图可以知道 PA0 被拉到 GND 变成低电平,这样 PA0 就等于 0 即 KEY0 等于 0。 那么 KEY0 如何反映到 PA0 的值的呢?接下来继续分析代码: (1)#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) (2)#define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) (3)#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) (4)#define PAin(n) BIT_ADDR(GPIOC_IDR_Addr,n) (5)#define KEY0 PAin(0) 代码(1):上面有讲解,这个 BITBAND(addr,bitnum)最后得出的是某寄存器里的某个 bit 位所映射的 别名区的地址。 代码(2):unsigned long *表示强制把这个地址变成一个 32 位的长的地址的指针,或者说是一个指针, 指向 32 位的一个地址;然后*((volatile unsigned long *)(addr))这个表示这个地址,长达 32 位 bit 的值, 通过 MEM_ADDR(addr) 把从 addr 地址开始的连续 32 个 bit 里的值给取出来。 代码(3):BIT_ADDR(addr, bitnum)表示某寄存器的地址,对应的某 bit 位所对应的别名区的空间的值, 也就是说取出某寄存器的某 bit 位的值 代码(4):把 PC 的某个管脚,与 BIT_ADDR 进行绑定关联 代码(5):把 KEY0 设置成 PA0,使得 KEY0 能取到 GPIOC_IDR 寄存器里第 4 位也就是 PA0 的值 这样,这个例程的关键是是否取到了 PA0 的值,取到了值之后,再进行相关的操作,这个是大家 可以自己定义的,在这个例程中,按一下按键,我们就将 LED 灯取反,原来是亮的就变成灭的,原 来是灭的就变成亮的。 5.3.5 例程02 STM32芯片按键点灯-增加了防抖的代码 1. 示例简介: 其他都与上个例程相同,唯一不同的就是增加了防抖代码,在这里是用软件防抖 2. 调试说明: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 283 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 按下 PA0 管脚所连的按键(按钮 1),每按一次,LED 灯会由亮变灭,或者又灭变亮,因为增加 了防抖代码,基本上可以做到按一次,就采集到一次数据,灯由亮变灭或者又灭变亮,非常的稳定。 3. 关键代码: 原理图还是同上个例程一样: int main(void) //main 是程序入口 { unsigned int key_up =1; RCC_init(); //初始化配置时钟频率为 72MHZ LED_init(); //LED 初始化配置 Key_init(); //初始化控制按键的 PA0 端口 while (1) { Delay(0xfffff); if(key_up) LEDON; else LEDOFF; // 增加了防抖功能,如果你按下按键的时候会有抖动 // 开灯 // 关灯 } } if(KEY0==0) key_up = !key_up; //取反 代码 Delay(0xfffff)就是我们增加的防抖功能,如果你按下按键的时候会有抖动,我们增加一定 时间的时间再来判断按键是否按下来,这样在一定程度上可以起到消抖的作用,但是这里还有一个 BUG 就是如果长时间按着按键不动,while 循环里面就会运行多次灯点亮程序,如果是计数器的话,这个 就不准了,按一次键,就计算了许多次数,大家可以尝试一下如何去解决这个问题,按一次键就只亮 一次,无论一次按多长时间。 第六章 STM32库函数架构剖析 本章通过简单介绍 STM32 库的各个文件及其关系,让读者建立 STM32 库的概念,看完后对库有 嵌入式专业技术论坛 (www.armjishu.com)出品 第 284 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 个总体印象即可,在后期实际开发时接触了具体的库时,再回头看看这一章,相信你对 STM32 库又 会有一个更深刻的认识。 6.1 STM32库函数到底是什么 STM32 的库函数是 ST 公司已经封装好一个软件封装库,也就是很多基础的代码,在开发产品的 时候只需要直接调用这个 ST 库函数的函数接口就可以完成一系列工作;例如,你原来要自己烧饭洗 衣服,现在 ST 库函数就好像一个保姆,你只需要使唤一声就有饭吃,有干净的衣服了。 6.2 STM32库函数的好处 在 51 单片机的程序开发中,我们直接配置 51 单片机的寄存器,控制芯片的工作方式,如中断, 定时器等。配置的时候,我们常常要查阅寄存器表,看用到哪些配置位,为了配置某功能,该置 1 还 是置 0。这些都是很琐碎的、机械的工作,因为 51 单片机的软件相对来说较简单,而且资源很有限, 所以可以直接配置寄存器的方式来开发。 STM32 库是由 ST 公司针对 STM32 提供的函数接口,即 API (Application Program Interface),开发 者可调用这些函数接口来配置 STM32 的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发 快速,易于阅读,维护成本低等优点。 当我们调用库的 API 的时候可以不用挖空心思去了解库底层的寄存器操作,就像当年我们学习 C 语言的时候,用 prinft()函数时只是学习它的使用格式,并没有去研究它的源码实现,如非必要,可以 说是老死不相往来。 实际上,库是架设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上 为用户提供配置寄存器的接口。 6.3 千人大项目如何分配工作 其实大多数项目产品研发都是用类似库函数的方式进行分解的,如果有 1000 个开发人员来负责开 发板 windows 操作系统,那么怎么做?一定是有一群人负责最底层的硬件级,寄存器的读写封装,包 括显示器的点亮,图形刷写;然后另外一群人根据底层这群人提供的接口,同步做二次开发。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 285 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 所以库函数的理念完全被广泛应用于各种实际的项目和产品中,因为这样才可以使得多人协同工 作,才能做更大的项目产品。 6.4 STM32库结构剖析 6.4.1 CMSIS标准 我们知道由 ST 公司生产的 STM32 采用的是 Cortex-M3 内核或者 Cortex-M4 内核。以 M3 为例, 内核是整个微控制器的 CPU。该内核是 ARM 公司设计的一个处理器体系架构。ARM 公司并不生产 芯片,而是出售其芯片技术授权。ST 公司或其它芯片生产厂商如 TI,负责设计的是在内核之外的部 件,被称为核外外设或片上外设、设备外设。如芯片内部的模数转换外设 ADC、串口 UART、定时器 TIM 等。内核与外设,如同 PC 上的 CPU 与主板、内存、显卡、硬盘的关系: 因为基于 Cortex 的某系列芯片采用的内核都是相同的,区别主要为核外的片上外设的差异,这些 差异却导致软件在同内核,不同外设的芯片上移植困难。为了解决不同的芯片厂商生产的 Cortex 微控 制器软件的兼容性问题,ARM 与芯片厂商建立了 CMSIS 标准(Cortex MicroController Software Interface Standard)。 所谓 CMSIS 标准,实际是新建了一个软件抽象层。见下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 286 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 CMSIS 标准中最主要的为 CMSIS 核心层,它包括了: z 内核函数层:其中包含用于访问内核寄存器的名称、地址定义,主要由 ARM 公司提供 z 设备外设访问层:提供了片上的核外外设的地址和中断定义,主要由芯片生产商提供 可见 CMSIS 层位于硬件层与操作系统或用户层之间,提供了与芯片生产商无关的硬件抽象层, 可以为接口外设、实时操作系统提供简单的处理器软件接口,屏蔽了硬件差异,这对软件的移植是有 极大的好处的。STM32 的库,就是按照 CMSIS 标准建立的。 6.4.2 库目录,文件简介 STM32 的 V1.1.0 版库可以从官网获得,也可以直接从本书的附录光盘得到。本书主要采用最新 版的 V1.1.0 库文件。 解压后进入库目录:\STM32F4xx_StdPeriph_Lib_V1.1.0 各文件夹内容说明见图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 287 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 Libraries 文件夹下是驱动库的源代码及启动文件。 Project 文件夹下是用驱动库写的例子跟一个工程模板。 还有一个已经编译好的 HTML 文件,是库帮助文档,主要讲的是如何使用驱动库来编写自己的应 用程序。说得形象一点,这个 HTML 就是告诉我们:ST 公司已经为你写好了每个外设的驱动了,想 知道如何运用这些例子就来向我求救吧。不幸的是,这个帮助文档是英文的,这对很多英文不好的朋 友来说是一个很大的障碍。但要告诉大家,英文仅仅是一种工具,绝对不能让它成为我们学习的障碍。 其实这些英文还是很简单的,我们需要的是拿下它的勇气。 网上流传有一份中文版本的库帮助文档,但那个是版本的,但英文版本的目录结构和库函数接口 跟版本的区别还是比较大的,这点大家要注意下。 在使用库开发时,我们需要把 libraries 目录下的库函数文件添加到工程中,并查阅库帮助文档来 了解 ST 提供的库函数,这个文档说明了每一个库函数的使用方法。 进入 Libraries 文件夹看到,关于内核与外设的库文件分别存放在 CMSIS 和 STM32F4xx_StdPeriph_Driver 文件夹中。 6.4.3 关于core_cm3.h文件 一般来说 CMSIS 标准的核内设备函数层 M3 核通用的源文件 core_cm3.c 和头文件 core_cm3.h, 它们的作用是为那些采用 Cortex-M3 核设计 SOC 的芯片商设计的芯片外设提供一个进入 M3 内核的接 口。这两个文件在其它公司的 M3 系列芯片也是相同的。至于这些功能是怎样用源码实现的,我们可 以不用管它,有兴趣的朋友可以深究。 在 ST 的 STM32F4xx_StdPeriph_Lib_V1.1.0 中,是没有 core_cm3.c 这个文件的。core_cm3.c 的功 能在 core_cm3.h 里面实现。下面我们看一下 core_cm3.h 文件。 core_cm3.h 文件还有一些与编译器相关条件编译语句,用于屏蔽不同编译器的差异,我们在开发 时不用管这部分,有兴趣可以了解一下。里面包含了一些跟编译器相关的信息,如:RealView Compiler (RVMDK),ICC Compiler (IAR),GNU Compiler。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 288 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 较重要的是在 core_cm3.h 文件中包含了 stdin.h 这个头文件,这是一个 ANSI C 文件,是独立于 处理器之外的,就像我们熟知的 C 语言头文件 stdio.h 文件一样。位于 RVMDK 这个软件的安装目录 下,主要作用是提供一些新类型定义,如: 这些新类型定义屏蔽了在不同芯片平台时,出现的诸如 int 的大小是 16 位,还是 32 位的差异。 所以在我们以后的程序中,都将使用新类型如 int8_t 、int16_t„„ 在稍旧版的程序中还可能会出现如 u8、u16、u32 这样的类型,请尽量避免这样使用,在这里提 出来是因为初学时如果碰到这样的旧类型让人一头雾水,而且在以新的库建立的工程中是无法追踪到 u8、u16、u32 这些的定义的。 core_cm3.h 跟启动文件一样都是底层文件,都是由 ARM 公司提供的,遵守 CMSIS 标准,即所有 CM3 芯片的库都带有这个文件,这样软件在不同的 CM3 芯片的移植工作就得以简化。 6.4.4 system_stm32f4xx.c文件 在 E:\STM32F4xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates 文件夹下,这是由 ST 公司提供的文件: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 289 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 system_stm32f4xx.c,是由 ST 公司提供的,遵守 CMSIS 标准。该文件的功能是设置系统时钟和 总线时钟, M4 比 51 单片机复杂得多,并不是说我们外部给一个 8M 的晶振,M4 整个系统就以 8M 为时钟协调整个处理器的工作。我们还要通过 M4 核的核内寄存器来对 8M 的时钟进行倍频,分频, 或者使用芯片内部的时钟。所有的外设都与时钟的频率有关,所以这个文件的时钟配置是很关键的。 system_stm32f4xx.c 在实现系统时钟的时候要用到 PLL(锁相环),这就需要操作寄存器,寄存器 都是以存储器映射的方式来访问的,所以该文件中包含了 stm32f4xx.h 这个头文件。 6.4.5 stm32f4xx.h文件 文件位于\STM32F4xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Device\ST\STM32F4xx\Include 路径下。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 290 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 stm32f4xx..h 这个文件非常重要,是一个非常底层的文件。所有处理器厂商都会将对内存的操作 封装成一个宏,即我们通常说的寄存器,并且把这些实现封装成一个系统文件,包含在相应的开发环 境中。这样,我们在开发自己的应用程序的时候只要将这个文件包含进来就可以了。 6.4.6 启动文件 STM32F4xx_StdPeriph_Lib_V1.1.0\Libraries\CMSIS\Device\ST\STM32F4xx\Source\T emplates\arm 文件夹下是由汇编编写的系统启动文件。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 291 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 启动文件是任何处理器在上点复位之后最先运行的一段汇编程序。在我们编写的 c 语言代码运行 之前,需要由汇编为 c 语言的运行建立一个合适的环境,接下来才能运行我们的程序。所以我们也要 把启动文件添加进我们的的工程中去;所以,总的来说,启动文件的作用是: 1. 初始化堆栈指针 SP; 2. 初始化程序计数器指针 PC; 3. 设置堆、栈的大小; 4. 设置异常向量表的入口地址; 5. 配置外部 SRAM 作为数据存储器(这个由用户配置,一般的开发板可没有外部 SRAM); 6. 设置 C 库的分支入口__main(最终用来调用 main 函数); 7. 在 3.5 版的启动文件还调用了在 system_stm32f4xx.c 文件中的 SystemIni() 函数配置系统时钟, 在旧版本的工程中要用户进入 main 函数自己调用 SystemIni() 函数。 6.4.7 STM32F4xx_StdPeriph_Driver文件夹 Libraries\STM32F4xx_StdPeriph_Driver 文件夹下有 inc(include 的缩写)跟 src(source 的简写) 这两个文件夹,这都属于 CMSIS 的设备外设函数 部分。src 里面是每个设备外设的驱动程序,这些 外设是芯片制造商在 Cortex-M3 核外加进去的。 进入 libraries 目录下的 STM32F4xx_StdPeriph_Driver 文件夹如下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 292 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 在 src 和 inc 文件夹里的就是 ST 公司针对每个 STM32 外设而编写的库函数文件,每个外设对应 一个 .c 和 .h 后缀的文件。我们把这类外设文件统称为:stm32f4xx_ppp.c 或 stm32f4xx_ppp.h 文件, PPP 表示外设名称。 如针对模数转换(ADC)外设,在 src 文件夹下有一个 stm32f4xx_adc.c 源文件,在 inc 文件夹下有一个 stm32f4xx_adc.h 头文件,若我们开发的工程中用到了 STM32 内部的 ADC,则至少要把这两个文件包 含到工程里: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 293 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 这两个文件夹中,还有一个很特别的 misc.c 文件,这个文件提供了外设对内核中的 NVIC(中断向 量控制器)的访问函数,在配置中断时,我们必须把这个文件添加到工程中。 6.4.8 stm32f4xx_it.c、 stm32f4xx_conf.h文件 在库目录的 Project\STM32F4xx_StdPeriph_Template 目录下,存放了官方的一个库工程模板,我们 在用库建立一个完整的工程时,还需要添加这个目录下的 stm32f4xx_it.c、stm32f4xx_it.h、 stm32f4xx_conf.h 这三个文件。 stm32f4xx_it.c,是专门用来编写中断服务函数的,在我们修改前,这个文件已经定义了一些系统 异常 的接口,其它普通中断服务函数由我们自己添加。但是我们怎么知道这些中断服务函数的接口 如何写呢?是不是可以自定义呢?答案当然不是的,这些都有可以在汇编启动文件中找到,具体的大 家自个看库的启动文件的源码去吧。 stm32f4xx_conf.h,这个文件被包含进 stm32f4xx.h 文件。是用来配置使用了什么外设的头文件, 用这个头文件我们可以很方便地增加或删除上面 driver 目录下的外设驱动函数库。如下面的代码配置 表示使用了 gpio、rcc、spi、usart 的外设库函数,其它的注释掉的部分,表示没有用到。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 294 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 stm32f4xx_conf.h 这个文件还可配置是否使用“断言”编译选项,在开发时使用断言可由编译器 检查库函数传入的参数是否正确,软件编写成功后,去掉“断言”编译选项可使程序全速运行。可通 过定义 USE_FULL_ASSERT 或取消定义来配置是否使用断言。 6.4.9 库各文件间的关系 前面向大家简单介绍了各个库文件的作用,库文件是直接包含进工程即可,丝毫不用修改,而有 的文件就要我们在使用的时候根据具体的需要进行配置。接下来从整体上把握一下各个文件在库工程 中的层次或关系,这些文件对应到 CMSIS 标准架构上。我们以 STM32F1 系列为例: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 295 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 上图描述了 STM32 库各文件之间的调用关系,这个图省略了 DSP 核(Cortex-M3 没有 DSP 核)和 实时系统层部分的文件关系。在实际的使用库开发工程的过程中,我们把位于 CMSIS 层的文件包含 进工程,丝毫不用修改,也不建议修改。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 296 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 对于位于用户层的几个文件,就是我们在使用库的时候,针对不同的应用对库文件进行增删(用 条件编译的方法增删)和改动的文件。 6.4.10 常用官方资料 1.《STM32 数据手册.pdf 》 这个文件相当于 STM32 的 datasheet,管脚定义,内部存储器架构分配,跟芯片硬件相关的定义 都可以从这里找得到。 2.《STM32 参考手册.pdf 》 这个文件对 STM32 的寄存器描述,它把 STM32 的时钟、存储器架构、及各种外设都描述得清清 楚楚。当我们对 STM32 的库函数的实现方式 感到困惑时,可查阅这个文件,以直接配置寄存器方式 开发的话查阅这个文档的频率会更高。 3.《stm32f4xx_stdperiph_lib_um.chm》 这个就是前面提到的库的帮助文档,在使用库函数时,我们最好通过查阅此文件来了解库函数原 型,或库函数的调用 的方法。也可以直接阅读源码里面的函数的函数说明。 4. 其他文档 6.4.11 库函数帮助文档使用 所谓库函数,就是 STM32 的库文件中为我们编写好的函数接口,我们只要调用这些库函数,就 可以对 STM32 进行配置,达到控制目的。我们可以不知道库函数是如何实现的,但我们调用函数必 须要知道函数的功能、可传入的参数及其意义、和函数的返回值。 于是,有读者就问那么多函数我怎么记呀?神舟的回答是:会查就行了,哪个人记得了那么多。 所以我们学会查阅库帮助文档 是很有必要的。 打开库帮助文档 stm32f4xx_stdperiph_lib_um.chm 见下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 297 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 层层打开文档的目录标签 Modules\STM32F4xx_StdPeriph_Driver,可看到在路径/Modules/ STM32F4xx_StdPeriph_Driver 标签下有很多外设驱动文件的名字 MISC、ADC、BKP、CAN 等标签。 我们试着查看 ADC 的初始化库函数(ADC_Init) 看看,继续打开标签见下图: 利用这个文档,我们即使没有去看它的具体代码,也知道要怎么利用它了。 如它的功能是:以 ADC_InitStruct 参数配置 ADC,进行初始化。原型为 void ADC_Init(ADC_TypeDef * ADCx , ADC_Init_TypeDef * ADC_InitStruct) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 298 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 其中输入的参数 ADCx 和 ADC_InitSturct 均为库文档中定义的 自定义数据类型,这两个传入 参数均为结构体指针。初学时,我们并不知道如 ADC_TypeDef 这样的类型是什么意思,可以点击函 数原型中带下划线的 ADC_TypeDef 就可以查看这是什么类型了。 就这样初步了解了一下库函数,读者就可以发现 STM32 的库是写得很优美的。每个函数和数据 类型都符合见名知义 的原则,当然,这样的名称写起来特别长,而且对于我们来说要输入这么长的 英文,很容易出错,所以在开发软件的时候,在用到库函数的地方,直接把库帮助文档 中函数名称 复制粘贴到工程文件就可以了。 第七章 实战篇 7.1 LED流水灯实验 7.1.1 流水灯试验的意义与作用 作为开发板硬件经典入门实验,非流水灯实验莫属(流水灯也叫跑马灯)。神舟王407开发板板 载了4个LED指示灯,LED1,LED2,LED3和LED4。本实验将通过教你如何控制这四个灯实现交替闪 烁的流水灯效果。 该实验的关键在于如何控制STM32的IO口输出不同的电平。通过这一节的学习,您将 初步掌握STM32基本IO口的使用,迈出STM32学习的第一步。 7.1.2 实验原理 前面已经说过,跑马灯的关键实际上就是如何控制STM32处理器的GPIO接口作为输出接口,输出 指定的电平信号。那么,这一节,我们就主要了解STM32的GPIO的原理和控制方法。 STM32F407 的 IO 口可以由软件配置成 4 种模式: ¾ 输入(复位状态) / input (reset state) ¾ 通用输出模式 / general purpose output mode ¾ 复用功能模式 / alternate function mode ¾ 模拟模式 / analog mode 对应到STM32库文件中的定义如下 在我们使用一个GPIO之前,我们一般需要对GPIO管脚的时钟,和GPIO管脚模式以及速率进行设 定。 STM32的GPIO端口在作为输出时,可以软件配置端口最大支持的时钟速率,有以下几种: ¾ 输出模式,最大时钟速率2MHz ¾ 输出模式,最大时钟速率25MHz ¾ 输出模式,最大时钟速率50MHz 嵌入式专业技术论坛 (www.armjishu.com)出品 第 299 页,共 771 页 ¾ 输出模式,最大时钟速率100MHz 对应到STM32库中的定义如下: ARM 技术论坛 www.armjishu.com 神舟 IV 号用户手册 V2.0 为了降低STM32处理器的功耗,可以依据实际的需求,选择合适的时钟速率,GPIO口支持的最大 时钟速率越低,它产生的功耗也越低。 在对STM32的GPIO管脚有了一定的了解后,我们看一个完整的GPIO端口初始化的例子。 为程序便于大家修改和移植,此处使用宏定义来定义指示灯的管脚等: 下面的初始化神舟王407板载的4个LED灯的代码。对应的GPIO端口初始化的子函数。 关于IO口更详细的介绍,请参考开发板光盘里的《STM32F参考手册 DM00031020.pdf 》第六章,关于GPIO的章节详细介绍。参考手册(Reference Manual),也可以从ST官网下载。 7.1.3 硬件设计 神舟王 407 开发板上总共有 4 个是用户 LED 指示灯,由 4 个 GPIO 管脚分别控制 LED 灯的亮灭, 当 GPIO 管脚输出低电平时,LED 指示灯亮。反之,当 GPIO 管脚输出高电平时,LED 指示灯灭。 这四个 LED 指示灯分别由 PF10、PF9、PF8 和 PF7 控制。 下图为LED原理图,其中GPIO管脚上串的电阻,主要起限流作用,防止电流过大损坏LED和GPIO 口。 GPIO管脚与对应的LED灯关系如下: LED灯 LED灯对应的GPIO 嵌入式专业技术论坛 (www.armjishu.com)出品 第 300 页,共 771 页 www.armjishu.com DS4 DS3 DS2 DS1 LED灯电路: PF10 PF9 PF8 PF7 ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.1.4 软件设计 进入例程的文件夹,然后打开\ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 301 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析1:在系统启动文件(startup_stm32f4xx.s)中已经调用SystemInit()初始化了168MHz系统时钟, 这里的代码是汇编的,大家可以了解一下就可以,这个文件里的代码是ST官方定制好了的,不需要 我们修改,我们只需要知道在这里有这个时钟调用的函数就可以。 代码分析2:我们神舟王407ZG开发板的主频是168MHz。那么在哪里设置的初始化成168MHZ的主频 呢?我们看一下,文件System _STM32F4xx.c中的函数SystemInit()函数。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 302 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 这个函数可以大概分为4个部分。 第一:设置FPU,浮点运算器。这个是STM32F4新加的功能。在STM32F1和STM32F2 中并没有。 第一:重置RCC时钟配置默认的复位状态。 需要注意一下,我们重启开发板后,使用默认时钟内部高速时钟HSI(F2的内置 16MHz RC振荡器)而不是直接使用外部高速时钟。这是为什么呢?内部时钟是在芯片 内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时 钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上 电之后我们再通过软件配置,转而采用外部时钟信号。 从内部时钟切换到外部时钟时,还需要等待外部时钟源是否准备好,需要等待外部 时钟稳定,而不是直接转换。 第二:假如有外部RAM,需要配置FSMC用于外部SRAM。 设置Vector的位置, 第三:通过SetSysClock()函数,配置SystemClock的时钟源。这个函数配置了168MHz的 主屏。主要设置了PLL的倍频和分频因子、APB和AHBx的预分频系数等。我们分析一下, 嵌入式专业技术论坛 (www.armjishu.com)出品 第 303 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 SetSysClock()函数。函数中对RCC时钟的RCC->CR、RCC->CFGR、RCC->PLLCFGR 这3个寄存器进行配置。168M主频配置的流程图如下: 我们神舟王407开发板外部时钟是25MHz。经过PLLM,25分频得1MHz(25/25=1);经过PLLN, 336倍频后得336MHz(1x336=336);经过PLLP,2分频后得168MHz(336/2=168)。最终 PLLCLK=168MHz。如果对函数SetSysClock(),不想一一的对照寄存器。也可以简单的通过 分频、倍频的定义可以推测系统时钟。具体定义: 代码分析3:进入主程序,首先初始化LED指示灯。初始化板载LED指示灯的代码如下 我们可以看到,初始化LED灯的代码中首先是调用RCC_AHB1PeriphClockCmd()函数使能了LED灯所 使用的GPIO口的时钟。然后是通过结构体GPIO_InitStructure对LED灯使用的管脚进行相应配置。我 们看一下,它里面的内容。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 304 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析4:Turn_On_LED()函数点亮LED灯,GPIO_SetBits()函数熄灭LED灯。 可以看到,Turn_On_LED()函数实际上是调用了函数GPIO_ResetBits()来点亮LED灯。 GPIO_ResetBits()函数的内容如下。 这里实际上函数GPIO_ResetBits()和函数GPIO_SetBits()分别操作GPIOx_BSRRH寄存器和 GPIOx->BSRRL寄存器。通过改变这些寄存器的值来设置芯片管脚的,使得芯片管脚按照寄存器手 册里的规定来进行相应的工作;可以是输出或输入,可以是高电平或是低电平。从而达到我们控制 一个LED灯亮和灭。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 305 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 通过,查阅用户手册可知,GPIOF_BSRRL 对应位设置 1,可以使得对应管脚的 ODR 位为 1; GPIOF_BSRRH 的对应位设置 1,可以使得对应管脚的 ODR 位为 0。 那么 ODR 位是什么呢?这个就是端口输出数据寄存器 GPIOx_ODR,实际上这个寄存器里的对 应位的变化才是真正 GPIO 管脚高低电平的变化;而寄存器 GPIOx_BSRRL 和寄存器 GPIOx_BSRRH 则可以间接影响到它。 当然上面程序,我们也可以改成直接操作 GPIOx_ODR 的代码,这个留个大家来做练习吧。 代码分析5: while()循环中不断的点亮和熄灭LED灯,实现流水灯的样子。 7.1.5 下载与验证 如果使用JLINK下载固件,请按错误!未找到引用源。下载固件到神舟王407开发板小节进行操 作。 如果使用USB下载固件,请按错误!未找到引用源。小节进行操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 306 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 如果使用串口下载固件,请按错误!未找到引用源。小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。小节进 行操作。 7.1.6 实验现象 将固件下载在神舟王 407 开发板后,可以看到神舟王 407 开发板的四个 LED 灯(LED1~4)轮 流闪亮,实现我们所说的流水灯效果。4 个 LED 的具体位置如下图所示。 7.2 蜂鸣器实验 7.2.1 蜂鸣器的简介 什么是蜂鸣器呢?蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计 算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中用作发 声器件。 1) 蜂鸣器的详细分析 蜂鸣器可以分为:电磁式和电压式。 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。它是以压 电陶瓷的压电效应,来带动金属片的振动而发声; 电磁式的蜂鸣器,则是用电磁的原理,通电时将金属振动膜吸下,不通电时依振动膜的弹力弹 回。 故压电式蜂鸣器是以方波来驱动,电磁式是 1/2 方波驱动,压电式蜂鸣器需要比较高的电压才 能有足够的音压,一般建议为 9V 以上。压电的有些规格,可以达到 120dB 以上,较大尺寸的也很容 易达到 100dB。 电磁式蜂鸣器:用 1.5V 就可以发出 85dB 以上的音压了,唯消耗电流会大大的高于 压电式蜂鸣器,而在相同的尺寸时,电磁式的蜂鸣器,响应频率可以做的比较低;电磁式蜂鸣器的 音压一般最多到 90dB.机械式蜂鸣器是电磁式蜂鸣器中的一个小类别。 蜂鸣器又分为有源蜂鸣器和无源蜂鸣器。这里讲的“源”,指的是:振荡源。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 307 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 有源蜂鸣器,内部有振荡、驱动电路,加电源就可以响,优点是用起来省事;缺点是频率固定 了,就只一个单音。 无源的蜂鸣器与喇叭一样,需要加上交变的音频电压才能发声,也可以发出不同频率的声音。 不过,蜂鸣器的声音反正是不好听的,所以经常是加上方波,而不是加正弦。 2)蜂鸣器和喇叭的对比 蜂鸣器和喇叭主要区别如下: 1、蜂鸣器一般是高阻,直流电阻无限大,交流阻抗也很大,窄带发声器件,通常由压电陶瓷 片发声。需要较大的电压来驱动,但电流很小,几 mA 就可以了。功率也很小。 2、喇叭则是低阻,由线圈、磁铁、振膜及外壳组成。直流电阻几乎是 0,交流阻抗一般几欧到 十几欧。宽频发声器件,通常由利用线圈的电磁力推动膜片发声。 3、有源蜂鸣器只能用固定电压驱动,发生频率出厂时固定了;而喇叭通过驱动器可以发出各种 声音。可讲究音质,我们的音响、MP3、耳机、手机上都是用的喇叭,声音频率是可以改变的。一些 报警器只能发出 “滴 滴”声响的一般都是蜂鸣器,没什么音质可言。 在实际应用中我们会区分,蜂鸣器是有源还是无源,电磁式还是电压式?我们神舟 51 开发板提供了 电磁式无源蜂鸣器,下面我们会详细分析。 7.2.2 蜂鸣器的结构 一般的无源蜂鸣器的结构图,如下: 1:防水贴纸 2:线轴 3:线圈 4:磁铁 5:底座 6:引脚 7:外壳 8:铁蕊 9:封胶 10:小 铁片 11:振动膜 12:电路板 蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,外接的振荡器产生 的音频信号电流通过电磁线圈,使电磁线圈产生磁场。振动膜片在电磁线圈和磁铁的相互作用下, 周期性地振动发声。 因此要使得这种蜂鸣器发出声音,必须在外部给它接一个震荡发生器。 7.2.3 蜂鸣器实验的意义与作用 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、报 警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。用于产品的声音提醒 或者告警。 本实验将介绍,如何通过一个GPIO管脚控制有源蜂鸣器。该实验与流水灯实验类似,都是学习 如何控制STM32的IO口输出。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 308 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.2.4 实验原理 前面流水灯的实验已经介绍过STM32处理器GPIO接口,如何配置它的模式,时钟速率等,在这 一节就不再重复讲解GPIO接口的使用。 STM32的单个IO最大可以提供25mA的电流。而神舟王407开发板蜂鸣器的驱动电流是30mA左 右。两者十分相近。如果直接用I/O口驱动蜂鸣器的话,其它地方的用电就得省着点。所以,我们不 用I/O口直接驱动蜂鸣器,而是用三极管驱动。 当控制蜂鸣器的GPIO管脚的管脚输出高电平时,三极管导通,蜂鸣器发声。当GPIO 管脚输出低电平时,三极管截止,蜂鸣器关闭。 7.2.5 硬件设计 其原理图如下: 在STM32神舟王407开发板中,提供了一个蜂鸣器,由处理器的PF6管脚控制,当PF6管脚输出低 电平时,蜂鸣器发出声音。 图中PF6的电阻R21的作用为限流作用,防止电流蜂鸣器工作时电流过大,损坏处理器的管脚。 查阅STM32F407处理器可知,STM32处理器IO口能够承受的电流为25mA,如下表所示: 而蜂鸣器的驱动电流为30mA,因此在此处串一个电阻,不至于电流太大而损坏处理器的GPIO 管脚。电阻R62是控制蜂鸣器发声的大小。 注意神舟王 407 开发板载蜂鸣器与 315M 的无线模块 VT 复用,当 315M 的无线遥控的任意按键按下 时蜂鸣器也会鸣响。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 309 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.2.6 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析1:在系统启动文件(startup_stm32f4xx_xx.s)中已经调用SystemInit()初始化了时钟,这里的代 码是汇编的,大家可以了解一下就可以,这个文件里的代码是ST官方定制好了的,不需要我们修改, 我们只需要知道在这里有这个时钟调用的函数就可以。168MHz主频配置请参考前面章节。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 310 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析 2:这里我们先看一下蜂鸣器的 GPIO 管脚是 GPIOF 端口的第 6 脚 代码分析 3:首先把蜂鸣器对应的 GPIO 管脚的时钟,以及管脚配置等初始化好 代码分析 4:然后进入到 while()循环,对连接了蜂鸣器的管脚进行拉高和拉低,并且再配上一定的 延时,这样蜂鸣器就在一响一响;其中 GPIO_ResetBits ()函数是打开蜂鸣器;GPIO_SetBits ()关闭蜂 鸣器。 代码分析 5:GPIO_ResetBits ()函数和 GPIO_SetBits ()函数是通过改变 STM32 的寄存器的值来达到使 蜂鸣器的管脚进行变高变低变化的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 311 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 以函数 GPIO_ResetBits(GPIO_BEEPER, BEEPER_PIN)为例,BEEP_PORT 和其 BEEP_PIN 实是 我们定义好的蜂鸣器对应使用的 GPIO 端口及对应端口管脚。 而 BEEP_PORT->BSRRH 中的 BSRRH 是我们 GPIO 端口对应的寄存器 BSRR 的高 16 位。 可以发现函数 GPIO_ResetBits(GPIO_BEEPER, BEEPER_PIN)实际上,是改变了寄存器 BSRR 的 值实现管脚的拉低和拉高从而使蜂鸣器发出声音的。 那我们怎么知道改变 BSRR 的值可以使管脚电平变低或变高呢?这个是 ST 官方定义的,我们只 需要参照 ST 官方提供的参考手册进行操作即可。如果想了解里面的结构,也可以参考 ST 官方提供 的相关管脚的电路设计。 7.2.7 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 312 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.2.8 实验现象 将固件下载到 STM32 神舟王 407 的开发板后,按复位键可以听到蜂鸣器发出一定频率的“滴、 滴”响声,蜂鸣器在神州王号中的位置如下图所示: 7.3 按键检测实验 前面我们介绍了STM32的IO口作为输出功能使用,这一节,我们将向大家介绍如何使用STM32 的IO口作为输入功能,我们以按键的输入为例讲解,通过本节的学习,你将了解到STM32的IO口作 为输入使用的方法。本节分为如下几个小节: 1 按键实验的意义与作用 2 实验原理 3 硬件设计 4 软件设计 5 下载与验证 6 实验现象 7.3.1 按键的介绍 首先我们先了解一下,我们常用到的键盘。键盘分为编码键盘和非编码键盘。键盘上闭合键 的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。而靠 软件编程来识别的键盘称为非编码键盘,在单片机组成的各种系统中,用的较多的是非编码键盘。 非编码键盘又分为独立键盘和行列式(又称矩阵式)键盘。独立键盘由独立按键组成,每个按键 占用一个I/O口,行列式键盘不用占那么多I/O。这里我们主要讲解的是独立按键。 键盘实际上就是一组按键,在单片机外围电路中,通常用到的按键都是机械弹性开关,当开 关闭合时,线路导通,开关断开,如下图是几种单片机系统常见的按键。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 313 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 弹性小按键被按下时闭合,松手后自动断开;自锁式按键按下时闭合且会自动锁住,只有再次按 下时才弹起断开。 7.3.2 单片机检测小弹性按键的原理 单片机检测按键的原理是:单片机的I/O口既可作为输出也可作为输入使用,当检测按键时 用的是它的输入功能,我们把按键的一端接地,另一端与单片机的某个I/O口相连,开始时先给该 I/O口赋一高电平,然后让单片机不断地检测该O口是否变为低电平,当按键闭合肘,即相当于该 I/O口通过按键与地相连,变成低电平,程序一旦检测到I/O口变为低电平则说明按键被按下, 然后执行相应的指令。 去抖概念:(分为软件去抖和硬件去抖) 按键是机械器件,按下或者松开时有固定的机械抖动。 什么是机械抖动?通常的按键开关为机械弹性开关,由于机械触点的弹性作用,一个按键开关 在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一 连串的抖动。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参 数,在很多场合都要用到;实际上只进行一次按键操作,但有可能执行了多次按键结果,这就是抖 动造成的,所以大多数产品实际使用中都使用了按键去抖功能。 按键的连接方法和按键在被按下时其触点电压变化过程下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 314 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 这个抖动时间虽然很短,不同按键抖动不同,但对应单片机来说,很轻松就能检测到,单片机 的运行的速度是微秒 us 级别。 用示波器跟踪一个小的按钮开关在闭合时的抖动现象,得到如下图的波形。 观察波形可以帮助我们对抖动现象有一个直观的了解。水平轴2ms/Div,抖动间隙大约为 10ms,在达到稳定状态前一共有6次变化,频率随时间升高。 硬件去抖最简单的就是按键两端并联电容,容量根据实验而定。当然也有专用的去抖动芯片。 软件去抖使用方便不增加硬件成本,容易调试,所以现在大都使用软件去抖。 关于软件去抖,我们在这里也详细讲解一下原理 : 1、检测到按键按下后进行 5~10ms 延时,用于跳过这个抖动区域 2、延时后再检测按键状态,如果没有按下表明是抖动或者干扰造成,如果仍旧按下,可以认为 是真正的按下。并进行对应的操作。 3、同样按键释放后也要进行去抖延时,延时后检测按键是否真正松开。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 315 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.3.3 意义与作用 STM32的IO口在前面的流水灯实验中已经有了详细的介绍,这里我们细讲,这一节我们讲结合 STM32的库,描述如何设置STM32 的GPIO口作为输入使用。 这一节,我们将通过神舟王 STM32F407ZG 载有的 4 个按键(KEY1、KEY 2、KEY 3/ TAMPER、 KEY 4/ WAKEUP),来控制板上的 4 个 LED(LED1~4),按下任一个按钮,对应的 LED1~4 点亮。 7.3.4 实验原理 这个例程的实验原理主要包括两个:一、通过神舟王开发板上的4个按钮(KEY1、KEY2、KEY3/ TAMPER、KEY4/ WAKEUP),控制4个LED灯的点亮和关闭状态。 具体的对应关系如下: 现象 操作 LED1亮其它LED灭 LED2亮其它LED灭 LED3亮其它LED灭 LED4亮其它LED灭 神舟王板载KEY1按键被按下 神舟王板载KEY2按键被按下 神舟王板载KEY3/TAMPER按键被按下 神舟王板载KEY4/WAKEUP按键被按下 7.3.5 硬件设计 该实验需要使用到神舟王开发板上的LED灯,按键,相关硬件电路如下: 图表 18 LED 指示灯电路 神舟王STM32F407ZG开发板总共有4个功能按键,分别是WAKEUP按键和TAMPER按键及两个用于自 定义功能按键,在不使用第二功能的情况下,这四个按键都可以作为通用的按键,由用户自定义其 功能。这四个按键分别与PC4、PB10、PC13和PA0四个GPIO管脚连接,当按键按下时,对应的GPIO 管脚为低电平,反之,当没有按键按下时,对应的GPIO管脚为高电平。其中PA0 (STM32的WKUP 引脚)可以作为WK_UP功能,它除了可以用作普通输入按键外,还可以用作STM32的唤醒输入。PC13 可以实现备份区寄存器的入侵功能。本实验中所有的按键均作为普通IO使用。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 316 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 图表 19 按键输入电路 GPIO 管脚与对应的 LED 灯关系如下: LED灯 LED灯对应的GPIO LED1 PF10 LED2 PF9 LED3 PF8 LED4 PF7 GPIO 管脚与按键对应关系 按键 KEY1 KEY2 KEY3/TAMPER KEY4/WAKEUP 按键对应的GPIO PA5 PF11 PC13 PA0 7.3.6 软件设计 进入神舟王 STM32F407ZG 开发板光盘资料文件夹\程序源代码文件夹\按键扫描实验,然后打开 \Project \ MDK-ARM \ Project.uvproj 文件: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 317 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析1:在系统启动文件(startup_stm32f4xx_xx.s)中已经调用SystemInit()初始化了时钟,这里的代 码是汇编的,大家可以了解一下就可以,这个文件里的代码是ST官方定制好了的,不需要我们修改, 我们只需要知道在这里有这个时钟调用的函数就可以。 代码分析2:LED_config()初始化板载LED指示灯,实验中LED灯配合按键进行亮灭,所以在这里 初始化4个LED灯。 代码分析3:GPIO_KEY_Config()初始化按键。 按键有两种初始化方式: 1)第一种是普通的GPIO方式,也就是GPIO管脚配置成输入的状态,然后不断通过while()循环去检 测这个管脚,看看是否有按键按下,GPIO电平有变化。 2)第二种是中断的方式,配置好中断,STM32内部有中断控制器的功能,设置好中断触发机制,一 旦芯片检测到中断发生,中断控制器就会通知CPU,CPU就会调用相应的中断函数进行中断处理; 如果我们把中断配置到连接了按键的GPIO管脚上,一旦检测到按键按下,就产生中断,这样就可以 不需要CPU轮询去检测这个GPIO管脚了,有中断控制器来控制和触发,这样就节约了很多CPU资源。 代码分析4:这样重点分析一下GPIO_KEY_Config()函数里的中断配置过程,初始化KEY按键的 GPIO管脚,配置为带上拉的输入,按键按下时为低电平0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 318 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析5:返回读取按键所在GPIO管脚的状态,看看按键是否有被按下,GPIO_ReadInputDataBit ()是官方库函数提供的一个读GPIO管脚状态的函数 嵌入式专业技术论坛 (www.armjishu.com)出品 第 319 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析6:GPIO_ReadInputDataBit()函数,传入的是GPIO的端口号和GPIO管脚,只需要访问到 对应的IDR,读取到对应管脚的IDR寄存器值就可以了 代码分析7:进入循环,ReadKeyDown()()函数不断检测按键是否有被按下去,如有,先调用 delay(150000)函数延时一下,再进行判断,这段延时的目的是达到去按键抖动的目的: 最后确定按键按下,就调用Led_Turn_on()函数将灯点亮,其他几个按键也是同样的方式来实 现,这里就不做介绍了。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 320 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.3.7 下载与验证 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.3.8 实验现象 将固件程序下载到神舟王 STM32F407ZG 开发板后,关闭电源,重新打开电源;神舟王开发板上 的 4 个 LED 灯都亮;如下图显示 在没有按键按下时,4 个 LED 灯都亮;有按键按下,相关的 LED 灯随之发生变化,具体实现现象如 下表所示: LED 灯 按键 说明 LED1 KEY 1 按键 按一下 KEY 1 对应 LED 1 灯灭,再按一下 LED 1 亮 LED2 KEY 2 按键 按一下 KEY 2 对应 LED 2 灯灭,再按一下 LED 2 亮 LED3 KEY 3 按键 按一下 KEY 3 对应 LED 3 灯灭,再按一下 LED 3 亮 LED4 KEY 4 按键 按一下 KEY 4 对应 LED 4 灯灭,再按一下 LED 4 亮 神舟王开发板按键位置,如下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 321 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.4 BitBand按键扫描检测 7.4.1 什么是位带操作 还记得 51 单片机吗? 单片机 51 中也有位的操作,以一位(BIT)为数据对象的操作;例如 51 单片机可以简单的将 P1 端口的第 2 位独立操作,P1.2=0 或者 P1.2=1,就是这样把 P1 口的第三个脚 (bit2)置 0(输出低电平)或者置 1(输出高电平)。 而现在 STM32 的位段、位带别名区这些就是为了实现这样的功能,可以在 SRAM、I/O 外设空 间实现对这些区域的某一位的单独直接操作。 7.4.2 为什么要用位带操作 那么 51 单片机中间不是有位的操作吗,而 STM32 为什么要提出位带的操作呢?首先,这里不 得不提一个事情就是 STM32 的内部区域访问只能是 32 位的字,不能是字节或者半字,也更不可能 只访问一个 bit,要访问就要一次访问 32 个 bit,这部分 STM32 在神舟开发板手册的 GPIO 章节中提 到过;而 51 单片机里一个 bit(一个字节等于 8 个 bit,一个字是 32 个 bit)。而 STM32 中一个寄存 器一般是 32 个 bit 的,每一个位都是 1 个 bit,那么如何可以访问一个寄存器中的 1 个位呢?就是 1 个 bit,把一次访问 32bit 的 STM32 经过一系列转换达到只访问其中的一个 bit,所以 STM32 使用一 种新型的方式来解决这个问题,设计一个办法来解决用一次访问 32bit 的这样的操作达到 51 单片机 那种只访问一个 bit 的效果。 7.4.3 如何设计和实现位带操作的 从编程者这个角度来说,我们操作的对象是一个一个的 bit 位,而对于 STM32 来说,它内内部只 能是 32 位 bit 每次的访问。如果要实现这个技术,必须要做一个映射,也就是从 1 个 bit 映射到 32 嵌入式专业技术论坛 (www.armjishu.com)出品 第 322 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 个 bit,就是用 STM32 内部的一次访问(32 个 bit)来代表编程者认为的 1 个 bit。 那 STM32 内部是如何解决的呢?它是在支持位带操作的地方,取个别名区空间,而这个别名区 空间可以让一次 32 位来进行访问,对这个别名进行操作就相当于对 SRAM 或者 I/O 存储空间中的位 (1 个寄存器里的位就是 1 个 bit,1 个 bit 最后对应别名区空间的 32 个位,因为 STM32 芯片内部只 能是 32 位去访问)进行操作。 这样呢,1MB SRAM 就可以 32M 个对应别名区空间,就是 1 位膨胀到 32 位(1bit 变为 1 个 字);我们对这个别名区空间开始的某一字操作,置 0 或置 1,就等于它映射的 SRAM 或 I/O 相应的 某地址的某一位的操作。 7.4.4 STM32中位带操作的具体部署情况 支持位带操作的两个内存区的范围是: 序号 支持位带操作的两个内存区的范围 对应的别名区空间范围 1 SRAM 区中的最低 1MB: SRAM 所对应的别名区 32MB 空间: 0x2000_0000-0x200F_FFFF 0x2200_0000-0x23FF_FFFF 2 片上外设区中的最低 1MB: 片上外社区所对应的别名区 32MB 空间: 0x4000_0000-0x400F_FFFF 0x4200_0000-0x43FF_FFFF 嵌入式专业技术论坛 (www.armjishu.com)出品 第 323 页,共 771 页 www.armjishu.com 下面是内部空间映射图: ARM 技术论坛 神舟 IV 号用户手册 V2.0 例如:SRAM 区中的最低 1MB 空间中的 0x2000_0000 的 8 个 bit,分别对应如下: 地址 对应的 bit 位 别名空间 Bit 对应的别名空间 0x2000_00000 Bit1 0x2200_0000 跨度一个字 = 4 个字节 = 32 个 bit Bit2 0x2200_0004 跨度一个字 = 4 个字节 = 32 个 bit Bit3 0x2200_0008 跨度一个字 = 4 个字节 = 32 个 bit Bit4 0x2200_000C 跨度一个字 = 4 个字节 = 32 个 bit Bit5 0x2200_0010 跨度一个字 = 4 个字节 = 32 个 bit Bit6 0x2200_0014 跨度一个字 = 4 个字节 = 32 个 bit Bit7 0x2200_0018 跨度一个字 = 4 个字节 = 32 个 bit Bit8 0x2200_001C 跨度一个字 = 4 个字节 = 32 个 bit 可以看到上表和上图,0x2000_0000 中的一个 bit 位对应了别名区的一个 32 位的字,也就是说 STM32 芯片的内部寄存器的任意一个位,都其实对应的是别名区的 32 个位。 7.4.5 如何用代码来实现位带操作 在 STM32 中,一个寄存器是 32 位的,32 个 bit 中的任意其中一个 bit 所对应的别名空间 到底该如何访问呢?首先分为两种情况,一种是在 SRAM,一种是在 FLASH 中,两个别名 空间的起地位置是不同的,SRAM 是从 0x2200_0000 开始,而 FLASH 是从 0x4200_0000 开 始。 假如在 SRAM 中的一个寄存器的地址是 A,访问寄存器 A 中的第 n 个 bit 位。那么该如 何计算呢?我们知道 SRAM 中别名区的起始地址是 0x2200_0000 对应 SRAM 中实际寄存器 嵌入式专业技术论坛 (www.armjishu.com)出品 第 324 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 地址 0x2000_0000,SRAM 中每 1 个 bit,都会对应别名区中的 32 个 bit,那么实际地址的公 式应该如下: 0x2200_0000 + (SRAM 实际寄存器地址偏移 0x2000_0000 的 bit 数)* 4 因为 0x2200_0000 这个地址每增加 1,实际上就是增加 8 个 bi(t 一个地址对应一个字节), 实际寄存器中的 1 个 bit 对应 32 个 bit,所以就乘以 4,地址本身增加 1 是 8bit,8bit 乘以 4 倍刚好是 32bit。 那么接下来” SRAM 实际寄存器地址偏移 0x2000_0000 的 bit 数”该如何计算呢? 对,用寄存器的地址减去这个基地址,然后在乘以 8(因为一个地址对应 8 个 bit),所以就 可以得到以下的公式: (A‐0x20000000)*8 以上这个公式可以知道实际寄存器离基地址有多少个 bit 的距离,访问该寄存器的第 n 个 bit 位还必须加上一个 n,就变成以下的公式: (A‐0x20000000)*8+n 好了,最后整理整个换算公式如下,FLASH 与 SRAM 的原理都是想通的: SRAM :0x22000000 +((A‐0x20000000)*8+n)*4 FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 4. 举例说明: 比如我要访问如下寄存器 GPIOB_BSRR 中的第 14bit 位 BS13,注意因为寄存器内部是从 0 开始 计数到 31 截止,所以第 14bit 相当于是第 13。 可以从下图看到,GPIO 端口 B 的起始地址是 x04001_0C00,GPIOB_BSRR 寄存器的偏移地址 是 0x10,访问的第 14bit 位的 BS13。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 325 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 那么通过公式: FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 换算 0x4200_0000 + ((0x40010c00-0x40000000)*8 + 12)*4 = 实际地址 在这里我们就不具体计算了,SRAM 访问也是同理 5. 如何将理念转化成代码: 由上面几节得出,SRAM 和 FLASH 中别名区的寻址公式如下: SRAM :0x22000000 +((A‐0x20000000)*8+n)*4 FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 可以看到 0x2200_0000 和 0x4200_0000 都共同有个 x200_0000 这个数值;乘以 8 相当于再加上 外面的那个乘以 4,总共是乘以 32,而 n 是乘以 4;乘以 32 相当于是数值向左移 5 位,乘以 4 相当 于向左边移 2 位。 尝试将如下公式化成 #define BITBAND(addr,bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 这样就可以用 BITBAND(addr,bitnum)来表示寄存器里的任何一个 bit 位,大概原理讲到这里, 具体使用方法通过例程来体现。 7.4.6 软件设计 进入例程的文件夹,然后打开\ MDK-ARM \ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 326 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析1:在系统启动文件(startup_stm32f4xx_xx.s)中已经调用SystemInit()初始化了时钟。 代码分析2:调用LED_config( )函数初始化板载LED指示灯,前面已经有介绍 代码分析3:开始使用位带的BitBand方式,使得管脚输出高电平熄灭指示灯,这里可以看到,一个 变量就可以独立操作一个GPIO管脚,这究竟是如何做到的呢?下面继续看代码分析: 1)首先看如下这行代码: #define LED1OBB Periph_BB((uint32_t)&LED1_GPIO_PORT->ODR, LED1_PIN_NUM) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 327 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 LED1OBB希望变成PF端口的第10个GPIO管脚,那就是PF.10,那么LED1_PIN_NUM=10,而 LED1_GPIO_PORT->ODR则变成了GPIOF->ODR 2)继续分析一下,把PF端口和PF端口的第10管脚这两个参数传入到Periph_BB()就可以访问到PF.10 的这个GPIO管脚了吗?还得分析一下Periph_BB()函数 代码分析4:开始详细分析和解析Periph_BB()函数,这里就比较复杂,如果感兴趣的朋友可以认 真研究和计算,如果不感兴趣,也不会影响后面的学习,等有兴趣的时候再来研究也都可以,这是 STM32神舟团队专门提供的建议: 1)Periph_BB_BASE是外设别名区基地址 #define Periph_BASE 0x40000000 // 外设基地址 Peripheral #define Periph_BB_BASE 0x42000000 // 外设别名区基地址 Peripheral bitband 从图中可以看到从0x40000000到0x40100000这1M的Bit Band区域对应了从0x42000000~0x43FFFFFF 这32MB的区域,也就是说Bit Band区域中的1个bit对应了Bit Band Alias区域32个bit的空间。 2)在 STM32 中,一个寄存器是 32 位的,32 个 bit 中的任意其中一个 bit 所对应的别名 空间到底该如何访问呢?首先分为两种情况,一种是在 SRAM,一种是在 FLASH 中,两个 别名空间的起地位置是不同的,FLASH 是从 0x4200_0000 开始。 假如在 FLASH 中的一个寄存器的地址是 A,访问寄存器 A 中的第 n 个 bit 位。那么该如 何计算呢?我们知道 FLASH 中别名区的起始地址是 0x4200_0000 对应 SRAM 中实际寄存器 嵌入式专业技术论坛 (www.armjishu.com)出品 第 328 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 地址 0x4000_0000,FLASH 中每 1 个 bit,都会对应别名区中的 32 个 bit,那么实际地址的 公式应该如下: 0x4200_0000 + (FLASH 实际寄存器地址偏移 0x4000_0000 的 bit 数)* 4 因为 0x4200_0000 这个地址每增加 1,实际上就是增加 8 个 bi(t 一个地址对应一个字节), 实际寄存器中的 1 个 bit 对应 32 个 bit,所以就乘以 4,地址本身增加 1 是 8bit,8bit 乘以 4 倍刚好是 32bit。 那么接下来” FLASH 实际寄存器地址偏移 0x4000_0000 的 bit 数”该如何计算呢? 对,用寄存器的地址减去这个基地址,然后在乘以 8(因为一个地址对应 8 个 bit),所以就 可以得到以下的公式: (A‐0x40000000)*8 以上这个公式可以知道实际寄存器离基地址有多少个 bit 的距离,访问该寄存器的第 n 个 bit 位还必须加上一个 n,就变成以下的公式: (A‐0x40000000)*8+n = 实际寄存器的地址距基地址的实际 bit 数 好了,最后整理整个换算公式如下,FLASH 与 SRAM 的原理都是想通的: FLASH :0x42000000 +((A‐0x40000000)*8+n)*4(实际寄存器的地址距基地址的实际 bit 数 * 4 个字节(4 个字节是 32 个 bit) 再加上 bitband 的别名区的基地址,就得出实际的别 名区 bitband 的地址了) 3)可以从下图看到,GPIO 端口 F 的起始地址是 x04002_1C00,访问的是 GPIO 管脚 10 那么通过公式: FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 换算 0x4200_0000 + ((0x40021C00-0x40000000)*8 + 12)*4 = 实际地址 4)FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 这个公式化成另外一种计算方式就变成: 0x42000000 +(A‐0x40000000)*32+n*4,所以乘以32实际上是左移5位,乘以4实际上就是 左移2位,最后3个地址相加: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 329 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 这3个地址,一个是最基础的地址0x42000000,一个是寄存器对应bitband区域的地址,最后 一个寄存器里面的位对应的bitband区域的地址。 代码分析5:PFSetBit(10)函数就是表示设置PF.10管脚,使得管脚管脚依次输出高电平 #define PFSetBit(n) (PFOutBit(n) = 1) #define PFOutBit(n) Periph_BB((uint32_t)&GPIOF->ODR,n) 可以看到,最终还是调用了Periph_BB()函数了,在这里只需要传入所对应寄存器的地址,以及对应 的GPIO管脚号,就可以访问到最终的bitband区域。 7.4.7 下载与验证 如果使用JLINK下载固件,请按错误!未找到引用源。下载固件到神舟王407开发板小节操作。 如果使用USB下载固件,请按错误!未找到引用源。小节进行操作。 如果使用串口下载固件,请按错误!未找到引用源。小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。小节进 行操作。 7.4.8 实验现象 将固件程序下载到神舟王 407 开发板后,按一下复位键;神舟王 407 开发板上的 4 个 LED 灯全部亮, 然后逐个熄灭。按下 4 个按键中的随意一个,对应的 LED 灯的状态反转。如下图显示 7.5 EXTI外部按键中断实验 前面我们介绍了STM32的IO口作为输出功能使用并介绍了我们以按键的输入扫描实验,这一节, 我们将向大家介绍如何使用STM32的IO口作为EXTI外部中断的输入功能,我们以按键的输入为例讲 解,通过本节的学习,你将了解到STM32的IO口作为EXTI外部中断输入使用的方法。 7.5.1 什么是中断 单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。比如说你在做A事,但是 突然间来了你想起来了更重要的B事,所以你马上去做B事了,做完之后再回来继续做A事,这个就 是中断。 7.5.2 什么是单片机的中断? 当CPU正在执行一个任务,但突然又发生了一个更高级的任务,CPU必须立即去执行的任务, 所以CPU必须中断当前的任务,并保存该任务已经执行的状态和相关信息,然后转而去执行那个更 加高级的任务,因此就引入了“中断”这个概念。 中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的 嵌入式专业技术论坛 (www.armjishu.com)出品 第 330 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原 程序。 中断是单片机实时地处理内部或外部事件的一种内部机制。当某种内部或外部事件发生时, 单片机的中断系统将迫使CPU暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后, 又返回被中断的程序处,继续执行下去。 在程序里面也是一样的。举个例子可能会容易懂点,定时中断:比如你定时1ms,主程序在运行, 每当1ms时间到后,就跑到定时中断子程序里面执行,执行完后再回到主程序(中断程序是1ms中断 一次)。那对于整个系统来说中断能实现什么好处呢?下面我们给以说明: 1)提高了CPU的效率 CPU是计算机的指挥中心,它与外围设备(如按键、显示器等)通讯的方法有查询和中断2种: 查询的方法是无论外围IO是否需要服务,CPU每隔一段时间都要依次查询一遍,这种方法CPU需要 花费一些时间在做查询服务工作。 中断则是在外围设备需要通讯服务时主动告诉CPU,这个时候CPU才停下当前工作去处理中断 程序,不需要占用CPU主动去查询的时间,CPU可以在没有中断请求来临之前一直做自己的工作, 从而提高了CPU效率。 2)可以实现实时处理 外设任何时刻都可能发出请求中断信号,CPU接到请求后及时处理,以满足实时系统的需要。 3)可以及时处理故障 计算机系统运行过程中难免会出现故障,有许多事情是无法预料的,如电源掉电、存储器出错、 外围设备工作不正常等,这时可以通过中断系统向中断源CPU发送中断请求,由CPU及时转到相 应的出错处理程序,从而提高计算机的可靠性。 7.5.3 STM32中断的初步理解 这个例程的实验原理主要包括两个:一、通过神舟王407开发板上的4个按钮(KEY1、KEY2、 KEY3/ TAMPER、KEY4/ WAKEUP),控制4个LED灯的点亮和关闭状态。具体的对应关系如下: 现象 操作 DS4亮其它LED灭 DS3亮其它LED灭 DS2亮其它LED灭 DS1亮其它LED灭 神舟王407板载KEY1按键被按下 神舟王407板载KEY2按键被按下 神舟王407板载KEY3/TAMPER按键被按下 神舟王407板载KEY4/WAKEUP按键被按下 这里我们首先STM32 IO口中断的一些基础概念。STM32的每个IO都可以作为外部中断的中断输 入口,这点也是STM32的强大之处。STM32F407的中断控制器支持23个外部中断/事件请求。每个中 断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F407的23个外部中断为: 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC Alarm事件。 线18:连接到USB OTG FS唤醒事件。 线19:连接到以太网唤醒事件。 线20:连接到USB OTG HS唤醒事件。 线21:连接到RTC Tamper and TimeStamp事件。 线22:连接到RTC 唤醒事件。 STM32F407ZGT6一共有7组GPIO,每组GPIO口都有16个管脚,分别是PA[15:0]、PB[15:0]、 PC[15:0]、PD[15:0] 、PE[15:0]、PF[15:0]、PG[15:0]。STM32的所有GPIO管脚都可以作为中断输入 源,但是如果每个GPIO都是一个独立的中断源,则需要一百多个个中断源,这是不科学的,所以通 过复用的方式使其对处理器来说来自GPIO的一共有16个中断Px[15:0]。具体实现是PA[0]、PB[0]、 PC[0]、PD[0] 、PE[0]、PF[0]和PG[0]共享一个GPIO中断;PA[1]、PB[1]、PC[1]、PD[1] 、PE[1] 、 嵌入式专业技术论坛 (www.armjishu.com)出品 第 331 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 PF[1]和PG[1]共享一个GPIO中断;……PA[15]、PB[15]、PC[15]、PD[15] 、PE[15] 、PF[15] 和PG[15] 共享一个GPIO中断,如下图所示: 所以在硬件设计时要注意,不要将外部中断连接到PA[1]、PB[1]、PC[1]、PD[1] 、PE[1] 、PF[1] 和PG [1],这样的话处理器只能选择一个作为中断源比如PA[1],那么其它的中断将无法到达处理器。 下 面 谈 谈 具 体 的 代 码 实 现 , 在 库 函 数 中 , 配 置 GPIO 与 中 断 线 的 映 射 关 系 的 函 数 SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)来实现的。 该函数将GPIO端口与中断线映射起来,例如: GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource3); 将中断线3与GPIOA映射起来,那么很显然是GPIOA的第3个管脚与EXTI3中断线连接了。设置 好中断线映射之后,那么到底来自这个IO口的中断是通过什么方式触发的呢?这里还需要对中断的 一些属性进行设置,接下来我们就要设置该中断线上中断的初始化参数了。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 332 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 中断线上中断的初始化是通过函数EXTI_Init()实现的。EXTI_Init()函数的定义是: void EXTI_Init ( EXTI_InitTypeDef * EXTI_InitStruct ); 所有的参数都会被设置到EXTI_InitTypeDef这个结构体里去,下面我们用一个使用范例来说明这 个函数的使用: EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line3;; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 上面的例子设置中断线3上(EXTI_Line3;)的中断为下降沿触发(EXTI_Trigger_Falling)。STM32 的外设的初始化都是通过结构体来设置初始值的,这里就不罗嗦结构体初始化的过程了。我们来看 看结构体EXTI_InitTypeDef的成员变量, 从定义可以看出,有4个参数需要设置: typedef struct { uint32_t EXTI_Line; EXTIMode_TypeDef EXTI_Mode; EXTITrigger_TypeDef EXTI_Trigger; FunctionalState EXTI_LineCmd; }EXTI_InitTypeDef; 第一个参数是中断线的标号,取值范围为EXTI_Line0~EXTI_Line15。这个在上面已经讲过中断 线的概念。也就是说,这个函数配置的是某个中断线上的中断参数。 第二个参数是中断模式,可选值为中断EXTI_Mode_Interrupt和事件EXTI_Mode_Event。 第 三 个 参 数 是 触 发 方 式 , 可 以 是 下 降 沿 触 发 EXTI_Trigger_Falling , 上 升 沿 触 发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发EXTI_Trigger_Rising_Falling,相信学 过51的对这个不难理解。 第四个参数是使能中断 7.5.4 STM32中断的初始化过程以及手册的查询 关于中断的更加深入的理解查阅手册之后,ST 给出需要查看另外的几个文档 嵌入式专业技术论坛 (www.armjishu.com)出品 第 333 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 这些手册都在 ST 官网里可以找到,《STM32F4 参考手册 DM00031020.pdf》中主要介绍的是关 于中断的屏蔽,哪根中断线进行上升沿或者下降沿触发等,如下手册目录截图: .这里没有涉及到优先级的设定,优先级的设定具体细节在另外一个手册中就是《Cortex-M4 编程手 册》,如下手册目录截图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 334 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 最后手册是《CM4 技术参考手册》主要是介绍理论上的,介绍整个 NVIC 的编程器模型,有兴趣的 可以详细去研究一下。 这么用户手册,那么外部中断初始化的一般要经过那些步骤呢?请见下面: 1)初始化IO口为输入。 2)开启IO口复用时钟,设置IO口与中断线的映射关系。 3)初始化线上中断,设置触发条件等 4)配置中断分组(NVIC),并使能中断 5)编写中断服务函数。 通过以上几个步骤的设置,我们就可以正常使用外部中断了,关于IO口初始化中断之后,唯一 复杂的就只剩下中断分组的优先级了,这个优先级原本在51单片机中是比较简单的,但在M4中就被 设计得比较复杂一些,优先级无非就是这些任务按先后顺序进行切换,那么我们接来下做一些详细 的分析: 7.5.5 STM32中断优先级 CM4内核支持256个中断优先级,其中包含了16个内核中断和240个外部中断,并且具有256级的 可编程中断设置。但STM32并没有使用CM4内核的全部东西,而是只用了它的一部分。而我们常用 的就是这87个可屏蔽中断,但是STM32的87个可屏蔽中断,在STM32F103系列上面,又只有60个(在 107系列才有68个);所以说这个16级的中断优先级就随客户怎么去设计,把STM32F107的这68个中 断分别赋予不同的优先级,用户可以根据各自的情况来灵活设定优先级,已使得系统能够以最高效 能来进行工作。而神舟王407的主芯片是STM32F407ZG,它也是M4的,中断资源基本类似。这里的 NVIC就是中断属性的设置的一个专业术语,下面看看与NVIC相关的寄存器有哪些属性: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 335 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 STM32的中断在这些寄存器的控制下有序的执行的。只有了解这些中断寄存器,才能了解STM32 的中断。下面简要介绍这几个寄存器: ISER[8]:ISER全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组,要使能某个 中断,必须设置相应的ISER位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。 ICER[8]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和ICER一样。这里要专门设 置一个ICER来清除中断位,而不是向ISER写0来清除,是因为NVIC的这些寄存器都是写1有效的, 写0是无效的。具体为什么这么设计,请看《CM4权威指南》第125页,NVIC概览一章。 ISPR[8]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应 的中断和ISER是一样的。通过置1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0是无效的。 ICPR[8]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与ISPR 相反,对应位也和ISER是一样的。通过设置1,可以将挂起的中断接挂。写0无效。 IABR[8]:全称是:Active Bit Registers,是一个中断激活标志位寄存器组。这是一个只读寄存器, 通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。对应位所代表的中 断和ISER一样,如果为1,则表示该位所对应的中断正在被执行。 IP[240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组 相当重要!STM32的中断分组与这个寄存器组密切相关。因为STM32的中断多达60多个,所以STM32 采用中断分组的办法来确定中断的优先级。IPR寄存器组由15个32bit的寄存器组成,每个可屏蔽中断 占用8bit,这样总共可以表示15*4=60个可屏蔽中断。刚好和STM32的可屏蔽中断数相等。IP[0]的 [31~24],[23~16],[15~8],[7~0]分别对应中中断3~0,依次类推,总共对应68个外部中断。而每个 可屏蔽中断占用的8bit并没有全部使用,而是 只用了高4位。这4位,又分为抢占优先级和子优先级。 抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中中断分组的 设置来决定。 寄存器ISER、ICER、ISPR、ICPR、IABR在STM32中都使用的8个(实际3个就够了,后面的留在后 面扩充?)。这些32位的寄存器中每一位对应了一个中断通道相应的标志。 比如地址在0xE000E100的ISER[0]这个32位的寄存器,第0位是中断通道0的允许位,第1位是中 断通道1的允许标志……第31位是中断通道31的允许位;接下来地址在0xE000E104的ISER[1]则是中 断通道32-63的允许位。ICER、ISPR、ICPR、IABR的结构相同,只是含义不同。注意是对这些寄存器 的操作:写1表示置位或清除,写0无任何影响。例如:对地址在0xE000E100的ISER[0]的第0位写1, 表示允许中断通道0中断;但对0xE000E100的ISER[0]的第0位写0,则没有任何作用,该位保持不变。 如果要禁止中断通道0的中断响应,那么就必须:对地址0xE000E180的ICER[0]的第0位写1,表示禁 止中断通道0的中断;对0xE000E180的ICER[0]的第0位写0,也是不起任何作用的。IP[240]用于定义 240个外部中断通道的优先级,每1个字节对应一个中断通道。4个中断通道的IP[n]字构成一个32位 嵌入式专业技术论坛 (www.armjishu.com)出品 第 336 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 的寄存器。在STM32中最多有68个外部中断通道,每个IP[n]的1个字节中只使用高4位(见前面介绍)。 IP[n]的结构如下: 7.5.6 硬件设计 神舟王407开发板总共有4个功能按键,分别是WAKEUP按键和TAMPER按键及两个用于自定义功能 按键,在不使用第二功能的情况下,这四个按键都可以作为通用的按键,由用户自定义其功能。这 四个按键分别与PA5、PF11、PC13和PA0 四个GPIO管脚连接,当按键按下时,对应的GPIO管脚为 低电平,反之,当没有按键按下时,对应的GPIO管脚为高电平。其中PA0 (STM32的WKUP引脚)可 以作为WK_UP功能,它除了可以用作普通输入按键外,还可以用作STM32的唤醒输入。PC13可以实 现备份区寄存器的入侵功能。本实验中所有的按键均作为普通IO使用。 按键输入电路 GPIO 管脚与按键对应关系 按键 KEY1 KEY2 KEY3/TAMPER KEY4/WAKEUP 按键对应的GPIO PA5 PF11 PC13 PA0 本实验需要使用的 GPIO 管脚与对应的 LED 灯关系如下: LED灯 LED灯对应的GPIO DS1 PF7 嵌入式专业技术论坛 (www.armjishu.com)出品 第 337 页,共 771 页 www.armjishu.com DS2 PF8 DS3 PF9 DS4 PF10 ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.5.7 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析1:在系统启动文件(startup_stm32f4xx_xx.s)中已经调用SystemInit()初始化了时钟,这里的代 嵌入式专业技术论坛 (www.armjishu.com)出品 第 338 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 码是汇编的,大家可以了解一下就可以,这个文件里的代码是ST官方定制好了的,不需要我们修改, 我们只需要知道在这里有这个时钟调用的函数就可以。 代码分析2:函数LED_config( )初始化LED,这些前面已经有详细分析,这里不细分析。 代码分析4:SZ_STM32_KEYInit( )初始化板载按键为中断模式。 代码分析5:初始化中断线,以及中断的触发模式: 代码分析6:初始化KEY按键的中断优先级 代码分析7:BUTTON_IRQn[key]例如在按键KEY1中对应的PA5的管脚,所以对应到的中断函数为 EXTI9_5_IRQn,可以在stm32f4xx_it.c中找到这个对应的函数: 这里需要说明一下,STM32的IO口外部中断函数只有6个,分别为: EXPORT EXTI0_IRQHandler EXPORT EXTI1_IRQHandler EXPORT EXTI2_IRQHandler EXPORT EXTI3_IRQHandler EXPORT EXTI4_IRQHandler EXPORT EXTI9_5_IRQHandler EXPORT EXTI15_10_IRQHandler 中断线0-4每个中断线对应一个中断函数,中断线5-9共用中断函数EXTI9_5_IRQHandler,中断线10-15 共用中断函数EXTI15_10_IRQHandler。 代码分析8:关于函数EXTI_GetITStatus(EXTI_Line5)和EXTI_ClearITPendingBit(EXTI_Line5)做进一 步分析 在编写中断服务函数的时候会经常使用到两个函数,第一个函数是判断某个中断线上的中断是 否发生(标志位是否置位): ITStatus EXTI_GetITStatus(uint32_t EXTI_Line); 嵌入式专业技术论坛 (www.armjishu.com)出品 第 339 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 这个函数一般使用在中断服务函数的开头判断中断是否发生。另一个函数是清除某个中断线上 的中断标志位: void EXTI_ClearITPendingBit(uint32_t EXTI_Line); 这个函数一般应用在中断服务函数结束之前,清除中断标志位。 常用的中断服务函数格式为: void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line5)!=RESET)//判断某个线上的中断是否发生 { 中断逻辑… EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE上的中断标志位 } } 在这里需要说明一下,固件库还提供了两个函数用来判断外部中断状态以及清除外部状态标志 位的函数EXTI_GetFlagStatus和EXTI_ClearFlag,他们的作用和前面两个函数的作用类似。只是在 EXTI_GetITStatus 函 数 中 会 先 判 断 这 种 中 断 是 否 使 能 , 使 能 了 才 去 判 断 中 断 标 志 位 , 而 EXTI_GetFlagStatus直接用来判断状态标志位。如果使用了这两个函数,可以使得程序更加的健壮。 代码分析9:NVIC_GroupConfig()配置NVIC中断优先级分组 NVIC只可以配置16种 中断向量的优先级,也就是说,抢占优先级和响应优先级的数量由一个4 位的数字来决定,把这个4位数字的位数,分配成抢占优先级部分和响应优先级部分。有5组分配方 式。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 340 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析10:NVIC_InitTypeDef结构体初始化了优先级的初始定义,首先要用NVIC_IRQChannel参 数 来 选 择 将 要 配 置 的 中 断 向 量 , 用 NVIC_IRQChannelCmd 参 数 来 进 行 使 能 (ENABLE) 或 关 闭 (DISABLE)该中断。在NVIC_IRQChannelPreemptionPriority成员要配置中断向量的抢占优先级, 在NVIC_IRQChannelSubPriority需要配置中断向量的响应优先级: NVIC_IRQChannel 需要配置的中断向量; NVIC_IRQChannelPreemptionPriority 配置相应中断向量抢占优先级; NVIC_IRQChannelSubPriority 配置相应中断向量的响应优先级; NVIC_IRQChannelCmd 使能或关闭相应中断向量的中断响应; 代码分析11:要配置这些优先级组,可以采用库函数NVIC_PriorityGroupConfig(),可输入的参数为 NVIC_PriorityGroup_0 ~ NVIC_PriorityGroup_4,分别为以上介绍的5种分配组。 可以看到,关于设置优先级的时候,就进入到了SCB->AIRCR这个寄存器了,这个寄存器可以 在《Cortex-M4编程手册》中找到,我们截取部分进行说明: 我 们 可 以 看 到 , SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup; 例 如 : SCB->AIRCR |= (0x05FA0000 | 0x600)这句代码设置到了AIRCR寄存器到底是什么,设置成了 0x05FA0600这个值 这里简单介绍一下STM32的中断分组:STM32将中断分为5个组,组0~4。该分组的设置是由 SCB->AIRCR寄存器的bit10~8来定义的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 341 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 AIRCR(Application Interrupt/Reset Control Register),该寄存器的[10:8]3位就是 PRIGROUP的 定义位,它的值规定了系统中有多少个抢先级中断和子优先级中断。而STM32只使用高4位bits,其 可能的值如下(来自ST的函数库头文件中的定义),那么现在就选择了下面的组1,目前优先级被设 定为组1,也就是1位抢占优先级,3位响应优先级 由于这个寄存器相当重要,为了防止误操作(写),因此当改写这个寄存器的内容时,必须要 同时向这个寄存器的高16位[31:16]写验证字(Register key) 0x05FA。 代码分析12:下面开始分析NVIC_Init() 中断优先级设置的步骤: 1. 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级和子优先级的分配位数。 调用函数为NVIC_PriorityGroupConfig(); 2. 设置所用到的中断的中断优先级别。对每个中断调用函数为NVIC_Init(); 函数NVIC_Init()初始化优先级等相关属性,STM32的中断如此之多,配置起来并不容易,因此, 我们需要一个强大而方便的中断控制器NVIC (Nested Vectored Interrupt Controller)。NVIC是属于 嵌入式专业技术论坛 (www.armjishu.com)出品 第 342 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 Cortex内核的器件,不可屏蔽中断 (NMI)和外部中断都由它来处理,而SYSTICK不是由NVIC来控制 的。 使 用 NVIC 来 配 置 中 断 时 , 自 然 想 到 ST 库 肯 定 也 已 经 把 它 封 装 成 库 函 数 了 。 对 NVIC 初 始 化 NVIC_Init() 函数,首先要定义并填充一个NVIC_InitTypeDef 类型的结构体: 可以看到这个函数中对3个结构体进行设置了,其中SCB->AIRCR前面已经介绍过了,这里就是 把用户设定的优先级真正的取出来: 然后存入到 代码分析13:分析一下NVIC_Type的结构体 STM32的中断在这些寄存器的控制下有序的执行的。只有了解这些中断寄存器,才能了解STM32 嵌入式专业技术论坛 (www.armjishu.com)出品 第 343 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 的中断。下面简要介绍这几个寄存器: ISER[8]:ISER全称是:Interrupt Set-Enable Registers,这是一个中断使能寄存器组。要使能某个 中断,必须设置相应的ISER位为1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。 ICER[8]:全称是:Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组与ISER的 作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和ICER一样。这里要专门设置 一个ICER来清除中断位,而不是向ISER写0来清除,是因为NVIC的这些寄存器都是写1有效的,写0 是无效的。具体为什么这么设计,请看《CM4权威指南》,NVIC概览一章。 ISPR[8]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中 断和ISER是一样的。通过置1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写0是 无效的。 ICPR[8]:全称是:Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作用与ISPR 相反,对应位也和ISER是一样的。通过设置1,可以将挂起的中断接挂。写0无效。 IABR[8]:全称是:Active Bit Registers,是一个中断激活标志位寄存器组。这是一个只读寄存器,通 过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。对应位所代表的中断 和ISER一样,如果为1,则表示该位所对应的中断正在被执行。 IP[240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组相当 重要!STM32的中断分组与这个寄存器组密切相关。因为STM32的中断多达60多个,所以STM32采 用中断分组的办法来确定中断的优先级。IP寄存器组由240个32bit的寄存器组成,每个可屏蔽中断占 用8bit。IPR[0]的[31~24],[23~16],[15~8],[7~0]分别对应中中断3~0,依次类推。而每个可屏蔽中 断占用的8bit并没有全部使用,而是 只用了高4位。这4位,又分为抢占优先级和子优先级。抢占优 先级在前,子优先级在后。而这两个优先级各占几个位又要根据SCB->AIRCR中中断分组的设置来 决定。 代码分析14:全部设置好之后,只需要进入一个while()死循环,一旦按键按下,就触发了已经配置 好的GPIO管脚的中断,从而进入到中断函数,执行中断函数里的内容。 中断函数都放在stm32f4xx_it.c中 嵌入式专业技术论坛 (www.armjishu.com)出品 第 344 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.5.8 下载与验证 如果使用JLINK下载固件,请按错误!未找到引用源。错误!未找到引用源。下载固件到神舟 王407开发板小节进行操作。 如果使用USB下载固件,请按错误!未找到引用源。错误!未找到引用源。小节进行操作。 如果使用串口下载固件,请按错误!未找到引用源。错误!未找到引用源。小节进行操作。 如果在IAR开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 7.5.9 实验现象 上电运行。在没有按键按下时,所有的LED灯都亮,有按键按下,相关的LED灯会随之发生变 化,具体实现现象如下表所示。 现象 操作 说明 DS4亮 DS3亮 DS2亮 DS1亮 神舟王407开发板KEY1按键被按下 神舟王407开发板KEY2按键被按下 神舟王407开发板KEY3/TAMPER按键被按下 神 舟 王 王 407 开 发 板 KEY4/WAKEUP 按 键 被 按下 没有按键按下时 则保持最后一次 按键出发的LED 亮 嵌入式专业技术论坛 (www.armjishu.com)出品 第 345 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.6 SysTick系统滴答实验 7.6.1 基本概念和原理 SysTick定时器被捆绑在NVIC中,用于产生SysTick异常。在以前,操作系统和有所有使用了时 基的系统,都必须要一个硬件定时器来产生需要的“滴答”中断,作为整个系统的时基。滴答中断 对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务 能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种 定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让 用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。 Cortex-M3在内核部分 包含了一个简单的定时器——SysTick timer。因为所有的CM4芯片都带 有这个定时器,软件在不同芯片生产厂商的 CM4器件间的移植工作就得以化简。该定时器的时钟源 可以是内部时钟(FCLK,CM4上的自由运行时钟),或者是外部时钟( CM4处理器上的STCLK信号)。 不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同。因此, 需要阅读芯片的使用手册来确定选择什么作为时钟源。在STM32中SysTick 以 HCLK(AHB时钟)或 HCLK/8 作为运行时钟。 SysTick定时器:系统滴答定时器是一个非常基本的倒计时定时器,用于在每隔一定的时间产生 一个中断,即使是系统在睡眠模式下也能工作。它使得OS 在各CM4器件之间的移植中不必修改系 统定时器的代码,移植工作一下子容易多了。 SysTick定时器能产生中断,CM4为它专门开出一个异常类型,并且在向量表中有它的一席之地。 它使操作系统和其它系统软件在CM4器件间的移植变得简单多了,因为在所有CM4产品间,SysTick 嵌入式专业技术论坛 (www.armjishu.com)出品 第 346 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 的处理方式都是相同的。SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一 个闹铃,用于测量时间等。 Systick 定时器属于cortex内核部件,可以参考《CortexM4权威指南》或《STM34xxx-Cortex编程 手册》来了解。 7.6.2 实验原理 SysTick其实就是一个24位的倒计数定时器,当计到0时,将从STK_LOAD寄存器中自动重装载 定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。 下面先了解跟SysTick相关的几个寄存器。 SysTick_CSR 0xE000E010 -- 控制寄存器 SysTick_LOAD 0xE000E014 -- 重载寄存器 SysTick_VAL 0xE000E018 -- 当前值寄存器 SysTick_CALRB 0xE000E01C -- 校准值寄存器 由于SysTick是CortexM4的标准组件,关于技术细节详细请参见《Cortex-M4 技术参考手册》文 档,“SysTick timer (STK)”小节。 7.6.3 硬件设计 SysTick 为内部组件,这部分不需要硬件电路,这里仅在中断产生时,进行点灯操作。 7.6.4 软件设计 打开主函数: 代码分析1: 初始化LED灯以及初始化蜂鸣器,然后通过函数SysTick_Configuration( )设置systick定时器。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 347 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 1) if (SysTick_Config(SystemCoreClock / 1000)) SysTick 中断配置函数,配置具体装载多少时间,也 就是说计数多少次就会被中断一次,在这里可以看到 2) NVIC_SetPriority(SysTick_IRQn, 0x0)设置 systick 中断号,启动这个中断,并同时配置一下优先 级 代码分析2:SysTick_Config()是完成systick设置的最终函数,下面具体来分析一下寄存器: 因为STM32是SystemCoreClock时钟是168MHZ,在这里传入的值是SystemCoreClock /1000,每次 振荡时间是1/168MHZ,现在需要振荡168M/1000次总共所花的时间用以下公式来算: 需要振荡的次数 * 每次的振荡时间 = 168M/1000 * 1/168M = 1/1000 = 0.001秒 = 1毫秒 也就是说,systick每隔1ms时钟就会产生一次systick的中断,函数内部的配置可以参看下面的寄存器 — SysTick_CSR SysTick控制与状态装台寄存器 复位状态为:0x00000000 SysTick_CSR寄存器的位分配如下所示: 以上各位的描述,如下表所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 348 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 — SysTick_LOAD 重装值寄存器 SysTick一个递减的计数器,当计数器递减到“0”时,重装寄存器中的值就会被重装。 SysTick_LOAD重装值寄存器是一个24位宽的寄存器,如下图所示: — SysTick_VAL 当前值寄存器 使用SysTick当前值寄存器来查找寄存器中的当前值。具体寄存器的位分配如下所示: — SysTick_CALRB 校准寄存器 使用校准寄存器通过乘法或是除法运算可以将寄存器调节成任意所需的时钟速率,如下所 示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 349 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 分析代码 3:NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)通过判断中断 IRQn 的值,来知道这 个中断号,以及这个中断号之下的优先级 priority 设置。 可以看到 stm32f4xx.h 中的 IRQn 数组中有许多中断的优先级,可以看到系统内部级的中断都是小于 0 的,优先级比较高;其他普通的中断,例如看门狗,FLASH,RTC 等都是大于 0 的优先级,这些 与系统级的中断比的话,优先级要低一些。 代码分析4:产生中断之后进入中断函数SysTick_Handler() 调用TimingDelay_Decrement( )函数,每调用一次TimingDelay减去1,就表示时间过了1 毫秒。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 350 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析4:调用Delay ( )给TimingDelay赋值。 假设我们DelayMs(1000)使TimingDelay的值为1000。那么延时的时间应该是1ms的1000 倍,即1秒(忽略进行其他操作运行的时间)。 代码分析5:在while循环中,我们:蜂鸣器不停的变化。 7.6.5 下载与验证 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。 错误!未找到引用源。小节进行操作。 7.6.6 实验现象 将程序下载到神舟王 407 核心板后,按复位键正常情况下,神舟王开发板上的 LED 灯 DS4 将按 一定的频率亮灭,蜂鸣器按一定的频率发出“滴、滴”声。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 351 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.7 USART串口1通信(神舟王STM32F407-库函数版) 7.7.1 串口printf打印输出实验的意义与作用 串口的使用对于我们开发调试过程中的作用是非常之大,可以用来查看,打印以及输入相关信 息, 7.7.2 串口printf打印输出实验原理 在学习串口发送功能之前,我们先要了解什么是串口,串口通信是什么,也就是串行通信的基 础知识。 串行通信基础知识: 串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种 通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并 行传输低。 串口是计算机上一种非常通用的设备通信协议。大多数计算机(不包括笔记本电脑)包含两个 基于 RS-232 的串口。串口同时也是仪器仪表设备通用的通信协议(串口通信协议也可以用于获取远 程采集设备的数据)。 一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。 评价一个通讯是否优质,主要体现在传输的速度,数据的正确性,功耗是否低,布线成本是否低 (例如 1 根线收发都能满足就比 8 根线的并行收发要节约成本);使用是否普及(就好像大家都学英 语,世界很大部分的人都可以独立使用英语吗,会英语的人多,就非常普及,可通讯面就非常广; 如果你学的鸟语,那就只能跟鸟通信,没有人能听懂)。 串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但 送速度慢。串行通讯的距离可以从几米到几千米。 RS-232(串口的英文代名词)采取不平衡传输方式,即所谓单端通讯。由于其发送电平与接收 电平的差仅为 2V 至 3V 左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最 长为约 15 米,最高速率为 20kb/s。RS-232 是为点对点(即只用一对收、发设备)通讯而设计的,其 驱动器负载为 3~7kΩ。所以 RS-232 适合本地设备之间的通信。 传统的串行接口标准有 22 根线,采用标准 25 芯 D 型插头座(DB25),后来使用简化为 9 芯 D 型插座(DB9),现在应用中 25 芯插头座已很少采用。 像现在所说的几线串口,一般都是指使用了几根线,最初的 RS-232 串口是 25 针的,所有的针 脚定义都有用到,后来变成了 9 针的,所谓全功能串口就是所有的针脚定义都使用上了,例如流量 嵌入式专业技术论坛 (www.armjishu.com)出品 第 352 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 控制,握手信号等都有用到,一般来说国外的产品做产品比较规矩,把所有的串口信号都做上去了。 但是国内的技术人员发现,其实 RS-232 串口最主要使用的就是 2,3 线,另外的接口如果不使用的 话,也不会出现很大的问题,所以,就在 9 针的基础上做精简,所以就有所谓的 2,3,4,5,6,8 线的串口出来了。. 2 线串口只有 RXD,TXD 两根基本的收发信号线;3 线串口除了 RXD 和 TXD,还有 GND;所谓 4~9 线只是在 TXD 和 RXD 基础上增加了相应的控制信号线,依据实际需要进行设计。 一般来说,使用5线的232通信,是加了硬件流控的,即RTS,CTS信号,主要是为了保证高速通信时 的可靠性,如果你的通信速度不是很高,完全可以不用理会 根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。信息只能单向传 送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。 ¾ 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。 ¾ 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称 为半双工传输。 ¾ 如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。 并行通信和串行通信 单片机与外界通信的基本方式有两种:并行通信和串行通信,串口属于串行通信。并行通信是指 利用多条数据传输线将一个数据的各位同时发送或接收。串行通信是指利用一条传输线将数据一位 位地顺序发送或接收。 并行通信和串行通信的示意图如下图: 在每一条传输线传输速率相同时,并行通信的传输速度比和串行通信快。然而当传输距离变长 时,并行通信的缺点就会凸显,首先是相比于串行通信而言信号易受外部干扰,信号线之间的相互 干扰也增加,其次是速率提升之后不能保证每根数据线的数据同时到达接收方而产生接收错误,而 且距离越长布线成本越高。 所以并行通信目前主要用在短距离通信,比如处理器与外部的 flash 以及外部 RAM 以及芯片内 部各个功能模块之间的通信。串行通信以其通信速率快和成本低等优点成为了远距离通信的首选。 RS232 串口,以及差分串行总线像 RS485 串口、USB 接口、CAN 接口、IEEE-1394 接口、以太网接 口、SATA 接口和 PCIE 接口等都属于串行通信的范畴。 下图左侧为每根数据线的数据同时到达接收方,被正确采样的最理想情况;右侧的图为每根数据 线的数据不能同时到达接收方而产生接收错误情形。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 353 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 串行通信又分为两种方式:异步通信与同步通信。 z 异步通信及其协议 异步通信以一个字符为传输单位,通信中两个字符间的时间间隔不固定可以是任意长的,然而 在同一个字符中的两个相邻位代码间的时间间隔是固定的,接收时钟和发送时钟只要相近就可以。 通信双方必须使用约定的相同的一些规则(也叫通信协议)。 常见的传送一个字符的信息格式规定 有起始位、数据位、奇偶校验位、停止位等,其中各位的意义如下: ① 起始位 先发出一个逻辑”0”信号,表示传输字符的开始。 ② 数据位 紧接着起始位之后。数据位的个数可以是 5、6、7、8 等,构成一个字符。一般采用扩 展的 ASCII 码,范围是 0~255,使用 8 位表示。首先传送最低位。 ③ 奇偶校验位(不是必须) 奇偶校验是串口通信中一种简单的检错方式,当然没有校验位也是 可以的。数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据 传送的正确性。例如,如果数据是 01100000,那么对于偶校验,校验位为 0。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 354 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 ④ 停止位 它是一个字符数据的结束标志。可以是 1 位、1.5 位、2 位的高电平。由于数据是在传 输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。 因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数 越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 ⑤ 空闲位 处于逻辑“1”状态,表示当前线路上没有数据传送。 B、同步通信是指数据传送是以一个帧(数据块或一组字符)为传输单位,每个帧中包含有多个字符。 在通信过程中,字符与字符之间、字符内部的位与位之间都同步,每个字符间的时间间隔是相等的, 而且每个字符中各相邻位代码间的时间间隔也是固定的。同步通信的数据格式如图所示 同步通信的特点可以概括为: „ 以数据块为单位传送信息。 „ 在一个数据块(信息帧)内,字符与字符间无间隔。 „ 接收时钟与发送进钟严格同步 同步串行通信方式中一次连续传输一块数据,开始前使用同步信号作为同步的依据。同步字符 的插入可以是单同步字符方式或双同步字符方式,均由同步字符、数据字符和校验字符 CRC 等三部 分组成: 同步字符位于帧结构开头,用于确认数据字符的开始。 数据字符在同步字符之后,字符个数不受限制,由所需传输的数据块长度决定; 校验字符有 1~2 个,位于帧结构末尾,用于接收端对接收到的数据字符的正确性的校验。 由于连续传输一个数据块,故收发双方时钟必须相当一致,否则时钟漂移会造成接收方数据辨 认错误。这种方式下往往是发送方在发送数据的同时也通过一根专门的时钟信号线同时发送时钟信 息,接收方使用发送方的时钟来接由数据。同步串行通信方式传输效率高,但对硬件要求高,电路 结构复杂。 所有的串行接口电路都是以并行数据形式与 CPU 接口、而以串行数据形式与外部逻辑接口。所 以串口对外应该是串行发送的,速度慢,但是比并行传输要稳定很多。 那么串口是如何解决干扰以及校验的问题呢? 嵌入式专业技术论坛 (www.armjishu.com)出品 第 355 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 什么是数据校验?通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的 一个校验值。接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,就说明数据 是完整的。 为了理解数据校验,什么是最简单的校验呢?最简单的校验就是把原始数据和待比较数据直接进 行比较,看是否完全一样这种方法是最安全最准确的。同时这样的比对方式也是效率最低的。只适 用于简单的数据量极小的通信。 串口通信使用的是奇偶校验方法,奇偶校验我们会在下面的参数介绍里面有详细的介绍,大家 可以去看下。 串口的原理和特点: 串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线 Universal Serial Bus 或者 USB 混淆)。大多数计算机包含两个基于 RS232 的串口。串口同时也是仪器仪表设备通用的通信协 议;很多 GPIB(通用接口总线)兼容的设备也带有 RS-232 口。同时,串口通信协议也可以用于获取远 程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信 慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距 离通信。 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3) 接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线 用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。 对于两个进行通行的端口,这些参数必须匹配: a.波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每 秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么 时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400, 28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的 很近的仪器间的通信,典型的例子就是GPIB设备的通信。 b.数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8 位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7 位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数 据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位 取决于通信协议的选取,术语“包”指任何通信的情况。 c.停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时 的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止 位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不 同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 d.奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没 有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个 值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0, 保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真 正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机 会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步. e..硬件流控制: 硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪) 流控制。硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将 通讯两端的RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数 据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停来自计算机的数据 流。这种硬件握手方式的过程为:我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓 冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我 们在接收端将CTS线置低电平(送逻辑0),当发送端的程序检测到CTS为低后,就停止发送数据, 嵌入式专业技术论坛 (www.armjishu.com)出品 第 356 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 直到接收端缓冲区的数据量低于低位而将CTS置高电平。RTS则用来标明接收设备有没有准备好接收 数据。 常用的流控制还有还有DTR/DSR(数据终端就绪/数据设置就绪)。我们在此不再详述。 ¾ STM32 串口 STM32的串口是相当丰富的,功能也很强劲。最多可提供5路串口(神舟王407引出了串口1和串 口2),有分数波特率发生器、支持单线光通信和半双工单线通讯、支持LIN、智能卡协议和IrDA SIR ENDEC规范(仅串口3支持)、具有DMA等。 串口最基本的设置,就是波特率的设置。STM32的串口使用起来还是蛮简单的,只要你开启了 串口时钟,并设置相应IO口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可 以使用了。下面,我们就简单介绍下这几个与串口基本配置直接相关的寄存器。 1).STM32串口时钟的使能 串口作为STM32的一个外设,其时钟由外设始终使能寄存器控制,这里我们使用的串口1是在 RCC_APB2RSTR寄存器的第4位。 2).串口复位 当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新 配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外 设 的 操 作 。 串 口 1 的 复 位 是 通 过 配 置 RCC_APB2RSTR 寄 存 器 的 第 4 位 来 实 现 的 。 RCC_APB2RSTR寄存器的各位描述如下: 从上图可知串口1的复位设置位在RCC_APB2RSTR的第4位。通过向该位写1复位串口1,写0 结束复位。其他串口的复位位在RCC_APB1RSTR里面。 3).串口波特率设置 每个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器达到配置不同波特 率的目的。该寄存器的各位描述如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 357 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 前面提到STM32的分数波特率概念,其实就是在这个寄存器里面体现的。最低4位用来存放小数 部分DIV_Fraction,[15:4]这12位用来存放整数部分DIV_Mantissa。高16位未使用。这里波特率的计 算通过如下公式计算: 这里的 (x=1、2)是给外设的时钟,USARTDIV是一个无符号的定点数,它的值可以 有串口的BRR寄存器值得到。而我们更关心的是如何从USARTDIV的值得到USART_BRR的值,因 为一般我们知道的是波特率,和PCLKx的时钟,要求的就是USART_BRR的值。 4).串口控制 STM32的每个串口都有3个控制寄存器USART_CR1~3,串口的很多配置都是通过这3个寄存器来 设置的。这里我们只要用到USART_CR1就可以实现我们的功能了,该寄存器的描述在《STM32F4 参考手册 DM00031020.pdf》有详细介绍,在这里我们就不列出来了。 5).数据发送与接收。 STM32的发送和接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了发送 和接收两部分。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也在改寄存 器中。改寄存器的各位描述如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 358 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 注意: 虽然USART_DR是一个32位寄存器,但 [31:9] 是强制为“0”,只用了低9位(DR[8:0])。 DR[8:0]为串口数据,包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR), 一个给接收用(RDR),该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之 间的并行接口。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。 当使能校验位(USART_CR1种PCE位被置位)进行发送时,写到MSB的值会被后来的校验位该取 代。 当使能校验位进行接收时,读到的MSB位是接收到的校验位。 6).串口状态寄存器USART_SR 串口的状态可以通过状态寄存器USART_SR读取。USART_SR的各位描述如下: 寄存器USART_SR各位描述 这里我们主要关注一下三位,第5,6,7位RXNE、TC和TXE。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 359 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 串口最基本的设置,就是波特率的设置,然后配置数据位长度,奇偶校验位等信息。 至于串口时钟、串口复位、串口的控制等等。 7.7.3 关于TTL电平 由于处理器输出的是TTL/COMS电平,而PC串口为RS-232电平,所以硬件需要使用一颗电平转 换芯片MAX3232实现双向电压转换。硬件原理图如图所示。由于串口外围电路很简单也很常见,再 此就不做深入讲解了。 这里说到了TTL电平,那么什么是TTL电平呢? 单片机是一种数字集成芯片,数字电路中只有两种电平:高电平和低电平;高电平和低电平是 通过单片机的管脚进行输入和输出的,我们只要记住一句话,单片机管脚不是输入就是输出,不是 高电平就是低电平。 为了让大家在初学的时候对电平特性有一个清晰的认识,我们暂且定义单片机输出与输入为 TTL 电平,其中高电平为+5V,低电平为 OV。计算机的串口出来的为 RS-232C 电平,其中高电平为-5V— -12V,低电平为+5V—+12V。这里要强调的是,RS-232C 电平为负逻辑电平,所以高电平为负的,低 电平为正的,大家千万不要认为上面是我写错了,因此当计算机与单片机之间要通信时,需要加电 平转换芯片,我们在神舟王 407 板子上所加的电平转换芯片是 MAX3232(在串口 1 座附近)。初学者 在学习时先掌握上面这点就够了,若有兴趣请大家再看下面的知识点——常用逻辑电平。 知识点:常用逻辑电平 常用的逻辑电平有 TTL、CMOS、LVTTL、ECL、PECL、GTL、RS-232、RS-422、RS-485、LVDS 等。 其中 TTL 和 CMOS 的逻辑电平按典型电压可分为四类:5V 系列(5V 的 TTL 和 5V 的 CMOS)、3.3V 系列, 2.5V 系列和 1.8V 系列。 5V 的 TTL 和 5V 的 CMOS 是通用的逻辑电平。3.3V 及以下的逻辑电平被称为低电压逻辑电平,常 用的为 LVTTL 电平。低电压逻辑电平还有 2.5V 和 1.8V 两种。 那为什么 TTL 电平信号用的最多呢? 原因 1:这是因为大部分数字电路器件都用这个电平标准。就好像我们学英语,国际通用英语 这门语言,那大家都用这个语言进行交流和沟通,所以后来的人都要学习英语才能彼此相互能交流。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 360 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 所以使得越来越多的电路器件使用这个电平标准。TTL 电平数据表示通常采用二进制,+5V 等同于逻 辑 1,OV 等同于逻辑 O,这被称为 TTL(晶体管一晶体管逻辑电平)信号系统,这是计算机处理器控 制的设备内部各部分之问通信的标准技术。TTL 电平信号对于计算机处理器控制的设备内部的数据传 输是很理想的,首先计算机处理器控制的设备内部的数据传输对于电源的要求不高,热损耗也较低, 另外 TTL 电平信号直接与集成电路连接而不需要价格昂贵的线路驱动器以及接收器电路。 原因 2:TTL 电平的特点适合设备内数据高速的传输。TTL 的通信大多数情况是采用并行数据传 输方式,但电平最高为+5V,电压相对比较低,所以传输过程中会有电压损耗和压降,导致 TTL 的传 输距离是有限的,一般只适合近距离传输;而且并行数据传输对于超过 10 英尺的距离就可能会有同 步偏差,传输距离太远,有可能造成数据不同步;所以 TTL 电平符合近距离(在芯片内部或者计算 机内部进行高速数据交互)高速的并行传输,在数字电路要求数据处理速度高的时代来说,选择 TTL 这个标准是正确的,可靠的。 CMOS 电平最高可达 12V,CMOS 电路输出高电平在 3V~12V 之间,而输出低电平接近 0 伏。CMOS 电路中不使用的输入端不能悬空,否则会造成逻辑混乱。另外,CMOS 集成电路因为电源电压可以在 较大范围内变化,因而对电源的要求不像 TTL 集成电路那样严格。 TTL 电路和 CMOS 电路的逻辑电平关系如下: 1) CMOS 是场效应管构成,TTL 为双极晶体管构成;因为 TTL 和 COMS 的高低电平的值不一样, 所以互相连接时需 要电平的转换。 2) TTL 电路是电流控制器件,而 coms 电路是电压控制器件。 3) TTL 电路的速度快,传输延迟时间短(5-10ns),但是功耗大;COMS 电路的速度慢,传输延 迟时间长(25-50ns),但功耗低,COMS 电路本身的功耗与输入信号的脉冲频率有关,频率越高,芯片 集越热,这是正常现象。 4) CMOS 集成电路电源电压可以在较大范围内变化,因而对电源的要求不像 TTL 集成电路那样 严格。所以,用 TTL 电平在条件允许下他们就可以兼容。要注意到他们的驱动能力是不一样的,CMOS 的驱动能力会大一些,有时候 TTL 的低电平触发不了 CMOS 电路,有时 CMOS 的高电平会损坏 TTL 电 路,在兼容性上需注意。 5) CMOS 的高低电平之间相差比较大、抗干扰性强,TTL 则相差小,抗干扰能力差。 6) CMOS 的工作频率较 TTL 略低。 TTL 电平临界值: 1)TTL 输出电压:逻辑电平 1 = 2.4V,逻辑电平 0 = 0.4V 2)TTL 输入电压:逻辑电平 1 = 2.0V,逻辑电平 0 = 0.8V CMOS 电平临界值(设电源电压为+5V) 1) CMOS 输出电压:逻辑电平 1 = 4.99V,逻辑电平 0 = 0.01V 2) CMOS 输入电压:逻辑电平 1 = 3.5V,逻辑电平 0 = 1.5V 常用逻辑芯片的特点如下: 74LS 系列: TTL 输入:TTL 输出:TTL 74HC 系列: CMOS 输入: CMOS 输出: CMOS 74HCT 系列: CMOS 输入:TTL 输出: CMOS CD4000 系列: CMOS 输入: CMOS 输出: CMOS 通常情况下,单片机、ARM、DSP、FPGA 等各个器件之间引脚能否直接相连要参考以下方法进行 判断:一般来说,同电压的是可以相连的,不过最好还是好好查看芯片技术手册上的 VIL(逻辑电平 0 的输入电压)、VIH(逻辑电平 1 的输入电压)、VOL(逻辑电平 0 的输出电压)、VOH(逻辑电平 1 的输出电压)的值,看是否能够匹配。有些情况在一般应用中没有问题,虽然参数上有点不够匹配, 但还是在管脚的最大和最小容忍值范围之内,不过有可能在某些情况下可能就不够稳定,所以我们 在设计电路的时候要尽量保持匹配,这样是最佳的设计。 7.7.4 STM32的异步串口通讯协议 . 阅读过《STM32F4 参考手册 DM00031020.pdf》的读者会发现,STM32 的串口非常强大,它不 嵌入式专业技术论坛 (www.armjishu.com)出品 第 361 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 仅支持最基本的通用串口同步、异步通讯,还具有 LIN 总线功能(局域互联网)、IRDA 功能(红外通 讯)、SmartCard 功能。为实现最迫切的需求,利用串口来帮助我们调试程序,本章介绍的为串口最 基本、最常用的方法,全双工、异步通讯方式。下图为串口异步通讯协议。 重温串口的通讯协议,我们知道要配置串口通讯,至少要设置以下几个参数:字长(一次传送的数 据长度)、波特率(每秒传输的数据位数)、奇偶校验位、还有停止位。对 ST 库函数的使用已经上手的 读者应该能猜到,在初始化串口的时候,必然有一个串口初始化结构体,这个结构体的几个成员肯 定就是有来存储这些控制参数的。 7.7.5 交叉线和直连线 见上图,这是 STM32 神舟王 407 开发板的接线图,使用的 MAX3232 芯片,把 STM32 的 PA10 引脚(复用功能为 USART1 的 Rx)接到了 DB9 接口的第 2 针脚,把 PA9 引脚(复用功能为 USART 的 Tx)连接到了 DB9 接口的第 3 针脚。开发板上 J22 和 J23 都默认使用跳冒连接到 1~2。 Tx(发送端)接第 3 针脚,Rx(接收端)接第 2 针脚。这种接法是跟 PC 的串口接法一样的, 如果要实现 PC 跟神舟 STM32 开发板通讯,就要使用两头都是母的交叉线。 7.7.6 串口工作流程 1.串口传输速度控制(波特率控制) 前面的寄存器版本有提到过,这里再细讲一下,波特率,即每秒传输的二进制位数,用 b/s (bps) 表示,通过对时钟的控制可以改变波特率。在配置波特率时,我们向波特比率寄存器 USART_BRR 写入参数,修改了串口时钟的分频值 USARTDIV。USART_BRR 寄存器包括两部分,分别是 DIV_Mantissa(USARTDIV 的整数部分)和 DIVFraction(USARTDIV 的小数)部分,最终,计算公式为 USARTDIV=DIV_Mantissa+(DIVFraction/16)。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 362 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 USARTDIV 是对串口外设的时钟源进行分频的,对于 USART1,由于它是挂载在 APB2 总线上 的,所以它的时钟源为 fPCLK2;而 USART2、3 挂载在 APB1 上,时钟源则为 fPCLK1,串口的时 钟源经过 USARTDIV 分频后分别输出作为发送器时钟及接收器时钟,控制发送和接收的时序。 2.收和发控制 围绕着发送器和接收器控制部分,有好多个寄存器:CR1、CR2、CR3、SR,即 USART 的三个 控制寄存器(Control Register)及一个状态寄存器(Status Register)。通过向寄存器写入各种控制参数, 来控制发送和接收,如奇偶校验位,停止位等,还包括对 USART 中断的控制;串口的状态在任何时 候都可以从状态寄存器中查询得到。具体的控制和状态检查,我们都是使用库函数来实现的,在此 就不具体分析这些寄存器位了。 3.传输过程中的数据存储 收发控制器根据我们的寄存器配置,对数据存储转移部分的移位寄存器进行控制。当我们需要 发送数据时,内核或 DMA 外设把数据从内存(变量)写入到发送数据寄存器 TDR 后,发送控制器将 适时地自动把数据从 TDR 加载到发送移位寄存器,然后通过串口线 Tx,把数据一位一位地发送出 去,在数据从 TDR 转移到移位寄存器时,会产生发送寄存器 TDR 已空事件 TXE,当数据从移位寄 存器全部发送出去时,会产生数据发送完成事件 TC,这些事件可以在状态寄存器中查询到。 而接收数据则是一个逆过程,数据从串口线 Rx 一位一位地输入到接收移位寄存器,然后自动地 转移到接收数据寄存器 RDR,最后用内核指令或 DMA 读取到内存(变量)中。 4.串口整体架构图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 363 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.7.7 硬件设计 下面是我们神舟王 407 开发板的串口部分原理图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 364 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 USART1_RX:接收数据串行输入。 USART1_TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被 激活,并且不发送数据时,TX管脚处于高电平。 神舟王407开发板上有2个RS-232C串口,如下图所示。 这两个RS-232C串口为DB9公头插针,其线序与PC电脑上的DB9公头插针相同,都为2脚输入到开发 板,3脚输出,如下图所示。所以只要一根母到母交叉串口线就可以方便的将这两个串口连接起来, 或者将开发板上的串口与PC机连接起来。 串口 1(J10)信号定义 DB9管脚 功能描述 1 NC 2 USART1_PA10 开发板接收 DB9管脚 6 7 嵌入式专业技术论坛 (www.armjishu.com)出品 功能描述 NC NC 第 365 页,共 771 页 www.armjishu.com 3 USART1_PA9 开发板发送 4 NC 5 GND ARM 技术论坛 神舟 IV 号用户手册 V2.0 8 NC 9 NC 串口 2(J11)信号定义 DB9管脚 功能描述 1 NC 2 USART2_PB11 开发板接收 3 USART2_PB10 开发板发送 4 NC 5 GND DB9管脚 6 7 8 9 功能描述 NC NC NC NC 说明:串口 2 可 RS485 接口进行了复用,在使用串口 2 之前,请确认接口选择跳线 J20,J21 设置是否 正确。 7.7.8 例程 01 UART串口1 Printf打印输出字符 7.7.9 软件设计 进入主函数: 代码分析 1:printf ( );初始化串口 1,并且设置波特率为 115200,并对串口设置了许多参数 嵌入式专业技术论坛 (www.armjishu.com)出品 第 366 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析 2:printf ( )开始真正的对 USART 进行初始化的工作,这里是库函数来做的。这里主要过 程分为几步,我们分开来阐述: 代码分析 3:第一步是 GPIO 初始化 1.首先先对 GPIO 初始化 GPIO 具有默认的复用功能,在使用它的复用功能的时候,我们首先要把相应的 GPIO 进行初始 化。此时我们使用的 GPIO 的复用功能为串口,但为什么是 PA9 和 PA10 用作串口的 Tx 和 Rx,而不 是其它 GPIO 引脚呢?这是从《【英文】STM32F407 数据手册(Rev9).pdf》的引脚功能定义中查询到 的。 选定了这两个引脚,并且 PA9 为 Tx,Tx 为发送端,输出引脚。PA10 位 Rx,Rx 引脚为接收端, 输入引脚。那么它们的 GPIO 模式要如何配置呢? STM32F407ZGT3 和 STM32F103、STMF107 等 F1 系列的产品的复用配置有明显的不同: 1)STM32F1 系列的产品复用 IO 时必须调用 RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE)函数打开复用时钟。而 F4 系列的没 有这一项,取而代之的是 GPIO_PinAFConfig();而且运用时不能通过与元算符“|”来配置多个 IO, 这一点查看 GPIO_PinAFConfig()函数定义就可知道。 2)在 GPIO 管脚的配置上,STM32F1 系列的产品配置好了 IO 复用功能,相应 IO 可以设置为 AF_PP、IN_FLOATING、OUT。但在里 STM32F2 系列里,GPIO_PinAFConfig()开启后,相应 IO 必须设置为“AF”,只有这样才能真正复用 IO。也就是说 GPIO 的输入输出模式也变了。STM32F1 系列中,这样的用法:GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;已经不行了。原 因是,GPIO_Mode_IN_FLOATING 这种模式已经不存在了。在 F2 的库里边只有这个模式: GPIO_Mode_AF。所有使用复用功能的引脚都应设置成这种模式。这样比看来 F4 比 F1 方便,你不 用考虑这个引脚应该设置成浮空输入还是推挽输出....因此引脚设置错误基本可以消失。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 367 页,共 771 页 www.armjishu.com 代码分析 4:第二步是 USART 的初始化 ARM 技术论坛 神舟 IV 号用户手册 V2.0 USART1 的参数进行设定后,初始化 GPIO 管脚。在库函数 STM_EVAL_COMInit( )里对 GPIO 管脚进行初始化配置及填充 USART 的初始化结构体。这部分内容,是根据串口通讯协议来设置的。 1. .USART_BaudRate = 115200; 波特率设置,利用库函数,我们可以直接这样配置波特率,而不需要自行计算 USARTDIV 的分 频因子。在这里把串口的波特率设置为 115200,也可以设置为 9600 等常用的波特率,在《STM32F4 参考手册 DM00031020.pdf》中列举了一些常用的波特率设置及其误差,见下图。如果配置成 9600, 那么在和 PC 通讯的时候,也应把 PC 的串口传输波特率设置为相同的 9600。通讯协议要求两个通讯 器件之间的波特率、字长、停止位奇偶校验位都相同。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 368 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 2. .USART_WordLength = USART_WordLength_8b; 配置串口传输的字长。本例程把它设置为最常用的 8 位字长,也可以设置为 9 位。 3. .USART_StopBits = USART_StopBits_1; 配置停止位。把通讯协议中的停止位设置为 1 位。 4. .USART_Parity = USART_Parity_No ; 配置奇偶校验位。本例程不设置奇偶校验位。 5. .USART_HardwareFlowControl= USART_HardwareFlowControl_None; 配置硬件流控制。不采用硬件流。 硬件流,在 STM32 的很多外设都具有硬件流的功能,其功能表现为:当外设硬件处于准备好的状态 时,硬件启动自动控制,而不需要软件再进行干预。 在串口这个外设的硬件流具体表现为:使用串口的 RTS (Request to Send) 和 CTS(Clear to Send) 针 脚,当串口已经准备好接收新数据时,由硬件流自动把 RTS 针拉低(向外表示可接收数据);在发送 数据前,由硬件流自动检查 CTS 针是否为低(表示是否可以发送数据),再进行发送。本串口例程没 有使用到 CTS 和 RTS,所以不采用硬件流控制。 6. USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 配置串口的模式。为了配置双线全双工通讯,需要把 Rx 和 Tx 模式都开启。 7. 填充完结构体,调用库函数在函数 STM_EVAL_COMInit( )中调用 USART_Init( )向寄存器写入配 置参数。 8. 最后,在函数 STM_EVAL_COMInit( )中调用 USART_Cmd() 使能 USART1 外设。在使用外设时, 嵌入式专业技术论坛 (www.armjishu.com)出品 第 369 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 不仅要使能其时钟,还要调用此函数使能外设才可以正常使用。 代码分析 5:第三步就是将 printf()进行重定向,使得串口打印的数据可以从 printf 直接输出,这样就 比较方便调试产品。 在 main 文件中,配置好串口之后,就通过下面的几行代码由串口往电脑里面的超级终端打印信息, 打印的信息为一些字符串和当前的日期。 调用这个函数看似很简单,我们来看 printf() 这个函数。要想 printf() 函数工作的话,我们需要把 printf() 重新定向到串口中。重定向,是指用户可以自己重写 c 的库函数,当连接器检查到用户编写 了与 C 库函数相同名字的函数时,优先采用用户编写的函数,这样用户就可以实现对库的修改了。 为了实现重定向 printf()函数,我们需要重写 fputc() 这个 c 标准库函数,因为 printf()在 c 标准库函 数中实质是一个宏,最终是调用了 fputc()这个函数的。 重定向的这部分工作,由 Printf.c 文件中的 fputc(int ch, FILE *f) 这个函数来完成,这个函数具体 实现如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 370 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 重定向时,我们把 fputc()的形参 ch,作为串口将要发送的数据,也就是说,当使用 printf(),它调 用这个 fputc()函数时,然后使用 ST 库的串口发送函数 USART_SendData(),把数据转移到发送数据 寄存器 TDR,触发我们的串口向 PC 发送一个相应的数据。调用完 USART_SendData()后,要使用 while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET) 语句不停地检查串口发送是否完 成的标志位 TC,一直检测到标志为完成,才进入一下步的操作,避免出错。在这段 while 的循环检 测的延时中,串口外设已经由发送控制器根据我们的配置把数据从移位寄存器一位一位地通过串口 线 Tx 发送出去了。 这个代码中调用了两个 ST 库函数。USART_SendData() 和 USART_GetFlagStatus()其说明见图下 图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 371 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 注意:这里有个 USR MicroLIB 库,如果没有效果可以对此处打钩,一般是不需要的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 372 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.7.10 下载与验证 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 7.7.11 实验现象 将固件程序下载到 STM32 神舟王 407 开发板后,关闭电源,用串口线神舟王 407 串口 1 与电脑 连接,并打开超级终端,按以下设置,如下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 373 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 选择 COM1;按确定 再按确定,完成超级终端设置,重新打开电源 ,超级终端窗口显示信息,如下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 374 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.7.12 例程 02 UART串口1-带SYSTICK中断Printf() 7.7.13 软件设计 此处仅仅多了一个 SYSTICK 定时器来产生中断,在串口打印的同时还可以点亮 LED 灯。 7.7.14 实验现象 实验现象同上,不同的是可以看到板子上多个 LED 灯在不停的闪烁。 7.7.15 例程 03 UART串口1输入和输出 7.7.16 软件设计 关键代码分析: 代码分析 1:USART1_gets_nowait ( )函数 嵌入式专业技术论坛 (www.armjishu.com)出品 第 375 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 代码分析 1:函数 USART1_gets_nowait(uStrCom1, STRING_SIZE)中有两个参数,第一个参数是 uStrCom1,用于存放输入的数据。第二个参数 STRING_SIZE 表示最大能输入的参数范围: 在本函数中主要还是通过调用 USART1_getchar()函数实现数据的输入。而通过判断函数 USART1_ValidInput()的返回值,可以确定是否有数据输入。 7.7.17 实验现象 将固件程序下载到 STM32 神舟王 407 开发板后,关闭电源,用串口线将神舟王 407 的串口 1 与电 脑连接,并打开超级终端,按以下设置,如下图: 选择 COM1;按确定 嵌入式专业技术论坛 (www.armjishu.com)出品 第 376 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 再按确定,完成超级终端设置。 重新打开电源;STM32 神舟王 407 开发板上 4 个 LED 点亮。 超级终端窗口显示信息,如下图 并按相关提示信息输入内容。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 377 页,共 771 页 www.armjishu.com 如输入字符串:abcd 并以空格或回车键结束; 显示结果,如图: ARM 技术论坛 神舟 IV 号用户手册 V2.0 再输入一个数字:如输入 9 ;并以空格或回车键结束; 显示结果,如下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 378 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.8 USART串口2通信 这是要注意我们说的串口 2,开发板上标的 COM2 实际上是 USART3,只是换个名称而已。 7.8.1 意义与作用 STM32 支持 6 个串口,有的设备有需要支持多个串口进行通信,比如一个串口不停发数据,一 个串口不停接收数据;或者一个设备同时接收多路数据。 串口的使用对于我们开发调试过程中的作用是非常之大,可以用来查看,打印以及输入相关信 息,是我们在嵌入式开发中最先与中央处理器通信的接口,学习好串口的功能,对于后续神舟王407 的各个例程的调试具有至关重要作用。 STM32的通用同步异步收发器(USART)是相当丰富的,功能也很强劲。神舟王407开发板使用的 是STM32F407ZGCT6,具有6个串口。该USART有分数波特率发生器,发送和接收共用的可编程波 特率,最高达4.5Mbits/s;可编程数据字长度(8位或9位);可配置的停止位-支持1或2个停止位;支持 单线半双工通讯;支持LIN;支持智能卡协议和IrDA SIR ENDEC规范(仅串口3支持)、具有DMA 等。通过本节的学习,你将了解到STM32串口的基本使用方法、以及使用中断模式来实现串口收发 的过程。 7.8.2 串口2与串口1的区别 这个图是从 STM32F407 数据手册中摘抄出来的,也就是说 USART1 和 USART6 是由 APB2 总线 提供时钟,而 USART2~USART5 都是由 APB1 提供时钟。APB2 的时钟是 84MHz,而 APB1 的时钟 是 42MHz,比 APB2 的时钟要慢一半,所以 USART1 实际上在高速一点的波特率传输的时候要比 USART2~USART5 要稳定。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 379 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.8.3 多个串口如何同时接收源源不断发送给每个串口的数据 使用中断 7.8.4 两个串口同时来数据了 这个时候只能进入一个中断,会丢失数据吗 可以做到不丢失数据,原因如下: 1) 串口是低速设备,115200 的波特率对 stm32 来说也是挺慢的速度 2) 中断与数据传输覆盖的时间差 USART 串口数据传输是一种很慢的传输方式,以波特率为 38400 计算,假定数据帧格式为:8 个数据位、1 个停止位、没有奇偶检验位,则每个字节的传输时间至少为 260us,中断处理程序只要 在这个时间之内从接受寄存器读出收到的数据,就不会造成数据丢失。 串口数据在下一个自己接收完成之前,接收 BUF 里的数据是不会被覆盖的。所以实际中断相应 只要不超过 1 个字节的传输时间就没事。适当调整下各个中断处理程序,完全来得及 如果你有 2 个串口同时传输数据,则每个串口的接收中断处理程序只要能在 130us 内完成,就不 会造成数据丢失。串口是低速设备,115200 的波特率对 stm32 来说也是挺慢的速度, 同时中断,也 就是微秒级延时,不至于丢数据。 3) STM32 的 USART 中移位寄存器和数据寄存器是分开的 下图是 STM32 USART 的框图,在图的右上方可以看到,从 USART_RX 到来的数据通过 Receive Shift Register 被转换为并行格式,只有当收到一个完整的字节后,Receive Shift Register 的内容才被送到 Receive Data Register (RDR),程序可以通过 RDR 读出收到的数据字节。 只要你的程序在下一个数据字节到来之前读出 Receive Data Register (RDR),就不会产生数据丢失。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 380 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.8.5 硬件设计 由于处理器输出的是TTL/COMS电平,而PC串口为RS-232电平,所以硬件需要使用一颗电平转 换芯片MAX3232实现双向电压转换。原理图如下图所示。由于串口外围电路很简单也很常见,再此 就不做深入讲解了。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 381 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 串口数据的输入和输出是站在处理器角度看的: USART3_RX:接收数据串行输入。通过过采样技术来区别数据和噪音从而恢复数据。 USART3_TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被 激活,并且不发送数据时,TX管脚处于高电平。 GND:数字地。为接收和发送信号提供参考地。 神舟王 407 开发板上有 2 个RS-232C串口。这两个RS-232C串口为DB9 公头插针,其线序与PC 电脑上的DB9 公头插针相同,都为 2 脚输入到开发板,3 脚输出,如所图表 20 DB9 公头线序及信号 定义示。所以只要一根母到母交叉串口线就可以方便的将这两个串口连接起来,或者将开发板上的 串口与PC机连接起来。 图表 20 DB9 公头线序及信号定义 图表 21 神舟王 407 开发板的 2 个 RS-232C 串口 嵌入式专业技术论坛 (www.armjishu.com)出品 第 382 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 DB9管脚 功能描述 1 NC 2 USART1_PA10 开发板接收 3 USART1_PA9 开发板发送 4 NC 5 GND 表格 5 串口 1(CN5)信号定义 DB9管脚 1 2 3 4 功能描述 NC NC NC NC DB9管脚 功能描述 DB9管脚 功能描述 1 NC 1 NC 2 USART3_PB11 2 NC 3 USART3_PB10 3 NC 4 NC 4 NC 5 GND 表格 6 串口 2(CN6)信号定义 注:由于串口1与USB的ID和VBUS信号复用,使用时需要改变跳线位置。 由于 STM32 的管脚数量有限,所以其串口管脚为多功能复用管脚,为了不同功能硬件不相互影 响,开发板上使用跳线来选择对应功能,在做此次试验前需要检查神舟王 407 开发板上的跳线位置 是否正确。 如果连接串口 2(推荐,默认出厂跳线既连接好了串口 2),则需要将 J20、J21 跳帽短接;如果 连接串口 1(不推荐,默认出厂跳线不是连接串口 1),则需要将 J22 和 J23 的 1ÅÆ2 用跳帽短接, 如图所示: 跳线连接正确后使用交叉母对母串口线连接神舟王407开发板的串口到PC或USB转串口线,下面可以 开始软件设计了。 7.8.6 例程01 UART串口2Printf()打印 大部分原理都通串口1相同,只有少部分不一样,实验现象也是相同 嵌入式专业技术论坛 (www.armjishu.com)出品 第 383 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.8.7 软件设计 主要有 3 点不同之处: 1) 在 STM32_Shenzhou_COMInit;函数中,初始化的串口接收和发送的管脚是 PB10 和 PB11 2) 串口端口由 USART1 变成了 USART3 3) 串口 USART3 的时钟总线变成了 APB1 总线 7.8.8 下载与验证 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 7.8.9 实验现象 将固件程序下载到神舟王 407 开发板后,关闭电源,用串口线神舟王 407 开发板的串口 2 与电脑 连接,并打开超级终端,按以下设置,如下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 384 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 选择 COM1;按确定 再按确定,完成超级终端设置。 超级终端窗口显示信息,如下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 385 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.8.10 例程 02 UART串口2-带SYSTICK中断Printf() 同串口 1 对应章节 7.8.11 例程 03 UART串口1Printf输出和scanf输入 同串口 1 对应章节 7.9 UART串口1和串口2同时格式化输出输入 7.9.1 下载与验证 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错 误!未找到引用源。小节进行操作。 7.9.2 实验现象 将固件程序下载到神舟王 407 开发板后,关闭电源,用串口线神舟王 407 串口 1 与电脑连接,并打 开超级终端,按以下设置,如下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 386 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 选择 COM1;按确定 再按确定,完成超级终端设置。 重新打开电源,超级终端窗口显示详细信息: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 387 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 提示信息在键盘上输入 abc;, 再提示信息: 连接到串口 2,输入 123,显示效果: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 388 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.10 串口高级例程之Printf中断收发实验 前面两节学习了STM32的常用接口UART串口的基本使用。之前的讲解都是串口的基本使用方 法,效率比较低。本章节我们学习在神舟系列STM32开发板上使用串口接收中断和发送中断以及 FIFO缓存来实现高效率的串口数据收发实例。 本次串口实例借鉴了著名的操作系统VxWorks操作系统的串口相关实现方法。做过驱动的人都 知道,在驱动中频繁的使用Printf函数不但会降低系统的效率,而且可能会使系统崩溃。原因是Printf 在串口打印输出是需要等待,中断中的长时间等待是致命的。所以本章节我们一起来研究如何使 Printf函数实现0等待,以及如何实现缩短串口接收中断处理速度。 7.10.1 意义与作用 目前串口仍然是MCU微控制器必不可少的接口之一。串口的使用对于我们开发调试过程中的作 用是非常之大,可以用来查看,打印以及输入相关信息,是我们在嵌入式开发中最先与中央处理器 通信的接口,学习好串口的功能,对于后续神舟王407的各个例程的调试具有至关重要作用。 鉴于前面章节已经对串口基础知识有了讲解,相关知识请参考前面的章节的内容。 本章节我们学习使用串口接收中断和发送中断以及FIFO缓存来实现高效率的串口数据收发实 例。我们一起来研究如何使Printf函数实现0等待以及如何实现缩短串口接收中断处理速度。 现讲一段经历:本人曾经在调试板件系统时,需要将某一接口(标记为接口A)的数据消息打印 出来以Debug。接口A的特点是数据收发具有突发性和不持续性,当时计算过串口在115200波特率下 根本来不及打印接口A的突发数据,而且很担心使用Printf函数对系统造成不良影响甚至BUG不能重 现。带着怀疑的态度添加了Printf函数来Debug,事实证明系统的运行几乎没有受到影响,而且串口 打印的数据几乎没有丢失!!!!!我感到很是惊讶,直到一次调试中我断开了接口A的连接后,串 口依然打印接口A的消息数据持续了十几秒,我对VxWorks操作系统的串口相关实现方法产生了浓厚 的兴趣。相比之前调试Linux驱动时由于串口输出导致其他接口中断处理不及时而丢失产生了鲜明的 对比。本章节我们以类似的方法在神舟系列STM32开发板上实现串口接收中断和发送中断以及FIFO 缓存来实现高效率的串口数据收发。 该方法在后续的USB调试和以太网口程序调试时很实用。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 389 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.10.2 实验原理 本实验的核心是: 对于串口 Printf 输出,为了做到使 Printf 函数实现 0 等待,我们在底层使用 Buffer 缓存来自 Printf 的数据,Buffer 按照 FIFO 先入先出的结构组织。当 Printf 有数据发送时,其底层的发送函数并不是 真正的串口发送,而只是将数据写入 FIFO 并使能串口发送中断后中便退出,这个操作时 RAM 的读 写操作,执行速度很快,所以不需要等待,唯一可能影响速度的是 FIFO 的深度,如果 FIFO 较小而 实际要打印的数据量很大则 FIFO 填满以后需要等待,所以可以根据实际情况设置 FIFO 的深度。本 次在神舟系列 STM32 开发板上的实验中发送缓存 FIFO“USART_Tx_Buffer”的深度为 256 字节, 用户可以自己修改其大小。而实际的发送数据是在串口发送中断中完成的。 对于串口输入,我们在在中断中使用 Buffer 缓存串口收到的数据,默认是收到回车符时或者收 到的数据填满缓冲区时通过全局变量“USART_Rx_Done”通知前台程序。这样中断里的程序简单则 处理速度快,中断可以快速返回。本次在神舟系列 STM32 开发板上的实验中接收缓存区 USART_Rx_Buffer 的大小为 20 字节,用户可以自己修改其大小。 7.10.3 硬件设计 由于 STM32 的管脚数量有限,所以其串口管脚为多功能复用管脚,为了不同功能硬件不相互影 响,开发板上使用跳线来选择对应功能,在做此次试验前需要检查神舟王 407 开发板上的跳线位置 是否正确。 由于 STM32 的管脚数量有限,所以其串口管脚为多功能复用管脚,为了不同功能硬件不相互影 响,开发板上使用跳线来选择对应功能,在做此次试验前需要检查神舟王 407 开发板上的跳线位置 是否正确。 如果连接串口 2(推荐,默认出厂跳线既连接好了串口 2),则需要将 J20、J21 跳帽短接;如果 连接串口 1(不推荐,默认出厂跳线不是连接串口 1),则需要将 J22 和 J23 的 1ÅÆ2 用跳帽短接, 如图所示: 跳线连接正确后使用交叉母对母串口线连接神舟王407开发板的串口到PC或USB转串口线,下面可以 开始软件设计了。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 390 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.10.4 软件设计 这一章节我们学习使用串口接收中断和发送中断以及FIFO缓存来实现高效率的串口数据收发 实例。我们一起来研究如何使Printf函数实现0等待以及如何实现缩短串口接收中断处理速度。 本实验设计灵活,可以支持串口1或者串口2,只需修改“Printf.h”文件的以下语句: 以上定义编译结果为使用神舟系列STM32开发板上的串口2。 以上定义编译结果为使用神舟系列STM32开发板上的串口1。 关 于 STM32 的 USART 的 库 函 数 实 现 , 主 要 是 在 STM32F4xx_StdPeriph_Driver 库 的 “ stm32f4xx_usart.c ” 和 “ stm32f4xx_usart.h ” 两 个 文 件 里 。 以 V3.3.0 版 本 的 库 为 例 , 它 们 位 于 “STM32F4xx_StdPeriph_Lib_V1.0.0 \Libraries\Stm32F4xx_StdPeriph_Driver”目录的“src”和“inc” 文件夹里,前面章节已经有所讲解,本章节不再讲述。 我们自顶向下剖析分解,首先是主程序MAIN函数: 主程序MAIN函数首先1、配置中断向量表,然后2、初始化串口,接着打印提示消息,最后进入 While循环等待串口接收数据完成或缓存区溢出,将其打印。 1、配置中断向量表 根据宏定义来使能串口1或串口2的中断: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 391 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 2、初始化串口 根据宏定义初始化串口1或串口2的参数,并使能接收和发送中断: 3、串口Printf发送的实现 首先,完成串口发送单个字节的函数,在“Printf.c”文件的有如下的宏定义,这是为了兼容不 同的编译平台。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 392 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 图表 22 串口 PUTCHAR_PROTOTYPE 宏定义 其实现如下: 其“USART_StoreBufferData”函数的实现如下: 原理:对于串口 Printf 输出,为了做到使 Printf 函数实现 0 等待,我们在底层使用 Buffer 缓存 来自 Printf 的数据,Buffer 按照 FIFO 先入先出的结构组织。当 Printf 有数据发送时,其底层的发送 函数并不是真正的串口发送,而只是将数据写入 FIFO 并使能串口发送中断后中便退出,这个操作时 RAM 的读写操作,执行速度很快,所以不需要等待,唯一可能影响速度的是 FIFO 的深度,如果 FIFO 较小而实际要打印的数据量很大则 FIFO 填满以后需要等待,所以可以根据实际情况设置 FIFO 的深 度。本次在神舟系列 STM32 开发板上的实验中发送缓存 FIFO“USART_Tx_Buffer”的深度为 256 字节,用户可以自己修改其大小。而实际的发送数据是在串口发送中断中完成的。 4、串口接收的实现 串口接收相关主要是在串口接收中断中调用“USART_GetInputString”函数接收并缓存串口数据, 支持退格键: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 393 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 原理:对于串口输入,我们在在中断中使用 Buffer 缓存串口收到的数据,默认是收到回车符时 或者收到的数据填满缓冲区时通过全局变量“USART_Rx_Done”通知前台程序。这样中断里的程序 简单则处理速度快,中断可以快速返回。本次在神舟系列 STM32 开发板上的实验中接收缓存区 USART_Rx_Buffer 的大小为 20 字节,用户可以自己修改其大小。 注意上述函数中变量“USART_Rx_Done”与前台 MAIN 函数中语句的对应: 5、串口中断处理的实现 首先,根据宏定义决定是使用串口 1 中断还是或串口 2 中断 串口1中断还是或串口2中断统一如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 394 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 前面已经讲解了在串口接收中断中调用的“USART_GetInputString”函数。 对于发送:前面“3、串口Printf发送的实现”讲解时说:而实际的发送数据是在串口发送中断 中完成的。如果发送缓冲区非空则发送数据,否则如果发送缓冲区已经为空则禁止串口发送中断(发 送中断将在缓冲区非空时由“USART_StoreBufferData”打开),“USART_SendBufferData”函数的 具体实现如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 395 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟 IV 号用户手册 V2.0 7.10.5 下载与验证 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错 误!未找到引用源。小节进行操作。 7.10.6 实验现象 将固件下载在神舟王407开发板后,用随板配置的串口线连接神舟王407串口2与电脑的串口,打 开超级终端,并按如下参数配置串口。 注意神舟王 407 开发板串口跳线连接是否正确 本实验使用串口接收中断和发送中断以及FIFO缓存来实现高效率的串口数据收发实例。下载固 件后,可以在串口输入信息后按回车键,其实现效果如下图所示。 如果选择的是串口1,实验效果如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 396 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 如果选择的是串口2,实验效果如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 397 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.11 产品唯一身份标识(Unique Device ID)实验(96位唯一ID实验) 7.11.1 意义与作用 产品唯一的身份标识(Unique Device ID)非常适合: ● 用来作为序列号(例如 USB 字符序列号或者其他的终端应用) ● 用来激活带安全机制的自举过程 ● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在 闪存存储器内的安全性。 96 位的产品唯一身份标识所提供的参考号码对任意一个 STM32 微控制器,在任何情况下都是唯 一的。用户在何种情况下,都不能修改这个身份标识。 7.11.2 实验原理 这个 96 位的产品唯一身份标识,按照用户不同的用法,可以以字节(8 位)为单位读取,也可以以 半字(16 位)或者全字(32 位)读取。 96 位的独特 ID 位于地址 0x1FFF7A10 ~ 0x1FFF7A18 的系统存储区,用户可以以字节、半字、或 字的方式单独读取其间的任一地址,其中 0x1FFF7A18 中为最高字节,0x1FFF7A10 中为最低字节。 本次试验以 ARMJISHU 的神舟系列开发板为硬件平台,通过调用系统的 Printf 函数来打印出唯一 标识 DeviceSerial。 作为扩展本次试验也可以顺带读取位于 0x1FFF7A20 地址的“闪存容量寄存器”获得开发板内部 集成 Flash 的大小信息,通过调用系统的 Printf 函数来打印出产品内部 Flash 大小。 7.11.3 硬件设计 产品唯一身份标识(Unique Device ID)为处理器内部组件,这部分不需要硬件电路,这里仅在在串 口中输出产品唯一身份标识(Unique Device ID)即可。 7.11.4 软件设计 程序中定义全局变量 STM32DeviceSerialID 存放读到的设备 ID,96 位的独特 ID 位于地址 0x1FFF7A10 ~ 0x1FFF7A18 的系统存储区,程序如下: Delay_ARMJISHU 函数流水灯使用的延时函数,用简单的 For 循环实现 嵌入式专业技术论坛 (www.armjishu.com)出品 第 398 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 下来看看main函数,其中涉及的子程序如果之前的章节已有介绍(如串口相关),则此处不再 讲述。本示例涉及的程序都添加了较为详细的注释。 在MAIN主函数中调用GetDeviceSerialID()以后,就可以使用Printf来打印,然后作为扩展, 也可以试验顺带读取位于0x1FFF7A20地址的“闪存容量寄存器” 使用Printf来打印出来。 7.11.5 下载与验证 如果使用JLINK下载固件,请按错误!未找到引用源。错误!未找到引用源。下载固件到神舟王 407开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误!未 找到引用源。小节进行操作。 7.11.6 实验现象 将固件程序下载到神舟王 407 开发板后,关闭电源,用串口线神舟王 407 串口 1 与电脑连接,并打 开超级终端,按以下设置,如下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 399 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 选择 COM1;按确定 再按确定,完成超级终端设置。 超级终端窗口显示信息,如下图,可以看到神舟王 407 开发板的串口打印出了产品唯一身份标识 (Unique Device ID)和开发板内部集成 Flash 的大小信息。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 400 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 图上红框的为产品唯一身份标识信息。 7.12 ADC模数转换实验 (神舟王STM32F407-库函数版) ADC:Analog-to-Digital Converter(模数转换器),顾名思意就是将模拟量转换成数字量的设备或 模块。 前面的例程,我们大家一起学习了 STM32 处理器的 GPIO 操作,在这一节,我们将一起来简单学 习 STM32 的 ADC 的使用。神舟王 407 将电位器上采集到的数据通过 ADC 转换后,通过串口将转换 的数据显示出来。 7.12.1 ADC模数转换实验的意义与作用 日常中,我们直接接触的都是一些模拟的设备,电位器、传感器、语音和视频等等,那么如何将 这些设备采集到的数据进行传输呢?模拟数据在传输过程中,数据量大,占用带宽达,受干扰严重, 直接限制、影响到我们的通信传输质量。因此,在现阶段的做法,在数据进行传输的第一步都会进行 模拟/数字的转换。将模拟信号进行采样、量化、编码等一系列操作后,再传到通信信道中进行通信。 那么这涉及到一些概念,我们了解一下。 1.模拟信号:模拟信号是指信息参数在给定范围内表现为连续的信号。 或在一段连续的时间间 隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号。像那些电压/电流与声音这些都 是模拟信号。 2.数字信号:数字信号指幅度的取值是离散的,幅值表示被限制在有限个数值之内。二进制码就 是一种数字信号。二进制码受噪声的影响小,易于有数字电路进行处理,所以得到了广泛的应用。 3.A/D:从字面上看,A 我们称为模拟信号(Analog signal),D 我们称为数字信号 (digital signal),A/D 转换器也就是把模拟信号转换成数字信号的器件。 这节先让我们主要了解模拟/数字转换的操作。数据进行处理后,在彩屏上显示。 7.12.2 AD转换原理 逐次逼近式 A/D 转换器的基本工作流程: A/D 转换器上的模拟多路开关是接外部的模拟信号输入端口,外部的模拟信号,如电压、电流、 压力、温度、湿度等就是由这里接入的。A/D 转换器有很多种类型。我们以逐次逼近式的 A/D 转换器 为例简单说明它的基本工作流程,下面看一个逐次逼近式的功能图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 401 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 逐次逼近型 ADC 在逐次逼近的方法上分为两种,以 3 比特采样为例,它首先将基准电压分为 7 个比较电压,使输入信号同时与这 7 个电压进行比较,最 接近的比较电压是表示数值;第二种是将 输入电压逐次接近电压的二分之一、四分之一、八分之一等,顺序产生比较后的数字信号。因为变换 过程是将输入信号与基 准信号比较,所以,基准电压必需是稳定准确的。输入信号的最高电平应保 持稳定,充分利用变换器达到高的分辨率。对于任何逐次逼近 ADC,都有 5 个组成部分: 第一部分是 DAC,其中含有一个算术逻辑测试单元,会比较 DAC 的输出和模拟信号的输入,直 到两者接近; 第二部分是输出寄存器; 第三部分是比较器,逐次逼近 ADC 仅含有一个比较器,所以功耗和管芯尺寸都比较小; 第四部分是逻辑电路; 第五部分是时钟。 有一个要求是:DAC 的精度一定要高于 ADC。 逐次逼近型 ADC 因其功耗小、成本低、尺寸小 以及性能等方面的优点,成为了目前市场上最具成本效益的 ADC,也是最常见的 ADC。 在确定硬件地址(这个我们下面会有介绍到),与之通信后,芯片在做 AD 功能时,根据那模拟 输入得到的模拟信号,芯片会经过 4 个步骤把模拟信号转换成数字信号,分别是:采样、保持、量化 与编码。 1)采样 又称为抽样,将模拟信号抽样就是把一段模拟信号分解成许多节点;例如直线上扬的股市曲线图, 昨天是 5000 点,今天是 6000 点,明天是 8000 点,这 3 个数字虽然无法描述每一天完整的曲线走势 图,但可以大概描述出来大体的走势是一个上涨的趋势。如果把这个抽样再改进一下,变成昨天上午 是 4500 点,昨天下午是 5000 点,今天上午是 5500 点,今天下午是 6000 点,明天上午是 7000 点, 明天下午是 8000 点;那么可以看到这个曲线又更加的真实了。采样点增加了一倍,股市曲线走势图 也清晰了不少。 2)保持 需要这个信号连续的保持一段时间,否则就有可能是一个干扰或者信号毛刺,这样的干扰和毛刺 是不符合采样标准的。 用专业术语来描述就是后续的量化过程需要一定的时间 τ,对于随时间变化的模拟输入信号,要 求瞬时采样值在时间 τ 内保持不变,这样才能保证转换的正确性和转换精度,这个过程就是采样保持。 正是有了采样保持,实际上采样后的信号是阶梯形的连续函数。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 402 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 3)量化 又称幅值量化,把采样信号经过舍入或截尾的方法变为只有有限个有效数字的数,这一过程称为 量化。 若取信号可能出现的最大值 A,令其分为 D 个间隔,则每个间隔长度为 R=A/D,R 称为量化增 量或量化步长。当采样信号落在某一小间隔内,经过舍入或截尾方法而变为有限值时,则产生量化误 差。 一般又把量化误差看成是模拟信号作数字处理时的可加噪声,故而又称之为舍入噪声或截尾噪 声。量化增量 D 愈大,则量化误差愈大,量化增量大小,一般取决于计算机 A/D 卡的位数。例如,8 位二进制为 28=256,即量化电平 R 为所测信号最大电压幅值的 1/256。 像上面举的股市曲线走势图中的 5000 点,6000 点,8000 点等都是已经被量化出来的值。 4)编码 将离散幅值经过量化以后变为二进制数字的过程,采样后的这些节点如何变成程序代码中可以识 别的二进制码,如何把这些节点合理的顺序排列出来,这样就实现了把一连串的模拟信号用数字信号 给描述出来的过程,这个数字信号就是编码。 这里要提一点,无论将模拟信号如何采样转换成数字信号,都有误差的,采样不可能那么全,所 以数字信号只能描述模拟信号的绝大部分,不可能 100%的完全反馈出模拟信号,所以在电子产品中, 很多模数转换芯片都是自己的精度的,精度就跟采样的精度有关系,这块大家接下来可以留意一下。 7.12.3 STM32的ADC特点 STM32处理器的ADC是一个12位的逐次逼近型模拟数字转换器。它有多达19个通道,可测量16 个外部信号、2个内部信号和1个电池电压信号。各通道的A/D转换可以单次、连续、扫描或间断模式 执行。ADC的结果可以左对齐或者右对齐方式存储在16位数据寄存器中。需要强调的是ADC的输入时 钟经由PCLK2经分频产生。 对 于 ADC 中 涉 及 的 几 个 寄 存 器 , 如 ADC 控 制 器 ( ADC_CR ) 、 ADC 的 采 样 事 件 寄 存 器 (ADC_SMPR)、ADC规则序列寄存器(ADC_SQR)以及ADC规则数据寄存器(ADC_DR),这几 个寄存器的使用在此就不展开描述,大家有兴趣可以查阅《STM32F4用户手册》资料关于ADC的描述。 此部分涉及到的寄存器在ST标准库的外设驱动“stm32f4xx_adc.c”中有相关的定义以及初始化。ADC 的工程项目中,直接调用相关函数与定义。 谈到ADC时,那么我们就有必要提及DMA方式。因为规则通道转换的值存储在一个仅有的数据寄存 器中,所有当转换多个规则通道时,就需要使用DMA,否则将导致已经存储在ADC_DR寄存器中的数据丢 失。但是只有在规则通道的转换结束时,才产生DMA请求,并将转换的数据从ADC_DR寄存器传输到用 户指定的目的地址。 DMA是用来提供在外设和存储器之间或是存储器和存储器之间的高速数据传输的。无需CPU干预, 而数据可以通过DMA快速的转移,节约了CPU的资源。这样便为快速,高性能的ADC提供通道。简单了 解DMA具有多个channel即可。详见《STM32F4用户手册》资料关于DMA的描述。 STM32F407的ADC可谓是非常强大,有3个ADC每个ADC最大的采样率达到了0.41us(既2.4M),如 果3个ADC在规则组模式下同时采样最快可以达到7.2M的采样率。 在讲解ADC采样之前ADC的时钟ADCCLK是一个非常关键的因素。ADCCLK的时钟来自于APB2(AHB 一般为系统时钟的1分频168M,APB1为系统时钟的4分频42M,APB2为系统时钟的2分频84M),最终ADCCLK 的时钟是通过Fpclk2通过2、4、6、8分频而来,在这里提一下stm32的时钟,其实理解一块stm32芯片 理解其不同的时钟线是非常关键的事情,可能有些人看到Fpclk2可能就蒙了,其实Fpclk2就是APB2的 意思这里自己可以在编程文档中找到。 ADC的采样时间是按照:Tconv = Sampling time + 12 cycles,当采样时间为3cycles时,总 的转换时间为15个ADCCLK,ADCCLK在36M下即为2.4M。可以这么说对于ADC的采样时间非常的重要。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 403 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 STM32F4的ADC涉及到一个规则组和注入组的概念这里就不提了,自己可以通过查看文档来解决, 其实就是转换的方式不同而已。 既然ad采样好了,那么对连续或交替的ad采样中数据的搬移是一个关键,这里stm32F4提供了3 种高效的DMA搬运方法: DMA模式1:单次触发模式,当ADC转换完成就进行ADC转换数据的搬移。 DMA模式2:2次转换触发,当有ADC1和ADC2同时交替工作时,每完成1次交替转换,就将ADC1的 数据放在低半字,将ADC2的数据放在高半字。 当有ADC1和ADC2及ADC3同时交替工作时,每完成一次交替转换,就将就将ADC1的数据放在低半字, 将ADC2的数据放在高半字,在下一次交替工作的时候将ADC3的数据放在低半字,将新一次的ADC1数据 放在高半字。 DMA模式3:该模式类似于模式2,但是只能用于交替模式且转换位数为6或8位,每转换2个ADC 将数据以半字存放。 7.12.4 实验原理 ADC 通过读取 PC3 管脚输入的模拟信号输出 ADC 转换值,然后将 ADC 转换值换算成电压值并 通过串口显示。 神舟王 407 开发板 STM32F407ZGT6 有 3 个 ADC。一般 STM32 拥有 1~3 个 ADC。STM32F101/102 系列有 1 个 ADC,STM32F103 系列一般有 2 个 ADC。STM32F407/407 有 3 个 ADC。这个在 ST 官方 提供的数据手册中可以找到。例如在 STM32F407 的数据手册的第 16 页我们就可以看到芯片的 ADC 资源: 神舟王407开发板ADC的转换结果是12位二进制数,最小转换结果为0x0000,最大转换结果为 0xFFFF,所以我们定义一个16位的变量(ADCConvertedValue)来保存转换结果。 STM32处理器的ADC是一个12位的逐次逼近型模拟数字转换器。它有多达18个通道,可测量16 个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以 左对齐或者右对齐方式存储在16位数据寄存器中。需要强调的是ADC的输入时钟不得超过14MHz,并 有PCLK2经分频产生。神舟系列开发板的ADC是一种逐次逼近型模拟数字转换器,它的转换结果是12 位二进制数,最快转换速度1uS,这么优秀的性能不是一般的MCU所能具有的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 404 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 STM32将ADC的转换分为2个通道组:规则通道组和注入通道组。 注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续 转换。这个和中断是类似的,在实际应用中给我们提供方便。 我们通过例子说明:假如在蔬菜大棚外放了几个温度湿度传感器,大棚内也放了几个温度湿度传 感器。我们主要监控的是大棚内的温度/湿度情况,需要时刻监控。但偶尔也需要看看大棚外的温度湿 度情况;因此我们可以使用规则通道组循环扫描大棚内的传感器并显示AD转换结果,当你想看大棚 外温度湿度情况时,通过一个按钮启动注入转换组并暂时显示大棚外的信息,当你放开这个按钮后, 系统又会回到规则通道组继续检测大棚内的信息。 从系统设计上,测量并显示大棚外温度/湿度的过程中断了测量并显示大棚内温度/湿度的过程, 但程序设计上可以在初始化阶段分别设置好不同的转换组,系统运行中不必再变更循环转换的配置, 从而达到两个任务互不干扰和快速切换的结果。可以设想一下,如果没有规则组和注入组的划分,当 你按下按钮后,需要从新配置AD循环扫描的通道,然后在释放按钮后需再次配置AD循环扫描的通道。 下面讲解ADC的设置步骤: 1) 开启PC口时钟,设置PC3为模拟输入模式。 本实验我们用到的是ADC1的通道13。神舟王407开发板的主芯片是STM32F407ZGT6,通道13 对应的引脚是PC3。各个通道对应的管脚大家参考数据手册。例如: 2) 开启DMA时钟,对DMA进行配置。 为什么使用DMA,这里就不再重复。 3) 开启ADC1时钟,对ADC1参数进行配置。 4) 对ADC1使用的通道组进行设置,对采用顺序,转换时间进行设置。 5) 使能ADC并校准 6) 读取ADC的值 7.12.5 硬件设计 神舟王 407 的电位器与 PC3 管脚相连,具体的硬件原理图如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 405 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.12.6 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 406 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 代码分析1:在系统启动文件(startup_stm32f4xx_xx.s)中已经调用SystemInit()初始化了时钟,最开 始的例程已经对此分析过了,还有不明白的可以看下前面的例程。 代码分析2:调用Printf_Init( )函数初始化串口,并向超级终端打印信息。前面已经有介绍。 代码分析3:调用ADC1_CH13_DMA_Config( )函数初始化ADC。 代码分析 4:ADC_SoftwareStartConv(ADC1)配置好 ADC 之后就开始启动 ADC1 的转换操作,正式将 模拟的变量转化成数字的变量。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 407 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 代码分析5:进入while循环,通过ADC1ConvertedValue,获取ADC模数转换的结果,并将结果转换为 电压值。最后通过串口显示信息。到此我们的代码流程基本走完。 代码分析6:下面我们详细分析一下初始化ADC函数ADC1_CH13_DMA_Config( )。 1) 我们进入初始化ADC函数后,首先对ADC1和DMA和GPIOC的进行时钟使能。 2) 对DMA结构体的使用配置。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 408 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 DMA结构体配置的内容包括。使用DMA2的第一个通道DMA_Channel_0,包括时钟设置、目标存 储地址、转换模式、数据宽度和优先级等。 数据从ADC外设的数据寄存器转移到内存(&ADC1ConvertedValue),内存、外设地址都固定,每 次传输的数据大小为半字(16位),使用DMA循环传输模式。DMA传输的外设地址ADC1_DR_ADDRESS 是一个自定义的宏: 数据寄存器保存了ADC转换后的数值,以它作为DMA的传输源地址。它的地址是由ADC1外设的 基地址(0x4001 2000) 加上ADC数据寄存器(ADC_DR)的地址偏移 (0x4c)计算得到的。 3)电位器使用的ADC通道初始化及其重新校准。 PC3管脚是AD的第13输入通道,在代码中我们我们完全可以找到对应的配置。ADC通道和GPIO 管脚的关系可以从ST官方提供的数据手册找到。 代码分析7:函数ADC1_CH13_DMA_Config( )完成初始化以后,ADC将开始转换数据,同时ADC 通过DMA方式不断的更新,最新的ADC值,由于DMA通道传输无须CPU干预,由硬件自己完成,因 此。程序只需要打印读取的最新的ADC值即可,如下所示程序,重复打印ADC转换的值。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 409 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 既 然 数 据 从 ADC 外 设 的 数 据 寄 存 器 (DR_Address) 转 移 到 内 存 , 那 么 我 们 使 用 函 数 ADC1ConvertedValue获取ADC模数转换的结果。我们需要转换为电压值。下面计算电压值,计算电压 值的公式: 实际电压值=ADC 转换值*Vdd/Vdd_convert_value(0xFFF) Vdd 是参考电压,3.3V。Vdd_convert_value 是 4096,因为我们这个 STM32 它的转换的精度是 12 位的, 0x1000,2 的 12 次方是 4096。有了这些数据就可以求出我们需要的电压值了。 7.12.7 下载与测试 如果使用 JLINK 下载固件,请按 如何使用 JLINK V8 下载固件到神舟王 407 号开发板 小节进行 操作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王 407 号开发板小节进行操作。 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按 如何通过 MDK 编译和在线调 试 小节进行操作。 7.12.8 实验现象 本例程串口输出结果。在超级终端上显示其 ADC 的值。如下图: 调节电位器时,电压值发送明显变化。 7.13 Calendar实时时钟与年月日与闹钟(神舟王STM32F407-库函数版) 本章节讲解 STM32 的 RTC 的高级应用,不仅实现当前时分秒的现实,而且实现 Calendar 农历 嵌入式专业技术论坛 (www.armjishu.com)出品 第 410 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 年月日与节气和公历日历年月日时分秒的计算和显示,在乐趣中让大家更深入的掌握 RTC 实时时钟 功能及用法。 7.13.1 意义与作用 RTC(Real-time clock)是实时时钟的意思。神舟王 407 开发板的处理器 STM32F407 集成了 RTC (Real-time clock)实时时钟,在处理器复位或系统掉电但有实时时钟电池的情况下,能维持系统当前 的时间和日期的准确性。实时时钟是一个独立的定时器。RTC 实时时钟模块拥有一组连续计数的计数 器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日 期。本次实验不仅实现当前时分秒的现实,而且实现 Calendar 农历年月日与节气和公历日历年月日 时分秒的计算和显示,在乐趣中让大家更深入的掌握 RTC 实时时钟功能及用法。 STM32 的 RTC 主要特性为: ● 可编程的预分频系数:分频系数最高为 220。 ● 32 位的可编程计数器,可用于较长时间段的测量。 ● 2 个分离的时钟:用于 APB1 接口的 PCLK1 和 RTC 时钟(RTC 时钟的频率必须小于 PCLK1 时 钟频率的四分之一以上)。 ● 可以选择以下三种 RTC 的时钟源: ─ HSE 时钟除以 128; ─ LSE 振荡器时钟; ─ LSI 振荡器时钟。 ● 2 个独立的复位类型: ─ APB1 接口由系统复位; ─ RTC 核心(预分频器、闹钟、计数器和分频器)只能由后备域复位。 ● 3 个专门的可屏蔽中断: ─ 闹钟中断,用来产生一个软件可编程的闹钟中断。 ─ 秒中断,用来产生一个可编程的周期性中断信号(最长可达 1 秒)。 ─ 溢出中断,指示内部可编程计数器溢出并回转为 0 的状态 7.13.2 实验原理 RTC由两个主要部分组成(参见下图)。第一部分(APB1接口)用来和APB1总线相连。此单元还包含 一组16位寄存器,可通过APB1总线对其进行读写操作(参见16.4节)。APB1接口由APB1总线时钟驱动, 用来与APB1总线接口。 另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。第一个 模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含 了一个20位的可编程分频器(RTC预分频器)。如果在RTC_CR寄存器中设置了相应的允许位,则在每个 TR_CLK周期中RTC产生一个中断(秒中断)。第二个模块是一个32位的可编程计数器,可被初始化为当 前的系统时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如 果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 411 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 图表 23 简化的 RTC 框图 RTC 模块和时钟配置系统(RCC_BDCR 寄存器)处于后备区域,即在系统复位或从待机模式唤醒 后,RTC 的设置和时间维持不变。 系统复位后,对后备寄存器和 RTC 的访问被禁止,这是为了防止 对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和 RTC 的访问: ● 设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位,使能电源和后备接口时钟 ● 设置寄存器 PWR_CR 的 DBP 位,使能对后备寄存器和 RTC 的访问。 7.13.3 硬件设计 神舟系列开发板的RTC的硬件设计非常简单,其主要硬件都集成在了处理器内部,外围电路主需 要一个32.768KH在的晶振和VBAT供电电池即可。 STM32F407内部已经包含了40kHz低速内部RC振荡电路LSE,但是其精准度不是很高,为此我们在 外部增加了32.768KHz的晶振电路驱动RTC实时时钟。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 412 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 STM32的VBAT采用CR1220纽扣电池和VCC3.3混合供电的方式,在有外部电源(VCC3.3)的时候, BT1不给处理器的VBAT供电,而在外部电源断开的时候,则由BT1给VBAT供电。这样,VBAT总是有电的, 以保证RTC的持续运行以及后备寄存器的内容不丢失。 相关电路如下: 当安装了电池后, VBAT 管脚由电池供电,如没有安装电池, VBAT 管脚由+3.3V 系统电源供电。 7.13.4 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 413 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:Printf_Init()初始化串口打印 7.13.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.13.6 实验现象 下载后串口会有打样信息的输出,如果是第一次运行该程序,则串口会输出提示(按提示输入星期、日 期、月份、年份) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 414 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 如果不是第一次运行该程序,上次运行时已经设置好系统时间,在复位重启或者有 RTC 电池时断电重 启后,串口会提示“No need to configure RTC…”然后每过一秒刷新一次系统时间。如图所示: 7.14 Calendar实时时钟与农历与与闹钟(神舟王STM32F407-库函数版) 7.14.1 软件设计 代码分析 3:进 7.14.2 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 嵌入式专业技术论坛 (www.armjishu.com)出品 第 415 页,共 771 页 在线调试 小节进行操作。 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.14.3 实验现象 将程序下载到神舟王 407 核心板后,关闭开关,用随板配置的串口线连接神州王串口 1 与电脑的串口, 打开超级终端,并按如下参数配置串口。 重新打开电源运行,并按复位键,正常情况下,串口打印信息如下图。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 416 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 以上图提示信息: 请输入星期 Plesase Set WeekDay(01~07)::如输入 05 请输入日期 Please Set Date(01~31):如输入 23 请输入月份 Please Set Month(01~12):如输入 08 请输入年份 Please Set Year(00~99):如输入 13 显示结果信息以下图 : 嵌入式专业技术论坛 (www.armjishu.com)出品 第 417 页,共 771 页 接下来在输入时间设置信息: 请输入时钟 Please Set Hours :如输入 19 请输入分钟 Please Set Minutes :如输入 14 请输入秒钟 Please Set Seconds :如输入 30 显示结果信息为以下图: ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 接下来是闹钟设置: 请输入闹钟时钟 Please Set Alarm Hours :如输入 19 请输入闹钟分钟 Please Set Alarm Minutes :如输入 16 请输入闹钟秒钟 Please Set Alarm Seconds :如输入 50 显示结果信息为以下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 418 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 以上信息输入完毕后,神舟王开发板 DS1 和 DS2 灯点亮。等待闹钟启动, 与以上的设置时间和闹钟时间,2 分 20 秒后,闹钟启动,蜂鸣器响和 DS2 灯点亮。 神舟王开发板按键功能说明: 按键位置 功能说明 KEY 2 按键 查看当前时间(闹钟时间没到前) 关闭闹钟蜂鸣器(闹钟时间到了,蜂鸣器响) KEY 3 按键 查看闹钟设置时间 KEY 4 按键 重新设置时间 7.15 TIMER定时器中断实验 7.15.1 意义与作用 对于TIMER定时器大家应该不会陌生,51单片机内部就有定时器,作为高性能的STM32开发板 自然少不了对其介绍。定时器属于STM32处理器的内部资源。神舟系列的本例程通过TIMER定时器, 产生的中断定时在串口输出打印信息。我们按照以下的几个部分对STM32处理器的TIMER进行学习。 7.15.2 实验原理 神舟王407开发板使用的处理器是ARM CORTEX-M4系列的STM32F407ZGT6,其内部含有多 达14个定时器,包括: 2个高级定时器:TIM1 & TIM8 -用于马达控制 -各自拥有4个通道,带互补输出以及霍尔接口 10个通用定时器 -各自拥有4个通道:TIM2 & TIM5 & TIM4 & TIM5 -各自拥有2个通道:TIM9 & TIM12 -各自拥有1个通道:TIM10 & TIM11 & TIM13 & TIM14 嵌入式专业技术论坛 (www.armjishu.com)出品 第 419 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 2个基本定时器:TIM6 & TIM7 -仅作计数使用,无通道 本实验我们使用到通用定时器中的TIM5。 通用寄存器主要特点: 通用TIMx定时器功能包括: 1. 16位(TIM5和TIM4)或32位(TIM2和TIM5)计数器,向上,向下,向上/向下自动重装 计数。 2. 16位可编程预分频器(可在运行时改变)用于在1到65535之间细分计数器的时钟频率。 3. 多达4个独立的通道可用于: - 输入捕捉 - 输出比较 - PWM生成(边缘和中心对齐模式) - 单脉冲输出模式 4. 使用外部信号控制定时器和定时器互连的同步电路 5. 对以下事件中断/ DMA的生成: - 更新:计数器溢出/下溢,计数器初始化(通过软件或内部/外部触发) - 触发事件(计数器开始,停止,初始化或内部/外部触发计数) - 输入捕捉 - 输出比较 6. 支持针对定位增量(正交)编码器和霍尔传感器电路 7. 触发输入作为外部时钟或者按周期的电流管理 STM32定时器定时时间的计算 首先我们来看一下如何计算定时器的时间来完成一个一秒中断一次的基本功能。 假如系统时钟是 168Mhz,如上图所示 timer clocks 是由 APBx 得到。我们神舟王 407 开发 板的主芯片是 STM32F407ZGT6。配置的系统时钟是 168MHz。这个在前面的章节已经有了介绍。 STM32F407ZGT6 有 14 个定时器,这些定时器使用的时钟不都是一样的。我们可以看一下 407 的 数据手册的 16 页。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 420 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 本实验中,我们使用到的是定时器 5(TIM5)。定时器 5(TIM5)属于 APB1,而 APB1 允许的 最大的时钟是 42MHz。一般的配置包括我们本次的示例中 timer clocks= HCLK(42MHz)。也就 是说本次示例中 TIM5 模块入口时钟是 42Mhz。 TIM5 模块入口时钟经过一个预分频器后的时钟才是 TIM5 计数器的时钟(用 CK_CNT 表示)。 预分频器的系数为:TIMx_PSC ,当 TIMx_PSC=0 时表示不分频,则 TIM5 计数器的时钟用 CK_CNT=模块入口时钟 168Mhz;当 TIMx_PSC=1 时表示 2 分频,则 TIM5 计数器的时钟用 CK_CNT=模块入口时钟 84Mhz;以此类推。本实验中,我们可以从看一下 systerm_stm32f4xx.c 文件下面的设置系统时钟函数 SetSysClock(void)。可以看到我们系统时钟 168MHz 进来刚好是 4 分频,168/4=42(MHz)。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 421 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 公式为:CK_CNT= fCK_PSC/(PSC[15:0]+1),其中 PSC 最大为 65535。 其次是 TIM5 计数器的计数值的设置,TIM5 计数器以 CK_CNT 为时钟来计数,向下计数到 0 或向上计数到设定值(TIMx_ARR)则产生中断。我们以向上计数为例,从 0 开始计数到设定值 TIMx_ARR 时产生中断。要产生一秒一次中断则要使计数器的值乘以预分频值=系统时钟 42MHz, 其中计数器的值和预分频值都必须小于 65535。我们使预分频值为 4200,计数器值为 10000,则 4200 * 10000 = 4200000 即 42M。其中拆分法有很多,比如 2100 * 20000 = 4200000,只 要注意计数器的值和预分频值都必须小于 65535 即可。 当然既然是一秒一次的重复中断,当然中断要是自动装载的。 7.15.3 硬件设计 TIMER 定时器为 STM32 处理器内部组件,这部分不需要硬件电路,这里仅在中断产生时,进行 串口打印操作。 说明:本实例需要用到使用GPIO管脚控制LED的相关知识,关于LED的其它函数请查看“LED跑 马灯实验”,此处不再介绍。本历程中主要是针对STM32定时器示例中新增添的代码进行说明。 7.15.4 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 422 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:Printf_Init ()函数初始化串口,前面我们已经讲解,我们就不再重复。 代码分析 2:Tim_Init()函数对 TIM5 进行初始化。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 423 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 本函数配置定时器参数。前面实验原理章节的“STM32定时器定时时间的计算”部分已经介绍 了定时时间的计算方法,从 Tim_Init函数中我们可以看出TIM5的参数配置流: 1)TIM5时钟使能。调用RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE) 函数现实。 2)初始化定时器参数,设置自动重装值,分频系数,计数方式等。调用TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure) 函 数 实 现 。 函 数 中 用 到 结 构 体 , 结 构 体 类 型 是 TIM_TimeBaseInitTypeDef。 typedef struct { uint16_t TIM_Prescaler; uint16_t TIM_CounterMode; uint16_t TIM_Period; uint16_t TIM_ClockDivision; uint8_t TIM_RepetitionCounter; } TIM_TimeBaseInitTypeDef 大家翻开其它的工程,我们初始化配置其它的接口的话,也常常用到类似的函数。这样的结构体 包含了这个接口的信息。比如我们配置GPIO管脚的时候,要确定是那个管脚,管脚的速率,输入输出 模 式 等 。 这 里 TIM_Prescaler 用 来 配 置 分 频 系 数 。 TIM_CounterMode 用 来 设 置 计 数 方 式 。 TIM_Period用来配置自动重载计数周期。TIM_RepetitionCounter用来设置时钟分频因子。 3)经过TIM_TimeBaseInit()函数初始化TIM5之后,我们清除TIM5溢出中断标志,打开TIM5 的溢出中断,使能TIM5,当然还要配置TIM5中断参数。这里的每一个功能都调用了对应的函数实现。 到此我们的初始化函数基本完成。 代码分析5:TIM5中断触发的时候,进入中断服务函数。我们看一下中断服务函数TIM5_IRQHandler()。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 424 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 中断服务函数中,我们通过串口打印信息。 至此神舟系列TIMER定时器中断相关软件程序介绍完毕! 7.15.5 下载与验证 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。 错误!未找到引用源。小节进行操作。 7.15.6 实验现象 将固件程序下载到神舟王 407 开发板后,按下复位键。可以看到串口打印如下。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 425 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.16 IWDG独立看门狗 STM32 内部自带了 2 个看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG)。这一章,介绍 如何使用 STM32 的独立看门狗(以下简称 IWDG)。 7.16.1 什么是看门狗 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造 成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成 整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑, 便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。 其实就是相当一个装满时间数值的倒计时器一样,启动之后就开始倒计时,倒计时为零传送一个复位 信号到 CUP,又重新开始倒计时。 7.16.2 为什么是独立看门狗呢 就是在芯片内部独立的一部分,独立的看门狗是基于一个 12 位的递减计数器和一个 8 位的预分 频器,它由一个内部独立的 RC 振荡器提供时钟;因为这个 RC 振荡器独立于主时钟,所以它可运行 于停机和待机模式。它可以被当成看门狗用于在发生问题时复位整个系统,或作为一个自由定时器为 应用程序提供超时管理。通过选项字节可以配置成是软件或硬件启动看门狗。在调试模式下,计数器 可以被冻结。 7.16.3 怎么使用独立看门狗IWDG 前面已经介绍了,独立看门狗相当于一个独立的倒计时器,那要用之前就要给这个倒计时设置一 个启动开关才能用,而启动开关这里就是用 Key Register 键值寄存器;有了开关那可以用,但倒计数 的值不可能是无穷大,所以在这里也要设置一个 Reload Register 重装载寄存器用来控制我们想要时 间;控制启动开关、时间长短都有了,还有一个倒计时节奏速度,也就是频率,这里就用到了 Prescaler Register 预分频寄存器;好,有了这三个寄存器,我们就可以进行对它控制操作。对这几个寄存器进 行进一步的了解: Key Register 键值寄存器的作用是: (1)控制独立看门狗的启用功能; (2)改变另外两个寄存器(Prescaler Register 预分频寄存器)和(Reload Register 重装载寄存器) 作用状态功能; (3)改变看门狗计数器为 0 时,复位的产生或重新再计数。 Prescaler Register 预分频寄存器的作用是:用来设置看门狗时钟的分频系数。 Reload Register 重装载寄存器的作用是:用来重新加载为倒计数计数器的初值。 Status Register 状态寄存器的作用是:设置(Prescaler Register 预分频寄存器)和(Reload Register 重装载寄存器)两个寄存器读操作的有效性。 其实使用独立看门狗就是在控制和设置几个寄存器。接下来一步一步详细操作怎么使用独立看门 狗 IWDG。 键值寄存器 IWDG_KR(Key Register): 首先是键值寄存器 IWDG_KR,该寄存器功能上面所说,接下是各位的描述,如图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 426 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 在键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗;此时计数器开始从其复位 值 0xFFF 递减计数。当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。 无论 何时,只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器 中从而避免产生看门狗复位,这里相当于喂狗,每一定时间内喂一次,防止看门狗自动复位。 IWDG_PR 和 IWDG_RLR 寄存器具有写保护功能。要修改这两个寄存器的值,必须先向 IWDG_KR 寄存器中写入 0x5555。将其他值写入这个寄存器将会打乱操作顺序,寄存器将重新被保 护。重装载操作(即写入 0xAAAA)也会启动写保护功能。 预分频寄存器 IWDG_PR(Prescaler Register): 接下来,介绍预分频寄存器(IWDG_PR),该寄存器用来设置看门狗时钟的分频系数,最低为 4,最 高位 256,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其它都是保留位。预分频 寄存器各位定义如图: 重装载寄存器 IWDG_RLR(Reload Register): 介绍一下重装载寄存器 IWDG_RLR。该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,但是只有低 12 位是有效的,该寄存器的各位描述如图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 427 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 状态寄存器 IWDG_SR(Status Register): 注:如果在应用程序中使用了多个重装载值或预分频值,则必须在 RVU 位被清除后才能重新改变预 装载值,在 PVU 位被清除后才能重新改变预分频值。然而,在预分频和/或重装值更新后,不必等待 RVU 或 PVU 复位,可继续执行下面的代码。(即是在低功耗模式下,此写操作仍会被继续执行完成。) 以上就是对独立看门狗有关几个寄存器的功能操作等介绍。 7.16.4 启动STM32的独立看门狗 STM32 的独立看门狗由内部专门的 32Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。 这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 32Khz,而是一个可变化 的时钟,只是我们在估算的时候,以 32Khz 的频率计算,看门狗对时间的要求不是很精确,所以, 时钟有些偏差,都是可以接受的。 接下来就可以启动 STM32 的独立看门狗,启动过程可以按以下步骤实现: (1)向 IWDG_KR 写入 0x5555。 通过这步,取消 IWDG_PR 和 IWDG_RLR 的写保护,使后面可以操作这两个寄存器。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 428 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 设置 IWDG_PR 和 IWDG_RLR 的值。 这两步设置看门狗的分频系数,和重装载的值。 怎么计算看门狗溢出时间呢? 由此,就可以知道看门狗的喂狗时间(也就是看门狗溢出时间),该时间的计算方式为: Tout=((4×2^prer) ×RLR) /32KHz 其中 Tout 为看门狗溢出时间(单位为 ms);prer 为看门狗时钟预分频值(IWDG_PR 值), 范围为 0~7(十进制,转二进制 000~111 以上面预分频对应);RLR 为看门狗的重装载值(IWDG_RLR 的值低 12 位)。 看门狗复位时间=(预分频×重装载值) /32KHz 根据公式推算就可以知道重装载值、预分频系数与溢出时间的关系,做出一个简单参考表格: 重装载值(RLR 寄存器低 12 位) 预分频 内部 RC 看门狗复位时间(ms) 500 64 32 KHz 1000 ms 1(最小值) 64 32 KHz 2 ms(在预分频 64 最小时间) 4096(最大值) 64 32KHz 8192ms(在预分频 64 最大时间) 2000 16 32 KHz 1000 ms 1(最小值) 16 32 KHz 0.5 ms(在预分频 16 最小时间) 4096(最大值) 16 32 KHz 2048ms(在预分频 16 最大时间) 假设:预分频系数设定 prer 值为 4,重装载值 RLR 值为 625,那么就可以得到 Tout=64×500/32=1000ms,这样,看门狗的溢出时间就是 1s,只要你在一秒钟之内,有一次写入 0XAAAA 到 IWDG_KR,就不会导致看门狗复位(当然写入多次也是可以的)。这里需要提醒大家的 是,看门狗的时钟不是准确的 32Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门 狗复位。 (2)向 IWDG_KR 写入 0XAAAA。 通过这句,将使 STM32 重新加载 IWDG_RLR 的值到看门狗计数器里面。即实现独立看门狗的 喂狗操作。 (3)向 IWDG_KR 写入 0XCCCC。 通过这句,来启动 STM32 的看门狗。注意 IWDG 在一旦启用,就不能再被关闭!想要关闭, 只能重启,并且重启之后不能打开 IWDG,否则问题依旧,所以在这里提醒大家,如果不用 IWDG 的 话,就不要去打开它,免得麻烦。 7.16.5 软件设计 7.16.6 下载与验证 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 429 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.16.7 实验现象 将固件程序下载到神舟王 407 开发板后,按下复位键。神舟王 407 开发板上的 DS2 按照一定的频 率闪烁。按下按键 KEY2,则 LED 灯 DS1 被点亮。 7.17 窗口看门狗 7.17.1 什么是窗口看门狗 窗口看门狗(WWDG)通常被用来监测,由外部干扰或不可预见的逻辑条件造成的应用程序背离正 常的运行序列而产生的软件故障。除非递减计数器的值在 T6 位变成 0 前被刷新,看门狗电路在达到 预置的时间周期时,会产生一个 MCU 复位。在递减计数器达到窗口寄存器数值之前,如果 7 位的递 减计数器数值(在控制寄存器中)被刷新, 那么也将产生一个 MCU 复位。这表明递减计数器需要在一 个有限的时间窗口中被刷新。也就是在独立看门狗的递减时间上设置一个有效的“窗口”只有在这“窗 口”内才能进行有效的“喂狗操作”。在“窗口”之外的喂狗操作和“窗口”的上线到下限中未进行 喂狗操作都将默认未错误操作,将会产生一个 MCU 复位。我们将之称为窗口看门狗。 7.17.2 窗口看门狗的特性 ● 可编程的自由运行递减计数器 ● 条件复位 ─当递减计数器的值小于 0x40,(若看门狗被启动)则产生复位。 ─当递减计数器在窗口外被重新装载,(若看门狗被启动)则产生复位。见 0。 ● 如果启动了看门狗并且允许中断,当递减计数器等于 0x40 时产生早期唤醒中断(EWI),它可以 被用于重装载计数器以避免 WWDG 复位,在了解了窗口看门狗的的特性后我们在来看窗口看门狗的 时序图。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 430 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 窗口看门狗时序图 时序图中,T[6:0]就是 WWDG_CR 的低七位,W[6:0]即是 WWDG->CFR (控制寄存器)的低 七位。T[6:0]就是窗口看门狗的计数器,而 W[6:0]则是窗口看门狗的上窗口(上窗口的值不是固定的 用户可以根据自己的需要进行设置,因为 WWDG->CFR 这个寄存器只有低 7 位提供给用户来设置窗 口的上限所以我们最大只能设置到 7F,最小不能小于下窗口值),下窗口值是固定的(0X40)。当窗 口看门狗的计数器在上窗口值之外被刷新,或者低于下窗口值都会产生复位。 7.17.3 窗口看门狗的计算公式: 窗口看门狗的超时公式如下: 其中: Twwdg=(4096×2^WDGTB×(T[5:0]+1)) /Fpclk1; Twwdg:WWDG 超时时间(单位为 ms) Fpclk1:APB1 的时钟频率(单位为 Khz) WDGTB:WWDG 的预分频系数 T[5:0]:窗口看门狗的计数器低 6 位 根据上面的公式,那么可以得到最早喂狗时间-最晚喂狗时间表如表所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 431 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 最小超时值为窗口看门狗计数周期时间=1s/FPCK1X(4096×2^WDGTB)列假设 Fpclk1=42Mhz,预 分频系数为 1,看门狗的计数周期时间 us=1000000(1S=1000ms=1000000us)/42000000(1MZH=1000KZH=1000000ZH)X(4096 × 1) ≈136us 最大超时值为窗口的最大值=1S/FPCK1×(4096×2*WDGTB)×(7F-3F) 注意:7F 为窗口上限最大值 40 为窗口下限 STM 系统默认值是固定的 3F 将报错 7.17.4 窗口看门狗要用到哪些寄存器 在了解了窗口看门狗的一些基本特性后我们来介绍下窗口看门狗 3 个寄存器,首先介绍控制寄存器 (WWDG_CR),该寄存器的各位描述如下图所示: 可以看出,这里我们的 WWDG_CR 只有低八位有效,T[6:0]用来存储看门狗的计数器值,随 时更新的,每个看窗口看门狗计数周期(4096×2^ WDGTB)减 1。当该计数器的值从 0X40 变为 0X3F 的时候,将产生看门狗复位。 WDGA 位则是看门狗的激活位,该位由软件置 1,以启动看门狗,并且一定要注意的是该位一 旦设置,就只能在硬件复位后才能清零了。 窗口看门狗的第二个寄存器是配置寄存器(WWDG_CFR),该寄存器的各位及其描述如下图所 示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 432 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 该位中的 EWI 是提前唤醒中断,也就是在快要产生复位的前一段时间(T[6:0]=0X40)来提醒 我们,需要进行喂狗了,否则将复位!因此,我们一般用该位来设置中断,当窗口看门狗的计数器值 减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中断,我们可以在中断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在进入中断后,必须在不大于 1 个窗口看门狗 计数周期的时间(在 PCLK1 频率为 42M 且 WDGTB 为 0 的条件下,该时间为 136)内重新写 WWDG_CR,否则,看门狗将产生复位! 最后我们要介绍的是状态寄存器(WWDG_SR),该寄存器用来记录当前是否有提前唤醒的标志。 该寄存器仅有位 0 有效,其他都是保留位。当计数器值达到 40h 时,此位由硬件置 1。它必须通过 软件写 0 来清除。对此位写 1 无效。即使中断未被使能,在计数器的值达到 0X40 的时候,此位也 会被置 1。 下面我们来看下窗口看门狗的架构图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 433 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 如果看门狗被启动(WWDG_CR 寄存器中的 WDGA 位被置’1’), 并且当 7 位(T[6:0])递减 计数器从 0x40 翻转到 0x3F(T6 位清零)时,则产生一个复位。如果软件在计数器值大于窗口寄存器中 的数值时重新装载计数器,将产生一个复位。这里我要讲的是窗口看门狗它不像独立看门狗内部有一 个独立的时钟它是用来自与 RCC 的外部时钟驱动的,也就是说当外部时钟受到影响窗口看门狗也会 受到相应的影响,这样做有什么好处那?它的好处在于它不光更严格的监视了系统喂狗操作,而且它 关联到外部时钟当外部时钟不走了,这狗也将失去作用。 7.17.5 窗口看门狗与独立看门狗的区别 独立看门狗 Iwdg——有独立时钟(内部低速时钟 LSI---32KHz),所以不受系统硬件影响的系统 故障探测器。主要用于监视硬件错误。 窗口看门狗 wwdg——时钟与系统相同。如果系统时钟不走了,这个狗也就失去作用了,主要用 于监视软件错误 对于一般的看门狗,程序可以在它产生复位前的任意时刻刷新看门狗,但这有一个隐患,有可能 程序跑乱了又跑回到正常的地方,或跑乱的程序正好执行了刷新看门狗操作,这样的情况下一般的看 门狗就检测不出来了;如果使用窗口看门狗,程序员可以根据程序正常执行的时间设置刷新看门狗的 一个时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,这样可以检测出程序没有按照正常 的路径运行非正常地跳过了某些程序段的情况。 7.17.6 怎么使用窗口看门狗 介绍完窗口看门狗的原理、窗口看门狗将要用到的特殊功能寄存器以及窗口看门狗与独立看门 狗的区别后我们在来介绍要如何使用窗口看门狗,这里我们介绍的是用中断来喂狗,具体步骤如下; 1) 使能 WWDG 时钟 前面我们介绍独立看门狗和窗口看门都的区别时特别说明了独立看门狗使用的是内部低速时 钟,不存在使能的问题。而 WWDG 是使用的 PCLK1 的时钟,在使用前需要先使能时钟的。 2) 设置 WWDG_CFR 和 WWDG_CR 两个寄存器 在使能好时钟过后,我们设置 WWDG 的 CFR 和 CR 两个寄存器,对 WWDG 进行配置。 包括使能窗口看门狗、开启中断、设置计数器的初始值、设置窗口值并设置分频数 WDGTB 等。 这里要注意的是用户根据自己的需要设定时间,先要通过上面的看门狗超时公式和外部晶振算出我 嵌入式专业技术论坛 (www.armjishu.com)出品 第 434 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 们需要设定的时间那个分频段,在根据预分频时基算出 WWDG_CR 的计数器值。 如:假设我们使用的是 36M 的外部晶振,我们将要设定的时间是 3.41ms,我们不难算出应该 设定的 WDGTB[0:0]然后我们可以 3.41ms=1s/36M×(4096×1)×计算器值。可以算出大概为 30,也 就表示在 WWDG_CR 的计数器次数在加上 3F 得出 WWDG_CR 的计数值为 5D 3) 开启 WWDG 中断并分组 在设置完了 WWDG 后,需要配置该中断的分组及使能。这点通过我们之前所编写的 MY_NVIC_Init 函数实现就可以了。 4)编写中断服务函数 在最后,还是要编写窗口看门狗的中断服务函数,通过该函数来喂狗,喂狗要快,否则当 窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。在中断服务函数里面也要将状态寄存 器的 EWIF 位清空。 7.17.7 硬件设计 本实验中,我们只需要用到串口,通过 STM32 的窗口看门狗的功能在看门狗中断的时候,通 过串口把数据打印出去。 7.17.8 软件设计 我们先来看下主函数。 初始化串口,并让串口输出打印我们这次的实验目的 中断分组和对窗口看门狗进行一个配置,如寄存器、中断的配置函数 嵌入式专业技术论坛 (www.armjishu.com)出品 第 435 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 While 循环,在这里等待窗口看门狗的中断 深入分析程序代码 窗口看门狗配置分组函数 NVIC_GroupConfig(): 配置 NVIC 中断优先级分组 中断 NVIC 配置,中断函数 WWDG_IRQn。 我们看一下对窗口看门狗的配置函数 WWDG_Init(): ¾ 使能时钟,窗口看门狗使用的是 PCLK1 的时钟,需要先使能时钟。方法是: ¾ 设置窗口值和分频数 设置窗口值的函数是: 这个函数就一个入口参数为窗口值 设置分频数的函数是: 这个函数同样只有一个入口参数就是分频值。 ¾ 开启窗口看门狗中断 嵌入式专业技术论坛 (www.armjishu.com)出品 第 436 页,共 771 页 开启 WWDG 中断的函数为: ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 我们看下看门狗的寄存器配置是怎么样的,首先是使能看门狗,并设置一个计数值。在这个函数 里面,是用一个 0x80 与上 0x7f,得到一个新的数值给到寄存器 WWDG_CR,使得第七位为 1,使能看 门狗。 我们再来看下这个函数,它的主要作用是让窗口看门狗配置为中断模式,计数值递减到 0x40 的 时候产生中断,只能是复位清除。 我们下面看下中断函数是怎么样的,当看门狗计数值到 0x40 产生中断时会怎么样操作的,首先 进入中断之后先是重新给寄存器重新载入计数值,然后清除中断标志位,清除完中断标志位后让串口 输出打印一串字符。也就是说我们的窗口看门狗每一次执行中断就会打印一次数据。 这样就能看到我们前面做实验现象中,串口不断打印数据" ARMJISHU.COM-->喂狗\n\r"的效果 了。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 437 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.17.9 实验现象 将固件下载在神舟王 407 核心板后,用随板配置的串口线连接神州王串口 1 与电脑的串口,打开 超级终端,并按如下参数配置串口。 上电运行神舟王,串口将重复打印信息,如下图所示, 嵌入式专业技术论坛 (www.armjishu.com)出品 第 438 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.18 315M无线模块(神舟王STM32F407-库函数版) 7.18.1 按键检测与315M无线模块实验 前面我们介绍了STM32的IO口作为输出功能使用,这一节,我们将向大家介绍如何使用STM32 的IO口作为输入功能,其中包括按键的输入,也有315M无线模块通过解码后,由IO口输入。通过本 节的学习,你将了解到STM32的IO口作为输入使用的方法,也对无线通信传输,解码有一定的了解。 本节分为如下几个小节: 6.4.1 KEY_LED按键与315M无线模块实验的意义与作用 6.4.2 实验原理 6.4.3 硬件设计 6.4.4 软件设计 6.4.5 下载与测试 6.4.6 实验现象 在开始实验之前,我们了解一下315M无线模块。无线模块是利用无线技术进行无线传输的 一种模块。它被广泛地应用于电脑无线网络,无线通讯,无线控制等领域。无线模块主 要由发射器,接收器和控制器组成。 1)315M 无线模块的特点: 数据发射模块的工作频率为 315M,采用声表谐振器 SAW 稳频,频率稳定度极高,当环境温度在 -25~+85 度之间变化时,频飘仅为 3ppm/度。特别适合多发一收无线遥控及数据传输系统。声表谐 振器的频率稳定度仅次于晶体,而一般的 LC 振荡器频率稳定度及一致性较差,即使采用高品质微调 电容,温差变化及振动也很难保证已调好的频点不会发生偏移。 数据模块具有较宽的工作电压范围 3~12V,当电压变化时发射频率基本不变,和发射模块配套的 接收模块无需任何调整就能稳定地接收。当发射电压为 3V 时,空旷地传输距离约 20~50 米,发射功 率较小,当电压 5V 时约 100~200 米,当电压 9V 时约 300~500 米,当发射电压为 12V 时,为最佳 工作电压,具有较好的发射效果,发射电流约 60 毫安,空旷地传输距离 700~800 米,发射功率约 500 毫瓦。当电压大于 l2V 时功耗增大,有效发射功率不再明显提高。这套模块的特点是发射功率比较大, 传输距离比较远,比较适合恶劣条件下进行通讯。 315M 无线模块是无线通信产品中的一种,它跟 WIFI 或者 2.4G 无线模块比;315M 只适合传输 数据量不大的信息流,2.4G 可以传输像视频等大的数据流,不过 315M 传输距离要比 2.4G 远,可以 穿透墙壁等优势。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 439 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 315M 无线模块它由发射部分和接收部分组成。接收端上有 4 个输出端对应发射端的 4 个按键, 分别是 D0,D1,D2,D3 为按键状态输出端,当某个按键按下后,相应的数据端口就输出高电平,在这几 个端口加一级放大就可以驱动继电器,功率三极管,进行负载遥控开关控制。也可以直接连到单片机 的 I/O 脚上,通过单片机采集数据端口状态,然后进行外部控制。 2)315M 无线模块内部架构实现: 315M 无线模块由发射部分和接收部分组成:1.发射部分由,按键,编码芯片,315M 调制器,功 率放大电路等构成: 接收部分由无线信号接收电路,解码芯片构成: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 440 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 在通常使用中,我们一般采用8位地址码和4位数据码,这时解码芯片PT2272的第1~ 8脚为地址设定脚,有三种状态可供选择:悬空、接正电源、接地三种状态,地址编码不 重复度为38=6561组,只有发射端PT2262和接收端PT2272的地址编码完全相同,才能配对 使用,遥控模块的生产厂家为了便于生产管理,出厂时遥控模块的PT2262和PT2272的八 位地址编码端全部悬空,这样用户可以很方便选择各种编码状态,用户如果想改变地址 编码,只要将PT2262和PT2272的1~8脚设置相同即可,例如将发射机的PT2262的第2脚 接地,第3脚接正源,其它引脚悬空,那么接收机的PT2272只要也第2脚接地,第3脚接正 电源,其它引脚悬空就能实现配对接收。地址设置跳线如图7所示,用户可以在PCB板上 直接将地址引脚(PCB板中间8个过孔焊盘)与L(低电平)或H(高电平)相连,从而实 现地址设置。PT2262与PT2272地址设置要完全一样。当两者地址编码完全一致时,接收 机对应的D1~D4端输出约4V互锁高电平控制信号,同时VT端也输出解码有效高电平信 号。 7.18.2 按键检测与无线模块实验的意义与作用 STM32的IO口在前面的流水灯实验和蜂鸣器实验中已经有了详细的介绍,这里我们细讲,这一节 我们讲结合STM32的库,描述如何设置STM32 的GPIO口作为输入使用。 这一节,我们将通过神舟王407板载有的4个按键(key1,key2,key3和key4),来控制板上的4 个LED(DS1~4),同时,借用315M无线模块进行实验,无线模块的遥控按钮,按下任一个按钮,对 应的DS1~4亮,让爱好者享受无线控制的乐趣。 7.18.3 实验原理 这个例程的实验原理主要包括两个:一、通过神舟王407开发板上的4个按钮(key1,key2,key3 和key4),控制4个LED灯的点亮和关闭状态。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 441 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 关于315M无线模块的实验原理,315M配套的遥控设备,每按下一个按钮,以315MHz左右的频率 通过无线传输,而315M模块由28cm长度的天线接收传输的信号,并由PT2272进行解码,同时置VT端 有效高电平,然后将解码后的数据由D0~D3连接的GPIO管脚输入到STM32处理器中,处理器根据接收 到的信号,对应输出控制LED的组合点灯亮状态。 具体的对应关系如下: 具体的对应关系如下: 现象 操作 DS1亮 神舟王407板载KEY1按键被按下或者无线遥 控上的A键被按下 DS2亮 神舟王407板载KEY2按键被按下或者无线遥 控上的B键被按下 DS3亮 神舟王407板载KEY3按键被按下或者无线遥 控上的C被按下 DS4亮 神舟王407板载KEY4按键被按下或者无线遥 控上的D被按下 说明 当无线遥控上的按键被按下 时 , 神 舟 王 407 的 蜂 鸣 器 发 声; 当 神 舟 王 407 板 载 的 按 键 被 按下时,神舟王407蜂鸣器不 发声。 7.18.4 硬件设计 该实验需要使用到神舟王407开发板上的LED灯,按键,315M无线模块接口,相关硬件电路如下: ¾ LED 灯硬件电路 ¾ 315M 无线与按键硬件电路 嵌入式专业技术论坛 (www.armjishu.com)出品 第 442 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 在上图中可以看出无线与神舟王407号板载的按键进行了复用,使用了处理器的相同的GPIO口。 关于如何区分是按键变化引起的GPIO电平变化还是无线模块收到了遥控信号,主要有两个方法可以实 现。 方法一:判断无线模块的VT信号是否有效,以此来区分GPIO的电平变化是由按键还是无线模块 引起的。当遥控上有按键按下时,无线模块的VT将变为高电平,同时,按键对应的D0~4管脚也输出 高电平(说明:315M的VT和D0~4是高电平有效的)。 方法二:由于硬件设计上,无线模块和按键进行复用时,增加了三极管电路,无论是神舟王407 号板载的按键被按下,还是无线模块接收到遥控的按键信号,对应的GPIO口都将变低,但是当无线模 块接收到遥控信息时,会导致蜂鸣器导通发出鸣响。因此可通过蜂鸣器是否发声来判断是按键还是无 线遥控。 GPIO管脚与对应的LED灯关系 LED灯 DS1 DS2 DS3 DS4 LED灯对应的GPIO PF7 PF8 PF9 PF10 GPIO管脚与按键和无线模块对应关系 按键与蜂鸣器 KEY1 KEY2 KEY3 KEY4 蜂鸣器 315M无线模块 D0 D1 D2 D3 VT GPIO PA5 PF11 PC13 PA0 PF6 7.18.5 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 443 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 444 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 445 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 代码分析 1:首先进行 LED 灯的初始化,因为后面的程序需要按一下按键,就使得 LED 灯进行闪烁 和亮灭: 代码分析 2:进行 while()循环后,通过 IF 和 ELSE 来判断是不是有 315M 无线信号或者神舟王板上按 键被按下两种途径;通过判断 if(Check_315M_Wireless()),也就是 315M 无线模块是否被按下去,如 果没有按下去的话,再判断是否有神舟王板上的按键是否被按下,如果有就点亮对应的 LED 灯,并 且在串口打印出对应的字符。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 446 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 代码分析 3:关键之处要分析一下 Check_315M_Wireless()函数,因为就是这个函数来监控是否有无线 信号传入的: 可以看到就是监控 CPU 的 PF6 这个管脚是否有输入,我们查看一下原理图,看下 PF6 连接的是哪个 管脚: 可以看到 PF6 连着 Q6 三极管,再连接着 315M 无线模块的 VT 端,315M 无线模块只要一接收到 任何数据,VT 端就会变高,这是 315M 模块本身的特点,该信号线一旦拉高,就会导致三极管导通, 这样 PF6 就会被下拉到低电平;这样 GPIO_ReadInputDataBit(GPIO_315M_PORT, GPIO_315M)函数就 会读到 PF6 的电平变化,而 return 一个 1,而不是 0。 这样 代码就可以往下走了,再通过下面的代码来判断无线 模块到底被按下了哪个按键,具体代码可以自行进行分析 嵌入式专业技术论坛 (www.armjishu.com)出品 第 447 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 代码分析 4:另外 ReadKeyDown()这个函数,来判断哪个按键被按下,原理图中按键与 315M 的 管脚是连在一起的,所以既可以使用按键按下,使得 GPIO 管脚有变化,也可以用 315M 无线模块控 制来使得 GPIO 管脚有变化。其实这个函数就是通过轮询来判断哪个具体的按键被按下了: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 448 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.18.6 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.18.7 实验现象 硬件连接如下 单片机接口 连接配件 U5(单片机 315 315M 无线模块 模块接口) J10(串口 1) 连接串口数据线 的一端(列一端 连接电脑) 硬件连接 功能 315 无线模块信 号 嵌入式专业技术论坛 (www.armjishu.com)出品 第 449 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 将固件下载在神州王 407 开发板后,连接 315M 模块在 U5 口上,连接用随板配置的串口线连接在 神舟王 407 的串口 1 上列外一端与电脑的串口连接, 打开超级终端,并按如下差数配置串口。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 450 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 神州王上电、复位后,超级终端显示图片如下 下载好后我们通过 315 遥控器 按 A 可以看见 DS1 亮并在超级终端内显示如下 按 B 可以看见 DS2 亮并在超级终端内显示如下 按 C 可以看见 DS3 亮并在超级终端内显示如下 嵌入式专业技术论坛 (www.armjishu.com)出品 第 451 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 按 D 可以看见 DS4 亮并在超级终端内显示如下 下载好后我们通过超级终端可以看到这些打印信息。 7.19 硬件CRC循环冗余检验实验 CRC 是(Cyclic Redundancy Check)的缩写,意思是循环冗余校验。CRC 循环冗余校验技术主要 应用于核实数据远程传输或者数据存储的正确性和完整性。神舟系列开发板使用的 STM32 芯片都内 置了一个硬件的 CRC 计算模块,本章节我们讲述该硬件模块的使用。 7.19.1 意义与作用 CRC 校验可以硬件完成,可以软件实现。本多处理器内部没有硬件 CRC 校验电路,只能使用软 件实现,但是软件实现需要占用 CPU 和 RAM 资源,而且速度稍慢。神舟系列开发板使用的 STM32 芯片内置了一个硬件的 CRC 计算模块,可以在通信的检测错误和数据完整性方面发挥优异的性能, 本章节我们讲述该硬件模块的使用。 7.19.2 实验原理 CRC 循环冗余校验计算单元是根据固定的生成多项式得到任一 32 位全字的 CRC 计算结果。 在 其他的应用中, CRC 技术主要应用于核实数据传输或者数据存储的正确性和完整性。标准 EN/IEC 60335-1 即提供了一种核实闪存存储器完整性的方法。CRC 计算单元可以在程序运行时计算出软件的 标识,之后与在连接时生成的参考标识比较,然后存放在指定的存储器空间。 所有的 STM32 芯片都内置了一个硬件的 CRC 计算模块,可以很方便地应用到需要进行通信的程 序中,这个 CRC 计算模块使用常见的、在以太网中使用的计算多项式: X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 +X8 + X7 + X5 + X4 + X2+ X +1 写成十六进制就是: 0x04C1 1DB7。STM32 芯片的硬件 CRC 计算单元框图如下: 图表 24 CRC 计算单元框图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 452 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 使用这个内置 CRC 模块的方法非常简单,既首先复位 CRC 模块(设置 CRC_CR=0x01),这个操作 把 CRC 计算的余数初始化为 0xFFFFFFFF;然后把要计算的数据按每 32 位分割为一组数据字,并逐 个地把这组数据字写入 CRC_DR 寄存器(既上图中的绿色框),写完所有的数据字后,就可以从 CRC_DR 寄存器(既下图中的兰色框)读出计算的结果。 注意:虽然读写操作都是针对 CRC_DR 寄存器,但实际上是访问的不同物理寄存器。 下面是用 C 语言描述的这个计算模块的算法,大家可以把它放在通信的另一端,对通信的正确性 进行验证: 有几点需要说明: 1)上述算法中变量 CRC,在每次循环结束包含了计算的余数,它始终是向左移位(既从最低位向最高 位移动),溢出的数据位被丢弃。 2)输入的数据始终是以 32 位为单位,如果原始数据少于 32 位,需要在低位补 0,当然也可以高位补 0。 3)假定输入的 DWORD 数组中每个分量是按小端存储。 4)输入数据是按照最高位最先计算,最低位最后计算的顺序进行。 例如: 如果输入 0x44434241,内存中按字节存放的顺序是:0x41, 0x42, 0x43, 0x44。计算的结果是: 0xCF534AE1 如果输入 0x41424344,内存中按字节存放的顺序是:0x44, 0x43, 0x42, 0x41。计算的结果是: 0xABCF9A63 7.19.3 硬件设计 CRC 计算单元是 STM32 处理器内部硬件组件,这部分不需要硬件电路,这里仅将计算结果在串口 打印出来。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 453 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.19.4 软件设计 本实验循环重复计算一段已知数据的 CRC 校验结果并打印,这段已知数据如下: 关于串口打印相关知识请查看“串口 1 的 Printf 输出实验”章节。 本实验比较简单,下面我们之间看 main 主函数,main 主函数开始首先是初始化串口 1,如下: 接着是打印一些提示信息,如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 454 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 最后是 while 循环,循环体内首先使能 CRC 时钟(当然这一步可以放在循环体之外),然后是给 CRC 寄存器置初值,CRC_ResetDR 置初值很关键,否则循环打印出的 CRC 结果一次和一次不同,最 后是计算已知数据的 CRC 校验结果并打印,如下: 7.19.5 下载与验证 如果使用JLINK下载固件,请按错误!未找到引用源。错误!未找到引用源。下载固件到神舟王 407开发板小节进行操作。 如果使用USB下载固件,请按错误!未找到引用源。错误!未找到引用源。小节进行操作。 如果使用串口下载固件,请按错误!未找到引用源。错误!未找到引用源。小节进行操作。 如果在IAR开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误!未 找到引用源。小节进行操作。 7.19.6 实验现象 将固件下载在神舟王407开发板后,用随板配置的串口线连接神舟王407串口1与电脑的串口,打 开超级终端,并按如下参数配置串口。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 455 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 图表 25 超级终端串口参数配置 以下是下载固件后上电运行神舟王 407 时串口的打印信息,每次校验得到相同结果: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 456 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.20 PVD电源电压监测实验 7.20.1 意义与作用 相信大家都有这样的经历,使用 PC 电脑做文档编辑时突然停电而没有保存文档,重新开机后可 能刚才的辛苦付之东流。工业控制领域的主控系统突然断电可能会造成无法挽回的经济损失甚至造成 严重的安全事故,这样的意外时一个可靠的工控系统无法容忍的。如果在主控掉电的瞬间能及时执行 一些操作,比如及时存盘或者及时关闭正在高速运转的机械设备等,神舟系列 STM32 开发板的处理 器内部集成了 PVD,可以帮您实现这个应用。 PVD 是 Power supply supervisor 的缩写,意思是可编程电压监测器。 用户可以利用 PVD 对 VDD 电压与电源控制寄存器(PWR_CR)中的 PLS[2:0]位进行比较来监控电 源,这几位选择监控电压的阀值。 通过设置 PVDE 位来使能 PVD。 电源控制/状态寄存器(PWR_CSR) 中的 PVDO 标志用来表明 VDD 是高于还是低于 PVD 的电压阀值。该事件在内部连接到外部中断的第 16 线,如果该中断在外部中断寄存器中是使能的,该事件就会产生中断。当 VDD 下降到 PVD 阀值 以下和(或)当 VDD 上升到 PVD 阀值之上时,根据外部中断第 16 线的上升/下降边沿触发设置,就会 产生 PVD 中断。例如,这一特性可用于用于执行紧急关闭任务。 7.20.2 实验原理 本实验演示神舟系列 STM32 开发板处理器内部的 PVD 电压监控功能,当检测到电压低于 2.9V (可以灵活设置这个阈值)时,将产生 PVD 中断,我们在中断中以串口打印“Bye!”来演示“执行 紧急处理任务”。 电源管理器(PVD) 图表 26 STM32 的 PVD 的门限示意图 1)PVD = Programmable Votage Detector 可编程电压监测器 它的作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧 急处理。在给出表格的上半部分就是可编程的监视阀值数据。当供电电压又恢复到给定的阀值以上时, 也会产生一个中断,通知软件供电恢复。供电下降的阀值与供电上升的PVD阀值有一个固定的差值, 这就是表中的VPVDhyst(PVD迟滞)这个参数,通过列出的PVD阀值数据可以看到这个差别。引入这个 差值的目的是为了防止电压在阀值上下小幅抖动,而频繁地产生中断。 电源管理器(PVD)寄存器的值与电压阈值之间的关系: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 457 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 用户可以利用PVD对VDD电压与电源控制寄存器中的PLS[2:0]位进行比较来监控电源,这几位选 择监控电压的阀值。通过设置PVDE位来使能PVD。 电源控制/状态寄存器中的PVDO标志用来表明VDD是高于还是低于PVD的电压阀值。该事件在内 部连接到外部中断的第16线。当VDD下降到PVD阀值以下和(或)当VDD上升到PVD阀值之上时,根 据外部中断第16线的上升/下降边沿触发设置,就会产生PVD中断。这一特性可用于用于执行紧急关闭 任务。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 458 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.20.3 硬件设计 PVD 可编程电压监测器单元是 STM32 处理器内部硬件组件,这部分不需要硬件电路,这里仅将计 算结果在串口打印出来。 7.20.4 软件设计 我们先从 MAIN 函数看起,如下所示,第一部分是初始化串口、LED 指示灯等等,这部分知识在 前面章节已经讲解过,请回顾相关章节的知识。 首先初始化可编程电压监测器。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 459 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 接下来是使能 PVD 相关的寄存器和相关参数,其中监控电压的阈值就是下面这个函数决定的 “PWR_PVDLevelConfig(PWR_PVDLevel_7)”。 你可以根据你的实际需要更改参数来设置不同的监控电压的阈值,可选的参数有: 最后是循环打印提示信息等待 PVD 中断,用户可以使用关闭神舟开发板电源的方式来产生 PVD 中断: MAIN 中的 SZ_STM32_PVDConfiguration(void)函数配置使能外部中断第 16 线的上升/下降边沿触发: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 460 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 配置嵌套中断向量表,使能并设置外部中断第 16 线的中断优先级: 中断处理函数如下: 其中关闭指示灯来节约电能以便有足够的时间来执行紧急任务,这点很重要,因为此时的都能主 要来自存储在电容器里的能量,关闭主控板上其它可能消耗都能得设备,可以延长电容器的放电时间。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 461 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.20.5 下载与验证 如果使用JLINK下载固件,请按错误!未找到引用源。错误!未找到引用源。下载固件到神舟王 407开发板小节进行操作。 如果使用USB下载固件,请按错误!未找到引用源。错误!未找到引用源。小节进行操作。 如果使用串口下载固件,请按错误!未找到引用源。错误!未找到引用源。小节进行操作。 如果在IAR开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误!未 找到引用源。小节进行操作。 7.20.6 实验现象 本实验演示神舟系列 STM32 开发板处理器内部的 PVD 电压监控功能,当检测到电压低于 2.9V (可以灵活设置这个阈值)时,将产生 PVD 中断,我们在中断中以串口打印“PVD 2.9V ”来演示“执 行紧急处理任务”。 将固件下载在神舟王 407 开发板后,用随板配置的串口线连接神舟王 407 串口 1 与电脑的串口, 打开超级终端,串口参数配置为 。 用户可以使用关闭神舟开发板电源的方式来产生 PVD 中断: 7.21 STM32低功耗之- STANDBY待机模式实验 7.21.1 意义与作用 在系统或电源复位以后,微控制器处于运行状态。当 CPU 不需继续运行时,可以利用多种低功 耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用 的唤醒源等条件,选定一个最佳的低功耗模式。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 462 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.21.2 STM32低功耗模式介绍 STM32 有一个低功耗模式,在系统或电源复位以后,微控制器处于运行状态。运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省 功耗,例如等待某个外部事件时。用户需要根据最低电源消耗,最快速启动时间和可用的唤醒源等条 件,选定一个最佳的低功耗模式。STM32 的 3 种低功耗模式;STM32 的低功耗模式有 3 种: 1)睡眠模式(CM3 内核停止,外设仍然运行) 2)停止模式(所有时钟都停止) 3)待机模式(1.2V 内核电源关闭) 7.21.3 待机模式 待机模式可实现系统的最低功耗。该模式是在 Cortex-M4 深睡眠模式时关闭电压调节器。整个 1.2V 供电区域被断电。PLL、HSI 和 HSE 振荡器也被断电。SRAM 和寄存器内容丢失,只有备份的寄存器 和待机电路维持供电。 在这三种低功耗模式中,最低功耗的是待机模式,在此模式下,最低只需要 2uA 左右的电流。 停机模式是次低功耗的,其典型的电流消耗在 20uA 左右。最后就是睡眠模式了。用户可以根据自己 的需求来决定使用哪种低功耗模式。 我们仅对 STM32 的最低功耗模式-待机模式,来做介绍。待机模式可实现 STM32 的最低功耗。 该模式是在 CM4 深睡眠模式时关闭电压调节器。整个 1.2V 供电区域被断电。PLL、HSI 和 HSE 振 荡器也被断电。SRAM 和寄存器内容丢失。仅备份的寄存器和待机电路维持供电。 待机模式下的输入/输出端口状态在待机模式下,所有的 I/O 引脚处于高阻态,除了以下的引 脚: ● 复位引脚(始终有效) ● 当被设置为防侵入或校准输出时的 TAMPER 引脚 ● 被使能的唤醒引脚 7.21.4 进入待机模式 关于如何进入待机模式,详见表 12。 可以通过设置独立的控制位,选择以下待机模式的功能: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 463 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 ● 独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动 IWDG。一旦启动了独立看 门狗,除了系统复位,它不能再被停止。 ● 实时时钟(RTC):通过备用区域控制寄存器(RCC_BDCR)的 RTCEN 位来设置。 ● 内部 RC 振荡器(LSI RC):通过控制/状态寄存器(RCC_CSR)的 LSION 位来设置。 ● 外部 32.768kHz 振荡器(LSE):通过备用区域控制寄存器(RCC_BDCR)的 LSEON 位设置。 WFI = wait for interrupt 等待中断,即下一次中断发生前都在此 hold 住不干活 WFE = wait for event 等待事件,即下一次事件发生前都在此 hold 住不干活 上表还列出了退出待机模式的操作,从上表可知,我们有 4 种方式可以退出待机模式,即当一个 外部复位(NRST 引脚)、IWDG 复位、WKUP 引脚上的上升沿或 RTC 闹钟事件发生时,微控制器从待 机模式退出。从待机唤醒后,除了电源控制/状态寄存器(PWR_CSR),所有寄存器被复位。从待机模 式唤醒后的代码执行等同于复位后的执行(采样启动模式引脚,读取复位向量等)。电源控制/状态寄存 器(PWR_CSR)将会指示内核由待机状态退出。 说明:进入待机模式,JTAG 是无法仿真和下载程序的,如果你写这个程序的时候不小心使系统一直 进待机模式,也不要怕。可以通过切换 BOOT 引脚,使用串口 ISP 下载程序,清除 FLASH 就可以啦。 7.21.5 待机模式寄存器介绍 上面我们已经说明了进入待机模式的通用步骤,其中涉及到 2 个寄存器,电源控制寄存器 (PWR_CR)和电源控制/状态寄存器(PWR_CSR)。下面我们介绍一下这两个寄存器: 电源控制寄存器(PWR_CR),该寄存器的各位描述如下 嵌入式专业技术论坛 (www.armjishu.com)出品 第 464 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 这里我们通过设置 PWR_CR 的 PDDS 位,使 CPU 进入深度睡眠时进入待机模式,同时我们通过 CWUF 位,清除之前的唤醒位。 电源控制/状态寄存器(PWR_CSR)的各位描述如下 这里,我们通过设置 PWR_CSR 的 EWUP 位,来使能 WKUP 引脚用于待机模式唤醒。WUF 位也 可以用来检查是否发生了唤醒事件。 7.21.6 待机唤醒步骤 1)使能电源时钟。 因为要配置电源控制寄存器,所以必须先使能电源时钟。 2)设置 WK_UP 引脚作为唤醒源。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 465 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 因为要配置电源控制寄存器,所以必须先使能电源时钟。然后再设置 PWR_CSR 的 EWUP 位,使能 WK_UP 用于将 CPU 从待机模式唤醒。 3)设置 PDDS 位,执行 WFI 指令,进入待机模式。 接着我们通过 PWR_CR 设置 PDDS 位,使得 CPU 进入深度睡眠时进入待机模式,最后执行 WFI 指令 开始进入待机模式,并等待 WK_UP 中断的到来。 4)最后编写 WK_UP 中断函数。 因为我们通过 WK_UP 中断来唤醒 CPU,所以我们有必要设置一下该中断函数,同时我们也通过该函 数里面进入待机模式。 通过以上几个步骤的设置,我们就可以使用 STM32 的待机模式了,并且可以通过 WK_UP 来唤醒 CPU, 我们最终要实现这样一个功能:通过按复位按键开机,并且通过 DS1 的闪烁指示程序已经开始运行。 按下 KEY2 按键,则进入待机模式,DS1 关闭,程序停止运行。按下 WAKEUP 键(KEY4),退出待 机模式,DS1 恢复闪烁。类似于手机的开关机。 7.21.7 硬件设计 本实验中,我们使用了 LED 指示灯与两个按键完成本次的实验,配置 KEY2 作为进入待机模式 按键,KEY4 作为唤醒按键即可,程序实现的功能是:按下 KEY2 进入待机模式,LED 都灭了。再按 下 KEY4 唤醒进入工作模式,DS1 闪烁,DS2 常亮。使用的按键、指示灯和串口电路请参考前面的相 关章节。 7.21.8 软件设计 我们先从 MAIN 函数看起,如下所示,第一部分是初始化按键、LED 指示灯等等,这部分知识在 前面章节已经讲解过,请回顾相关章节的知识 接下来是对 WakeUp 管脚(KEY4)唤醒处理器函数,串口、系统定时器与 RTC 时钟的初始化,相 关函数在后面讲解 嵌入式专业技术论坛 (www.armjishu.com)出品 第 466 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 最后是循环工作等待按键中断进入待机模式或者重新运行程序。 我们配置了 Systick,在中断复位函数中该函数使得 LED1,DS1 的状态反转。 深入分析程序代码 RTC 待机模式初始化函数,该函数是对一些时钟使能与寄存器配置的函数,通过函数 “PWR_GetFlagStatus”的返回值判断是否是等于“RESET”,如果不等于的话,从 STANDBY 待机模 式退出,否则从运行模式复位。而 2 种情况都各种进行了一个对 RTC 配置操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 467 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 当函数“PWR_GetFlagStatus”的返回值不等于“RESET”的话,进行一个 PWR_ClearFlag(PWR_FLAG_SB);的操作,这个函数的目的是使电源控制寄存器(PWR_CR)的第四位置 1,清除待机位,从而退出待机模式。而 PWR_FLAG 是等于 0x00000002 的; 当函数“PWR_GetFlagStatus”的返回值等于“RESET”的话则是对我们的 RTC 进行配置操作了, 从运行模式复位。 根据实验现象得到,我们按下 KEY2 的时候,STM32 进入待机模式,那么我们看下它是如何实现 的,首先我们看下对 KEY 进行初始化的函数 嵌入式专业技术论坛 (www.armjishu.com)出品 第 468 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 根据原理图可得到我们的 KEY 为上拉输入的一个按键,我们对这个按键进行了一个中断的配置,按 键按下的时候产生中断信号,而由于它是上拉输入的,按键按下的时候,由高电平变为低电平,所以 我们要把它配置为下降沿触发中断。 KEY2 使用的管脚是 PF11,中断服务函数为 “EXTI15_10_IRQHandler()”。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 469 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 通过判断按键产生的中断信号,使得 EXTI_Line11 中断线产生触发请求,当按键 KEY2 按下去的时候, 进入中断服务函数,执行“PWR_EnterSTANDBYMode()”函数。 “PWR_EnterSTANDBYMode()”函数的目的是配置我们的 STM32 进入我们的待机模式 先是对我们的 STM32 进行一个清除唤醒位的操作 嵌入式专业技术论坛 (www.armjishu.com)出品 第 470 页,共 771 页 然后是进入待机模式 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 这样,我们的 STM32 即可进入了我们的待机模式 那么 STM32 是如何退出待机模式的呢? 我们通过前面的描述中可知,退出待机模式的方法有四 种,分别是: 我们这里用到的是 WKUP 引脚控制,通过这个引脚的地址,使得按键按下去的时候,产生一个上升 沿唤醒我们的 STM32,在这里我们使用的是 PWR_WakeUpPinCmd(FunctionalState NewState);函数实 现。 到这里,我们已经能实现通过按键使得 STM32 进入待机模式与退出待机模式的实验。 7.21.9 下载与验证 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 471 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.21.10 实验现象 将固件程序下载到神舟王 407 开发板后,按下复位键,DS0 闪烁,DS1 常亮。按下神舟王 407 开 发板按键 KEY2,进入待机模式,开发板上的 LED 灯都不亮,再按下神舟王 407 开发板按键 KEY4, 退出待机模式;DS0 恢复闪烁状态,DS1 变回常亮状态。 7.22 STM32低功耗之--STOP停止模式实验 7.22.1 意义与作用 在系统或电源复位以后,微控制器处于运行状态。当 CPU 不需继续运行时,可以利用多种低功 耗模式来节省功耗,例如等待某个外部事件时。用户需要根据最低电源消耗、最快速启动时间和可用 的唤醒源等条件,选定一个最佳的低功耗模式。 本实现通过神舟王407开发板学习STM32的低功耗模式中的STOP停止模式。 7.22.2 实验原理 停止模式是在Cortex™-M4的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压 调节器可运行在正常或低功耗模式。此时在1.2V供电区域的的所有时钟都被停止,PLL、HSI和HSE RC 振荡器的功能被禁止,SRAM和寄存器内容被保留下来。 在停止模式下,所有的I/O引脚都保持它们 在运行模式时的状态。 进入停止模式: 关于如何进入停止模式,详见表10。 在停止模式下,通过设置电源控制寄存器(PWR_CR)的LPDS 位使内部调节器进入低功耗模式,能够降低更多的功耗。 如果正在进行闪存编程,直到对内存访问 完成,系统才进入停止模式。 如果正在进行对APB的访问,直到对APB访问完成,系统才进入停止 模式。 可以通过对独立的控制位进行编程,可选择以下功能: ● 独立看门狗(IWDG):可通过写入看门狗的键寄存器或硬件选择来启动IWDG。一旦启动了独立看 门狗,除了系统复位,它不能再被停止。 ● 实时时钟(RTC):通过备份域控制寄存器 (RCC_BDCR)的RTCEN位来设置。 ● 内部RC振荡器(LSI RC):通过控制/状态寄存器 (RCC_CSR)的LSION位来设置。 ● 外部32.768kHz振荡器(LSE):通过备份域控制寄存器((RCC_BDCR)的LSEON位设置。 在停止模式下,如果在进入该模式前ADC和DAC没有被关闭,那么这些外设仍然消耗电流。通过 设置寄存器ADC_CR2的ADON位和寄存器DAC_CR的ENx位为0可关闭这2个外设。 退出停止模式 关于如何退出停止模式,详见下表10。 当一个中断或唤醒事件导致退出停止模式时,HSI RC振 荡器被选为系统时钟。 当电压调节器处于低功耗模式下,当系统从停止模式退出时,将会有一段额 外的启动延时。如果在停止模式期间保持内部调节器开启,则退出启动时间会缩短,但相应的功耗会 增加。 下面的表格说明如何进入和退出停止模式: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 472 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.22.3 硬件设计 STOP 停止模式是 STM32 处理器的一种低功耗模式,这部分不需要特殊硬件电路,只要最小系统 运行正常即可,本实验使用的按键、指示灯电路请参考前面的相关章节。 7.22.4 软件设计 我们先从 MAIN 函数看起,如下所示,第一部分是初始化按键与 LED 指示灯等等,这部分知识 在前面章节已经讲解过,请回顾相关章节的知识。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 473 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 接下来是循环延时一段时间。 这里 TimingDelay 的变化是在 SysTick 的中断服务函数中的。 循环延迟工作一段时间后进入 STOP 停止模式(PWR_EnterSTOPMode)等待按键中断唤醒处理 嵌入式专业技术论坛 (www.armjishu.com)出品 第 474 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 器回到正常的工作模式: 深入分析实验代码 MAIN 函数中的 SysTick_Configuration()函数是系统滴答中断及其中断优先级。系统滴答中断这样 在运行模式时使 LED 灯 DS1 和 DS2 闪烁 根据 KEY2 初始化后的按键中断函数,中断唤醒处理器后对 LED 灯 DS4 进行一个取反,我们看下对 KEY 进行初始化的函数 嵌入式专业技术论坛 (www.armjishu.com)出品 第 475 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 根据原理图可得到我们的 KEY 为上拉输入的一个按键,我们对这个按键进行了一个中断的配置, 按键按下的时候产生中断信号,而由于它是上拉输入的,按键按下的时候,由高电平变为低电平,所 以我们要把它配置为下降沿触发中断。 KEY2 的中断线为:EXTI_Line11,中断服务函数:EXTI15_10_IRQHandler( )。判断 “EXTI_GetITStatus()”函数返回值是否是等于“RESET”,如果等于的话,执行该中断服务函数中 的内容,否则退出。 通过判断按键产生的中断信号,使得 EXTI_Line11 中断线产生触发请求,当按键 KEY2 按下去的 时候,LED4 状态被改变,并执行“EXTI_ClearITPendingBit()”函数。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 476 页,共 771 页 寄存器 EXTI_PR 如下: ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 根据寄存器 EXTI_PR 寄存器的定义,为该中断信号产生触发请求 7.22.5 下载与验证 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用源。错误! 未找到引用源。小节进行操作。 7.22.6 实验现象 本实验使 STM32 进入停止模式,并利用 KEY2 按键产生的外部中断线唤醒 STM32。通过指示灯 指示处理器的当前模式。 将固件下载到神舟王 407 开发板后,按下复位键。DS1 和 DS2 闪烁,DS4 点亮。一段时间后自动 进入 STOP 模式。DS1 和 DS2 停止闪烁。用户按下 KEY2 按键产生的外部中断唤醒 STM32,使 DS1 和 DS2 恢复闪烁状态。 7.23 TFT彩色液晶屏只显示红色 本实验向大家介绍如何使用 STM32 的 FSMC 接口驱动 LCD 屏,及使用触摸屏控制器检 测触点坐标 嵌入式专业技术论坛 (www.armjishu.com)出品 第 477 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 7.23.1 术语解释 1) 引言 将普通图像的信息数字化后,即得到数字图像,最后转换为合适计算机处理的数字。LCD 控制器 则被用于将数字图象传输到 LCD 显示屏进行显示。所以,如果需要理解 LCD 控制器的工作原理,有 必要了解一些图象基础知识 2) 帧 显示屏所显示的一幅完整画面就是一个帧。 3) 象素 “象素”是由图像和元素这两个单词的字母所组成的,是构成数字图象的最小单位。我们若把数 字图象放大数倍,就会发现数字图象其实是由许多色彩相近的小方点所组成,这些小方点就是“象素”。 4) 分辨率 分辨率有很多种,例如打印分辨率、影像分辨率等。此处仅仅就 LCD 显示器的分辨率进行阐释。 分辨率是指显示器所能显示点数的多少,可以把整个显示器想象成是一个棋盘,而分辨率就是棋盘经 线和纬线交叉点的数目。由于屏幕上的点、线和面都是由点组成的,所以显示器可以显示的点数越多, 显示画面就越精细。 对于 LCD 显示器来说,象素的数目和分辨率在数值上相等,都等于屏幕上横向点个数和纵向点个 数的乘积。 比如 STM32 神舟系列开发板所配的 2.8 寸或者 3.2 寸液晶屏的分辨率是 240*320 的,有这么多个 点。 7.23.2 液晶彩屏原理简介 LCD,即液晶显示器,因为其功耗低、体积小,承载的信息量大,因而被广泛用于信息输出、与 用户进行交互,目前仍是各种电子显示设备的主流。 因为STM32内部没有集成专用的液晶屏和触摸屏的控制接口,所以在显示面板中应自带含有这些 驱动芯片的驱动电路(液晶屏和触摸屏的驱动电路是独立的),STM32芯片通过驱动芯片来控制液晶屏 和触摸屏。以STM32神舟王407开发板3.2寸液晶屏(240*320)为例,它使用ILI9320或者SSD1289芯片控 制液晶屏,通过XPT2046芯片控制触摸屏。 液晶屏的控制芯片内部结构相对比较复杂,液晶屏的彩屏驱动电路最主要的是位于中间 GRAM(Graphics RAM),可以理解为显存。GRAM就好比是一个彩屏数据缓冲buffer,我们可以把大批的 显示内容以显示矩阵的形式写到buffer里,让彩屏LCD来读取buffer里的数据再由彩屏驱动芯片显示 到显示屏上,随着GRAM逐渐丰富和完善,除了显示矩阵以外还放很多的命令,GRAM中每个存储单元都 对应着液晶面板的一个像素点。它右侧的各种模块共同作用把GRAM存储单元的数据转化成液晶面板的 控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。到现在,这些驱动 /控制电路以及buffer都合起来放在一片芯片中,统一被称为driver IC,这个driver IC就是上一段 我们所说的ILI9320或者SSD1289的driver IC芯片。 7.23.3 液晶彩屏图像像素分析 TFT就是“Thin Film Transistor”的简称,一般代指薄膜液晶显示器,而实际上指的是薄膜晶体管 (矩阵)——可以“主动的”对屏幕上的各个独立的像素进行控制。对于图象产生的基本原理为:显 示屏由许多可以发出任意颜色的光线的像素组成,主要控制各个像素显示相应的颜色就可以达到目 的。在TFT LCD中一般会采用背光技术,为了能精确的控制每一个像素的颜色和亮度就需要在每一个 想色之后安装一个类似百叶窗的开关,当“百叶窗”打开时光线就可以透射过来,而“百叶窗”关上 之后,光线就无法透射。 图像数据的像素点由红(R)、绿(G)、蓝(B)三原色组成,三原色根据其深浅程度被分为0~255 个级别,它们按不同比例的混合可以得出各种色彩。如R:255,G255,B255混合后为白色。 根据描述像素点数据的长度,主要分为8、16、24及32位。如以8位来描述的像素点可表示28=256 嵌入式专业技术论坛 (www.armjishu.com)出品 第 478 页,共 771 页 ARM 技术论坛 www.armjishu.com 神舟王 407 用户手册 V2.0 色,16位描述的为216=65536色,称为真彩色,也称为64K色。实际上受人眼对颜色的识别能 力的限制, 16位色与12位色已经难以分辨了。 神舟王407号开发板上配带的TFT LCD屏,LCD屏为320x240分辨率,ILI9320液晶控制器液晶控制 器自带显存,其总大小为自带显存,其总大小为172800(240*320*18/8)字节。 STM32神舟王407号开发板支持2.8/3.2寸的ILI9320或SSD1289的TFT LCD,在本例程中,我们以 ILI9320控制器进行简单的介绍。 ILI9320采用的是16位控制模式,以16位描述的像素点。按照标准格式,16位的像素点的 三原色描述的位数为R:G:B =5:6:5,描述绿色的位数较多是因为人眼对绿色更为敏感 ILI9320最高能够控制18位的LCD,但为了数据传输简便,我们采用它的16位控制模式, 以16位描述的像素点。按照标准格式,16位的像素点的三原色描述的位数为R:G:B =5:6: 5,描述绿色的位数较多是因为人眼对绿色更为敏感。ILI9320控制模块的16位数据与显存间的对 应关系如下所示: 我们且看第一种配置TRI为0,DFM任意时的图形,低5位为蓝色B,中间6位为绿色G,最高5位为 红色R;图中的是默认16条数据线时,像素点三原色的分配状况,DB1~DB5为5根线为蓝色,DB6~DB8 以及DB10~DB12六根线为绿色,DB13~DB17这五根线为红色。这样分配有D0和D9位是无效的,使得 刚好使用完整的16位。 RGB比例为5:6:5是一个十分通用的颜色标准,5+6+5=16位,表示5根线表示红色,6根线表示 蓝色,5根线表示蓝色;如黑色的编码为0x0000,白色的编码为0xffff,红色为0xf800。比如红色0xf800, 化成RGB5:6:5的二进制就是11111 000000 00000,刚好可以看到R是红色的5位数据值是11111,G 是绿色的值是000000,B是蓝色00000,因为红色寄存器内容都是1,而其他两种颜色都为0,所以最终 会显示出红色。 7.23.4 控制器命令分析 嵌入式专业技术论坛 (www.armjishu.com)出品 第 479 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 我们这里用IL9320的命令做分析,其他像SSD1289,IL9341,IL9325等都是同样的道理;下面我 们了解几个重要的指令描述,如下图红框中内容。 1)00h指令,当为读操作时,读取控制器的型号;当为写操作时,打开/关闭OSC振荡器,当写 操作设置OSC比特位为1时,开启内部振荡器;为0时,停止振荡器。然后至少等待10ms时钟稳定后, 再继续其它功能的设置。我们在代码设计中就是通过指令00h读取LCD控制器的型号,从而针对具 体型号的控制器进行初始化操作,以便于兼容各种不同系列的LCD控制器。 2)03h指令,入口模式命令。 我们重点关注的是I/D0、I/D1、AM这3个位,因为这3个位控制了屏幕的显示方向。AM控制GRAM 的更新方向:当AM=“0”,表示地址更新方向为垂直方向;当AM=“1”,表示地址更新方向为 水平方向;I/D[1:0]:当更新一个显示数据时,控制地址计数器自动增1和减1。详细内容如下所示: 图:GRAM显示方向设置图 通过这几个位的设置,我们就可以控制屏幕的显示方向了,这种方法虽然简单,但是不是很通 用,比如不同的液晶,可能这里差别就比较大,不能完全通用,比如9341和9320就完全不通用,具 嵌入式专业技术论坛 (www.armjishu.com)出品 第 480 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 体要参考液晶屏手册。 3)07h,显示控制命令。该命令CL位用来控制是8位彩色,还是26万色。为0时26万色,为1时八 位色。D1、D0、BASEE这三个位用来控制显示开关与否的。当全部设置为1的时候开启显示,全0是 关闭。我们一般通过该命令的设置来开启或关闭显示器,以降低功耗。 D[1:0]:设置为“11”时,打开显示;设置为“00”时,关闭显示;而配合BASEE比特位,可以 用来设置开启或是关闭显示器时,系统是挂起还是运行状态,以此设置在挂起状态,达到降低功耗 的目的。 而CL比特位,当CL为1时,选择8位彩色;当CL为“0”时,选择为262144彩色: 4)20h和21h指令 分别为设置GRAM的行地址(X坐标)和列地址(Y坐标)。我们通过此两个指令的设置,指定 需要写入的点,然后再设置颜色,便实现在指定点写入一个颜色的;20h用于设置行地址(X坐标, 0~239),21h用于设置列地址(Y坐标,0~319)。当我们要在某个指定点写入一个颜色的时候,先 通过这两个命令设置到改点,然后写入颜色值就可以了。 5)22h指令 写数据到GRAM命令,当写入了这个命令之后,地址计数器才会自动的增加和减少。该命令是 我们要介绍的这一组命令里面唯一的单个操作的命令,只需要写入该值就可以了,其他的都是要先 写入命令编号,然后写入操作数。 6)R50~R53,行列GRAM地址位置设置。这几个命令用于设定你显示区域的大小,我们整个屏 的大小为240*320,但是有时候我们只需要在其中的一部分区域写入数据,如果用先写坐标,后写数 据这样的方式来实现,则速度大打折扣。此时我们就可以通过这几个命令,在其中开辟一个区域, 然后不停的丢数据,这样就不需要频繁的写地址了,大大提高了刷新的速度。 HSA[7:0]/HEA[7:0]:指定区域的垂直方向上的起点和终点。通过设置HSA和HEA比特,以限制 GRAM区域的垂直方向上的大小。 VSA[8:0]/VEA[8:0]:指定区域的水平方向上的起点和终点。通过设置VSA和VEA比特,以显示 GRAM区域的水平方向上的大小。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 481 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 其中: 可以看到 IL9320 中设置这个显示区域的代码如下,这里是设置 240-*320 大小: 命令部分到此,我们先简单了解到这里。有兴趣的朋友可以参阅《ILI9320控制器资料》一文, 我们接下来看看要如何才能驱动STM32神舟系列的TFTLCD模块, TFTLCD显示需要的相关设置步骤如 下: 1)初始化设置STM32与彩屏模块相连接的IO管脚 这一步,先将我们与TFTLCD模块相连的IO口进行初始化,以便驱动LCD。这里我们用到的是FSMC 接口模式,FSMC接口我们将在下面详细介绍。 2)初始化彩屏模块。 通过向彩屏模块写入一系列的设置,来启动TFTLCD的显示。为后续显示字符和数字做准备。比 如: 【复位TFT】Æ 【驱动IC初始化代码】Æ【复位所有的寄存器】Æ【开启显示】Æ【显存清0】Æ【开 始显示】Æ【显示各种图画】 3)开始使用彩屏,通过彩屏模块的一些控制信号线来控制彩屏。 这里就是通过我们设计的程序,将要显示的字符送到彩屏模块就可以了,这些函数将在软件设 计的时候介绍。通过以上三步,我们就可以使用STM32神舟系列彩屏模块来显示字符和数字了, 并 且可以显示各种颜色的背景。 7.23.5 FSMC介绍 STM32系列中内部集成256 KB以上FlaSh,后缀为xC、xD和xE的高存储密度微控制器特有的存储 控制机制,一般芯片引脚数在100脚以上的STM32F407芯片都带有FSMC接口,FSMC能够根据不同的外部 存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得STM32系列微控制器 不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同 时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及成本的综合要求。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 482 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 图:FSMC框图 从上图我们可以看出,STM32的FSMC将外部设备分为3类:NOR/PSRAM设备、NAND设备、 PC卡设备。他们共用地址数据总线等信号,他们具有不同的CS以区分不同的设备。 FSMC主要的优势有以下几点: 1)支持多种静态存储器类型。STM32通过FSMC可以与SRAM、ROM、PSRAM、NOR Flash和NANDFlash 存储器的引脚直接相连。 2)支持丰富的存储操作方法。FSMC不仅支持多种数据宽度的异步读/写操作,而且支持对 NOR/PSRAM/NAND存储器的同步突发访问方式。 3)支持同时扩展多种存储器。FSMC的映射地址空间中,不同的BANK是独立的,可用于扩展不同 类型的存储器。当系统中扩展和使用多个外部存储器时,FSMC会通过总线悬空延迟时间参数的设置, 防止各存储器对总线的访问冲突。 4)支持更为广泛的存储器型号。通过对FSMC的时间参数设置,扩大了系统中可用存储器的速度 范围,为用户提供了灵活的存储芯片选择空间。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 483 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 5)支持代码从FSMC扩展的外部存储器中直接运行,而不需要首先调入内部SRAM。 这里我们介绍下为什么可以把TFTLCD当成SRAM设备用:首先我们了解下外部SRAM的连接,外部 SRAM的控制一般有:地址线(如A0~A18)、数据线(如D0~D15)、写信号(WR)、读信号(OE)、 片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。而TFTLCD的信号包括:RS、D0~D15、 WR、RD、CS、RST和BL等,其中真正在操作LCD的时候需要用到的就只有:RS、D0~D15、WR、RD和CS; 这里比较关键点就是TFT LCD并不需要用到FSMC的地址线(如A0~A18),它只需要用到16根数据线以 及一些其他的控制信号线就可以了,并且操作时序和SRAM的控制完全类似,下面是对比表: 资源 SRAM 神舟TFT LCD 写信号(WE) 有 有 读信号(OE) 有 有 片选信号(CS) 有 有 数据线(D0~D15) 有 有 地址线(如A0~A18) 有 无 RS(TFT中决定是数据还是命令) 无 有 RST 无 有 BL 无 有 TFT LCD通过RS信号来决定传送的数据是数据还是命令,本质上可以理解为一个地址信号,比如 我们把RS接在A0上面,那么当FSMC控制器写的地址刚好让A0这根信号线为0(A1~A18因为并没有连接 到TFT上,所以可以忽略不计)的时候,会使得连在A0上的TFT信号RS也为0,对TFT LCD来说,就是 写命令;同样,当FSMC写地址的地址让A0这个地址变成1的时候,A0上的TFT信号RS也会变成1,对 TFTLCD来说,就是写数据了。这样,就把数据和命令区分开了,当然RS也可以接在其他地址线上, STM32神舟开发板是把RS连接在FSMC_A0上面的。 STM32的FSMC支持8/16/32位数据宽度,我们这里用到的LCD是16位宽度的,所以在配置FMSC控制 器属性的时候,选择16位宽就OK了。我们再来看看FSMC的外部设备地址映像,STM32的FSMC将外部存 储器划分为固定大小为256M字节的四个存储块,如下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 484 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 图:FSMC存储块地址映像 从上图可以看出,FSMC总共管理1GB空间,拥有4个存储块(Bank),本章,我们用到的是块1, 所以在本章我们仅讨论块1的相关配置,其他块的配置,请参考《STM32参考手册》第19章(324页) 的相关介绍。 STM32的FSMC存储块1(Bank1)被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存 器对所连接的存储器进行配置。Bank1的256M字节空间由28根地址线(2的28次方是256M,其中26根 地址线来自外部存储器地址FSMC_A[25:0]),另外2根地址线对4个区进行寻址(AHB总线是26和27): Bank1所选区 片选信号 地址范围 AHB总线 [27:26] [25:0] 第1区 FSMC_NE1 0X6000,0000~0X63FF,FFFF 00 第2区 FSMC_NE2 0X6400,0000~0X67FF,FFFF 01 FSMC_A[25:0] 第3区 FSMC_NE3 0X6800,0000~0X6BFF,FFFF 10 第4区 FSMC_NE4 0X6C00,0000~0X6FFF,FFFF 11 当我们选择使用Bank1的第2个区,即使用FSMC_NE2来外接外部设备的时候,即对应了 嵌入式专业技术论坛 (www.armjishu.com)出品 第 485 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 FSMC[27:26]=01,我们要做的就是配置对应第2区的寄存器组,来适应外部设备即可;同样,如 果当我们选择使用Bank1的第4个区,即使用FSMC_NE4来外接外部设备的时候,即对应了 FSMC[27:26]=11,我们要做的就是配置对应第4区的寄存器组,STM32的FSMC总线各Bank配置 寄存器如表: 可以看到,我们需要操作的TFT彩屏与操作SRAM是相同的控制器,都是负责存储块的Bank1的 内部控制器NOR FLASH控制器,对于NOR FLASH控制器,主要是通过FSMC_BCRx(x=1、2、3、4)、 FSMC_BTRx(x=1、2、3、4)和FSMC_BWTRx(x=1、2、3、4)寄存器设置(其中x=1~4,对应Bank中 的4个区),下面介绍一下这几个配置寄存器各负责的功能: FSMC_BCRx(x=1,2,3,4):SRAM/NOR闪存片选控制寄存器(FSMC_BCR1, FSMC_BCR2, FSMC_BCR3, FSMC_BCR4)每个Bank对应1个寄存器,这个寄存器包含了每个存储器块的控制信息,可以用于SRAM、 ROM、异步或成组传输的NOR闪存存储器(TFT LCD也可以),主要包括设置数据总线宽度,比如8位、 16位;存储类型的设置,比如SRAM或者PSRAM或者NOR闪存;地址/数据是否复用;存储块使能设置。 FSMC_BTRx(x=1,2,3,4):闪存片写时序寄存器(FSMC_BTR1,FSMC_BTR2,FSMC_BTR3,FSMC_BTR4); 可以通过这个寄存器设置模式,总线恢复时间,时钟分频,数据保持时间等时序相关的设置。 FSMC_BWTRx(x=1,2,3,4):闪存写时序寄存器(FSMC_BWTR1,FSMC_BWTR2,FSMC_BWTR3,FSMC_BWTR4); 采用哪种访问模式,数据保持时间,地址保持时间,底子好建立时间(单位是HCLK时钟周期) 通过这3个寄存器,可以设置FSMC访问外部存储器的时序参数,可以使得支持更多的外部存储器, 拓宽了可选用的外部存储器的速度范围。例如:FSMC的NOR FLASH控制器支持同步和异步突发两种访 问方式。选用同步突发访问方式时,FSMC将HCLK(系统时钟)分频后,发送给外部存储器作为同步时 钟信号FSMC_CLK。此时需要的设置的时间参数有2个(这些都不用太关注,有需要时再去研究,我们 已经实现了具体的代码,可以直接从代码中去看一下如何进行设置的): 1,HCLK与FSMC_CLK的分频系数(CLKDIV),可以为2~16分频; 2,同步突发访问中获得第1个数据所需要的等待延迟(DATLAT)。 对于异步突发访问方式,FSMC主要设置3个时间参数(这些都不用太关注,有需要时再去 研究,我们已经实现了具体的代码,可以直接从代码中去看一下如何进行设置的):地 址建立时间(ADDSET)、数据建立时间(DATAST)和地址保持时间(ADDHLD)。FSMC综合了SRAM/ROM、 PSRAM和NOR Flash产品的信号特点,定义了4种不同的异步时序模型。选用不同的时序模型时,需要 设置不同的时序参数,如下表所列: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 486 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 这里只是简单的介绍一些关于FSMC的参数设置,FSMC最终被设置成能够按照FSMC所控制的 目标器件的时序,规范来与之沟通,至于详细的设置,在这个例程中不需要花费太多精力关注细节, 大体知道是这么一回事就可以了,如果有必要用到的时候,就具体去进行研究就可以了。 7.23.6 FSMC函数初始化 1.FSMC初始化函数: 根据前面的讲解,初始化FSMC主要是初始化三个寄存器FSMC_BCRx,FSMC_BTRx, FSMC_BWTRx,那么在固件库中是怎么初始化这三个参数的呢? 固件库提供了3个FSMC初始化函数分别为 FSMC_NORSRAMInit();(可以用来初始化NOR和SRAM存储器) FSMC_NANDInit(); (可以用来初始化NAND存储器) FSMC_PCCARDInit();(可以用来初始化PC CARD等存储器) 这三个函数分别用来初始化4种类型存储器。这里根据名字就很好判断对应关系,下面我们看看 函数定义: void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef * FSMC_NORSRAMInitStruct); 这个函数只有一个入口参数,也就是FSMC_NORSRAMInitTypeDef类型指针变量,这个结构体 的成员变量非常多,因为FSMC相关的配置项非常多。 typedef struct { uint32_t FSMC_Bank; uint32_t FSMC_DataAddressMux; uint32_t FSMC_MemoryType; uint32_t FSMC_MemoryDataWidth; uint32_t FSMC_BurstAccessMode; uint32_t FSMC_AsynchronousWait; uint32_t FSMC_WaitSignalPolarity; uint32_t FSMC_WrapMode; uint32_t FSMC_WaitSignalActive; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 487 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 uint32_t FSMC_WriteOperation; uint32_t FSMC_WaitSignal; uint32_t FSMC_ExtendedMode; uint32_t FSMC_WriteBurst; FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct; FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct; }FSMC_NORSRAMInitTypeDef; 从这个结构体我们可以看出,前面有13个基本类型(unit32_t)的成员变量,这13个参数是用来 配置片选控制寄存器FSMC_BCRx。最后面还有两个FSMC_NORSRAMTimingInitTypeDef指针类型的 成员变量。FSMC有读时序和写时序之分,这里就是用来设置读时序和写时序的参数了,也就是说, 这两个参数是用来配置寄存器FSMC_BTRx(闪存片读时序寄存器)和FSMC_BWTRx(闪存片写时 序寄存器),后面我们会讲解到。下面我们主要来看看模式A下的相关配置参数: 参数-存储块标号:参数FSMC_Bank用来设置使用到的存储块标号和区号,前面讲过,我们是使 用的存储块1区号4,所以选择值为FSMC_Bank1_NORSRAM4。 参数FSMC_MemoryType用来设置存储器类型,我们这里是SRAM,所以选择值为 FSMC_MemoryType_SRAM。 参数-数据位宽度:参数FSMC_MemoryDataWidth用来设置数据宽度,可选8位还是16位,这里 我们是16位数据宽度,所以选择值为FSMC_MemoryDataWidth_16b。 参数-写使能:参数FSMC_WriteOperation用来设置写使能,毫无疑问,我们前面讲解过我们要 向TFT写数据,所以要写使能,这里我们选择FSMC_WriteOperation_Enable。 参数FSMC_ExtendedMode是设置扩展模式使能位,也就是是否允许读写不同的时序,这里我们采取 的读写不同时序,所以设置值为FSMC_ExtendedMode_Enable。 下面再介绍一下其他几个相关参数的意义吧:参数FSMC_DataAddressMux用来设置地址/数据复 用使能,若设置为使能,那么地址的低16位和数据将共用数据总线,仅对NOR和PSRAM有效,所以 我们设置为默认值不复用,值FSMC_DataAddressMux_Disable。 参数FSMC_BurstAccessMode, FSMC_AsynchronousWait,FSMC_WaitSignalPolarity, FSMC_WaitSignalActive,FSMC_WrapMode,FSMC_WaitSignal FSMC_WriteBurst和FSMC_WaitSignal 这些参数在成组模式同步模式才需要设置,大家可以参考中文参考手册了解相关参数的意思。 接下来我们看看设置读写时序参数的两个变量FSMC_ReadWriteTimingStruct和 FSMC_WriteTimingStruct,他们都是FSMC_NORSRAMTimingInitTypeDef结构体指针类型,这两个参 数在初始化的时候分别用来初始化片选控制寄存器FSMC_BTRx和写操作时序控制寄存器 FSMC_BWTRx。 下面我们看看FSMC_NORSRAMTimingInitTypeDef类型的定义: typedef struct { uint32_t FSMC_AddressSetupTime; uint32_t FSMC_AddressHoldTime; uint32_t FSMC_DataSetupTime; uint32_t FSMC_BusTurnAroundDuration; uint32_t FSMC_CLKDivision; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 488 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 uint32_t FSMC_DataLatency; uint32_t FSMC_AccessMode; }FSMC_NORSRAMTimingInitTypeDef; 这个结构体有7个参数用来设置FSMC读写时序。其实这些参数的意思我们前面在讲解FSMC的 时序的时候有提到,主要是设计地址建立保持时间,数据建立时间等等配置,对于我们的实验中, 读写时序不一样,读写速度要求不一样,所以对于参数FSMC_DataSetupTime设置了不同的值,大家 可以对照理解一下。记住,这些参数的意义在前面讲解FSMC_BTRx和FSMC_BWTRx寄存器的时候 都有提到,大家可以翻过去看看。 2.FSMC使能函数 FSMC对不同的存储器类型同样提供了不同的使能函数: void FSMC_NORSRAMCmd(uint32_t FSMC_Bank, FunctionalState NewState); void FSMC_NANDCmd(uint32_t FSMC_Bank, FunctionalState NewState); void FSMC_PCCARDCmd(FunctionalState NewState); 这个就比较好理解,我们这里不讲解,我们是 SRAM,所以使用的第一个函数;这些如果有必要 再去详细了解,因为这个都是 ST 官方设计 STM32 芯片的时候就已经预先规定好的了,我们只需要 按照他们的规则和要求去设置和使用它就足够了,因为其他芯片厂商不一定会使用 FSMC 这个协议 的。 7.23.7 硬件设计 本实验的硬件设计包括两个方面: 一、TFT LCD屏的原理设计,主要体现TFT LCD屏上的信号连接情况; 二、神舟王407开发板上的TFT座的信号连接情况。 首先是TFT LCD的硬件设计,下面这些信号是真正与LCD液晶屏相连接的: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 489 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 可以看到FSMC的数据线FSMC_D0~FSMC_D15都被使用了,而FSMC的地址线只使用了FSMC_A0这根管 脚跟RS(TFT LCD选择数据线是发的是命令还是发的是数据这根关键的信号线)连接。 其次,神舟王407开发板上的TFT LCD连接座的信号连接设计: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 490 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 这里可以看到,比上面的那个LCD座多了FSMC_A1~FSMC_A7几根管脚,这些都是作为预留,这个 座子是从神舟王407核心板上,到神舟王407底板上进行连接的。提前预留这些信号管脚是为了可以 支持更多更大的其他型号的液晶屏,比如4.3寸的液晶屏。今后不需要再修改硬件电路板信号了, 因为我们在设计的时候就已经考虑到了,深谋远虑,提前预留好了这些信号管脚。 7.23.8 软件分析 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 491 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:首先调用 STM32F2xG_LCD_Init ()函数对 TFT LCD 彩色液晶屏进行初始化,然后在 while() 循环中调用 LCD_Clear (Red)函数来循环显示红色。 代码分析 2:LCD_WriteReg()这个是写 LCD 的寄存器函数,可以看到这个函数实现代码如下: 到 LCD 这个结构体的定义如下: 可以看 #define LCD_BASE ((u32)(0x60000000 | 0x0C000000)) 这里的 LCD_BASE,是根据外部电路的连接来确定的,这里使用的 Bank1 的第 4 个区,就是从 地址 0x6C00,0000 开始,看下表: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 492 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 在使用 FSMC 驱动液晶屏的时,通过前面的硬件原理图可以看到,TFT LCD 的 RS 是接在 FSMC_A0 上面,CS 接在 FSMC_NE4 上,并且是 16 位数据总线。 #define LCD ((LCD_TypeDef *) LCD_BASE)关于 LCD_TypeDef 结构体地址,被强制指定到地址 LCD_BASE(地址为:0x6C00,0000)那么可以得到 LCD->LCD_REG 的地址就是 0x6C00,0000,对 应的 FSMC_A0 的状态为 0(即 RS=0,RS 是前面提到过的 TFT 液晶屏命令和数据的控制信号线, 写 0 表示命令),那么 LCD->LCD_RAM 的地址就是 0x6C00,0001(结构体地址自增,因为都是 vu16 型号的),那么此时对应的 FSMC_A0 的状态为 1(即 RS=1,RS 是前面提到过的 TFT 液晶屏命令和 数据的控制信号线,写 1 表示数据)。 typedef struct { vu16 LCD_REG; vu16 LCD_RAM; } LCD_TypeDef; 所以,有了这个定义,LCD->LCD_REG 就是写命令,而 LCD->LCD_RAM 就是默认对某个寄存 器写数据;所以如果是写 LCD,可以先确定写哪个寄存器,然后再往这个寄存器写什么数据内容: LCD->LCD_REG = 要写的命令,写哪个寄存器 LCD->LCD_RAM = 对哪个寄存器要写什么样的数据 反过来,读 LCD 的内部的数据就是相反: LCD->LCD_REG = 要读的哪个寄存器 读出来的数据是什么 = LCD->LCD_RAM 代码分析 3:LCD_CtrlLinesConfig()和 LCD_FSMCConfig()完成 LCD 与 CPU 之间管脚的初始化,包 括初始化 FSMC 总线。 LCD_CtrlLinesConfig()配置 LCD 控制管脚 嵌入式专业技术论坛 (www.armjishu.com)出品 第 493 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 配置 LCD 控制管脚,连接 TFT 彩色液晶屏的这些管脚都要被初始化一下时钟和 GPIO 管脚功能, 具体哪些管脚可以看下 TFT 液晶屏的原理图。 1) LCD_FSMCConfig()配置 FSMC 总线接口 配置 FSMC 总线接口,以及 FSMC 总线控制器的初始化 这里设置了比如:数据/地址复用=禁用;数据宽度 = 16 位;写操作 = 使能;扩展模式 = 使 能;异步等待 = 禁用等,主要是配置了 FSMC 控制器,具体细节如果有兴趣的话可以看下 STM32 的使用手册的 FSMC 章节进行研究,这里代码中都已经设置配好了。 代码分析 4:读取液晶屏的 ID 型号,0x0000h 指令,当为读操作时,读取控制器的型号; 1) LCD->LCD_REG = 0x0000 表示这是 0x0000 指令,是读取液晶屏的 ID 型号,实际上是将 LCD 的 LCD_TypeDef 这个 STRUCT 结构体的地址设定到 0x0000 然后接下来用 LCD->LCD_RAM 来 读取数据。 2) data = LCD->LCD_RAM 是用来读取数据,这个 0x0000 指令地址的数据就是液晶屏的 ID 号,比 嵌入式专业技术论坛 (www.armjishu.com)出品 第 494 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 如 IL9320 的液晶屏读出来的 ID 号是 0x9320,比如 SSD1289 型号的液晶屏读出来的 ID 号就是 0x8989 代码分析 5:开始判断液晶屏是哪个型号,比如是 9320 还是 SSD1289 型号,判断出型号之后,就会 进入该型号具体的配置显示过程 比如设置晶振打开,液晶屏的显示大小(比如是 230*320),显示的扫描方式是从左边往右边扫 描还是从下往上扫描等参数,具体可以详细看一下液晶屏的寄存器说明表。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 495 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 代码分析 6:LCD_Clear (Red)将 TFT LCD 彩色液晶屏显示红色,将屏幕填充成指定的颜色,如清屏, 则填充 0xffff;如显示红色,则填充 0xF800。 1) LCD_SetCursor(0x00, 0x013F)先设置坐标,然后往坐标写颜色 2) LCD_WriteRAM_Prepare()准备填充 GRAM,填充 GRAM 就是写数据到液晶屏里 3) 写颜色,一个点一个点的写,这里的液晶屏是 320*240 点阵的,所以 320*240=76800 for(index=0;index<76800;index++) { LCD->LCD_RAM=Color; } 代码分析 7:LCD_SetCursor(0x00, 0x013F) 通过 LCD_SetCursor()函数可以实现光标的位置,可以看 到 SSD1289 芯片手册中,关于寄存器 4E 和 4F 寄存器分别是设置光标的 X 位置和 Y 位置: 表示刷屏就是从这个点开始刷。 代码分析 8:LCD_WriteRAM_Prepare()函数 嵌入式专业技术论坛 (www.armjishu.com)出品 第 496 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 R34,写数据到 GRAM 命令,当写入了这个命令之后,地址计数器才会自动的增加和减少。该 命令是我们要介绍的这一组命令里面唯一的单个操作的命令,只需要写入该值就可以了,其他的都 是要先写入命令编号,然后写入操作数。 代码分析 8:开始一个点一个点的写入颜色到 GRAM 里,因为之前的 R34 已经定位好了 LCD 的 STRUCT 结构体的位置,那么可以计算一下 GRAM 的大小,总共是 320*240 = 76800 个点,每个点 的颜色是 5:6:5 的模式是 16 位来表示,就是 2 个字节,所以 GRAM 的大小是 76800*2 字节 = 150KB 大小,也就是说,液晶屏的 GRAM 大小最少是这么大才能存到一屏数据。 for(index=0;index<76800;index++) { LCD->LCD_RAM=Color; } 7.23.9 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和在线调试 小 节进行操作。 7.23.10 实验现象 将固件下载到神州王后,复位,神州王正常情况下将显示红色 嵌入式专业技术论坛 (www.armjishu.com)出品 第 497 页,共 771 页 www.armjishu.com V1.1 7.24 TFT彩色液晶屏显示蓝色 ARM 技术论坛 神舟王 STM32F407 用户手册 7.24.1 硬件设计 硬件设计同上 7.24.2 软件分析 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:LCD_Clear (Blue);可以看到还有很多其他的颜色,其中 blue 是蓝色 嵌入式专业技术论坛 (www.armjishu.com)出品 第 498 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 其中#define Blue 0x001F 我们把 0x001F 化成二进制就是 0000 0000 0001 1111,对于 5:6:5 的显示 模式来说,可以看下图,DB1~DB5 这个 5 位是都是 1,它是设定蓝色颜色的;而 DB6~DB12 都是 0 表示不显示绿色;DB12~DB17 也是为 0,它是设定红色颜色,表示不显示红色,这样一来就只会显 示出蓝色的颜色。 7.24.3 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 嵌入式专业技术论坛 (www.armjishu.com)出品 第 499 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和在线调试 小 节进行操作。 7.24.4 实验现象 将固件下载到神舟王 407 后,复位,神州王正常情况下将显示蓝色 7.25 FT彩色液晶屏如何显示一个点 7.25.1 扫描的简要分析 本实验在 LCD 屏上指定的位置显示一个点。 7.25.2 硬件设计 硬件设计同上 7.25.3 软件分析 进入例程的文件夹,然后打开\Project \MDK-ARM\ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 500 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:STM32F4xG_LCD_Init (),彩屏初始化函数。前面我们已经讲了,我们就不再重复,这 里它的主要是将彩屏初始化,并将彩屏刷成绿色。 代码分析 2:LCD_SetPoint(120, 160, Black),画点函数。 画点的时候,先确定位置,然后再画点。值得注意的是,这个点有点小,仔细看才能看出来。 代码分析 3:函数 LCD_SetCursor()设置光标的位置,即指定画点的位置。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 501 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 不同的液晶控制器,设置光标位置使用的寄存器是不同的。比如说,控制器 8989 设置光标的时 候用到的是寄存器 0x004e 和 0x004f。而控制器 9320,用到的是 0x0020 和 0x0021。这个在控制器的 芯片手册中有具体的说明。 设置光标函数,有两个参数,这个两个参数是有范围限定的。比如我们这里的液晶屏是 240x320。 那么函数的第一个参数的范围是:0<=Xpos<=240。第二个参数的范围是:0<=Ypos<=320。 代码分析 4:LCD_WriteRAM_Prepare()函数,准备向 RAM 中写数据。 这里向控制器送入 LCD_REG_34 命令。而 LCD_REG_34 等于 0x22。 0x22 命令是写数据到 GRAM 命令,写入这个命令后,地址计数器才会自动的增加和减少。这里 我们我们写入这个命令,为下面填充数据做准备。 代码分析 5:调用 LCD_WriteRAM()函数,向 LCD RAM 写数据。 这里 LCD->LCD_REG,是我们定义好的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 502 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 神舟王 407 和彩屏通信使用的是 FSMC 接口。调用函数 LCD_Write(RGB_Code)向 GRAM 写数 据。而 LCD_Write(LCD_DATA) 相当于 LCD->LCD_RAM = RGB_Code。即通过 FSMC 向对应的 GPIO 端口发送数据,我们这里发送的是画点的数据。 画点函数,就是通过端口 FSMC 接口向 GRAM 存储单元传输数据。而 GRAM 中每个存储单元 都对应着液晶控制器面板的一个像素点。LCD 控制器(9320、8989 等等)通过其它的组件的共同作 用把我们写入 GRAM 存储单元中的数据转化为液晶面板控制信号,使对应的像素点呈现特定的颜色。 7.25.4 下载与测试 如果使用JLINK下载固件,请按如何使用JLINKV8下载固件到神舟王开发板小节进行操作。 如果使用串口下载固件,请按如何使用串口下载一个固件到神舟王开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按如何通过MDK编译和在线调试小 节进行操作。 7.25.5 实验现象 将固件下载到神舟王开发板后,复位,神舟王开发板正常情况下将显示绿色,在屏的中间显示一 个黑点。注意,我们只是显示一个点,看的时候要仔细,可以把保护膜撕下来观察黑点。 7.26 TFT彩色液晶屏显示一个数字1 7.26.1 扫描的简要分析 本实验我们在 LCD 屏上指定的位置显示一个数字 1。我们这个 1 是通过字模显示的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 503 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.26.2 什么是字模 液晶屏其实就是一个由许多像素点组成的点阵,若要在上面显示一个字符,则需要很多像素 点共同构成,比如 8*16 的 ASCII 码字符,或者 16*16 的点阵显示的汉字。 如果每个 8*16 或者 16*16 的点阵区域来显示一个字符,把黑色的像素点以 1 来表示,空白 以 0 表示,每个像素点的状态以一个二进制位来记录,用 8*16/8=16 个字节或者 16*16/8=32 个 字节就可以把这个字记录下来。这个 16 字节或者 32 字节就被称之为该字符的字模。当然还有 其他常用的字模是 24*24,32*32 的。 可以把这个‘字模’两个字转化成以下的 32 个字节的字模: 比如看下,开头的 0x02 和 0x00,就是显示’字’的最上面那一点,显示第一行;比如下面这一行黑体, 可以数一下,从上面往下数是第 10 行,那么可以看到第 10 行是 0x7F 和 0xFE,确实是一个正确的 字模显示;在这样的字模中,以两个字节表示一行像素点,16 行构成一个字模: 7.26.3 ASCII码的字符解释 下图是 ASCII 码字符表 嵌入式专业技术论坛 (www.armjishu.com)出品 第 504 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 现在将这些 ASCII 字符表转化成 8x16 的数组,也就是说一个字符的高度是 8,宽度是 16,16 也就是两个字节,那么一个字符就是 8 行,每行都是 16 个 bit,等于是 8*16/8 = 16 个字节大小。可 以看到下面的 ASCII 字符,红框框住的是 16 个字节,显示一个字符。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 505 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 可以看到整个数组 ascii_8x16[1536]总共有 1536 个成员,每个成员就是一个单独的字节,而 16 个字节就是一个字符,那么这个数组总共能描述多少个字符呢?总共是 1536/16 = 96 个字符,从下 面的这张表来看,这个 96 个字符就是描述的是从 ASCII 值 32 到 127 这 96 个字符。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 506 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 比如我们希望显示www.armjishu.com 到液晶屏上,那么这个LOGO所有的字符都能在ASCII码表中通 过查表获得,接下来的软件分析会进一步分析如何用具体的软件代码来显示字符到LCD液晶屏上。 7.26.4 硬件设计 硬件设计同上 7.26.5 软件分析 进入例程的文件夹,然后打开\Project\MDK-ARM\Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 507 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:STM32F4xG_LCD_Init (),彩屏初始化函数。前面我们已经讲了,我们就不再重复,这 里它的主要是将彩屏初始化,并将彩屏刷成绿色。 代码分析 2:LCD_DrawChar(10, 100, &ASCII_Table[0]),显示数字 1 函数。 函数 LCD_DrawChar(),一共 3 个参数,第一、第二个参数设定字符显示的坐标。第三个参数 设定要显示的字符。 代码分析 3:显示字符函数中。本实验使用的字符大小是 24x48。即显示一个字模需要 24x48=1152 个 bit,1152/8=144 个字节。 代码分析 4:通过两个 for 循环实现,显示一个字符的数据。我们知道字符大小是 24x48。第一个 for 循环是 48。第二个 for 循环应该是 24。通过两个循环不停的调用画点函数 LCD_SetPoint( ),将需要 嵌入式专业技术论坛 (www.armjishu.com)出品 第 508 页,共 771 页 www.armjishu.com V1.1 的字符显示出来。 ARM 技术论坛 神舟王 STM32F407 用户手册 显示的时候,我们通过 if 语句判断显示的是背景颜色还是字符颜色。我们设置的背景颜色和字 符颜色是: 即,显示的字符的背景颜色和字符颜色分别为白色和黑色。 代码分析 5:我们知道显示一个点,是设定显示点的坐标,然后写数据。我们数字 1 也是一样的道理, 不同的是我们写入了很多点的数据。我们看一下显示的结果。 下面我们对数字 1 的数据进行分析,在此我们数字 1 设定的字模是 24x48。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 509 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 , 上面我们说了,字模的宽度是 24,高度是 48。我们先显示完一个宽度,高度加 1,再显示一个 宽度,高度再加 1,如此循环,最终显示一个字符。数字 1 的字模数据中,为了方便大家观察,我们 将数据分成 3 个字节一行。刚好是 3x8=24(bit),和宽度吻合。其实这样划分之后,大家数一下数字 1 数据的高度,刚好是 48 行的。 我们显示一个数字 1,从形状上,我们可以看到它的头是斜的,尾部是一横,中间部分是 1 竖。 那么我们的数据中间部分应该是一样的。我们对一下数据发现中间的数据都是 0x00,0x38,0x00。我们 将它化为二进制等于 0000 0000 0011 1000 0000 0000,就是说一个宽度中,中间有 3 个点是黑色的, 两边都是白色的。连续这样的数据就组成了 1 竖(数字 1 的中间部分)。 数字 1 的头部是上窄下宽,那么头部的数据从上往下,应该是上面的数据是 1 的位数比下面的 少。 大家观察一下,它头部的数据。从上往下,数据中 1 的位数增大。 大家看一下数字 1 尾部的数据: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 510 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 0x07,0xFF,0xC0,化为二进制为 0000 0111 1111 1111 1100 0000,这样的一个宽度数据组成一横 (数字 1 的底部)。 代码分析 6:我们看一下实验的效果 通过显示的结果我们可以推断出,液晶屏刷的方向。我们可以看到显示的 1 是竖着的,我们可 以判断出它的刷屏是在水平方向上的。如果刷屏方向是在竖直方向上的,那么数字 1 的显示应该是 卧倒的。 那么竖屏是从左到右刷,还是从右到左刷呢?刷屏的起始点在哪里呢?我们看一下数字 1 的头 部,它的突出部分是在左边。那么它刷屏的方向,是从左到右刷屏。从右向左的刷的话,突出部分 是指向右边的。刷屏的起始点是在左上角的第一个点。如果是在右下脚的话,显示的数字 1 就倒立 过来了。 那么通过数字 1 的显示,可以看出屏在显示数字 1 的时候显示的方向是:从左到右刷屏,而且 是从左上角开始刷屏。 7.26.6 下载与测试 如果使用JLINK下载固件,请按如何使用JLINKV8下载固件到神舟王开发板小节进行操作。 如果使用串口下载固件,请按如何使用串口下载一个固件到神舟王开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按如何通过MDK编译和在线调试小 节进行操作。 7.26.7 实验现象 将固件下载到神舟王开发板后,复位,神舟王开发板正常情况下将显示数字 1。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 511 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.27 TFT彩色液晶屏显示变异的数字1 7.27.1 简要分析 本实验我们对数字 1 的字模数据,进行改造显示特殊的数字 1,改变显示 1 的数组的值,看看这个 数字 1 会不会变形。 7.27.2 软件分析 进入例程的文件夹,然后打开\Project\MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 512 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 代码分析 1:显示数字 1 的实验的时候,我们已经对相关的函数进行了解释。我们这里主要针对两个 实验的数字 1 的数据进行对比分析。 (显示数字 1 的数据) (显示变异数字 1 的数据) 我们观察它两的数据发现,变异的数字 1 的数据和普通数字 1 的数据不同的地方是在数据的中 间部分。普通的数字 1 的数据的中间部分是一长串的宽度数据,0x00,0x38,0x00。变异数字 1 的数据 中间部分是一段宽度数据 0x00,0x38,0x00,加上一段宽度数据 0x00,0xFF,0x00,再加上一段宽度数据 0x00,0x38,0x00 构成。 0x00,0x38,0x00 化为二进制的数据是 0000 0000 0011 1000 0000 0000。0x00,0xFF,0x00 化为二进 制的数据是 0000 0000 1111 1111 0000 0000。很明显,0x38 只有 3 个 1,而 0xFF 是 8 个 1。那么最终 在液晶屏上显示的时候,特殊的数字 1 中间部分不是规则的一竖,应该是两头小一点,中间胖一点 的一竖。 7.27.3 软件分析 将固件下载到神舟王开发板后,复位,神舟王开发板正常情况下将显示特殊数字 1。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 513 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.28 TFT彩色液晶屏显示数字9 7.28.1 简要分析 上个例程显示了一个数字 1 之后,这个例程我们打算显示一个数字 9,再加深一下这个字模转成 数字的过程。 7.28.2 软件分析 进入例程的文件夹,然后打开\Project\MDK-ARM\ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:显示数字 1 的实验的时候,我们已经对相关的函数进行了解释。我们这里主要针对数字 9 的数据进行对比分析。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 514 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 (显示数字 1 的数据) (显示数字 9 的数据) 我们观察它两的数据发现,变异的数字 1 的数据和数字 9 的数据有很多的不同点。首先,数字 1 的中间部分是规律性的 0x00,0x38,0x00。而数字 9 并没有这样子的规律。 我们看一下,数字 9 的数据。开头的都是 0x00,那些都是空白的,我们不管它。第一个非 0 的 数据宽度是 0x01,0xF8,0x00。化为二进制是 0000 0001 1111 1000 0000 0000,大家发现这个二进制中 间部分有连续的 6 个 1,那么我们的这个 9 的头部是封顶的。 往下的一长串数据中,中间部分都都有 0。比如 0x70,0x00,0x60。我们这个数字 9,中间是空的。 空完之后,下面封一次底,完成数字 9 的上面的圆圈部分。 7.28.3 下载测试 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按如何通过 MDK 编译和在线调试小 节进行操作。 7.28.4 实验现象 将固件下载到神舟王开发板后,复位,神舟王开发板正常情况下将显示数字 9。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 515 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.29 TFT彩色液晶屏显示一个英文 7.29.1 简要分析 本实验我们显示一个大写的英文字母 A。 7.29.2 硬件设计 硬件设计同上 7.29.3 软件分析 进入例程的文件夹,然后打开\Project \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 516 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:显示英文字母的实验原理,和显示数字的实验原理是一样的。我们主要对比一下显示数 字 9 和显示英文 A 的数据。 , 这个和显示数字,基本是一样的,最大的区别是显示的内容不一样。这个可以从显示数据中看 出来。我们显示引文的时候,字模的大写也是 24x48。 分析一下字母 A 的数据。我们发现字母 A 的数据,只有一行是连续不断的十几个位都是 1。从 A 的 形状上不难猜出它描述的是 A 中间的的横杠。 7.29.4 下载与测试 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按如何通过 MDK 编译和在线调试小 节进行操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 517 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.29.5 实验现象 将固件下载到神舟王开发板后,复位,神舟王开发板正常情况下将显示英文字母 A。 7.30 TFT彩色液晶屏显示26个英文字母 7.30.1 简要分析 本实验显示 26 个英文字母 7.30.2 硬件设计 硬件设计同上 7.30.3 软件分析 进入例程的文件夹,然后打开\Project\MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 518 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:STM32F4xG_LCD_Init (),彩屏初始化函数。前面我们已经讲了,我们就不再重复,这 里它的主要是将彩屏初始化,并将彩屏刷成绿色。 代码分析 2:显示 26 个英文字母。 本实验和显示单个数字、单个英文基本一致。不同的是,通过 for 循环增加了显示的英文的数量。 具体的字符数据如下: 7.30.4 下载与测试 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按如何通过 MDK 编译和在线调试 小节进行操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 519 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.30.5 实验现象 将固件下载到神舟王开发板后,复位,神舟王开发板正常情况下将显示 26 个英文字母。 7.31 TFT彩色液晶屏显示中文字 7.31.1 使用工具将中文字转换成二进制码 进入光盘打开神舟王 407 的软件工具中,找到’神舟开发板汉字生成软件工具’文件夹: 第一步:打开 第二步: 第三步: 打开这个软件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 520 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 第四步:把结果复制进去 嵌入式专业技术论坛 (www.armjishu.com)出品 第 521 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.31.2 硬件设计 硬件设计同上 7.31.3 软件分析 进入例程的文件夹,打开例程 进入到 main()函数中: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 522 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:液晶屏的初始化等细节前面的例程都有详细介绍,这个例程中主要是这个函数用来显示 中文字符的 LCD_DisplayWelcomeStr(0x60);它显示了这个数组中所有的字符 用一个 for 循环来显示 WelcomeStr[13][]中的 13 个字符: 具体的每个字符显示是通过 LCD_DrawChinaChar()这个函数进行显示的 代码分析 2:LCD_DrawChinaChar(X, Y, const u8 *c)函数是显示一个字符到 LCD 上,X 和 Y 分别是 LCD 横坐标和纵坐标,const u8 *c 是需要显示的字符的字模,就是一些二进制数,这个函数的具体 嵌入式专业技术论坛 (www.armjishu.com)出品 第 523 页,共 771 页 www.armjishu.com V1.1 实现如下: ARM 技术论坛 神舟王 STM32F407 用户手册 1) 首先先设置好光标,就是字符显示的起始点,这个在代码中也是由用户确定的位置,你 想到 LCD 哪个位置显示都可以自己灵活的去通过修改参数来达到目的 2) 因为这里转的字符的字模是 72 个字节,每个字节可以描述 8 个点,每个点显示到 LCD 上需要一个一个来描述,所以可以计算一下 72 个字节分成 24 组,每组 3 个字节,每个 字节可以描述 LCD 显示 8 个点,每个点调用如果是 1 就显示字体的颜色,如果是为 0 就显示字体背景的颜色,这里颜色的显示是通过调用 LCD_WriteRAM()函数来完成的 3) 在写颜色之前,每次都调用一下 LCD_WriteRAM_Prepare()这个函数,告诉液晶屏准备 写 GRAM,写 GRAM 就是写 LCD,LCD 的颜色实际上是通过写 GRAM,再由 LCD 内 部的控制器去从 GRAM 中抓取显示内容,显示到 LCD 上的。 7.31.4 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407开发板 小节进行操作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和在线调试 小 节进行操作。 7.31.5 实验现象 将固件下载到神舟王 407 后,复位,神舟王 407 正常情况下将显示一串中文字符。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 524 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.32 TFT彩色液晶屏显示中英文字 7.32.1 硬件设计 硬件设计同上。 7.32.2 软件分析 软件设计参考 TFT 液晶屏显示英文章节和 TFT 液晶屏显示英文章节。 7.32.3 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和在线调试 小 节进行操作。 7.32.4 实验现象 将固件下载到神舟王407后,复位,神舟王407正常情况下将显示一串英文字符和中文 字符 嵌入式专业技术论坛 (www.armjishu.com)出品 第 525 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.33 TFT彩色液晶屏显示图片 7.33.1 图片格式介绍 图片格式有非常多的种类,比如 JPEG、BMP 和 GIF 等多种不同的类型,我们实验中主要是使 用 LCD 屏来显示 BMP 图片。 BMP 文件格式,又称为位图(Bitmap)或是 DIB(Device-Independent Device,设备无关位图), 是 Windows 系统中广泛使用的图像文件格式。BMP 文件保存了一幅图像中所有的像素。 BMP 格式可以保存单色位图、16 色或 256 色索引模式像素图、24 位真彩色图象,每种模式中 单一像素点的大小分别为 1/8 字节,1/2 字节,1 字节和 32 字节。目前最常见的是 256 位色 BMP 和 24 位色 BMP。 BMP 文件格式还定义了像素保存的几种方法,包括不压缩、RLE 压缩等。常见的 BMP 文件大多是 不压缩的。Windows 所使用的 BMP 文件,在开始处有一个文件头,大小为 54 字节。保存了包括文 件格式标识、颜色数、图像大小、压缩方式等信息,因为我们仅讨论 24 位色不压缩的 BMP,所以 文件头中的信息基本不需要注意,只有―大小‖这一项对我们比较有用。图像的宽度和高度都是一 个 32 位整数,在文件中的地址分别为 0x0012 和 0x0016。54 个字节以后,如果是 16 色或 256 色 BMP, 则还有一个颜色表,但在 24 位色 BMP 文件则没有,我们这里不考虑。接下来就是实际的像素数据 了。因此总的来说 BMP 图片的优点是简单。 7.33.2 深入了解BMP图片 BMP 文件的格式大体上分为 4 部分。 第一部分为位图文件头。 第二部分为位图信息头。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 526 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 第三部分为调色板。 第四部分就是实际的图像数据了。 BMP 的内容,网上的资料很多,都说烂了。从操作上讲,如果想在液晶屏上显示图片的话,还 是比较简单的。大体上说,使用我们提供的图像转换软件,将要显示的图像转换成数据,替代我们 提供的代码中的图像数据就可以了。 针对于本实验,我们直接看一下转换出来的 BMP 图像数据。 转换的出的数据,并非都是都是用于绘制的图像实际数据。在图像数据之前还有一串数据。比 如: 。 这里的 0x40,0x01,表示图像的宽度。0xF0,0x00 表示图像的高度。0x0140 化为 10 进制等于 320; 0x00F0 化为 10 进制是 240。其它位代表的意义,我们在代码中进行说明,在这里不一一列举。 7.33.3 使用工具将图片转换成二进制码 在本实例中,在main函数中有以下函数调用: LCD_Image2LcdDrawBmp565Pic()函数可以在指定的位置显示图片。当然显示的大小是有限 制的。比如我们本实验显示的图片是240x320,屏幕也是240x320。那么我们显示图片的时候,指定 的显示坐标应该是(0,0),刚好整屏显示。 本实验使用的图片转换工具是:Img2Lcd.exe。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 527 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 该软件的使用方法如下: 1) 双击“Image2Lcd 2.9.exe”,打开软件。 2) 单击“打开”选项,选择要转换的图片。 3) 对转换的图片进行设置。具体的设置入下图: 我们这里是C语言,输出的数据类型选择“C语言数组(*.C)”。这里大家要留意的是“输 出图像”。我们屏幕最大的宽度和高度是320和240。假如输出的图像刚好是(320,240),在代 码中设置图像显示位置的时候应该是在开始的位置,即坐标(0,0)。如果选择其他位置,图 片的显示错乱。 扫描模式,我们选择水平扫描。 “输出灰度”这里,我们选择的是“16位真彩色”。本实验中针对的是16位彩色,颜色数据 的排序是红、绿、蓝。颜色的位数分别是红色5位,绿色6位,蓝色5位。 勾选“包含图像头数据”。我们转换出来的数据,并非都是都是用于绘制的图像实际数据, 嵌入式专业技术论坛 (www.armjishu.com)出品 第 528 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 它还包含了图像头数据。 将数组拷贝出来,替换 QQ_LCON_80X80.C 文件中的“gImage_QQ_ICON_80X80_16[153608]”数组 内容和 QQ_LCON_80X80.h 文件中对应的数组定义,重新编译后即可显示用户自己的图片。 7.33.4 硬件设计 硬件设计同上 7.33.5 软件分析 进入例程的文件夹,然后打开\Project \ Project.uvproj 文件 进入到 main()函数中: 代码分析 1:液晶屏的初始化等细节前面的例程都有详细介绍,这个例程中主要是 LCD_Image2LcdDrawBmp565Pic ( )函数显示了图片。 代码分析 2:LCD_Image2LcdDrawBmp565Pic(0, 0, gImage_C) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 529 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 本函数有 3 个参数,第一、第二个参数设置图片显示的位置。第三个参数是指针,指向我们转 换出来的数组数据的首地址。 代码分析 3:画图函数中首先定义了 HEADCOLOR 类型的“* BmpHeadr”。我们看一下 HEADCOLOR 是什么。 大家可以发现,HEADCOLOR 里面分别包含了多个数据。有 4 个 unsigned char 类型,两个 unsigned short 类型。我们算一下它们总共占用了多少字节。unsigned char 占用一个字节,unsigned short 占用 两个字节。那么它们一共就是占用了 8 个字节。 这 8 个字节就是,我们转换的图片的头数据。它们的意义分别为:scan,扫描模式。gray, 灰 度值。w,h 分别是图像的宽度和高度。is565,16 位彩色。Rgb,描述 R G B 颜色分量的排列顺序。 代码分析 4:定义完“* BmpHeadr”后,将指针 BmpHeadr 指向我们转换出来的图片数组数据,读取 图片的宽度(Width)和高度(Height)。并跳过图像的头数据,将指针 BmpData 指向显示图片的实 际数据。 代码分析 5:通过对图像头数据的判断,调用 LCD_DrawBmp565Pic()函数显示图片。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 530 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 代码分析 6:图片显示函数 LCD_Image2LcdDrawBmp565Pic()。 LCD_DrawBmp565Pic(uint16_t StartX, uint16_t StartY, uint16_t Width, uint16_t Height, const uint16_t *BmpAddress)函数一共包含 5 个参数。第一、第二个参数是显示图像的起始点,本实验我们 给的点是(0,0)。第三、第四个参数分别表示图像的宽度和高度。第 5 个参数就是指向跳过图像头数 据后的第一个数据,即我们用于绘制图画的第一个数据。 代码分析 7:绘制图片,也是一个点一个点的画。只是速度太快我们人眼无法看出。 显示图片的时候,首先设定显示的范围,这里用到了 3 个寄存器 0x0044、0x0045、0x0046。我 们算一下给 0x0044 和 0x0046 的数据,0xEF00 和 0x013F。我们将十六进制 0xEF 化为十进制得 239。 0x13F 化为十进制是 319。相信大家对这两个数据非常的熟悉。对 0x0044、0x0045、0x0046 的介绍 大家参考控制芯片的手册。 显示的时候,设置显示时的位置。写入命令 0x22,准备写入 GRAM。然后通话 LCD_WriteRAM ()函数写数据。本实验中,可以通过两个 for 循环,先显示完一个宽度(Width),高度(Height) 加 1,依此类推,绘制完整幅图片。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 531 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.33.6 下载与测试. 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和在线调试 小 节进行操作。 7.33.7 实验现象 将固件下载到神舟王 407 开发板后,复位,神舟王 407 开发板正常情况下将显示一张图片。 7.34 TFT彩色液晶屏显示图片并刷屏 7.34.1 硬件设计 硬件设计同上。 7.34.2 软件分析 软件设计参考 TFT 彩色液晶屏显示图片章节。 7.34.3 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407开发板 小节进行操作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和在线调试 小 节进行操作。 7.34.4 实验现象 将固件下载到神舟王407后,复位,神舟王407正常情况下将显示图片,不同的图片不停的切 换。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 532 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.35 开机TFT液晶屏图片自动左右移动实验 7.35.1 简要分析 我们已经知道如何显示图片,本实验开机显示图片的时候,我们让图片左右移动。 7.35.2 硬件设计 硬件设计同上 7.35.3 软件分析 进入例程的文件夹,然后打开\Project\MDK-ARM \ Project.uvproj j 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 533 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:本实验通过 改变画图函数 LCD_Image2LcdDrawBmp565Pic()的第二个参数,使图片 左右移动。显示图片的时候,行坐标不变,列坐标左右移动,从而实现图片的左右移动。 代码分析 2:改变一个值,就使得图片先往一边移动,然后又往另一边移动。 7.35.4 下载与测试 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按如何通过 MDK 编译和在线调试 小节进行操作。 7.35.5 实验现象 将固件下载到神舟王开发板后,复位,神舟王开发板正常情况下将看到下面的图片左右移动。 7.36 神舟王_LCD触摸屏(神舟王STM32F407-库函数版) 学习了前面较为基础的实验后,本节我们来了解TFT彩屏的显示实验。主要是了解如何采用各 种不同的颜色显示不同的界面,同时可以将预先设置的字符用不同的颜色进行显示。业界上的2.8寸 和3.2寸的彩屏手机,也都是采用相类似的TFT实现的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 534 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 另外, 在 TFT LCD 屏显示的基础上,还有 TFT LCD 屏的触摸功能。神舟王 407 标配的 2.8/3.2 寸 LCD 模块还包含了 SPI 接口的触摸芯片,可以将触摸采样到的数据在 LCD 屏上进行进行显示。 7.36.1 TFT触摸屏实验的意义与作用 TFT屏在信息行业快速发展中得到广泛的运用,中高端的手机、可视电话、便携式 的VCD、平板电脑等等; 触摸屏逐渐取代键盘成为通信常用的人机交互工具,手机支持 触摸功能、PDA手持设备等等的运用。 本节实验,让大家了解TFT彩屏的显示原理,针对LCD的触摸功能进行详解,剖析触 摸采样到LCD屏显示间的处理过程。 7.36.2 实验原理 触摸屏简介 触摸屏一般分为电阻、电容、表面声波、红外线扫描和矢量压力传感等,其中使用最多的是四 线或无线电阻触摸屏。四线电阻触摸屏是由两个透明电阻膜构成的,在它的水平和垂直电阻网上施 加电压,就可以通过A/D转换面板在触摸点测量出电压,从而对应出坐标值。 我们一般液晶所 用的触摸屏,最多的就是电阻式触摸屏了(多点触摸属于电容式触摸屏,比如M8,IPhone等支持多 点触摸的手机所用的屏就是电容式的触摸屏), TFT LCD自带的触摸屏属于电阻式触摸屏,下面 简单介绍下电阻式触摸屏的原理。 电阻式触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的 电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明 氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的 内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层 隔开绝缘。 当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两 个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再 根据获得的位置模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。 电阻屏的特点有: 1)是一种对外界完全隔离的工作环境,不怕灰尘、水汽和油污。 2)可以用任何物体来触摸,可以用来写字画画,这是它们比较大的优势。 3)电阻触摸屏的精度只取决于 A/D 转换的精度,因此都能轻松达到 4096*4096。 从以上介绍可知,触摸屏都需要一个 AD 转换器, 一般来说是需要一个控制器的。TFTLCD 模 块选择的是四线电阻式触摸屏,这种触摸屏的控制芯片有很多,包括:ADS7843、ADS7846、TSC2046、 XPT2046 和 AK4182 等。这几款芯片的驱动基本上是一样的,也就是你只要写出了 ADS7843 的驱动, 这个驱动对其他几个芯片也是有效的。而且封装也有一样的,完全 PINTOPIN。所以在替换起来,很 方便。 神舟王407的触摸屏附在LCD屏的表面上,与LCD屏相配合使用,主要是用的触摸芯片是 ADS7843,业界上与ADS7843芯片相兼容的触摸芯片还有ADS7846、AK4182、XPT2046以及 TSC2046等,驱动基本上一致。 ADS7843是一款4线式触摸屏控制器,内含12位分辨率,125KHz转换速率,逐步逼近型的A/D转 换器。内部有一个由多个模拟开关组成的供电测量电路网络和12位的A/D转换器。其可以根据处理器 (stm32f407ZG通过SPI总线)发来的不同测试命令导通不同的模拟开关,以便向工作面电极对提供 电压,并把相应测量电极上的触点坐标位置所对应的电压模拟量引入到A/D转换器。在触摸点X、Y 坐标的测试过程中,测试电压与测量点的等效电路如下图所示:(P为测量点) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 535 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 当触摸屏受到点击或是挤压的时,ADS7843通过中断请求通知处理器(STM32F407ZG)有触摸 发生。如“中断请求”图所示,当没有触摸时,MOSFET①和②打开、③关闭,则中断输出引脚通 过外加的上拉电阻输出为高,当有触摸时,①和③打开,②关闭,则中断输出引脚通过③内部的连 接到地,输出为低,从而向处理器发出中断请求。 7.36.3 硬件设计 本实验的硬件设计包括两个方面: 一、TFT LCD屏的原理设计,主要体现TFT LCD屏上的信号连接情况; 二、神舟王407开发板上的TFT座的信号连接情况。 首先是TFT的硬件设计: 其次,神舟王407开发板上的TFTLCD座的信号连接设计: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 536 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 嵌入式专业技术论坛 (www.armjishu.com)出品 第 537 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 TFTLCD 模块自带的触摸屏控制芯片为 XPT2046。XPT2046 是一款 4 导线制触摸屏控制器,内 含 12 位分辨率 125KHz 转换速率逐步逼近型 A/D 转换器。XPT2046 支持从 1.5V 到 5.25V 的低电压 I/O 接口。XPT2046 能通过执行两次 A/D 转换查出被按的屏幕位置, 除此之外,还可以测量加在触 摸屏上的压力。内部自带 2.5V 参考电压可以作为辅助输入、温度测量和电池监测模式之用,电池监 测的电压范围可以从 0V 到 6V。XPT2046 片内集成有一个温度传感器。 在 2.7V 的典型工作状态下, 关闭参考电压,功耗可小于 0.75mW。XPT2046 采用微小的封装形式:TSSOP-16,QFN-16(0.75mm 厚 度)和 VFBGA-48。工作温度范围为-40℃~+85℃。 触摸芯片现位于 TFT LCD 屏上,处理器通过 SPI2 总线控制触摸芯片。X+、X-、Y+和 Y-则连接 到 LCD 触摸屏上。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 538 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 STM32F 王 407 处理器管脚与 2.8/3.2 LCD 触摸屏的信号定义关系如下: GPIO 管脚 PD14 PD15 PD0 PD1 PE7 PE8 PE9 PE10 PE11 PE12 PE13 PE14 PE15 PD8 PD9 PD10 PG12 PF0 PD5 PD4 PC7 PG7 —— PB12 PB14 PB15 PB13 PB12 信号名 FSMC_D0 FSMC_D1 FSMC_D2 FSMC_D3 FSMC_D4 FSMC_D5 FSMC_D6 FSMC_D7 FSMC_D8 FSMC_D9 FSMC_D10 FSMC_D11 FSMC_D12 FSMC_D13 FSMC_D14 FSMC_D15 FSMC_NE4 FSMC_A0 TFT LCD 模块信号 D0 D1 D2 D3 D4 D4 D6 D7 D8 D9 D10 D11 D12 D13 D14 D15 CS RS FSMC_NWE WR FSMC_NOE RD BLACK_LIGHT BLACK_LIGHT INT BUSY —— F_CS SD_CS SD_CS MISO MOSI SCK NSS MISO MOSI SCK NSS 说明 LCD 片选信号 命令/数据标志(1,读写数据;0,读 写命令) 向 LCD 写入数据 从 LCD 读取数据 背光控制 背光控制 TFT LCD 模块板载的 SD 卡 SPI CS 信 号,和 2.4G 模块的 IRQ 复用 触摸屏驱动芯片 SPI MISO 信号 触摸屏驱动芯片 SPI MOSI 信号 触摸屏驱动芯片 SPI SCK 信号 触摸屏驱动芯片 SPI CS 信号 嵌入式专业技术论坛 (www.armjishu.com)出品 第 539 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.36.4 软件分析 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:Printf_Init()初始化串口,以及串口打印 代码分析 2:STM324xG_LCD_Init()初始化液晶屏,之前例程中已经有详细分析,可以参考前面的例 程 代码分析 3:ADS7843_Init 初始化触摸芯片 嵌入式专业技术论坛 (www.armjishu.com)出品 第 540 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 触摸是 SPI 方式连接的,通过这个函数使能 SPI 接口,并且激活 ADS7843 芯片初始化好 代码分析 4:ARMJISHU_TouchScreen_ADS7843 嵌入式专业技术论坛 (www.armjishu.com)出品 第 541 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 5:ADS7843_Rd_Addata(u16 *X_Addata,u16 *Y_Addata)读取 X 坐标和 Y 坐标的数据 代码分析 6:TPReadX()读取 X 的坐标数据 代码分析 7:TPReadY()读取 Y 的坐标数据 嵌入式专业技术论坛 (www.armjishu.com)出品 第 542 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.36.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和在线调试 小 节进行操作。 7.36.6 实验现象 将固件下载到神州王后,复位,神州王正常情况下将显示以下图片,祝大家发财 7.37 图片跟触摸点移动实验 7.37.1 简要分析 我们已经知道如何显示图片,本实验我们先显示图片,然后让图片跟随触摸点移动。 7.37.2 硬件设计 硬件设计同上 嵌入式专业技术论坛 (www.armjishu.com)出品 第 543 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.37.3 软件分析 进入例程的文件夹,然后打开\Project \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:本实验我们这里添加了触摸的功能。通过 ARMJISHU_TouchScreen_ADS7843( )函数, 读取触摸点的信息。然后通过触摸信息 TSC_Value_X,调用 LCD_Image2LcdDrawBmp565Pic(0, TSC_Value_Y, gImage_C);函数显示图片,从而实现图片的移动。 7.37.4 下载与测试 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按 如何通过 MDK 编译和在线调试 小 节进行操作 7.37.5 实验现象 将固件下载到神舟王 407 开发板后,复位,神州开发板正常情况下将看到图片跟随触摸点移动。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 544 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.38 点击图片小图标显示小图标外框实验 7.38.1 简要分析 本实验中,我们点击图片中的小图标的时候,小图标变颜色 7.38.2 硬件设计 硬件设计同上 7.38.3 软件分析 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 下面开始具体分析程序代码: 代码分析 1:STM324xG_LCD_Init( ),彩屏初始化函数。前面我们已经讲了,我们就不再重复,这里 它的主要是将彩屏初始化,并将彩屏刷成绿色。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 545 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 代码分析 2:ADS7843_Init( )函数,初始化触摸功能。大家可以参考触摸屏的章节。这里就不重复。 代码分析 3:点击小图标后,显示小图标。 我们首先,显示一个全屏的程序。通过函数 ARMJISHU_TouchScreen_ADS7843( )读取触摸点的 信息。通过 for 语句判断触摸点是否在所限定的范围内,如果在的话,在原来图片上显示一个预先做 好的小图片,将原来图片中的小图标覆盖,从而实现显示小图标外框功能。 7.38.4 下载与测试 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按 如何通过 MDK 编译和在线调试 小 节进行操作。 7.38.5 实验现象 将固件下载到神舟王 407 开发板后,复位,神州王 407 开发板正常情况下将正常显示如下图片, 我们点击图片中央的小图标,小图标变色。 7.39 双击小图标触发实验 7.39.1 简要分析 本实验中,我们点击图片中间的小图标的时候,刷屏程序和显示字符程序得予运行。 7.39.2 硬件设计 硬件设计同上 嵌入式专业技术论坛 (www.armjishu.com)出品 第 546 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.39.3 软件分析 进入例程的文件夹,然后打开\Project\MDK-ARM\ Project.uvproj 文件 下面开始具体分析程序代码: 代码分析 1:本实验,初始化触摸屏,调用函数 LCD_Image2LcdDrawBmp565Pic(0, 0, gImage_image), 显示图片。 代码分析 2:点击小图标后,触发显示事件。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 547 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 我们首先,显示一个有 9 个图标的图片。通过函数 ARMJISHU_TouchScreen_ADS7843()读取 触摸点的信息。通过 if 语句判断触摸点是否在所限定的范围内,如果在的话,执行触发事件将屏刷 成红色。大家可以在此添加自己的触发事件。 7.39.4 下载与测试 如果在 MDK 开发环境中,下载编译好的固件或者在线调试,请按 如何通过 MDK 编译和在线调试 小 节进行操作 7.39.5 实验现象 将固件下载到神舟王开发板后,复位,神舟王开发板正常情况下将正常显示如下图片,我们点击 图片中央的小图标,小图标变色。随后屏幕变成红色。 7.40 双击小图标触发实验 7.40.1 简要分析 本实验中,我们点击两次图片中间的小图标的时候,刷屏程序和显示字符程序得予运行 7.40.2 硬件设计 硬件设计同上 7.40.3 软件分析 进入例程的文件夹,然后打开\Project\MDK-ARM\ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 548 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 下面开始具体分析程序代码: 代码分析 1:本实验,初始化触摸屏,调用函数 LCD_Image2LcdDrawBmp565Pic( ),显示图片。 代码分析 2:点击两次小图标后,触发显示事件。 我们首先,显示一个有 9 个图标的图片。再通过两次读取触摸信息,实现点击两次图标,触发 刷屏程序和显示字符串程序。 while(1)大循环里面有两个 while 循环。大循环中程序进入第一个 while 循环。判断触摸点的 位置,如果是在中间的小图标的范围内的话,使小图标底色变色,并跳出本循环。而后,进入第二 个 while 循环,等待下一个触摸的到来。如果又发生触摸,并且范围还在中间的小图标的范围内,则 触发刷屏程序。 7.40.4 实验现象 将固件下载到神舟王 407 开发板后,复位,神州王 407 开发板正常情况下将正常显示如下图片, 我们点击图片中央的小图标两次。随后屏幕变成红色。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 549 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.41 CAN总线回环实验 这一节我们将向大家介绍STM32的CAN总线的基本使用。有了STM32,CAN总线将变得简单, 俗话说“百闻不如一见”,应当再加上“百见不如一试”。在本小节,我们初始化CAN总线,分别 测试轮询模式和中断模式下的CAN总线环回,并通过神舟王407的串口等指示CAN环回的数据传送结 果。本节分为如下几个部分: 1 CAN总线回环实验的意义与作用 2 实验原理 3 软件设计 4 硬件设计 5 下载与验证 6 实验现象 7.41.1 意义与作用 什么是 CAN 总线? CAN,全称“Controller Area Network”,即控制器局域网,是国际上应用最广泛的工业级现场 总线之一。它是一种具有国际标准而且性能价格比又较高的现场总线,当今自动控制领域的发展中 能发挥重要的作用。最初 CAN 被设计作为汽车环境中的微控制器通讯,在车载各电子控制装置 ECU 之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备、电子 主干系统中,均嵌入 CAN 控制装置。 CAN 控制器局部网是 BOSCH 公司为现代汽车应用领先推出的一种多主机局部网,由于其卓越 性能现已广泛应用于工业自动化、多种控制设备、交通工具、医疗仪器以及建筑、环境控制等众多 部门。在北美和西欧,CAN 总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准 总线,并且拥有以 CAN 为底层协议专为大型货车和重工机械车辆设计的 J1939 协议。近年来,其所 具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶 劣、电磁辐射强和振动大的工业环境。控制器局部网将在我国迅速普及推广。 由于 CAN 为愈来愈多不同领域采用和推广,导致要求各种应用领域通信报文的标准化。为此, 1991 年 9 月 PHILIPS SEMICONDUCTORS 制订并发布了 CAN 技术规范(VERSION 2.0)。该技术 规范包括 A 和 B 两部分。2.0A 给出了曾在 CAN 技术规范版本 1.2 中定义的 CAN 报文格式,而 2.0B 给出了标准的和扩展的两种报文格式。此后,1993 年 11 月 ISO 正式颁布了道路交通运载工具--数字 信息交换--高速通信控制器局部网(CAN)国际标准(ISO11898),为控制器局部网标准化、规范化 推广铺平了道路。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 550 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 CAN 总线特点 CAN 总线是一种串行数据通信协议,它是一种多主总线,通信介质可以是双绞线、同轴电缆或 光导纤维。通信速率可达 1MBPS。CAN 总线通信接口中集成了 CAN 协议的物理层和数据链路层功 能,可完成对通信数据的成帧处理,包括位填充、数据块编码、循环冗余检验、优先级判别等项工 作。 CAN 协议的一个最大特点是废除了传统的站地址编码,而代之以对通信数据块进行编码。采用 这种方法的优点可使网络内的节点个数在理论上不受限制,数据块的标识码可由 11 位或 29 位二进 制数组成,因此可以定义 211 或 229 个不同的数据块,这种按数据块编码的方式,还可使不同的节 点同时接收到相同的数据,这一点在分布式控制系统中非常有用。数据段长度最多为 8 个字节,可 满足通常工业领域中控制命令、工作状态及测试数据的一般要求。同时,8 个字节不会占用总线时间 过长,从而保证了通信的实时性。CAN 协议采用 CRC 检验并可提供相应的错误处理功能,保证了 数据通信的可靠性。CAN 卓越的特性、极高的可靠性和独特的设计,特别适合工业过程监控设备的 互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。 另外,CAN 总线采用了多主竞争式总线结构,具有多主站运行和分散仲裁的串行总线以及广播 通信的特点。CAN 总线上任意节点可在任意时刻主动地向网络上其它节点发送信息而不分主次,因 此可在各节点之间实现自由通信。CAN 总线协议已被国际标准化组织认证,技术比较成熟,控制的 芯片已经商品化,性价比高,特别适用于分布式测控系统之间的数通讯。CAN 总线插卡可以任意插 在 PC AT XT 兼容机上,方便地构成分布式监控系统。 3. CAN 总线技术介绍 3.1 位仲裁 要对数据进行实时处理,就必须将数据快速传送,这就要求数据的物理传输通路有较高的速度。在 几个站同时需要发送数据时,要求快速地进行总线分配。实时处理通过网络交换的紧急数据有较大的 不同。一个快速变化的物理量,如汽车引擎负载,将比类似汽车引擎温度这样相对变化较慢的物理量更 频繁地传送数据并要求更短的延时。 CAN 总线以报文为单位进行数据传送,报文的优先级结合在 11 位标识符中,具有最低二进制数的 标识符有最高的优先级。这种优先级一旦在系统设计时被确立后就不能再被更改。总线读取中的冲 突可通过位仲裁解决。当几个站同时发送报文时,站 1 的报文标识符为 011111;站 2 的报文标识符为 0100110;站 3 的报文标识符为 0100111。所有标识符都有相同的两位 01,直到第 3 位进行比较时,站 1 的报文被丢掉,因为它的第 3 位为高,而其它两个站的报文第 3 位为低。站 2 和站 3 报文的 4、5、6 位 相同,直到第 7 位时,站 3 的报文才被丢失。注意,总线中的信号持续跟踪最后获得总线读取权的站的报 文。在此例中,站 2 的报文被跟踪。这种非破坏性位仲裁方法的优点在于,在网络最终确定哪一个站的 报文被传送以前,报文的起始部分已经在网络上传送了。所有未获得总线读取权的站都成为具有最高 优先权报文的接收站,并且不会在总线再次空闲前发送报文。 CAN 具有较高的效率是因为总线仅仅被那些请求总线悬而未决的站利用,这些请求是根据报文 在整个系统中的重要性按顺序处理的。这种方法在网络负载较重时有很多优点,因为总线读取的优先 级已被按顺序放在每个报文中了,这可以保证在实时系统中较低的个体隐伏时间。 对于主站的可靠性,由于 CAN 协议执行非集中化总线控制,所有主要通信,包括总线读取 (许可) 控制,在系统中分几次完成。这是实现有较高可靠性的通信系统的唯一方法。 3.2 CAN 与其它通信方案的比较 在实践中,有两种重要的总线分配方法:按时间表分配和按需要分配。在第一种方法中 ,不管每个 节点是否申请总线,都对每个节点按最大期间分配。由此,总线可被分配给每个站并且是唯一的站,而不 论其是立即进行总线存取或在一特定时间进行总线存取。这将保证在总线存取时有明确的总线分配。 在第二种方法中,总线按传送数据的基本要求分配给一个站 ,总线系统按站希望的传送分配 嵌入式专业技术论坛 (www.armjishu.com)出品 第 551 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 (如:Ethernet CSMA/CD)。因此,当多个站同时请求总线存取时,总线将终止所有站的请求,这时将不会有 任何一个站获得总线分配。为了分配总线,多于一个总线存取是必要的。 CAN 实现总线分配的方法,可保证当不同的站申请总线存取时,明确地进行总线分配。这种位仲 裁的方法可以解决当两个站同时发送数据时产生的碰撞问题。不同于 Ethernet 网络的消息仲裁,CAN 的非破坏性解决总线存取冲突的方法,确保在不传送有用消息时总线不被占用。甚至当总线在重负载 情况下,以消息内容为优先的总线存取也被证明是一种有效的系统。虽然总线的传输能力不足,所有未 解决的传输请求都按重要性顺序来处理。在 CSMA/CD 这样的网络中,如 Ethernet,系统往往由于过载 而崩溃,而这种情况在 CAN 中不会发生。 3.3 CAN 的报文格式 在总线中传送的报文,每帧由 7 部分组成。CAN 协议支持两种报文格式,其唯一的不同是标识符 (ID)长度不同,标准格式为 11 位,扩展格式为 29 位。 在标准格式中,报文的起始位称为帧起始(SOF),然后是由 11 位标识符和远程发送请求位 (RTR) 组成的仲裁场。RTR 位标明是数据帧还是请求帧,在请求帧中没有数据字节。 控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位 (ro),为将来 扩展使用。它的最后四个字节用来指明数据场中数据的长度(DLC)。数据场范围为 0~8 个字节,其后 有一个检测数据错误的循环冗余检查(CRC)。 应答场(ACK)包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑 1),这时正确接 收报文的接收站发送主控电平(逻辑 0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正 确接收到报文。 报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存 取,总线将处于空闲状态。 3.4 数据错误检测 不同于其它总线,CAN 协议不能使用应答信息。事实上,它可以将发生的任何错误用信号发出。 CAN 协议可使用五种检查错误的方法,其中前三种为基于报文内容检查。 3.4.1 循环冗余检查(CRC) 在一帧报文中加入冗余检查位可保证报文正确。接收站通过 CRC 可判断报文是否有错。 3.4.2 帧检查 这种方法通过位场检查帧的格式和大小来确定报文的正确性,用于检查格式上的错误。 3.4.3.应答错误 如前所述,被接收到的帧由接收站通过明确的应答来确认。如果发送站未收到应答,那么表明接收 站发现帧中有错误,也就是说,ACK 场已损坏或网络中的报文无站接收。CAN 协议也可通过位检查的 方法探测错误。 3.4.4 总线检测 有时,CAN 中的一个节点可监测自己发出的信号。因此,发送报文的站可以观测总线电平并探测 发送位和接收位的差异。 3.4.5 位填充 一帧报文中的每一位都由不归零码表示,可保证位编码的最大效率。然而,如果在一帧报文中有太 多相同电平的位,就有可能失去同步。为保证同步,同步沿用位填充产生。在五个生。在五个连续相等 位后,发送站自动插入一个与之互补的补码位;接收时,这个填充位被自动丢掉。例如,五个连续的低电 嵌入式专业技术论坛 (www.armjishu.com)出品 第 552 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 平位后,CAN 自动插入一个高电平位。CAN 通过这种编码规则检查错误,如果在一帧报文中有 6 个相 同位,CAN 就知道发生了错误。 如果至少有一个站通过以上方法探测到一个或多个错误,它将发送出错标志终止当前的发送。这 可以阻止其它站接收错误的报文,并保证网络上报文的一致性。当大量发送数据被终止后,发送站会自 动地重新发送数据。作为规则,在探测到错误后 23 个位周期内重新开始发送。在特殊场合,系统的恢 复时间为 31 个位周期。 但这种方法存在一个问题,即一个发生错误的站将导致所有数据被终止,其中也包括正确的数据。 因此,如果不采取自监测措施,总线系统应采用模块化设计。为此,CAN 协议提供一种将偶然错误从永 久错误和局部站失败中区别出来的办法。这种方法可以通过对出错站统计评估来确定一个站本身的 错误并进入一种不会对其它站产生不良影响的运行方法来实现,即站可以通过关闭自己来阻止正常数 据因被错误地当成不正确的数据而被终止。 3.4.6 CAN 可靠性 为防止汽车在使用寿命期内由于数据交换错误而对司机造成危险,汽车的安全系统要求数据传输 具有较高的安全性。如果数据传输的可靠性足够高,或者残留下来的数据错误足够低的话,这一目标不 难实现。从总线系统数据的角度看,可靠性可以理解为,对传输过程产生的数据错误的识别能力。 残余数据错误的概率可以通过对数据传输可靠性的统计测量获得。它描述了传送数据被破坏和 这种破坏不能被探测出来的概率。残余数据错误概率必须非常小,使其在系统整个寿命周期内,按平均 统计时几乎检测不到。计算残余错误概率要求能够对数据错误进行分类 ,并且数据传输路径可由一模 型描述。如果要确定 CAN 的残余错误概率,我们可将残留错误的概率作为具有 80~90 位的报文传送 时位错误概率的函数,并假定这个系统中有 5~10 个站,并且错误率为 1/1000,那么最大位错误概率为 10—13 数量级。例如,CAN 网络的数据传输率最大为 1Mbps,如果数据传输能力仅使用 50%,那么对于 一个工作寿命 4000 小时、平均报文长度为 80 位的系统,所传送的数据总量为 9×1010。在系统运行 寿命期内,不可检测的传输错误的统计平均小于 10—2 量级。换句话说,一个系统按每年 365 天,每天工 作 8 小时,每秒错误率为 0. 7 计算,那么按统计平均,每 1000 年才会发生一个不可检测的错误。 4.应用举例 某医院现有 5 台 16T/H 德国菲斯曼燃气锅炉,向洗衣房、制剂室、供应室、生活用水、暖气等 设施提供 5kg/cm2 的蒸汽,全年耗用天然气 1200 万 m3,耗用 20 万吨自来水。医院采用接力式方式供 热,对热网进行地域性管理,分四大供热区。其中冬季暖气的用气量很大,据此设计了基于 CAN 现 场总线的分布式锅炉蒸汽热网智能监控系统。现场应用表明:该楼宇自动化系统具有抗干扰能力强, 现场组态容易,网络化程度高,人机界面友好等特点。 CAN 总线典型特征 CAN 总线有如下基本特点 ◎ 废除传统的站地址编码,代之以对通信数据块进行编码,可以多主方式工作; ◎ 采用非破坏性仲裁技术,当两个节点同时向网络上传送数据时,优先级低的节点主动停止数 据发送,而优先级高的节点可不受影响继续传输数据,有效避免了总线冲突; ◎ 采用短帧结构,每一帧的有效字节数为 8 个,数据传输时间短,受干扰的概率低,重新发送 的时间短; ◎ 每帧数据都有 CRC 校验及其他检错措施,保证了数据传输的高可靠性,适于在高干扰环境 下使用; ◎ 节点在错误严重的情况下,具有自动关闭总线的功能,切断它与总线的联系,以使总线上其 他操作不受影响; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 553 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 ◎ 可以点对点,一对多及广播集中方式传送和接受数据。 CAN 总线的优点 ● 具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点; ● 采用双线串行通信方式,检错能力强,可在高噪声干扰环境中工作; ● 具有优先权和仲裁功能,多个控制模块通过 CAN 控制器挂到 CAN-bus 上,形成多主机局 部网络; ● 可根据报文的 ID 决定接收或屏蔽该报文; ● 可靠的错误处理和检错机制; ● 发送的信息遭到破坏后,可自动重发; ● 节点在错误严重的情况下具有自动退出总线的功能; ● 报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息。 STM32 处理器的 CAN 总线,支持 CAN 协议 2.0A 和 2.0B。具有以下特点: — 支持CAN协议2.0A和2.0B主动模式 — 波特率最高可达1兆位/秒 — 支持时间触发通信功能 发送 — 3个发送邮箱 — 发送报文的优先级特性可软件配置 — 记录发送SOF时刻的时间戳 接收 — 3级深度的2个接收FIFO — 14个位宽可变的过滤器组-由整个CAN共享标识符列表 — FIFO溢出处理方式可配置 — 记录接收SOF时刻的时间戳 — 可支持时间触发通信模式 ‹ 禁止自动重传模式 ‹ 16位自由运行定时器 ‹ 定时器分辨率可配置 ‹ 可在最后2个数据字节发送时间戳 管理 — 中断可屏蔽 — 邮箱占用单独1块地址空间,便于提高软件效率 嵌入式专业技术论坛 (www.armjishu.com)出品 第 554 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 STM32 的 CAN 一共有 3 个主要的工作模式,分别是初始化、正常和睡眠模式。 ‹ 初始化模式 软件通过对CAN_MCR寄存器的INRQ位置1,来请求bxCAN进入初始化模式,然后等待硬件对 CAN_MSR寄存器的INAK位置1来进行确认软件通过对CAN_MCR寄存器的INRQ位清0,来请求 bxCAN退出初始化模式,当硬件对CAN_MSR寄存器的INAK位清0就确认了初始化模式的退出。 当bxCAN处于初始化模式时,报文的接收和发送都被禁止,并且CANTX引脚输出隐性位(高电 平)。 ‹ 正常模式 在初始化完成后,软件应该让硬件进入正常模式,以便正常接收和发送报文。软件可以通过对 CAN_MCR寄存器的INRQ位清0,来请求从初始化模式进入正常模式,然后要等待硬件对CAN_MSR 寄存器的INAK位置1的确认。在跟CAN总线取得同步,即在CANRX引脚上监测到11个连续的隐性位 (等效于总线空闲)后,bxCAN才能正常接收和发送报文。 ‹ 睡眠模式(低功耗) 软件通过对CAN_MCR寄存器的SLEEP位置1,来请求进入这一模式。在该模式下,bxCAN的时 钟停止了,但软件仍然可以访问邮箱寄存器。当bxCAN处于睡眠模式,软件想通过对CAN_MCR寄 存器的INRQ位置1,来进入初始化式,那么软件必须同时对SLEEP位清0才行。 有2种方式可以唤醒(退出睡眠模式)bxCAN:通过软件对SLEEP位清0,或硬件检测CAN总线 的活动。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 555 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.41.2 实验原理 CAN 发送报文介绍 应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器 的TXRQ位置1,来请求发送。TXRQ位置1后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对 邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的 邮箱,参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。一旦CAN 总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。一旦邮箱中的报文被 成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一 次成功发送。 如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置1,由于发送错误引起的,就 对TERR位置1。 发送的优先级可以由标识符和发送请求次序决定: — 由标识符决定 当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符 数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。 — 由发送请求次序决定 通过对CAN_MCR寄存器的TXFP位置1,可以把发送邮箱配置为发送FIFO。在该模式下,发送 的优先级由发送请求次序决定。该模式对分段发送很有用。 CAN 接收报文介绍 接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU 的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO 中最先收到的报文。 根据CAN协议,当报文被正确接收(直到EOF域的最后1位都没有错误),且通过了标识符过滤, 那么该报文被认为是有效报文。 — 接收相关的中断条件 z 一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE 位为1,那么就会产生一个中断请求。 z 当FIFO变满时(即第3个报文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果 CAN_IER寄存器的FFIE位为1,那么就会产生一个满中断请求。 z 在溢出的情况下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位为1,那么就会产 生一个溢出中断请求 — 标识符过滤 在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以 广播的形式把报文发送给所有的接收者。(注:不是一对一通信,而是多机通信)节点在接收报文 时-根据标识符的值-决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报 文就被丢弃且无需软件的干预。 为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以 便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用 一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 556 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 过滤器的模式的设置 z 通过设置CAN_FM0R的FBMx位,可以配置过滤器组为标识符列表模式或屏蔽位模式。 z 为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。 z 为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。 z 应用程序不用的过滤器组,应该保持在禁用状态。 过滤器优先级规则 z 位宽为32位的过滤器,优先级高于位宽为16位的过滤器 z 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式 z 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高 上面的例子说明了bxCAN的过滤器规则:在接收一个报文时,其标识符首先与配置在标识符列 表模式下的过滤器相比较;如果匹配上,报文就被存放到相关联的FIFO中,并且所匹配的过滤器的 序号被存入过滤器匹配序号中。如同例子中所显示,报文标识符跟#4标识符匹配,因此报文内容和 FMI4被存入FIFO。 如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。 如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件 有任何打扰。 — 接收邮箱(FIFO) 在接收到一个报文后,软件就可以访问接收FIFO的输出邮箱来读取它。一旦软件处理了报文(如 把它读出来),软件就应该对CAN_RFxR寄存器的RFOM位进行置1,来释放该报文,以便为后面收 嵌入式专业技术论坛 (www.armjishu.com)出品 第 557 页,共 771 页 www.armjishu.com V1.1 到的报文留出存储空间。 ARM 技术论坛 神舟王 STM32F407 用户手册 中断 bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以 单独允许和禁用。 发送中断可由下列事件产生: ─ 发送邮箱0变为空,CAN_TSR寄存器的RQCP0位被置1。 ─ 发送邮箱1变为空,CAN_TSR寄存器的RQCP1位被置1。 ─ 发送邮箱2变为空,CAN_TSR寄存器的RQCP2位被置1。 FIFO0中断可由下列事件产生: ─ FIFO0接收到一个新报文,CAN_RF0R寄存器的FMP0位不再是‘00’。 ─ FIFO0变为满的情况,CAN_RF0R寄存器的FULL0位被置1。 ─ FIFO0发生溢出的情况,CAN_RF0R寄存器的FOVR0位被置1。 FIFO1中断可由下列事件产生: ─ FIFO1接收到一个新报文,CAN_RF1R寄存器的FMP1位不再是‘00’。 ─ FIFO1变为满的情况,CAN_RF1R寄存器的FULL1位被置1。 ─ FIFO1发生溢出的情况,CAN_RF1R寄存器的FOVR1位被置1。 错误和状态变化中断可由下列事件产生: ─ 出错情况,关于出错情况的详细信息请参考CAN错误状态寄存器(CAN_ESR)。 ─ 唤醒情况,在CAN接收引脚上监视到帧起始位(SOF)。 ─ CAN进入睡眠模式。 波特率设定 CAN总线通信的难点在于波特率的设定 ,当然如果是近距离通信,只有几十米那就可以忽略了, 如果几公里 波特率位序时序 都需要好好计算不然通信是不成功的。 CAN控制器器只需要进行少量的设置就可以进行通信,就可以像RS232/485那样使用。其中较难 设置的部分就是通信波特率的计算。CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特 率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。 实际上,CAN总线的波特率是一个范围。假设定义的波特率是250KB/S,但是实际上根据对寄 存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置),简单介绍一个波特 率的计算,在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间 段包括: A. 位同步时间(Tsync) B. 时间段1(Tseg1) C. 时间段2(Tseg2) 其中位同步时间占用1个Tscl;时间段2占用(Tseg1+1)个Tscl;时间段2占用(Tseg2+1)个Tscl,所以 CAN控制器的位时间(TBit)就是:TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl,那么CAN的波 特率(CANbps)就是1/TBit。 但是这样计算出的值是一个理论值。在实际的网络通信中由于存在传输的延时、不同节点的晶 体的误差等因素,使得网络CAN的波特率的计算变得复杂起来。CAN在技术上便引入了重同步的概 念,以更好的解决这些问题。这样重同步带来的结果就是要么时间段1(Tseg1)增加TSJW(同步跳转 宽度SJW+1),要么时间段减少TSJW,因此CAN的波特率实际上有一个范围: 1/(Tbit+Tsjw) ≤CANbps≤1/(Tbit-Tsjw) CAN有波特率的值四以下几个元素决定: A. 最小时间段Tscl; B. 时间段1 TSEG1; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 558 页,共 771 页 www.armjishu.com ARM 技术论坛 V1.1 C. 时间段2 TSEG2; D. 同步跳转宽度 SJW 神舟王 STM32F407 用户手册 那么Tscl又是怎么计算的呢?这是总总线时序寄存器中的预分频寄存器BRP派上了用场,Tscl= (BRP+1)/FVBP。FVBP为微处理器的外设时钟。 而TSEG1与TSEG2又是怎么划分的呢?TSEG1与TSEG2的长度决定了CAN数据的采样点,这种 方式允许宽范围的数据传输延迟和晶体的误差。其中TSEG1用来调整数据传输延迟时间造成的误差, 而TSEG2则用来调 整不同点节点晶体频率的误差。但是他们由于过于灵活,而使初次接触CAN 的人有点无所适从。TSEG1与TSEG2的是分大体遵循以下规则: Tseg2≥Tscl2,Tseg2≥2TSJW, Tseg1≥Tseg2 总的来说,对于CAN的波特率计算问题,把握一个大的方向就行了,其计算公式可了规结为: BitRate = Fpclk/( (BRP+1) * ((Tseg1+1)+(Tseg2+1)+1) 7.41.3 实验原理 本实验的基本原理是:我们将 CAN 配置成环回模式进行数据的发送和接收,通过将接收到的数据 和发送的数据进行对比,判断实验是否成功,并通过 LED 灯和串行显示实验是否 。 实验的基本流程: CAN 总线进行数据的发送和接收,发送接收前需要进行相应的配置。本实验中数据的发送和接 收流程如下: 1)对 CAN 总线进行配置。比如将 CAN 重置,配置 CAN 为环回模式及波特率等。 2)对 CAN 总线过滤器进行设置。在接收数据时数据要通过过滤器。因此在接收数据前需要对 过滤器进行配置。指定过滤器的编号,设定过滤器的标识符,对过滤器进行使能。 3)CAN 总线的发送设置。在发送数据之前,需要对报文进行设置。比如,发送的报文是使用 标准标识符还是扩展标识符。数据帧的长度是多少。具体发送什么数据等。 4)发送数据。数据发送的时候也有它自己的流程。 5)CAN 总线的接收设置。经过前面的步骤我们已经将数据发送到 FIFO 里边。我们将数据读取 出来之前,需要对用来存放接收数据的变量进行清 0。 6)接收数据。将接收到的数据和发送的数据一一进行对比,就可以判断实验的成功与否。当然 接收数据它也有自己的一个流程。 下面我们对实验的原理进行详细的分析: 在环回模式下,bxCAN 在内部把 Tx 输出回馈到 Rx 输入上,而完全忽略 CANRX 引脚的实际状态。 环回模式是一个自发自收模式。如下如图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 559 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 本实验中,数据的流向非常的简单。我们把 CAN1 配置成环回模式,换回模式下数据自发自收。 数据从邮箱经过接收过滤器进入接收 FIFO。在 STM32 互联型产品中,带有 2 个 CAN 控制器, STM32F407ZGT6 属于互联型。双 CAN 的框图如下: 从图中可以看出两个 CAN 都分别拥有自己的发送邮箱和接收 FIFO,但是它们共用 28 个过滤器 嵌入式专业技术论坛 (www.armjishu.com)出品 第 560 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 (互联型)。每个滤波器组由 2 个 32 位的寄存器,CAN_FxR1 和 CAN_FxR2 组成。通过 CAN_FMR 寄存器,设置滤波器组的位宽和工作模式。 CAN 发送报文介绍 应用程序选择1个空发送邮箱;设置标识符,数据长度和待发送数据;然后对CAN_TIxR寄存器 的TXRQ位置1,来请求发送。TXRQ位置1后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对 邮箱寄存器就不再有写的权限。TXRQ位置1后,邮箱马上进入挂号状态,并等待成为最高优先级的 邮箱,参见发送优先级。一旦邮箱成为最高优先级的邮箱,其状态就变为预定发送状态。一旦CAN 总线进入空闲状态,预定发送邮箱中的报文就马上被发送(进入发送状态)。一旦邮箱中的报文被 成功发送后,它马上变为空邮箱;硬件相应地对CAN_TSR寄存器的RQCP和TXOK位置1,来表明一 次成功发送。 如果发送失败,由于仲裁引起的就对CAN_TSR寄存器的ALST位置1,由于发送错误引起的,就 对TERR位置1。 发送的优先级可以由标识符和发送请求次序决定: — 由标识符决定 当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符 数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。 — 由发送请求次序决定 通过对CAN_MCR寄存器的TXFP位置1,可以把发送邮箱配置为发送FIFO。在该模式下,发送 的优先级由发送请求次序决定。该模式对分段发送很有用。 CAN 接收报文介绍 接收到的报文,被存储在3级邮箱深度的FIFO中。FIFO完全由硬件来管理,从而节省了CPU 的处理负荷,简化了软件并保证了数据的一致性。应用程序只能通过读取FIFO输出邮箱,来读取FIFO 中最先收到的报文。 根据CAN协议,当报文被正确接收(直到EOF域的最后1位都没有错误),且通过了标识符过滤, 那么该报文被认为是有效报文。 — 接收相关的中断条件 z 一旦往FIFO存入1个报文,硬件就会更新FMP[1:0]位,并且如果CAN_IER寄存器的FMPIE 位为1,那么就会产生一个中断请求。 z 当FIFO变满时(即第3个报文被存入),CAN_RFxR寄存器的FULL位就被置1,并且如果 CAN_IER寄存器的FFIE位为1,那么就会产生一个满中断请求。 z 在溢出的情况下,FOVR位被置1,并且如果CAN_IER寄存器的FOVIE位为1,那么就会产 生一个溢出中断请求 — 标识符过滤 在CAN协议里,报文的标识符不代表节点的地址,而是跟报文的内容相关的。因此,发送者以 广播的形式把报文发送给所有的接收者。(注:不是一对一通信,而是多机通信)节点在接收报文 时-根据标识符的值-决定软件是否需要该报文;如果需要,就拷贝到SRAM里;如果不需要,报 文就被丢弃且无需软件的干预。 为满足这一需求,bxCAN为应用程序提供了14个位宽可变的、可配置的过滤器组(13~0),以 便只接收那些软件需要的报文。硬件过滤的做法节省了CPU开销,否则就必须由软件过滤从而占用 一定的CPU开销。每个过滤器组x由2个32位寄存器,CAN_FxR0和CAN_FxR1组成。 过滤器的模式的设置 z 通过设置CAN_FM0R的FBMx位,可以配置过滤器组为标识符列表模式或屏蔽位模式。 z 为了过滤出一组标识符,应该设置过滤器组工作在屏蔽位模式。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 561 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 z 为了过滤出一个标识符,应该设置过滤器组工作在标识符列表模式。 z 应用程序不用的过滤器组,应该保持在禁用状态。 过滤器优先级规则 z 位宽为32位的过滤器,优先级高于位宽为16位的过滤器 z 对于位宽相同的过滤器,标识符列表模式的优先级高于屏蔽位模式 z 位宽和模式都相同的过滤器,优先级由过滤器号决定,过滤器号小的优先级高 上面的例子说明了bxCAN的过滤器规则:在接收一个报文时,其标识符首先与配置在标识符列 表模式下的过滤器相比较;如果匹配上,报文就被存放到相关联的FIFO中,并且所匹配的过滤器的 序号被存入过滤器匹配序号中。如同例子中所显示,报文标识符跟#4标识符匹配,因此报文内容和 FMI4被存入FIFO。 如果没有匹配,报文标识符接着与配置在屏蔽位模式下的过滤器进行比较。 如果报文标识符没有跟过滤器中的任何标识符相匹配,那么硬件就丢弃该报文,且不会对软件 有任何打扰。 — 接收邮箱(FIFO) 在接收到一个报文后,软件就可以访问接收FIFO的输出邮箱来读取它。一旦软件处理了报文(如 把它读出来),软件就应该对CAN_RFxR寄存器的RFOM位进行置1,来释放该报文,以便为后面收 到的报文留出存储空间。 本实验中,我们将过滤器,配置成无论送来什么数据,都接收的状态。过滤器的详细介绍,请 参考《STM32F4 参考手册 DM00031020.pdf》的 27 章相关 CAN 过滤器的内容。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 562 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 中断 bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以 单独允许和禁用。 发送中断可由下列事件产生: ─ 发送邮箱0变为空,CAN_TSR寄存器的RQCP0位被置1。 ─ 发送邮箱1变为空,CAN_TSR寄存器的RQCP1位被置1。 ─ 发送邮箱2变为空,CAN_TSR寄存器的RQCP2位被置1。 FIFO0中断可由下列事件产生: ─ FIFO0接收到一个新报文,CAN_RF0R寄存器的FMP0位不再是‘00’。 ─ FIFO0变为满的情况,CAN_RF0R寄存器的FULL0位被置1。 ─ FIFO0发生溢出的情况,CAN_RF0R寄存器的FOVR0位被置1。 FIFO1中断可由下列事件产生: ─ FIFO1接收到一个新报文,CAN_RF1R寄存器的FMP1位不再是‘00’。 ─ FIFO1变为满的情况,CAN_RF1R寄存器的FULL1位被置1。 ─ FIFO1发生溢出的情况,CAN_RF1R寄存器的FOVR1位被置1。 错误和状态变化中断可由下列事件产生: ─ 出错情况,关于出错情况的详细信息请参考CAN错误状态寄存器(CAN_ESR)。 ─ 唤醒情况,在CAN接收引脚上监视到帧起始位(SOF)。 ─ CAN进入睡眠模式。 波特率设定 CAN总线通信的难点在于波特率的设定 ,当然如果是近距离通信,只有几十米那就可以忽略了, 如果几公里 波特率位序时序 都需要好好计算不然通信是不成功的。 CAN控制器器只需要进行少量的设置就可以进行通信,就可以像RS232/485那样使用。其中较难 设置的部分就是通信波特率的计算。CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特 率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。 实际上,CAN总线的波特率是一个范围。假设定义的波特率是250KB/S,但是实际上根据对寄 存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置),简单介绍一个波特 率的计算,在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间 段包括: A. 位同步时间(Tsync) B. 时间段1(Tseg1) C. 时间段2(Tseg2) 其中位同步时间占用1个Tscl;时间段2占用(Tseg1+1)个Tscl;时间段2占用(Tseg2+1)个Tscl,所以 CAN控制器的位时间(TBit)就是:TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl,那么CAN的波 特率(CANbps)就是1/TBit。 但是这样计算出的值是一个理论值。在实际的网络通信中由于存在传输的延时、不同节点的晶 体的误差等因素,使得网络CAN的波特率的计算变得复杂起来。CAN在技术上便引入了重同步的概 念,以更好的解决这些问题。这样重同步带来的结果就是要么时间段1(Tseg1)增加TSJW(同步跳转 宽度SJW+1),要么时间段减少TSJW,因此CAN的波特率实际上有一个范围: 1/(Tbit+Tsjw) ≤CANbps≤1/(Tbit-Tsjw) CAN有波特率的值四以下几个元素决定: A. 最小时间段Tscl; B. 时间段1 TSEG1; C. 时间段2 TSEG2; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 563 页,共 771 页 www.armjishu.com ARM 技术论坛 V1.1 D. 同步跳转宽度 SJW 神舟王 STM32F407 用户手册 那么Tscl又是怎么计算的呢?这是总总线时序寄存器中的预分频寄存器BRP派上了用场,Tscl= (BRP+1)/FVBP。FVBP为微处理器的外设时钟。 而TSEG1与TSEG2又是怎么划分的呢?TSEG1与TSEG2的长度决定了CAN数据的采样点,这种 方式允许宽范围的数据传输延迟和晶体的误差。其中TSEG1用来调整数据传输延迟时间造成的误差, 而TSEG2则用来调 整不同点节点晶体频率的误差。但是他们由于过于灵活,而使初次接触CAN 的人有点无所适从。TSEG1与TSEG2的是分大体遵循以下规则: Tseg2≥Tscl2,Tseg2≥2TSJW, Tseg1≥Tseg2 总的来说,对于CAN的波特率计算问题,把握一个大的方向就行了,其计算公式可了规结为: BitRate = Fpclk/( (BRP+1) * ((Tseg1+1)+(Tseg2+1)+1) 7.41.4 硬件设计 在神舟王 407 开发板中,我们使用了处理器 STM32F407ZGT6 的 CAN 外扩 TI 的 VP230 CAN 总 线收发芯片来实现 CAN 总线接口。 神舟王 407 开发板板载了 1 组 CAN 总线接口(在底板上,还预留了另一个 CAN 接口)。 STM32F407ZGT6 这款处理器集成了 CAN 总线接口,在开发板上我们使用了 TI 公司的 3.3V 电压的 CAN 总线收发器来实现 CAN 物理层,如下图所示。CAN 总线收发器型号为 VP230。 相关硬件电路如下: 图表 27 CAN 总线接口原理图 其中 VP230 是 TI 公司推出的 3.3V CAN 总线收发器。它具有如下特性: — 工作电压为 3.3V — 满足 HBM 模式 16KV 的 ESD 防护 — 允许总线上最到 120 个节点 — 符合 ISO 11898 标准要求 嵌入式专业技术论坛 (www.armjishu.com)出品 第 564 页,共 771 页 www.armjishu.com V1.1 — 具有过热关断保护功能 VP230 的逻辑框图如下: ARM 技术论坛 神舟王 STM32F407 用户手册 管脚功能如下: CAN网拓扑结构: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 565 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.41.5 软件设计 时钟使能配置 在本实验中,我们分别通过轮询和中断两种方式,测试CAN总线的环回,并通过串口指示CAN 总线环回结果。因此,我们先初始化使用到的硬件资源有串口,具体代码如下: CAN 总线中断配置 在本实验中,我们通过分别利用轮询和中断方式进行CAN的环回(loopback)实验,因此,我们 需要设置CAN1接口的接收终端及其优先级,在本例程中,设置中断组1个,CAN1的子优先级级为0, 相关代码如下: 我们这里使用的是USE_CAN1。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 566 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 轮询方式CAN总线环回测试 在本实验中,CAN环回实验,分成中断和轮询两种模式进行测试,其中轮询方式的CAN接口初 始化和测试主要是由TestStatus CAN_Polling(void)函数实现的。 在这个函数中,我们首先对CAN1接口进行配置,包括bus-off管理,wake-up模式设置等等, 其 中CAN_Init函数根据CAN_InitStruct中指定的参数初始化CAN寄存器,相关代码如下: CAN_InitStruct 结构体的成员说明见下表 CAN_TTCM CAN_TTCM用来使能或去使能时间触发通讯模式 CAN_ABOM CAN_ABOM用来使能或者去使能自动离线管理 CAN_AWUM CAN_AWUM用来使能或者去使能自动唤醒模式 CAN_NART CAN_NART用来使能或者去使能非自动重传模式 CAN_RFLM CAN_RFLM用来使能或者去使能FIFO锁定模式 CAN_TXFP CAN_TXFP用来使能或者去使能发送FIFO优先级 CAN_MODE 设置CAN工作模式,可设置为正常工作模式(CAN_Mode_Normal) 静 默模式(CAN_Mode_Silent),环回模式( CAN_Mode_LoopBack)和 静默环回模式(CAN_Mode_Silent_LoopBack) CAN_SJW 定义重新同步跳跃宽度,即每位中可以延长或缩短多少个时间单位的上 限,可设置为1~4个时间单位(CAN_SJW_1tq~ CAN_SJW_4tq) CAN_BS1 设 定 时 间 段 1 的 时 间 单 位 数 目 , 可 设 置 为 1 ~ 16 个 时 间 单 位 (CAN_BS1_1tq~ CAN_BS1_16tq)。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 567 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 CAN_BS2 设 定 时 间 段 2 的 时 间 单 位 数 目 , 可 设 置 为 1 ~ 16 个 时 间 单 位 (CAN_BS1_1tq~ CAN_BS1_16tq)。 CAN_Prescaler 设定一个时间单位的长度,它的范围是1~1024 CAN的基本参数配置,主要在CAN主控制寄存器(CAN_MCR)中完成。感兴趣的朋友可以打 开函数CAN_Init( )对该寄存器的每一位进行对照。在完成CAN的基本参数配置以后,我们还需要对 滤波器的参数进行配置,这个主要是通过CAN_FilterInit函数实现的,相关代码如下: CAN_FilterNumber 指定待初始化的过滤器,它的范围是1到13 CAN_FilterMode 指定过滤器将被初始化的模式,可设置为标识符屏蔽位模式 ( CAN_FilterMode_IdMask ) 或 者 标 识 符 列 表 模 式 (CAN_FilterMode_IdList) CAN_FilterScale 过 滤 器 位 宽 , 可 设 置 为 2 个 16 位 过 滤 器 ( CAN_FilterScale_Two16bit ) 或 者 1 个 32 位 过 滤 器 (CAN_FilterScale_One32bit)。 CAN_FilterIDHigh 用来设定过滤器标识符(32位位宽时为其高段位,16位宽时 为第一个)。它的范围是0x0000到0xFFFF。 CAN_FilterIDLow 用来设定过滤器标识符(32位位宽时为其低段位,16位宽时 为第二个)。它的范围是0x0000到0xFFFF。 CAN_FilterMaskIDHigh 用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时 为其高段位,16位宽时为第一个)。它的范围是0x0000到 0xFFFF。 CAN_FilterMaskIDLow 用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时 为其低段位,16位宽时为第二个)。它的范围是0x0000到 0xFFFF。 CAN_FilterFIFOAssignment 设置指向过滤器的FIFO(0或者1) CAN_FilterActivation 使能或者去使能过滤器 代码中我们发现: CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; 即将过滤的标识符全置0,那么所有发过来的包都接收。我们完成了CAN总线接口的参数配置和滤波 器配置,正常情况下,我们就可以使用CAN总线接口了,在接下来,我们来看一下另两个非常重要 的函数CAN_Transmit()和CAN_Receive(),如何发送和接收一个正确格式的CAN帧。 在我们的例程中,CAN_Transmit()相关的代码为 嵌入式专业技术论坛 (www.armjishu.com)出品 第 568 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 它的相关参数说明如下: StdId 用来设定标准标识符。可设置为0到0x7FF ExtId 用来设定扩展标识符,可设置为0到0x3FFFF IDE 用来设定消息标识符的类型,可设置为使用标准标识符(CAN_ID_STD)或者 使用标准标识符+扩展标识符(CAN_ID_EXT) RTR 设定待传输消息的帧类型,可设置为数据帧(CAN_RTR_DATA)或者远程帧 (CAN_RTR_REMOTE) DLC 用来设定带传输消息的帧长度。取值范围0到0x8 Data[8] 待传输的数据 有代码可知,TxMessage.StdId=0x11将标识符设置成标准标识符。TxMessage.DLC=2,设置传输消息 的帧长度为2。两个数据分别为0xCA、0xFE。 在调用Transmit发送一帧数据后,程序通过CAN_TransmitStatus()函数,检查CAN数据帧是否正 常传输,待进入传输状态以后,由于是采用LoopBack方式,数据应该马上环回回接收侧,因此程序 接下来又调用CAN_MessagePending()检查CAN接口的挂号信息数据,大于等于1表示接收到的新的数 据,调用CAN_Receive函数进行处理。相关代码为 它的相关参数说明如下: StdId 用来设定标准标识符。可设置为0到0x7FF ExtId 用来设定扩展标识符,可设置为0到0x3FFFF IDE 用来设定消息标识符的类型,可设置为使用标准标识符(CAN_ID_STD) 或者使用标准标识符+扩展标识符(CAN_ID_EXT) RTR 设定待传输消息的帧类型,可设置为数据帧(CAN_RTR_DATA)或者远 程帧(CAN_RTR_REMOTE) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 569 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 DLC 用来设定带传输消息的帧长度。取值范围0到0x8 Data[8] 待传输的数据 FMI 设定消息将要通过的过滤器索引 我们发现代码中主要是对RxMessage的各个成员进行清0,初始化。准备用于存放读取出来的数 据。至此,就实现了一个CAN总线的LoopBack模式的数据收发,在例程中,还对接收的数据的正确 性进行了一系列的判断,最终确认接收到的数据是否出现错误。并返回对应的状态。 中断方式CAN总线环回测试 前面,我们分析了CAN总线环回实验的轮询模式的具体实现过程,接下来,我们一起分析一下, 中断模式下的CAN总线的环回具体实现过程。这个主要是在CAN_Interrupt(void)函数实现的。 首先,和轮询模式一样,我们也需要通过利用CAN_Init函数和CAN_FilterInit函数初始化CAN接 口和滤波器参数。 主要的不同是,在完成上述初始化以后,我们需要使用CAN FIFO的中断,并完成对应的中断服 务程序。我们看一下函数CAN_ITConfig()。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 570 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 可以看到函数主要对中断使能寄存器(CAN_IER)进行配置。CAN_IER寄存器如下: 我们传进来的参数CAN_IT_FMP0被定义成 ((uint32_t)0x00000002)。0x00000002化为二进制前面的高 位全是0,最后4位是0010,刚好对中断使能寄存器的第二位FMPIE0置1。FIFO 0消息挂号中断使能, 当FIFO 0的 FMP【1:0】为非0时,产生中断。 而 FIFO 从 空 状 态 开 始 , 接 收 到 一 个 有 效 的 报 文 后 , FIFO 状 态 变 为 挂 号 _1 , 硬 件 相 应 地 把 CAN_RFR寄存器的FMP【1:0】设置为01(二进制)。即,接收到一个有效的报文后,产生中断。 在主程序中,开启了FIFO的中断响应使能以后,程序调用了CAN_Transmit函数发送CAN数据帧, 由于CAN工作与环回模式,发送的数据帧环回回CAN接口,在中断服务程序中,对接收的帧进行处 理。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 571 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 中断服务程序位于stm32f4xx_it.c文件中,具体的函数实现为 嵌入式专业技术论坛 (www.armjishu.com)出品 第 572 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 当 FIFO 产生中断时,处理器将自动进入中断服务程序。并对数据正确性进行判断,并返回对应 的状态。 7.41.6 下载与验证 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按错误!未找到引用 源。错误!未找到引用源。小节进行操作。 7.41.7 实验现象 首先将固件分别下载到神舟王407开发板,上电运行开发板,正常情况下,串口会有测试打印如 下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 573 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.42 SPI_FLASH_W25X16_ (神舟王STM32F407-库函数版) 本节将利用SPI来实现对神舟王407板载的FLASH(W25X16)的读写,并将结果通 过串口显示在PC机上。后续升级,便将显示结果从LCD屏上显示出来。 7.42.1 SPI FLASH(W25X16)读写程序实验的的意义与作用 SPI总线是Motorola公司推出的三线同步接口,主要应用在FLASH,EEPROM以及一些数字通信 中。神舟王407硬件上使用到SPI接口的有:触摸屏,音频DA芯片PCM1770,W25X16,ENC28J60以 太网芯片以及2.4G无线模块。 SPI总线接口作为一种非常基本的外设接口,但是其应用却是很广泛。通过本例程SPI对W25X16 的读写实验,让大家简单了解SPI的通信原理。 7.42.2 实验原理 SPI(串行外设接口)是一种高速的,全双工,同步的通信总线,并且在芯片的管脚 上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是 出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32也有SPI 接口,可以配置为SPI协议或者I2S协议。下面先介绍STM32的SPI接口: 通常SPI通过4个引脚与外部器件相连: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 574 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 ¾ MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。 ¾ MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。 ¾ SCK:串口时钟,作为主设备的输出,从设备的输入 ¾ NSS:从设备选择。这是一个可选的引脚,用来选择主/从设备。它的功能是用来作为“片选 引脚”,让主设备可以单独地与特定从设备通讯,避免数据线上的冲突。从设备的NSS引脚可 以由主设备的一个标准I/O引脚来驱动。一旦被使能(SSOE位),NSS引脚也可以作为输出引脚, 并在SPI处于主模式时拉低;此时,所有的SPI设备,如果它们的NSS引脚连接到主设备的NSS 引脚,则会检测到低电平,如果它们被设置为NSS硬件模式,就会自动进入从设备状态。当 配置为主设备、NSS配置为输入引脚(MSTR=1,SSOE=0)时,如果NSS被拉低,则这个SPI 设备进入主模式失败状态:即MSTR位被自动清除,此设备进入从模式。 时钟信号的相位和极性 SPI_CR寄存器的CPOL和CPHA位,能够组合成四种可能的时序关系。CPOL(时钟极性)位控制在 没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。如果CPOL被清’0’, SCK引脚在空闲状态保持低电平;如果CPOL被置’1’,SCK引脚在空闲状态保持高电平。 如果CPHA(时钟相位)位被置’1’,SCK时钟的第二个边沿(CPOL位为0时就是下降沿,CPOL位 为’1’时就是上升沿)进行数据位的采样,数据在第二个时钟边沿被锁存。如果CPHA位被清’0’,SCK 时钟的第一边沿(CPOL位为’0’时就是下降沿,CPOL位为’1’时就是上升沿)进行数据位采样,数据在 第一个时钟边沿被锁存。 CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。下图显示了SPI传输的4种 CPHA和CPOL位组合。此图可以解释为主设备和从设备的SCK脚、MISO脚、MOSI脚直接连接的主 或从时序图。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 575 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 CPOL时钟极性和CPHA时钟相位的组合选择数据捕捉的时钟边沿。上图显示了SPI传输的4种 CPHA和CPOL位组合。此图可以解释为主设备和从设备的SCK脚、MISO脚、MOSI脚直接连接的主 或从时序图。 注意: 1. 在改变CPOL/CPHA位之前,必须清除SPE位将SPI禁止。 2. 主和从必须配置成相同的时序模式。 3.SCK的空闲状态必须和SPI_CR1寄存器指定的极性一致(CPOL为’1’时,空闲时应上拉SCK为高 电平;CPOL为’0’时,空闲时应下拉SCK为低电平)。 4. 数据帧格式(8位或16位)由SPI_CR1寄存器的DFF位选择,并且决定发送/接收的数据长度。 数据帧格式 根据SPI_CR1寄存器中LSBFIRST位,输出数据位时可以MSB在先也可以LSB在先。根据SPI_CR1 寄存器的DFF位,每个数据帧可以是8位或是16位。所选择的数据帧格式对发送和/或接收都有效。 本例程中,我们采用STM32的SPI1作为主模式来读取外部SPI FLASH芯片(W25X16),实现读 写功能。下面简单说明SPI1部分的配置情况: 在主配置时,在SCK脚输出串行时钟。 配置步骤: a) 配置 SPI 串行时钟波特率; b) 定义数据传输和串行时钟间的相位关系。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 576 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 c) 设置 8 位或 16 位数据帧格式; d) 如果需要 NSS 引脚工作在输入模式,硬件模式下,在整个数据帧传输期间应把 NSS 脚连接 到高电平,在软件模式下,需设置 SPI_CR1 寄存器的 SSM 位和 SSI 位。如果 NSS 引脚工作 在输出模式,则只需要设置 SSOE 位; e) 必须设置 MSTR 位和 SPE 位(只当 NSS 脚被连接到高电平,这些位才能保持置位)。 在这个配置中,MOSI引脚是数据输出,而MISO引脚是数据输入。 接下来简单了解一下W25X16芯片。W25X16是华邦公司推出的容量为16Mb,也就是2M字节的 芯片,容量大小跟AT45DB161是一样的。 W25X16芯片将2M的容量分为32个块(Block),每个块大小为64K字节,每个块又分为16个扇 区(Sector),每个扇区4K个字节。W25X16的最少擦除单位为一个扇区,也就是每次必须擦除4K个 字节。这样我们需要给W25X16开辟一个至少4K的缓存区。 W25X16 的擦写周期为 10000 次,具有 20 年的数据保存期限,支持电压为 2.7~3.6V,W25X16 支持 标准的 SPI,还支持双输出的 SPI,最大 SPI 时钟可以到 75Mhz(双输出时相当于 150Mhz),详细的 W25X16 的介绍,请参考光盘资料下的“外围器件数据手册”文件夹下的《W25X16 SPI Flash 数据 手册.pdf》。 7.42.3 硬件设计 在STM32神舟王407开发板中,板载了W25X16这一SPI FLASH,处理器通过SPI1接口与之连接。 硬件原理图如下: GPIO管脚与对应的SPI管脚对应关系 W25X16管脚 SCK SO SI /CS GPIO管脚 PA5 PA6 PA7 PC4 SPI信号 SPI1_SCK SPI1_MISO SPI1_MOSI —— 说明 SPI1接口信号 由于SPI1上除了W25X16以外,还包括SPI 接口的 网口芯片,因此W25X16使用了一个GPIO管脚PC4 作为它的片选控制信号。 同时,在实现SPI1读写W25X16芯片时,DS1灯也慢速的闪烁,LED灯的原理设计在前面已经详细 描述,在此不再累赘。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 577 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.42.4 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 分析代码 1:STM_Shenzhou_LEDInit()初始化 LED 灯 分析代码 2:Printf_Init() 初始化串口打印 分析代码 3:SPI_FLASH_TEST()函数来测试 SPI FLASH 嵌入式专业技术论坛 (www.armjishu.com)出品 第 578 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 第一步:SPI_FLASH_Init(void)函数初始化 FLASH 第二步:读取 SPI FLASH 的设备 ID 号 DeviceID = SPI_FLASH_ReadDeviceID(); 第三步:读取 SPI FLASH 的 ID 号 FlashID = SPI_FLASH_ReadID(); 第四步:判断是 W25X16 还是 W25Q16,这里是采用枚举的状态,因为板卡上会焊接这两款 IC 中的 一款,这里可以灵活进行判断 第五步:通过 Tx_Buffer[]输入一段字符,写入到 SPI FLASH 中,然后再读取出来,再把读取出来的 字符跟之前写入进去的进行比较,从而判断数据是否一致 1)先擦除:SPI_FLASH_SectorErase(FLASH_SectorToErase); 2)然后写入数据:SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize); 3)读取数据:SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize); 4)比较写入和读取出来的数据是否一致:TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize); 第六步:擦除 SPI FLASH,然后判断擦除之后,是不是都为 0xFF;正确的情况下,被擦除的区间 SPI FLASH 上的值应该都是 0XFF 才是对的 嵌入式专业技术论坛 (www.armjishu.com)出品 第 579 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 第七步:经过写入数据然后读取出来的操作以及擦除之后判断是否擦除成功的操作这两步都要是对 的,才能判断这个 SPI FLASH 是好的产品,所以就通过这个 IF 语句来进行判断,然后把相对应的结 果告诉用户 第八步:最后释放掉 SPI 的资源,为了节约用电,节约功耗,要记得使用完之后,一定要释放一下 资源,这是一个好的写嵌入式代码的习惯 7.42.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.42.6 实验现象 将固件下载到神州王后,从新上电运行,正常情况下,串口打印如下 同时神州王的 LED 指示灯也会指示运行结果,具体 LED 指示灯的状态及其含义 LED 指示灯 含义 DS1 闪烁 程序正常运行 DS2 亮 测试正常通过 DS3 亮 测试失败 嵌入式专业技术论坛 (www.armjishu.com)出品 第 580 页,共 771 页 www.armjishu.com V1.1 DS4 亮 未识别到 Flash 芯片 ARM 技术论坛 神舟王 STM32F407 用户手册 7.43 SRAM访问程序(神舟王STM32F407-库函数版) 7.43.1 SRAM访问实验的意义与作用 SRAM 是英文 Static RAM 的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保 存它内部存储的数据。SRAM 的速度非常快,在快速读取和刷新时能够保持数据完整性。它的用途 广泛,用于 CPU 内部的一级缓存以及内置的二级缓存,以及一些嵌入式设备,如网络服务器以及路 由器等。 而 STM32 处理器具有 FSMC(Flexible Static Memory Controller)总线,通过合适的参数配置, 可支持不同的外部存储器类型。包括 SRAM,NorFlash,Nand Flash 等。 在本实验,将介绍如何通过 STM32 处理器的 FSMC 总线访问 SRAM。 7.43.2 FSMC的优点 FSMC(Flexible Static Memory Controller,可变静态存储控制器)是 STM32 系列中内部集成 256 KB 以上 Flash,后缀为 xC、xD 和 xE 的高存储密度微控制器特有的存储控制机制。之所以称为“可变”, 是由于通过对特殊功能寄存器的设置,FSMC 能够根据不同的外部存储器类型,发出相应的数据/ 地址/控制信号类型以匹配信号的速度,从而使得 STM32 系列微控制器不仅能够应用各种不同类型、 不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存 储器,满足系统设计对存储容量、产品体积以及成本的综合要求。 它的主要优点如下: ①.支持多种静态存储器类型。 STM32 通过 FSMC 可以与 SRAM、ROM、PSRAM、Nor Flash 和 NandFlash 存储器的引脚直接相连。 ②.支持丰富的存储操作方法。 FSMC 不仅支持多种数据宽度的异步读/写操作,而且支持对 Nor/PSRAM/Nand 存储器的同步突发访问方式。 ③.支持同时扩展多种存储器。 FSMC 的映射地址空间中,不同的 BANK 是独立的,可用于扩 展不同类型的存储器。当系统中扩展和使用多个外部存储器时,FSMC 会通过总线悬空延迟时间参 数的设置,防止各存储器对总线的访问冲突。 ④.支持更为广泛的存储器型号。通过对 FSMC 的时间参数设置,扩大了系统中可用存储器的 速度范围,为用户提供了灵活的存储芯片选择空间。 ⑤.支持代码从 FSMC 扩展的外部存储器中直接运行。不需要首先调入内部 SRAM。 7.43.3 FSMC的内部结构 STM32 微控制器之所以能够支持Nor Flash/SRAM和Nand Flash这两类访问方式完全不同的存储 器扩展,是因为FSMC内部实际包括Nor Flash和Nand/PC Card两个控制器,分别支持两种截然不同 的存储器访问方式。在STM32 内部,FSMC的一端通过内部高速总线AHB连接到内核Cortex-M3, 另一端则是面向扩展存储器的外部总线。内核对外部存储器的访问信号发送到AHB总线后,经过 FSMC转换为符合外部存储器通信规约的信号,送到外部存储器的相应引脚,实现内核与外部存储器 之间的数据交互。FSMC起到桥梁作用,既能够进行信号类型的转换,又能够进行信号宽度和时序的 调整,屏蔽掉不同存储类型的差异,使之对内核而言没有区别。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 581 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.43.4 FSMC的映射地址空间 FSMC 管理 1 GB 的映射地址空间。该空间划分为 4 个大小为 256 MB 的 BANK,每个 BANK 又 划分为 4 个 64 MB 的子 BANK,如下表所列。FSMC 的 2 个控制器管理的映射地址空间不同。Nor Flash 和 PSRAM 控制器管理第 1 个 BANK,Nand/PC Card 控制器管理第 2~4 个 BANK。由于两个控制 器管理的存储器类型不同,扩展时应根据选用的存储设备类型确定其映射位置。其中,BANK1 的 4 个子 BANK 拥有独立的片选线和控制寄存器,可分别扩展一个独立的存储设备,而 BANK2~BANK4 只有一组控制寄存器。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 582 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 FSMC对每个存储块分配一个唯一的片选信号NE[4:1]。 7.43.5 实验原理 在本实验中,首先按照SRAM芯片要求,初始化好FSMC总线后,往SRAM芯片内固定地址写入 一串确定的值,然后程序读回之前写入的数据,判断写入与读出的值是否一致,通过神舟王407的LED 灯指示程序执行结果。各种灯的指示具体含义如下: LED指示灯 含义 DS1闪烁 程序正在执行过程中 DS2亮 写入神舟王407的SRAM的数据与读出的数据一致,也就是说访问SRAM成 功 DS3亮 写入神舟王407的SRAM的数据与读出的数据不一致,也就是说访问SRAM 失败 7.43.6 硬件设计 SRAM访问实验要用到的硬件资源有: ¾ 串口 1:串口 1 在本实验中用于打印 SRAM 访问提示信号和显示 SRAM 访问程序运行结果。 串口的输入输出实验在前面已经 进行了详细的讲解,在这里就不在重复。 具体见 串口 1 的发送与接收实验。 ¾ LED 指示灯:LED 指示灯主要用于指示 SRAM 访问程序运行状态和 SRAM 访问结果。 ¾ IC61LV25616LL SRAM 7.43.6.1 1.硬件原理 在神舟王407中,通过FSMC总线与IC61LV25616LL SRAM连接,具体电路如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 583 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 在上图中,我们可以看到以下信息 z SRAM 数据宽度 从上图中可以看出,与 SRAM 连接的数据线为 FSMC_D0~D15,一共 16 位。也就是说神舟王 407 上 使用的 SRAM 为 16 位数据宽度的 SRAM。 z SRAM 的地址范围 在上图中,SRAM的CE管脚与FSMC_NE3连接。 查看STM32参考手册可知,SRAM连接到STM32F407ZG处理器的BANK1的SRAM3,看下神舟407ZGT 与FSMC的连接: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 584 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.43.6.2 2.SRAM芯片说明 在神舟王 407 中,使用的 SRAM 的 IS61LV25616 这一由 ISSI 公司推出的 SRAM 芯片。 IS61LV25616 容量为 4M 比特(如果需要配置更大容量的 SRAM,可以直接替换为 IS61LV51216, IS61LV51216 与 IS61LV25616 完全 pin-to-pin 兼容,而容量确是原来的一倍,达到 8M 比特)。 ISSI 的 IS61LV51216 是一个 8M 容量,结构为 512K*16 位字长的高速率 SRAM,512K 只需要用到 19 根 地址线(A0~A18)就可以寻址完。 IS61LV25616 的管脚定义如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 585 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.43.7 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 586 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 分析代码 1:通过函数 STM_Shenzhou_LEDInit()初始化 LED 灯,然后调用 Turn_On_LED(5)函数点 亮 4 个 LED 灯使其常亮。 分析代码 2:通过 Printf_Init()初始化串口接口,初始化串口接口之后就可以将程序的状态打印出来。 分析代码 3:SRAM_Init()初始化 SRAM 芯片 分析代码 4:Fill_Buffer(TxBuffer, BUFFER_SIZE, 0x1234);填充一段数据到 TxBuffer 的缓存中 分析代码 5:SRAM_WriteBuffer(TxBuffer, WRITE_READ_ADDR, BUFFER_SIZE);将这个 TxBuffer 的缓存写入到 SRAM 中。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 587 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 分析代码 6:SRAM_ReadBuffer(RxBuffer, WRITE_READ_ADDR, BUFFER_SIZE);再将刚才写入的数 据读出到 RxBuffer 中来。 分析代码 7:最后判断读回的数据与写入的数据是否一致,如果一致表示 SRAM 读写访问成功,如 果不同,就表示 SRAM 写入和读出失败,有可能是没写成功,也有可能是读失败。 分析代码 8:进入到 SRAM_Init(void)进行详细分析一下 SRAM 是如何被初始化的 1) 从 CPU 与 SRAM 芯片相连接的硬件原理图可以看到这些管脚是这样连的 2) 那么我们需要把这些管脚都初始化一下,初始化分为几步 第一步:初始化这些 GPIO 接口的时钟 第二步:初始化 FSMC 接口的时钟 嵌入式专业技术论坛 (www.armjishu.com)出品 第 588 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 第三步:因为要将这些 GPIO 管脚做为 FSMC 总线使用,那么就需要重映射这些管脚到 FSMC 总线 上去,一个一个结构轮流来,这里是初始化 GPIOD 端口的管脚变成 FSMC 功能的管脚。 第四步:初始化 GPIOE 端口的管脚变成 FSMC 功能的管脚 第五步:初始化 GPIOF 端口的管脚变成 FSMC 功能的管脚 嵌入式专业技术论坛 (www.armjishu.com)出品 第 589 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 第六步:初始化 GPIOG 端口的管脚变成 FSMC 功能的管脚 3) 初始化 FSMC 的一些基础属性 嵌入式专业技术论坛 (www.armjishu.com)出品 第 590 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 4) 配置与 SRAM 连接的 FSMC 的 BANK1 的 SRAM3 关于 SRAM,外部 SRAM 的控制一般有:地址线(如 A0~A18)、数据线(如 D0~D15)、写信号 (WE)、读信号(OE)、片选信号(CS),如果 SRAM 支持字节控制。 STM32 的 FSMC 支持 8/16/32 位数据宽度,我们这里用到的 LCD 是 16 位宽度的,所以在设置 的时候,选择 16 位宽就 OK 了。我们再来看看 FSMC 的外部设备地址映像,STM32 的 FSMC 将外 部存储器划分为固定大小为 256M 字节的四个存储块。 而 ISSI 的 IS61LV51216 是一个 8M 容量,结构为 512K*16 位字长的高速率 SRAM,每次访问都是 16 位的数据,这样地址线就只需要描述 512K 的范围就足够了,这样就只需要 19 根地址线,因为 2 的 19 次方刚好是等于 512K 的。 STM32 的 FSMC 存储块 1(Bank1)被分为 4 个区,每个区管理 64M 字节空间,每个区都有独 立的寄存器对所连接的存储器进行配置。Bank1 的 256M 字节空间由 28 根地址线(HADDR[27:0]) 寻址(注意,这里 2 的 28 次方也只有 64M,另外还有 2 根片选信号来描述 4 个不同的块,每个块都 是 64M 这样 4 个块就是 256M 大小了).这里 HADDR 是内部 AHB 地址总线,其中 HADDR[25:0]来 自外部存储器地址 FSMC_A[25:0],而 HADDR[26:27]对 4 个区进行寻址。如下表所示: 在这里我们使用的是 NE3,选择的是 BANK1 的第 3 个块 嵌入式专业技术论坛 (www.armjishu.com)出品 第 591 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 分析代码 9:SRAM_WriteBuffer(TxBuffer, WRITE_READ_ADDR, BUFFER_SIZE); 写一段 TxBuffer 内 容,到地址 WRITE_READ_ADDR,这段内容的大小是 BUFFER_SIZE 可以看到,用一个 for 循环,逐个逐个将数据写入到 SRAM 中,每写一个数据,就减少 1,直到写完 为止,代码*(uint16_t *) (Bank1_SRAM3_ADDR + WriteAddr) = *pBuffer++; 中的 Bank1_SRAM3_ADDR 地址可以搜索一下看到,就是 BANK1 的第三块区域的起始地址 嵌入式专业技术论坛 (www.armjishu.com)出品 第 592 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 因为这个访问一次是 32bit 的,所以每执行一次写操作之后 WriteAddr += 2;地址要加 2,因为一个地 址是 16bit 的数据 分析代码 10:读的操作与写的操作一样,可以参考上面的描述 7.43.8 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.43.9 实验现象 下载固件后连接串口 1 并打开超级终端终端(如上)显示如图: 同时神州王的 LED 指示灯也会指示运行结果,具体 LED 指示灯的状态及其含义 DS1 闪烁 表示神州开发板正常运行 DS2--亮 表示读写 SRAM 成功 嵌入式专业技术论坛 (www.armjishu.com)出品 第 593 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 DS3--亮 表示读写 SRAM 失败 7.44 NOR_FLASH访问(神舟王STM32F407-库函数版) 在提到Nor Flash时候,我们就不得不提到Nand Flash。Nor和Nand Flash是现在市场上两种主要的 非易失闪存技术。其中,Intel于1988年首先开发出Nor flash技术,彻底改变了原先由EPROM和 EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了Nand flash结构,强调降低每比特的成 本,更高的性能,并且象磁盘一样可以通过接口轻松升级。 经过了十多年之后,仍然有相当多的硬件工程师分不清 Nor 和 Nand 闪存。在这里,我们首先对 Nor Flash 和 Nand Flash 从应用领域和特性等方面来认识 Nor Flash 与 Nand Flash。 7.44.1 Nor Flash与Nand Flash的区别 性能比较 Flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的 写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦 除。Nand 器件执行擦除操作是十分简单的,而Nor则要求在进行擦除前先要将目标块内所有的位都 写为0。 由于擦除Nor器件时是以64~128KB 的块进行的,执行一个写入/擦除操作的时间为5s,与 此相反,擦除Nand器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。执行擦除时块尺 寸的不同进一步拉大了 Nor 和 NAND之间的性能差距。 Nor Flash与Nand Flash的主要性能区别在于: ● Nor的读速度比Nand稍快一些。 ● Nand的写入速度比Nor快很多。 ● Nand的4ms擦除速度远比Nor的5s快。 ● 大多数写入操作需要先进行擦除操作。 ● Nand的擦除单元更小,相应的擦除电路更少。 接口差别 Nor flash带有SRAM接口,有足够的地址引脚来寻址,可以轻松地挂接在CPU的地址、数据总线 上,对CPU的接口要求低。可以很容易地存取其内部的每一个字节。 Nand Flash器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个 引脚用来传送控制、地址和数据信息。由于时序较为复杂,所以一般CPU最好集成Nand控制器。另 外由于NandFlash没有挂接在地址总线上,所以如果想用NandFlash作为系统的启动盘,就需要CPU具 备特殊的功能,如s3c2410在被选择为NandFlash启动方式时会在上电时自动读取NandFlash的4k数据 到地址0的SRAM中。如果CPU不具备这种特殊功能,用户不能直接运行NandFlash上的代码,那可以 采 取 其 他 方 式 , 比 如 好 多 使 用 NandFlash 的 开 发 板 除 了 使 用 NandFlash 以 外 , 还 用 上 了 一 块 小 的 NorFlash来运行启动代码。 Nand 读和写操作采用 512 字节的板,这一点有点像硬盘管理此类操作,很自然地,基于 Nand 的存储器就可以取代硬盘或其他块设备。 容量和成本 Nand flash 的单元尺寸几乎是 Nor 器件的一半,由于生产过程更为简单,Nand 结构可以在给 定的模具尺寸内提供更高的容量,也就相应地降低了价格。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 594 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 Nor flash占据了容量为1~16MB闪存市场的大部分,而Nand flash只是用在8~128MB的产品当 中,这也说明Nor主要应用在代码存储介质中,Nand适合于数据存储,Nand 在CompactFlash、Secure Digital、PC Cards和MMC 存储卡市场上所占份额最大。 相比起NandFlash来说,NorFlash的容量要小,一般在1~16MByte左右,一些新工艺采用了芯片 叠加技术可以把NorFlash的容量做得大一些。在价格方面,NorFlash相比NandFlash来说较高。 NandFlash生产过程更为简单,Nand结构可以在给定的模具尺寸内提供更高的容量,这样也就相 应地降低了价格。 可靠性和耐用性 采用flash介质时一个需要重点考虑的问题是可靠性。对于需要扩展MTBF的系统来说,Flash 是 非常合适的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较Nor和Nand的可靠性。 ¾ 寿命(耐用性) 在Nand 闪存中每个块的最大擦写次数是一百万次,而Nor的擦写次数是十万次。Nand存储器 除了具有10比1的块擦除周期优势,典型的Nand块尺寸要比Nor器件小8倍,每个Nand存储器块在给 定的时间内的删除次数要少一些。 ¾ 位交换 所有flash 器件都受位交换现象的困扰。在某些情况下(很少见,Nand发生的次数要比Nor多), 一个比特位会发生反转或被报告反转了。一位的变化可能不很明显,但是如果发生在一个关键文件 上,这个小小的故障可能导致系统停机。如果只是报告有问题,多读几次就可能解决了。当然,如 果这个位真的改变了,就必须采用错误探测/错误更正(EDC/ECC)算法。位反转的问题更多见于Nand 闪存,Nand的供应商建议使用Nand闪存的时候,同时使用EDC/ECC算法。这个问题对于用 Nand 存 储多媒体信息时倒不是致命的。当然,如果用本地存储设备来存储操作系统、配置文件或其他敏感 信息时,必须使用EDC/ECC系统以确保可靠性。 ¾ 坏块处理 Nand器件中的坏块是随机分布的。以前也曾有过消除坏块的努力,但发现成品率太低,代价太 高,根本不划算。 Nand 器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在 已制成的器件中,如果通过可靠的方法不能进行这项处理,将导致高故障率。 ¾ 易于使用 可以非常直接地使用基于Nor的闪存,可以像其他存储器那样连接,并可以在上面直接运行代 码。由于需要I/O接口,Nand要复杂得多。各种Nand器件的存取方法因厂家而异。 在使用Nand器件 时,必须先写入驱动程序,才能继续执行其他操作。向Nand 器件写入信息需要相当的技巧,因为设 计师绝不能向坏块写入,这就意味着在Nand器件上自始至终都必须进行虚拟映射。 ¾ 软件支持 当讨论软件支持的时候,应该区别基本的读/写/擦操作和高一级的用于磁盘仿真和闪存管理算 法的软件,包括性能优化。在Nor器件上运行代码不需要任何的软件支持,在Nand器件上进行同样操 作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),Nand和Nor器件在进行写入和擦除操作 时都需要MTD。 使用 Nor 器件时所需要的 MTD 要相对少一些,许多厂商都提供用于 Nor 器件 的更高级软件,这其中包括 M-System的TrueFFS驱动,该驱动被Wind River System、Microsoft、QNX Software System、Symbian和Intel等厂商所采用。 驱动还用于对DiskOnChip产品进行仿真和Nand闪存的管理,包括纠错、坏块处理和损耗平衡。 Nand Flash内部结构是用与非门组成存储单元的。有非易失性,读写速度快,而且比较容易做到 大容量。目前单片Nand Flash存储容量可以达到8Gbit(1GByte)。Nor Flash有易失性,掉电不保存数 嵌入式专业技术论坛 (www.armjishu.com)出品 第 595 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 据。随机存储速度比Nand Flash 快得多。所以一般用Nor Flash 用做内存片,或者叫做数据缓冲。而 Nand Flash则一般用来做存储数据用。比方说,U盘.MP3等。 应用领域 Flash在嵌入式行业应用广泛,但是由于Nor Flash与Nand Flash他们的容量,性能和价格等方面的 差异,在不同的市场, Nor 的传输效率很高,在小容量时具有很高的成本效益,更加安全,不容易 出现数据故障,因此,主要应用以代码存储为主,多与运算相关,而Nand Flash由于容量可以很大, 而成本又低,它的市场份额处于不断的增长中。 在手机市场,Nor Flash主要用于存储代码和数据;而Nand Flash随着技术的发展,高速手机平台 也开始使用Nand Flash+ SDRAM架构。 在便携式消费类电子产品市场,处于成本考虑,基本上没有厂家使用Nor Flash存储器。 在 PC 市场,Nor Flash 主要用于 PC 的 BIOS 部分,并且多为 4Mb-16Mb 小容量的。 7.44.2 FSMC扩展Nor Flash配置 SRAM/ROM、Nor Flash 和 PSRAM 类型的外部存储器都是由 FSMC 的 Nor Flash 控制器管理 的,扩展方法基本相同,其中 Nor Flash 最为复杂。通过 FSMC 扩展外部存储器时,除了传统存储器 扩展所需要的硬件电路外,还需要进行 FSMC 初始化配置。FSMC 提供大量、细致的可编程参数, 以便能够灵活地进行各种不同类型、不同速度的存储器扩展。外部存储器能否正常工作的关键在于: 用户根据选用的存储器型号,对配置寄存器进行合理的初始化配置。 (1)确定映射地址空间 根据选用的存储器类型确定扩展使用的映射地址空间。Nor Flash 只能选用 BANK1 中的 4 个子 BANK。选定映射子 BANK 后,即可确定以下 2 方面内容: ①硬件电路中用于选中该存储器的片选线 FSMC_NEi(i 为子 BANK 号,i=1,…,4); ②FSMC 配置中用于配置该外部存储器的特殊功能寄存器号。 (2)配置存储器基本特征 根据选用的存储器芯片确定需要配置的存储器特征,FSMC 根据不同存储器特征可灵活地进行 工作方式和信号的调整。主要包括以下方面: ①存储器类型(MTYPE)是 SRAM/ROM、PSRAM,还是 Nor Flash; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 596 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 ②存储芯片的地址和数据引脚是否复用(MUXEN),FSMC 可以直接与 AD0~AD15 复用的存储 器相连,不需要增加外部器件; ③存储芯片的数据线宽度(MWID),FSMC 支持 8 位/16 位两种外部数据总线宽度; ④对于 Nor Flash(PSRAM),是否采用同步突发访问方式(B URSTEN); ⑤对于 Nor Flash(PSRAM),NWAIT 信号的特性说明(WAITEN、WAITCFG、WAITPOL); ⑥对于该存储芯片的读/写操作,是否采用相同的时序参数来确定时序关系(EXTMOD)。 (3)配置存储器时序参数 FSMC 通过使用可编程的存储器时序参数寄存器,拓宽了可选用的外部存储器的速度范围。 FSMC 的 NorFlash 控制器支持同步和异步突发两种访问方式。选用同步突发访问方式时,FSMC 将 HCLK(系统时钟)分频后,发送给外部存储器作为同步时钟信号 FSMC_CLK。此时需要的设置的时间 参数有 2 个: ①HCLK 与 FSMC_CLK 的分频系数(CLKDIV),可以为 2~16 分频; ②同步突发访问中获得第 1 个数据所需要的等待延迟(DATLAT)。 对于异步突发访问方式,FSMC 主要设置 3 个时间参数:地址建立时间(ADDSET)、数据建立时 间(DATAST)和地址保持时间(ADDHLD)。FSMC 综合了 SRAM/ROM、PSRAM 和 Nor Flash 产品的 信号特点,定义了 4 种不同的异步时序模型。选用不同的时序模型时,需要设置不同的时序参数。 在实际扩展时,根据选用存储器的特征确定时序模型,从而确定各时间参数与存储器读/写周期参 数指标之间的计算关系;利用该计算关系和存储芯片数据手册中给定的参数指标,可计算出 FSMC 所需要的各时间参数,从而对时间参数寄存器进行合理的配置。 7.44.3 Nor Flash访问实验的意义与作用 在前面,我们比较了Nor Flash和Nand Flash的区别,Nand Flash虽然在容量和成本方面比较有优 势,但是在易用性和数据安全方面,Nor Flash还是有不可替代的优势,因此Nor Flash一般用于程序 存储。 Nor flash 带有 SRAM 接口,有足够的地址引脚来寻址,可以轻松地挂接在 CPU 的地址、数据总 线上,对 CPU 的接口要求低。在本章节,我们将一起分析,如何通过 STM32 的 FSMC 接口访问 Nor Flash。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 597 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.44.4 实验原理 在本实验中,将Nor Flash挂到STM32F407ZET6的FSMC总线的板块1的子板块2上(与前一节描述 的,将SRAM挂在板块1的子板块3上类似)。。 在本实验中,首先按照Nor Flash芯片要求,初始化好FSMC总线后,往Nor Flash芯片内固定地址 写入一串确定的值,然后程序读回之前写入的数据,判断写入与读出的值是否一致,通过神舟王407 的LED灯指示程序执行结果。各种灯的指示具体含义如下: LED 指示灯 含义 DS1 闪烁 程序正在执行过程中 DS2 亮 写入神舟王 SRAM 的数据与读出的数据一致,也就是说访问 Nor Flash 成功 DS3 亮 写入神舟王 SRAM 的数据与读出的数剧不一致,也就是说访问 Nor Flash 失败 7.44.5 硬件设计 NOR FLASH访问实验要用到的硬件资源有: ¾ 串口 1:串口 1 在本实验中用于打印 Nor Flash 访问提示信号和显示 Nor Flash 访问运行结果。 串口的输入输出实验在前面已经 进行了详细的讲解,在这里就不在重复。 具体见 4.5 串口 1 的发送与接收实验。 ¾ LED 指示灯:LED 指示灯主要用于指示 Nor Flash 访问程序运行状态和 Nor Flash 访问结果。 ¾ 39VF1601 NOR FLASH 硬件原理 在神舟王407中,通过FSMC总线与39VF1601 NOR Flash连接,具体电路如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 598 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 嵌入式专业技术论坛 (www.armjishu.com)出品 第 599 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 在上图中,我们可以看到以下信息 z NOR FLASH 数据宽度 从上图中可以看出,与 NOR FLASH 连接的数据线为 FSMC_D0~D15,一共 16 位。也就是说神舟王 407 上使用的 Nor Flash 为 16 位数据宽度的 Nor Flash。 z Nor Flash 的地址范围 在上图中,Nor Flash 的 CE 管脚与 FSMC_NE2 连接。将 Nor Flash 扩展到 Nor Flash 控制器管理的 BANK1 的第 2 个子 BANK。 Nor Flash 芯片说明 在神舟王 407 中,使用的 Nor Flash 是 SST 公司推出的 SST39VF160。它的容量为 16M 比特(如 果需要配置更大容量的 Nor Flash,可以直接替换为 SST39VF3201, SST39VF6401 等大容量的 Nor Flash,他们与 SST39VF160 完全 pin-to-pin 兼容,而容量却更大,达到 64M 比特)。 SST39VF160 的管脚定义如下: 7.44.6 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 600 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 可以看到工程已经被打开,下面开始具体分析程序代码: 分析代码 1:STM_Shenzhou_LEDInit()初始化串口打印函数 代码分析 2:NOR_Init()配置与 SRAM 连接的 FSMC BANK1 NOR/SRAM2 分析代码 3:NOR_ReadID(&NOR_ID) 读取 Nor Flash ID 并打印 分析代码 4:判断一下读取的 NOR FLASH 的 ID 是什么型号,这里可以通过枚举的方式支持多几个 不同厂商的 NOR FLASH 存储器芯片。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 601 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 分析代码 5:NOR_ReturnToReadMode();返回写模式 分析代码 6:NOR_EraseBlock(WRITE_READ_ADDR) 擦除 NOR FLASH 中将要写入的存储空间 分析代码 7:Fill_Buffer(TxBuffer, BUFFER_SIZE, 0x1234); 将写 Nor Flash 的数据 BUFFER 填充为从 0x1234 开始的连续递增的一串数据 分析代码 8:NOR_WriteBuffer(TxBuffer, WRITE_READ_ADDR, BUFFER_SIZE) 将数据写入到 Nor Flash 中。WRITE_READ_ADDR:写入的起始地址 分析代码 9:NOR_ReadBuffer(RxBuffer, WRITE_READ_ADDR, BUFFER_SIZE); 从 NOR FLASH 中 读回刚写入的数据。  WRITE_READ_ADDR:读出数据的起始地址 分析代码 10:判断读回的数据与写入的数据是否一致 7.44.7 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.44.8 实验现象 将程序下载到神舟王 407 核心板后,用随板配置的串口线连接神州王串口 1 与电脑的串口,打开超 级终端,并按如下参数配置串口。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 602 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 关闭开关,重新打开上电按复位运行,正常情况下,串口打印信息如下图。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 603 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 同时神舟王开发板的 LED 指示灯也会指示运行结果,具体 LED 指示灯的状态及其含义如下: LED 指示灯 含义 DS1 闪烁 程序正在执行过程中 DS2 亮 写入神舟王 SRAM 的数据与读出的数据一致,也就是说访问 Nor Flash 成功 DS3 亮 写入神舟王 SRAM 的数据与读出的数剧不一致,也就是说访问 Nor Flash 失败 7.45 NAND_FLASH访问(神舟王STM32F407-库函数版) 7.45.1 Nand Flash访问实验的意义与作用 在Nor Flash访问实验一节,我们已经比较Nor Flash和Nand Flash的区别。Nand Flash由于在容量 和成本方面上有明显的优势,虽然它的数据安全和可靠性方面不及Nor Flash, 但是这些很大程度上, 可以在软件和驱动层来避免由于Nand Flash本身的问题导致数据的丢失。 Nand Flash主要用于数据数据存储。 Nand Flash 和 SRAM,Nor Flash 不一样,它的数据线和地址线是复用的。操作 Nand Flash,需要特 别的访问控制协议,在本章节,我们将一起分析,如何通过 STM32 的 FSMC 接口访问 Nand Flash, 以 及了解 Nand Flash 的访问操作。 7.45.2 实验原理 1.FSMC 扩展 Nand Flash 配置 SRAM/ROM、Nor Flash和PSRAM类型的外部存储器都是由FSMC的Nor Flash控制器管理的, 通过STM32处理器的FSMC访问Nand Flash之前,需要根据NAND闪存的特性初始化FSMC的NAND 闪存控制器功能、时序、数据总线宽度等参数,才能访问控制NAND闪存存储器: ● 开启或关闭存储器就绪/繁忙(Ready/Busy)信号作为FSMC的输入等待。 ● 开启或关闭存储器就绪/繁忙(Ready/Busy)信号作为FSMC的中断输入源: 中断可以以下述3种方式产生: ─ 在就绪/繁忙信号的上升沿产生中断:存储器刚刚完成一个操作,新的状态已经就绪。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 604 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 ─ 在就绪/繁忙信号的下降沿产生中断:存储器开始一个新的操作。 ─ 在就绪/繁忙信号为高电平时产生中断:存储器已经就绪。 ● 选择NAND存储器的数据总线宽度:8或16位。 ● 开启或关闭ECC计算逻辑。 ● 指定ECC计算的页面大小:可以是256、512、1024、2048、4096或8192字节/页。 用户可以配置FSMC的时序分别满足NAND闪存的不同段的操作:公共段和属性段。可配置的时 序是: ● 建立时间:这是发送命令字之前地址的建立时间(以HCLK为单位),即从地址有效至开始读写 操作之间的时间。(译注:这里讲的读写操作是指对NAND内控制单元的读写,不一定是对 NAND中存储单元的操作) ● 等待时间:这是发送命令字所需要的时间(以HCLK为单位),即从NOE和NWE信号下降至上 升之间的时间。 ● 保持时间:这是发送命令字后地址保持的时间(以HCLK为单位),即从NOE和NWE信号下降 至上升至整个操作周期结束的时间。 ● 数据总线高阻时间:这个参数只在写操作时有效,它是在开始写操作后数据总线保持高阻状 态的时间(以HCLK为单位),即从地址有效至FSMC驱动数据总线的时间。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 605 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 下图显示了一个典型的NAND存储器访问的不同时序。 7.45.2.1 2.NAND FLASH操作 操作NAND闪存存储器,需要使用特别的访问协议,所有的读写操作,需要有下述步骤: 1. 向NAND闪存存储器发送一个命令 2. 发送读或写的地址 3. 读出或写入数据 为了使用户可以方便地操作NAND闪存,FSMC的NAND存储块被划分为3个段:数据段、地址段和 命令段。 实际上,这3个段的划分反映了真实的NAND闪存存储器的结构。写入命令段的任何地址,结 果都是向NAND闪存写入命令。写入地址段的任何地址,结果都是向NAND闪存写入读写操作的地址; 根据所用NAND闪存的构造,通常需要4~5个写入地址段才能写入一个读写操作的地址。写入或读出 数据段的任何地址,结果都是写入或读出NAND的内部单元,该单元的地址是之前在地址段写入的 那个地址。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 606 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.45.3 硬件设计 在神舟王407中,通过FSMC总线与HY27UF081G2A NAND Flash连接,具体电路如下: HY27UF081G2A芯片与FSMC管脚的对应关系 NAND FLASH信号 FSMC信号 管脚/端口分配 AL ALE/A17 PD12 CL CLE/A16 PD11 I/O0~7 D0~7 端口D/端口E /E NCE2 PD7 /R NOE PD4 /W NWE PD5 R/B NWAIT PD6 信号说明 地址锁存信号 命令锁存使能 数据总线D0~7 片选使能 输出使能 写使能 就绪/繁忙信号 神舟王407中NAND的就绪/繁忙信号连接至FSMC_NWAIT管脚,就初始化时需要使用等待功能 管理NAND闪存的操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 607 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.45.3.1 4.14.3.1.NAND Flash芯片说明 在神舟王407中,使用的NAND Flash是Hynix公司推出的HY27UF081G2A NAND Flash。它的容 量为1G比特。HY27UF081G2A的特性如下: ● NAND接口:8位总线宽度,复用的地址/数据线。 ● 页大小:(2K + 64)字节 ● 页读/编程时序: ─ 随机访问:25μs (最大) ─ 顺序访问:30ns (最小) ─ 页编程时间:200μs(典型值) HY27UF081G2A 的管脚定义如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 608 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.45.4 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:NAND_Init();配置与 SRAM 连接的 FSMC BANK2 NAND 代码分析 2:NAND_Reset()复位一下 NAND FLASH 代码分析 3:NAND_ReadID(&NAND_ID)读取 Nand Flash ID 并打印 代码分析 4:校验 Nand Flash 的 ID 是否正确 嵌入式专业技术论坛 (www.armjishu.com)出品 第 609 页,共 771 页 www.armjishu.com V1.1 代码分析 5:设置 NAND FLASH 的写地址 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 6:擦除待写入数据的块 代码分析 7:Fill_Buffer(TxBuffer, BUFFER_SIZE , 0x25) 将写 Nand Flash 的数据 BUFFER 填充为从 0x25 开始的连续递增的一串数 代码分析 8:status = NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber) 将数据写入到 Nand Flash 中。WriteReadAddr:读写的起始地址 代码分析 9:从 Nand Flash 中读回刚写入的数据 status = NAND_ReadSmallPage (RxBuffer, WriteReadAddr, PageNumber) 代码分析 10:判断读回的数据与写入的数据是否一致 7.45.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.45.6 实验现象 将固件下载到神州王后,从新上电运行,正常情况下,串口打印如下 嵌入式专业技术论坛 (www.armjishu.com)出品 第 610 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 同时神州王的 LED 指示灯也会指示运行结果,具体 LED 指示灯的状态及其含义如下 LED 指示灯 含义 DS1 闪烁 表示神州王正常运行 DS2 亮 表示读写 Nand flash 成功 DS3 亮 表示读写 Nand flash DS4 亮 表示没有读到 Nand flash 的 ID 7.46 EEPROM读写程序彩屏显示(神舟王STM32F407-库函数版) 7.46.1 EEPROM访问试验的意义与作用 EEPROM是一种电可擦可编程只读存储器,掉电后数据不丢失。是单片机应用系统中经常会用 到的存储器。EEPROM掉电后数据不会丢失,而且可以用电信号直接清除存储数据和再编程,正是 由于它的这一特性,EEPROM在嵌入式设备中应用广泛,用于产品出厂数据的保存,产品运行过程 中一些数据量不大的重要数据保存等。 在本章节,我们以最常见的 I2C 接口的 24C02 芯片为例进行学习研究。它采用 PHILIPS 公司开发的 两线式串行总线(I2C 总线),读写访问简单。通过本章节实验,我们将对 I2C 总线有一个深入的了解, 进而掌握如何读写访问 24C02 这一系列的 I2C 接口 EEPROM。 7.46.2 实验原理 常见储存器的介绍 接触电子的朋友,经常会遇到各种存储数据的器件。如:RAM、SRAM、SDRAM、ROM、EPROM、 EEPROM、Flash。开始的时候,我们会有这样的困惑:它们是怎样区分的呢?根据掉电数据是否丢 失可以分为 RAM(随机存取存储器)和 ROM(只读存储器)。ROM 和 RAM 指的都是半导体存储 器,ROM 是 Read Only Memory 的缩写,RAM 是 Random Access Memory 的缩写。ROM 在系统停止 嵌入式专业技术论坛 (www.armjishu.com)出品 第 611 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 供电的时候仍然可以保持数据,而 RAM 通常都是在掉电之后就丢失数据,典型的 RAM 就是计算机 的内存。 SRAM、SDRAM 属于 RAM 类型。EEPROM 、EPROM、Flash 属于 ROM 类型。当然各个存储 器之间各有各的特性,我们这里讲的是 EEPROM。 EEPROM 的简单介绍 EEPROM,电可擦可编程只读存储器--一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电 脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用,按字节操作。通常用来保存一些 用户数据,比如:闹钟的响铃时间。遵循二线制协议,由于其具有接口方便,体积小,掉电后数据 不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。 在本章节,我们以最常见的 I2C 接口的 24C02 芯片为例进行学习研究。它采用 PHILIPS 公司开 发的两线式串行总线(I2C 总线),读写访问简单。通过本章节实验,我们将对 I2C 总线有一个深入的 了解,进而掌握如何读写访问 24C02 这一系列的 I2C 接口 EEPROM。 I2C 总线的定义 I2C(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接 微控制器及其外围设备。I2C 总线产生于在 80 年代,最初为音频和视频设备开发,如今主要在服务 器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的 配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个 参数,增加了系统的安全性,方便了管理。 I2C总线特点 I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空 间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺, 并 且 能 够 以 10Kbps 的 最 大 传 输 速 率 支 持 40 个 组件 。 I2C 总 线 的 另 一 个 优 点 是 , 它 支 持 多 主 控 (multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号 的传输和时钟频率。当然,在任何时间点上只能有一个主控。它是由数据线SDA和时钟SCL构成的 串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速I2C总线一般 可达400kbps以上。 I2C 总线工作原理 I2C 总线是由一根数据线(SDA)和一根时钟线(SCL)构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,最高传送速率 100kbps。 各种被控制模块均并联在这条总线上,每个模块都有唯一的地址标识。在信息的传输过程中,I2C 总线上并接的每一模块电路既可以是主控器,又可以是发送器,这取决于它所要完成的功能。CPU 发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制 的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然 挂在同一条总线上,却彼此独立,互不相关。 I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表 示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答 信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。 若未收到应答信号,由判断为受控单元出现故障。 I2C总线时序图如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 612 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 神舟王407开发板板载的EEPROM芯片型号为24C02,该芯片的总容量是256个字节。 本节实验的基本原理:神舟王 407 通过 STM32F407ZGT6 处理器本身自带的硬件 I2C 接口与 24C02 相连,我们首先往 EEPROM 中写入一连串的有规律的数据,然后顺序读出,通过串口打印读出的数 据,判断读出的数据是否正确,从而得知 EERPOM 是否可以正常访问。 7.46.3 硬件设计 本实验需要用到的硬件资源: ¾ 神舟王 407 开发板串口 1DB9 接口 ¾ I2C EEPROM 24C02 STM32F407ZGT6处理器具有三个I2C接口,I2C接口与管脚对应关系如下表所示。 I2C接口 管脚名 对应GPIO 功能描述 I2C1 I2C1_SCL PB6 I2C1接口的时钟 I2C1_SDA PB7 I2C1接口的数据 I2C2 I2C2_SCL PF1 I2C2接口的时钟 I2C2_SDA PF0 I2C2接口的数据 I2C3 I2C3_SCL PA8 I2C3接口的时钟 I2C3_SDA PC9 I2C3接口的数据 神舟王407通过处理器自带硬件I2C1接口与EEPROM 24C02连接,电路图如下: AT24C02是美国ATMEL公司的低功耗CMOS串行EEPROM,它是内含256×8位存储空间,具有 工作电压宽(2.5~5.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 613 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 AT24C02的1、2、3脚是三条地址线,用于确定芯片的硬件地址。如上图中,A0~A2全部接地, 对应I2C的硬件地址为0xA0。 第8脚为电源输入端,第4脚为GND管脚。 第5脚SDA为串行数据输入/输出,数据通过这条双向I2C总线串行传送,在神舟王407中,与处理 器的PB7管脚连接。 第6脚SCL为串行时钟输入线,在神舟王407中,与处理器的PB6管脚连接。 SDA和SCL都需要和正电源间各接一个5.1K的电阻上拉。 第7脚为AT24C02的写保护端,如果需要禁止对AT24C02进行读写,需要上拉到电源。在神舟王 407中,为了方便随时对AT24C02进行访问操作,将WP管脚接地,禁止AT24C02的写保护功能。 24C02的特性如下: 神舟王407使用的EEPROM芯片型号为24C02,该芯片的容量为2Kbit,也就是256个字节,对于我们 一般的应用是足够了。但是你也可以依据实际的需要,更换更大容量的你也可以选择换大的芯片, 因为在原理上是兼容24C02~24C512全系列的EEPROM芯片的。 7.46.4 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 614 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:main()函数总共分为几个部分,具体如下 第一步:Printf_Init();串口的初始化,初始化串口打印 第二步:初始化彩色液晶屏,多一个渠道显示给用户看 第三步:sEE_Init()函数来初始化 I2C 总线的 EEPROM 的驱动 嵌入式专业技术论坛 (www.armjishu.com)出品 第 615 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 第四步:sEE_WriteBuffer(Tx1_Buffer, sEE_WRITE_ADDRESS1, BUFFER_SIZE1);写一个数据到地址 到 EEPROM 的 0x00 位置,写的内容是“SZW-STM32F40xx I2C buffer 1 transfer” 第五步: sEE_WaitEepromStandbyState()函数等待 I2C 写完后收到 standby 状态,这是 I2C 的协议要求 的,表示已经写完数据了。 第六步:NumDataRead = BUFFER_SIZE1;设置一个要读的数据大小 第七步:sEE_ReadBuffer(Rx1_Buffer, sEE_READ_ADDRESS1, (uint16_t *)(&NumDataRead));从对应 的地址读出对应大小的数据来,把数据读到 Rx1_Buffer 中去。 第八步:将读取到的数据打印出来 第九步:等待读取完,然后再校验一下读到的数据是否正确 第十步:根据比对所读的数据,来判断是否与写入的一样,并且显示到液晶屏和打印在串口上,告 诉用户结果 代码分析 2:整段写入数据和读取数据,然后再比较数据,这个过程执行了两遍,这样对校验 EEPROM 是不是真实写进去和真实读出来非常有帮助,因为这 2 次写进去的数据是不相同的。 代码分析 3:最后通过函数 sEE_DeInit()释放掉所有的资源 嵌入式专业技术论坛 (www.armjishu.com)出品 第 616 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.46.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.46.6 实验现象 将固件下载在神舟王 407 核心板后,关闭电源,用随板配置的串口线连接神州王串口 1 与电脑的串 口,打开超级终端,并按如下参数配置串口。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 617 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 重新打开电源,并按复位键,超级终端窗口显示如下图: 神舟王开发板上的彩屏显示如下图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 618 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 神舟王开发板上的彩屏显示如下图: 7.47 DMA传输实验 本章我们将向大家介绍神舟王407的DMA。在本章中,我们将利用STM32的DMA来实现串口2 数据传送,并在TFTLCD彩屏上显示当前的传送进度。本章分为如下几个部分: 1 STM32 DMA简介 2 实验原理 嵌入式专业技术论坛 (www.armjishu.com)出品 第 619 页,共 771 页 www.armjishu.com ARM 技术论坛 V1.1 3 硬件设计 4 软件设计 5 下载验证 神舟王 STM32F407 用户手册 7.47.1 STM32 DMA简介 DMA,全称为:Direct Memory Access,即直接存储器访问。 根据 ST 公司提供的相关信息,DMA 是 STM32 中一个独立与 Cortex-M4 内核的模块,有点类似 与 ADC、PWM、TIMER 等模块;主要功能是通信“桥梁”的作用,可以将所有外设映射的寄存器 “连接”起来,这样就可以高速问各寄存器,其传输不受 CPU 的支配,传输还是双向的。 DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传 输动作本身是由 DMA 控制器 来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部 更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。 DMA 传输对于高效能嵌入式系统算法和网络是很重要的。DMA 传输方式无需 CPU 直接控制传输, 也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传 送数据的通路,能使 CPU 的效率大为提高。 STM32F407ZGT6有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有8个通道。DMA2 有8个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来 协调各个DMA请求的优先权。 STM32的DMA有以下一些特性: ● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通 过软件来配置。 ● 在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在 相等优先权时由硬件决定(请求0优先于请求1,依此类推) 。 ● 独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目 标地址必须按数据传输宽度对齐。 ● 支持循环的缓冲器管理 ● 每个通道都有3个事件标志(DMA 半传输,DMA传输完成和DMA传输出错),这3个事件 标志逻辑或成为一个单独的中断请求。 ● 存储器和存储器间的传输 ● 外设和存储器,存储器和外设的传输 ● 闪存、SRAM、外设的SRAM、APB1 APB2和AHB外设均可作为访问的源和目标。 ● 可编程的数据传输数目:最大为65536 神舟王 407 的主芯片 STM32F407ZGT6 有两个 DMA 控制器,DMA1 和 DMA2,本章,我们仅针对 DMA2 进行介绍。 7.47.2 实验原理 本实验的原理:。我们先定义数组 SRC_Const_Buffer [ ],即开辟了一个空间,空间用于存放要发送的 数据。将这个空间和另一个空间 DST_Buffer[ ]用 DMA 方式绑定。DMA 传输是将数据从一个地址空 间复制到另外一个地址空间。当 CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实 行和完成。如本实验中,初始化从 SRC_Const_Buffer [ ]这个地址空间向空间 DST_Buffer[ ]发送数据 这个动作。初始化完成后,传输动作本身是由 DMA 控制器来实行和完成,不用 CPU 直接控制传输。 我们只需要开启 DMA 传输即可。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 620 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 接下来我们就介绍本实验的基本实现步骤: 1)初始化LED灯。对串口进行初始化Printf_Init( ),我们这里用到的是串口1。 2)调用函数DMA_Config( ) 配置DMA。DMA_Config( )函数初始化 DMA方式发送数据这个动 作动作。具体配置的内容有:使能DMA传输、配置中断等,详细的配置我们在代码部分进行分析。 3)等待DMA传输完成。 4)比较两个空间中的数据是否一致。 5)输出比较结果 到此我们实验的基本流程就完成了。当然还有按键控制,彩屏显示传输的百分比。这里就不一 一列举。 下面我们来看一下 DMA 的寄存器: 寄存器 1:DMA 中断状态寄存器(DMA_ISR) 如果开启了 DMA_ISR 中这些中断,在达到条件后就会跳到中断服务函数里面去,即使没开启, 我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 TCIFx,即通道 DMA 传输完成与否的标志。注意此寄存器为只读寄存器,所以在这些位被置位之后,只能通过其他的操 作来清除 寄存器 2:DMA 中断标志清除寄存器(DMA_IFCR) DMA_IFCR 的各位就是用来清除 DMA_ISR 的对应位的,通过写 0 清除。在 DMA_ISR 被置位 后,我们必须通过向该位寄存器对应的位写入 0 来清除。 寄存器 3:DMA 通道 x 配置寄存器((DMA_SxCR)(x=1~7,下同) 该寄存器的我们在这里就不贴出来了,见《【英文】STM32F2 系列 ARM 内核 32 位高性能微控 制器参考手册 V4.pdf》第 194 页 9.5.5 一节。该寄存器控制着 DMA 的很多相关信息,包括数据宽度、 外设及存储器的宽度、通道优先级、增量模式、传输方向、中断允许、使能等都是通过该寄存器来 设置的。所以 DMA_SxCR 是 DMA 传输的核心控制寄存器。 寄存器:DMA 通道 x 传输数据量寄存器(DMA_SxNDTR) 这个寄存器控制 DMA 通道 x 的每次传输所要传输的数据量。其设置范围为 0~65535。并且该寄 存器的值会随着传输的进行而减少,当该寄存器的值为 0 的时候就代表此次数据传输已经全部发送 完成了。所以可以通过这个寄存器的值来知道当前 DMA 传输的进度。 寄存器 5:DMA 通道 x 的外设地址寄存器(DMA_SxPAR) 该寄存器用来存储 STM32 外设的地址,比如我们使用串口 2,那么该寄存器必须写入 0x40004404 (其实就是&USART2_DR)。如果使用其他外设,就修改成相应外设的地址就行了。 寄存器 6:DMA 通道 x 的存储器 0 地址寄存器(DMA_SxM0AR) 该寄存器和 DMA_SxPAR 差不多,但是是用来放存储器的地址的。比如我们使用 SendBuf[ ] 数组来做存储器,那么我们在 DMA_SxM0AR 中写入&SendBuff 就可以了。 寄存器 7:DMA 通道 x 的存储器 1 地址寄存器((DMA_SxM1AR) 该寄存器和 DMA_SxM0AR 类似,不过该寄存器只能使用在双 buffer 模式下。 寄存器 7:DMA 通道 x 的 FIFO 控制寄存器((DMA_SxFCR) 顾名思义,对 FIFO 的控制。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 621 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 寄存器的详细分析大家可以参考《【英文】STM32F2 系列 ARM 内核 32 位高性能微控制器参考 手册 V4.pdf》DMA 的章节,我们这里就分析到这里。 7.47.3 硬件设计 1) 本实验用到LED灯 2) 串口 1 4) DMA DMA属于STM32内部。LED、串口,在我们提供的原理图中,我们这里不一一列举。 7.47.4 软件设计 进入例程的文件夹,然后打开\ Project\MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 622 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析1:在系统启动文件(startup_stm32f4xx_xx.s)中已经调用SystemInit()初始化了168MHZ时 钟,最开始的例程已经对此分析过了,还有不明白的可以看下前面的例程。本实验主要介绍和DMA 相关的内容. 代码分析2:调用STM_EVAL_LEDInit( )函数初始化板载LED指示灯,前面已经有介绍 代码分析3:调用Printf_Init( )函数初始化才串口,前面已经有介绍 代码分析4:调用DMA_Config( )函数初始化DMA。 本实验主要是对使用的DMA的配置。 1)通过DMA_GetCmdStatus函数判断是否有DMA传输进行中。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 623 页,共 771 页 www.armjishu.com V1.1 2)对|DMA结构体的初始化。 ARM 技术论坛 神舟王 STM32F407 用户手册 我们可以看到这里设置的两个传输的空间本别是SRC_Const_Buffer 和DST_Buffer,DMA传输的 数据量是BUFFER_SIZE等等。 3)使能DMA传输中断。 4)使能DMA通道 5)配就配置中断优先级 代码分析 5:等待 DMA 传完成。 DMA 传输完成,程序往下运行,否则一直在此循环。假如传输完成,则进入中断服务函数 DMA_STREAM_IRQHANDLER(void)。点亮 LED3 并打印“www.armjishu.com STM32 DMA 数据传 输完成”表明 DMA 传输数据完成。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 624 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 6:DMA 传输完成后,判断两个空间中数据是否一致。 可以看到判断数据是否一致的时候使用的是指针。如果两个空间中的数据都一样,那么程序返 回 PASSED,否则返回 FAILED。通过判断返回值,如果是 PASSED 的话,电路 LED4 和通过串口打 印“www.armjishu.com STM32 DMA 传输实验成功”数据,表明实验成功。 7.47.5 下载验证 在代码编译成功之后,我们通过下载代码到 STM32 神舟王 407 开发板上,按下复位键。正常情 况下可以看到。LED 灯 DS3 和 DS4 点亮。并且串口打印信息如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 625 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.48 STM32内部温度传感器实验 本章我们将向大家介绍STM32的内部温度传感器。在本章中,我们将利用STM32的内部温度传 感器来读取温度值,并在彩屏上显示出来。本章分为如下几个部分: 1 STM32 内部温度传感器简介 2 实验原理 3 硬件设计 4 软件设计 5 下载验证 7.48.1 STM32内部温度传感器简介 STM32 有一个内部的温度传感器,可以用来测量 CPU 及周围的温度(TA)。该温度传感器在内部 和 ADCx_IN16 输入通道相连接,此通道把传感器输出的电压转换成数字值。温度传感器模拟输入推 荐采样时间是 17.1μs。 STM32 的内部温度传感器支持的温度范围为:-40~125 度。精度比较差,为 ±1.5℃左右。这些我们可以在《STM32F4 参考手册 DM00031020.pdf》文档中找到对应的说明。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 626 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 STM32 内部温度传感器的使用很简单,只要设置一下内部 ADC,并激活其内部通道就差不多了。 关于 ADC 的设置,我们在前面已经进行了详细的介绍,这里就不再多说。 接下来我们介绍一下和温度传感器设置相关的 2 个地方。 第一个地方,我们要使用STM32的内部温度传感器,必须先激活ADC的内部通道,这里通过ADC_CR2 的SWSTART位(bit30)置。设置该位为1使能指定的ADC的软件转换启动功能。 第二个地方,STM32 的内部温度传感器固定的连接在 ADC 的通道 16 上,所以,我们在设置好 ADC 之后只要读取通道 16 的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当 前温度。 7.48.2 实验原理 本实验的实验原理:通过内部温度 ADC,将内部温度传感器的电压值取出。通过电压值转换为 对应的温度。 怎么通过 ADC 读取温传感器的值? 温度传感器在内部和 ADC1_IN16 输入通道相连接,此通道把传感器输出的电压值转换为数字 值。所以通过获取通道 ADC1_IN16 的转换值,就可得到我们想要的温度传感器的电压值。 现在,我们就可以总结一下 STM32 内部温度传感器使用的步骤了,如下: 1)设置 ADC,开启内部温度传感器。 关于如何设置ADC,在ADC实验已经介绍了,我们采用与上一节相似的设置。内部温度传感器 相当与把通道端口连接在内部温度传感器上。所以这里,我们要开启内部温度传感器功能: ADC_TempSensorVrefintCmd(ENABLE); 2)读取通道 16 的 AD 值,计算结果。 在设置完之后,我们就可以读取温度传感器的电压值了,得到该值就可以用上面的公式计算温 度值。从 ADC 实验的 ADC 通道与 GPIO 对应表可以知道,内部温度传感器是通过对应的是 ADC 的 通道 16。其它的跟上一节的讲解是一样的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 627 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 怎么转换电压值为温度值? 在官方提供的手册《【中文】STM32F 系列 ARM 内核 32 位高性能微控制器参考手册 V10_1.pdf》 169 页 11.10 章节中,给出了转换的公式及说明,根据这个公式可以实现电压值和温度值间的转换。 我们对,温度的计算公式进行说明: V25=Vsense 在 25 度时的数值。 VSENSE 温度传感器输出当前的电压值的计算方法: VSENSE=ADC_ConveredValue*Vdd/Vdd_convert_value(0xFFF) ADC_ConveredValue 是 ADC_DR 寄存器中的结果。Vdd 是参考电压。Vdd_convert_value 是 4096, 因为我们这个 STM32 它的转换的精度是 12 位的。 Avg_Slope=温度与 Vsense 曲线的平均斜率(单位为 mv/℃或 uv/℃)。 有了这些数据,就可以利用以上公式,计算出当前温度传感器的温度了。 7.48.3 硬件设计 本实验用到的硬件资源有: 1) 串口 2) ADC 3) 内部温度传感器 前两个之前均有介绍,而内部温度传感器也是在STM32内部,不需要外部设置,我们只需要软件 设置就OK了 7.48.4 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 嵌入式专业技术论坛 (www.armjishu.com)出品 第 628 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析1:在系统启动文件(startup_stm32f14xx_xx.s)中已经调用SystemInit()初始化了168MHZ时钟, 最开始的F例程已经对此分析过了,还有不明白的可以看下前面的例程。 代码分析2:调用 Printf_Init( )函数初始化才串口,前面已经有介绍 代码分析3:调用ADC_Config( )函数初始化内部温度传感器。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 629 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 在初始化函数ADC_Config( )中,对内部温度传感器进行了一系列的初始化后,调用函数 ADC_TempSensorVrefintCmd()开启内部温度传感器。还进行使能指定的ADC等其它设置,这些设 置主要用到了寄存器ADC的各个寄存器。比如函数ADC_TempSensorVrefintCmd()是对寄存器 ADC->CCR的配置。 而,“#define ADC_CCR_TSVREFE ((uint32_t)0x00800000)”刚好对寄存器ADC->CCR 的bit23进行置位,使能温度传感器。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 630 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析6:通过函数T_Adc_Init()进行初始化ADC,启动温度传感器等设置后,我们就可以对内部 温度传感器进行操作了。 代码中函数T_Get_Adc_Average(ADC_Channel_16,10)获取ADC的值。温度传感器在 内部和ADC1_IN16输入通道相连接, 我们通过通道ADC1_IN16,多次取数求平均值得 到我们所想要的温度传感器的ADC数据。 代码分析 7:获取 ADC 的值后,我们对它进行串口打印对应的数据。 代码分析 8:通过公式计算出我们想要的温度值。并通过彩屏和串口显示出来。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 631 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.48.5 下载验证 在代码编译成功之后,我们通过下载代码到 STM32 神舟王 407 开发板上,可以看到 串口打印如下的数据: 7.49 DS18B20温度传感实验(神舟王STM32F407-库函数版) 7.49.1 为什么会有温度传感器出现 能快速测出温度的工具我们可以称为温度计,温度计的核心部件是温度传感器。为什么会出现 温度传感器呢?因为它可以代替人体去感受外界的温度,并且能够把一个温度数字化,具体化,避 免了人体去直接接触感觉温度,过低或者过高的温度可能会冻伤或者是烧伤人体,方便人类去管理 和控制调整温度的变化。日常生活中各个领域中都使用到温度传感器,像家庭中的电子温度计、工 厂检测机器温度的仪器、交通工具上的等等。它为人类带来了很大的便利。 7.49.2 什么是温度传感器 温度传感器是指能感受温度并转换成可用输出信号的传感器,我们都知道温度理论上是无上限, 也无下限的;例如火山或者太阳的温度可以非常高,南北极的冰雪温度也可以非常低;所以温度范 围是非常广乏的,而目前市场上比较关心的温度范围主要是负 50 到正 100 之间摄氏度;根据温度变 嵌入式专业技术论坛 (www.armjishu.com)出品 第 632 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 化的灵敏度和精度,又有很多不同温度传感器的种类。像家庭用的大多是 0 到 100 摄氏度的温度计, 有些工厂用到的是几千度摄氏度的温度计,像那些钢筋铁厂的,单片机中我们一般使用的是 18B20 的一种温度传感器,在这个章节我们就以它为例。 前面我们说了灵敏度和精度,那什么是灵敏度呢?灵敏度就是温度变化了,可能人体需要 1 秒 钟才能感知,但有的毕竟灵敏的温度传感器只需要零点几秒就可以感知;那什么是精度呢?有的传 感器精度是 0.5 摄氏度,有的传感器精度是 0.1 摄氏度,意思就是温度每升降这个单位值,就会被感 知的最小刻度。 那么温度传感器怎么能够感知温度的呢?这就要涉及温度传感器究竟是什么材料制作,以及制 作的原理了;比如有的材料可以感知常温下的温度,但是如果温度超过 300 摄氏度,这个材料有可 能会被融化,所以每个传感器的功能都是有所限制的,也就是说,温度可测范围是有限制的,但是 这个世界的传感器技术每天都在进步和发展,对于外界温度的感知技术也是在不断进步的,或许有 一天,我们能有一个传感器能进入到太阳的内部去检测它的温度也说不定。 7.49.3 18B20温度传感器的特性 我们在这章节中讨论的 18B20 温度传感器是其中的一款普通的传感器,它能把读到的温度转成 二进制的格式发送给单片机,单片机收到它发过来的数据后再转换成比如十进制的方式让我们能知 道当前的温度是多少。这个我们会在下一节详细描述。它的测温范围是-55~125 ℃。固有测温分辨 率为 0.5 ℃。在这个范围内的温度它都能测试出来。 18B20 温度传感器只需要单线就能与单片机进行通信了,数据就是由这根信号线与单片机进行 连接的,加上电源与地,也就是说 18B20 温度传感器只有 3 根引脚就可以了。在这个单线上并不是 只能接一个 18B20 温度传感器的,能接多个 18B20 温度传感器,每个 18B20 温度传感器都有一个地 址,单片机访问哪个地址对应的那个 18B20 温度传感器就能与单片机进行通信。 7.49.4 18B20温度传感器的实现原理 我们先来看下 18B20 温度传感器内部的测温原理图,通过该图我们认识 18B20 温度传感器是 如何实现测温原理的。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 633 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 上图中,低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减 法计数器 1,高温度系数晶振的振荡频率随温度变化而明显改变,所产生的信号作为减法计数器 2 的脉冲输入。图中还隐含着计数门,当计数门打开时,DS18B20 就对低温系数振荡器产生的时钟 脉冲进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器决定,每次测量前,首 先将-55°C 所对应的基数分别置入减法计数器 1 和温度寄存器中,减法计数器 1 和温度寄存器被 预置在-55°C 所对应的一个基数值。减法计数器 1 对低温度系数晶振产生的脉冲信号进行减法计 数,当减法计数器 1 的预置值减到 0 时温度寄存器的值将加 1,减法计数器 1 的预置将重新被装入, 减法计数器 1 重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器 2 计 数到 0 时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。 1)18B20 温度传感器的功能 它能直接读出被测温度,并且可根据实际要求通过简单的编程实现 9~12 位的数字值读数方式。 可以分别在 93.75ms 和 750ms 内完成 9 位到 12 位的数字量,并且从 18B20 读出的信息或写入 18B20 的信息仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂 接的 18B20 供电,无需额为电源。 2)DS18B20温度传感器的工作方式与如何转换温度 CPU 对 DS18B20 的访问流程是:先对 DS18B20 初始化,再进行 ROM 操作命令,最后才能对存储器 操作,数据操作。DS18B20 每一步操作都要遵循严格的工作时序和通信协议。如主机控制 DS18B20 完成温度转换这一过程,根据 DS18B20 的通讯协议,须经三个步骤:每一次读写之前都要对 DS18B20 进行复位,复位成功后发送一条 ROM 指令,最后发送 RAM 指令,这样才能对 DS18B20 进行预定的操 作。 那什么是 ROM 指令,什么又是 RAM 指令呢? (1)DS18B20 温度传感器 64 b 闪速 ROM 的结构如表 1-1,64 位光刻 ROM 是出厂前被光刻好的, 它可以看作是该 DS18B20 的地址序列号,相当于我们的身份证一样,不同的器件地址序列号不同: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 634 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 表 1-1 闪速 ROM 的结构 8b 检验 CRC 48b 序列号 8b 工厂代码(10H) 开始 8 位是产品类型的编号,接着是每个器件的惟一的序号,共有 48 位,最后 8 位是前 56 位 的 CRC 校验码,这也是多个 DS18B20 可以采用一线进行通信的原因。 (2)非易市失性温度报警触发器 TH 和 TL,可通过软件写入用户报警上下限。 (3)高速暂存存储器 DS18B20 温度传感器的内部存储器包括一个高速暂存 RAM 和一个非易失性的可电擦除的 E2RAM。 后者用于存储 TH,TL 值。数据先写入 RAM,经校验后再传给 E2RAM。而配置寄存器为高速暂存器中 的第 5 个字节,他的内容用于确定温度值的数字转换分辨率,DS18B20 工作时按此寄存器中的分辨率 将温度转换为相应精度的数值。该字节各位的定义如表 1-2: 表 1-2 DS18B20 内部存储器 低 5 位一直都是 1,TM 是测试模式位,用于设置 DS18B20 在工作模式还是在测试模式。在 DS18B20 出厂时该位被设置为 0,用户不要去改动,R1 和 R0 决定温度转换的精度位数,即是来设置分辨率, 如表 1-3 所示(DS18B20 出厂时被设置为 12 位)。 表 1-3 R1 和 R0 模式表 R1 R0 分辨率 温度最大转换时间/mm 0 0 9位 93.75 0 1 10 位 187.5 1 0 11 位 275.00 1 1 12 位 750.00 由表 1-3 可见,设定的分辨率越高,所需要的温度数据转换时间就越长。因此,在实际应用中要在 分辨率和转换时间权衡考虑。 高速暂存存储器除了配置寄存器外,还有其他 8 个字节组成,其分配如下所示。其中温度信息(第 1, 2 字节)、TH 和 TL 值第 3,4 字节、第 6~8 字节未用,表现为全逻辑 1;第 9 字节读出的是前面所有 8 个字节的 CRC 码,可用来保证通信正确。 表 1-4 R1 和 R0 模式表 温度低 温度高位 TH 位 TL 配置 保留 保留 保留 8位 CRC 当 DS18B20 接收到温度转换命令后,开始启动转换。转换完成后的温度值就以 16 位带符号扩展的 嵌入式专业技术论坛 (www.armjishu.com)出品 第 635 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 二进制补码形式存储在高速暂存存储器的第 1,2 字节。单片机可通过单线接口读到该数据,读取时 低位在前,高位在后,数据格式以 0.625 ℃/LSB 形式表示。温度值格式如表 1-5:  表 1-5 温度值格式 23 22 21 20 2-1 2-2 2-3 2-4 S S S S S 26 25 24 对应的温度计算:当符号位 S=0 时,直接将二进制位转换为十进制;当 S=1 时,先将补码变换为原 码,再计算十进制值。表 1-6 是对应的一部分温度值。  表 1-6 部分温度值 温度/℃ 二进制表示 十六进制表示 +125 00000111 11010000 07D0H +25.0625 00000001 10010001 0191H +0.5 00000000 00001000 0008H 0 00000000 00000000 0000H -0.5 11111111 11111000 FFF8H -25.0625 11111110 01101111 FE6FH -55 11111100 10010000 FC90H DS18B20 完成温度转换后,就把测得的温度值与 TH,TL 作比较,若 T>TH 或 T<TL,则将该器件内的 告警标志置位,并对主机发出的告警搜索命令作出响应。因此,可用多只 DS18B20 同时测量温度并 进行告警搜索。 (4)CRC 的产生在 64 b ROM 的最高有效字节中存储有循环冗余校验码(CRC)。主机根据 ROM 的 前 56 位来计算 CRC 值,并和存入 DS18B20 中的 CRC 值做比较,以判断主机收到的 ROM 数据是否正确。 虽然 DS18B20 有诸多优点,但使用起来并非易事,由于采用单总线数据传输方式,DS18B20 的数据 I/O 均由同一条线完成。因此,对读写的操作时序要求严格。为保证 DS18B20 的严格 I/O 时序,需要 做较精确的延时。在 DS18B20 操作中,有了比较精确的延时保证,就可以对 DS18B20 进行读写操作、 温度转换及显示等操作。 (5)DS18B20 的控制方法 在硬件上,DS18B20 与单片机的连接有两种方法,一种是 Vcc 接外部电源,GND 接地,I/O 与单 片机的 I/O 线相连;另一种是用寄生电源供电,此时 VDD、GND 接地,I/O 接单片机 I/O。无论是内 部寄生电源还是外部供电,I/O 口线接一个上拉电阻即可。 单片机是如何控制温度传感器的呢?我们来看下 CPU 对温度传感器的控制命令 表 1-7 DS18B20 控制命令 嵌入式专业技术论坛 (www.armjishu.com)出品 第 636 页,共 771 页 www.armjishu.com V1.1 指令 温度转换 读暂存器 写暂存器 复制暂存器 重新调 E2RAM 读电源供电方式 7.49.5 硬件设计 约定代码 44H BEH 4EH 48H B8H B4H ARM 技术论坛 神舟王 STM32F407 用户手册 操 作说 明 启动 DS18B20 进行温度转换 读暂存器 9 个字节内容 将数据写入暂存器的 TH、TL 字节 把暂存器的 TH、TL 字节写到 E2RAM 中 把 E2RAM 中的 TH、TL 字节写到暂存器 TH、TL 字节 启动 DS18B20 发送电源供电方式的信号给主 CPU 神舟王 407 开发板通过与 DS18B20 的连接,烧录对应的例程,能把温度传感器检测到的温度 经过各种显示器件显示出来,如数码管、显示屏或者是彩屏等,用户能通过这些显示设备查看当前 的温度,有的例程还能检测多点的温度 使用神舟王 407 进行测试,通过板子的 J42 单排插针与温度传感器进行连接,神舟王 407 收 到温度传感器发送过来的信号后,把该信号发送到各种显示设备通过十进制的模式显示出来。从图 中我们可以看到,温度传感器只需要一根引脚即可完成单片机与它之间的通信。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 637 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.49.6 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:Printf_Init()初始化串口,以及串口打印 代码分析 2:通过串口打印一些字符到超级终端上 代码分析 3:DS18B20_Init())//初始化 DS18B20,兼检测 18B20 代码分析 4:获取 18B20 传感器的序列号 ID,并判断是否正确 crcstate = DS18B20_Get_Serial(serial) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 638 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 代码分析 5:读取出来的 ID,是一个 7 位的数组,数字的一个成员就是传感器的序列号 ID;其他 6 位是温度传感器 DS18B20 的 CRC 较验值。 代码分析 6:进入一个 while 死循环,再次调用 DS18B20_Init()函数初始化一次传感器,请注意这里 不一定是必须的,再一次初始化是为了保障 18B20 更加可靠的被识别到;然后调用函数 DS18B20_Get_Temp()来获取当前的 18B20 温度传感器的温度 代码分析 7:进一步详细分析 DS18B20_Init()函数 1) 首先初始化 18B20 的数据管脚所对应 CPU 的 GPIO 管脚的时钟 RCC_AHB1PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE); 2) 其次配置这个管脚为输出,因为这个管脚要去输出采集 18B20 传感器的温度等信息 DS18B20_Set_Output(); 3) 配置好 CPU 的管脚之后,尝试用这个管脚发一个命令去复位 DS18B20,复位脉冲(最短为 480uS 的低电平信号) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 639 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 DS18B20_Reset(void) 4) DS18B20_Check()函数是等待 DS18B20 的回应,如果返回 1,表示未检测到 DS18B20 的存在, 可能 18B20 接触不良或者损坏了,需要再检查一下;如果返回 0,则表示 18B20 传感器检测存在。 在这个函数中,首先 DS18B20_Set_Input()函数把连接和控制 18B20 的这个管脚配置成输入方式, 因为下面需要开始读取 18B20 的状态值了;其次,是按照 18B20 的输出给 CPU 的 GPIO 管脚的 信息,有一定的协议和时间规范,这里是 DSl820 等待大约 15.60uS 并且接着发送存在脉冲 (60-240uS 的低电平信号。) 所以这个函数接下来的一些 IF、while()语句就是做这个的,利用变量 retry 来判断这个时间参数。 代码分析 8:DS18B20_Get_Temp()获取温度的函数,这个函数主要是由几个字函数组成的,每次 要对 18B20 操作之前,软件都要先重新复位一下 18B20,然后再 reset 一下,这样主要是确保 18B20 是好的,如果不这样,会导致 18B20 有可能是死机或者无响应的情况。 1) 按照 18B20 的协议,写命令进去,要求开始温度转换到内部的寄存器中 2) 然后再写命令,要求准备读取温度 3) DS18B20_Read_Byte()函数来读取 18B20 返回回来的数据 7.49.7 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.49.8 实验现象 硬件连接,DS18B20 温度传感器与神舟王开发板连接图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 640 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 将程序下载到神舟王 407 核心板后,关闭开关,用随板配置的串口线连接神州王串口 1 与电脑的串 口,打开超级终端,并按如下参数配置串口。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 641 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 关闭电源,重新打开电源,按复位键运行,正常情况下,串口打印信息如下图。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 642 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.50 2.4G无线通信实验两个模块间通信(神舟王STM32F407-库函数版) 7.50.1 2.4G无线模块通讯实验的意义与作用 现实生活中,无线通信到处存在,手机、电视、无线遥控以及卫星等等。很多爱好者非常期望 了解无线通信时如何实现的?从信号的编码,信道传输,信号编码以及传输过程中,根据距离控制 发送功率等等?以下我们将简单了解这一系列的实现过程。 7.50.2 2.4G无线模块特性 NRF24L01+(或 NRF24L01)模块 2.4Ghz 全球开放 ISM 频段免许可证使用,最高工作速率 2Mbps, 最低工作速率 250K ,高效 GFSK 调制,抗干扰能力强,特别适合工业控制场合, 126 频道,满足 多点通信和跳频通信需要,内置硬件 CRC 检错和点对多点通信地址控制,还有低功耗等诸多优点。 带您加入无线数传的世界。 神舟王 407 开发板板载的无线数传模块为 2.4G 数传模块 NRF24L01+(或 NRF24L01)模块, NRF24L01+模块的最大通信速率为 2Mbps。模块如下图所示: 首先我们简单了解 nRF24L01 无线模块的特点以及工作原理。nRF24L01 无线模块,主要芯片是 nRF24L01,其特点如下: z 2.4Ghz 全球开放 ISM 频段免许可证使用; z 采用 GFSK 方式调制,数据传输率为 1Mb/s 或者 2Mb/s; z 具有自动应答和自动再发射功能; z 125 个频道,可以满足多点通信; z 具有 CRC 校验; z 低电压供电:1.9V~3.6V; z 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示), nRF24L01 内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块。其功耗低,在以-6dBm 功率发射时,工作电流只有 9mA;而接收时,工作电流只有 12.3mA。 7.50.3 nRF24L01无线模块的工作原理 使用nRF24L01无线模块,可以理解为使模块和其他设备进行通信。就神舟王407开发板而言, 涉及到nRF24L01无线模块的通信有: 1)神舟王407和无线模块间的通信。通过开发板配置、操作无线模块。 2)无线模块间的通信,无线模块间进行数据的交换。神舟王407开发板有2个2.4模块接口,可分 别连接一个模块;我们可以将一个模块用于发送数据,另一个模块用于接收数据。 下面我们围绕这2种通信进行介绍。 nRF24L01无线模块管脚说明 由下图可以看到,nRF24L01无线模块有6个信号接入单片机中(还有两个是电源和地)。6个信 嵌入式专业技术论坛 (www.armjishu.com)出品 第 643 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 号接入端为普通的I/O口。要控制nRF24L01无线模块,需通过这6个I/O口模拟SPI方式对无线模块进 行配置。 2.4G无线模块管脚定义如下: 2.4G 无线模块 nRF24L01 管脚说明: nRF24L01 模块 管脚信号 管脚 信号说明 GND 1 地信号 VCC 2 电源输入 电压范围1.9V~3.6V电源 CE 3 高电平有效,(RX)发射或(TX)接收模式控制 IRQ 8 低电平有效,中断输出。 CSN 4 SPI片选信号 (SPI信号) SCK 5 SPI时钟,由主器件产生 (SPI信号) MOSI 6 从SPI数据输出,三态输出。 (SPI信号) MISO 7 从SPI数据输入 (SPI信号) 注释: 1) 单片机和2.4G无线模块通信遵循SPI协议,初始化SPI总线时先将CE管脚拉低。 2) 模块工作电压范围为1.9V~3.6V,超过3.6V,可能烧坏芯片。神舟王407开发板给模块加的是 3.3V的电压。 nRF24L01内部结构介绍: nRF24L01内部结构如下图: 神舟王 407 通过 SPI 接口(这里用 I/O 口模拟)和 nRF24L01 无线模块通信,Register map 是用 来保存单片机对 nRF24L01 无线模块配置的寄存器,我们主要操作的也是这些寄存器。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 644 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 TX FIPOs、RX FIFOs 分别用于存储待发送和接收到的数据包。RF Transmitter 为射频发射器, RF Receiver 为射频接收器。XC1、XC2 连接晶体振荡器,用于对信号的模数/数模转换等提供时钟。 ANT1、ANT2 天线接口。 nRF24L01 无线模块工作模式说明: 工作模式决定了模块和模块间的通信方式,主要由神舟王 407 对 nRF24L01 无线模块的配置决 定。下图为 nRF24L01 无线模块的工作模式。它们由 CE 和寄存器内部 PWR_UP、PRIM_RX 共同 控制,有发射模式、接收模式、空闲模式、掉电模式。如下图: 空闲模式: nRF24L01 的空闲模式是为了减少平均工作电流而设计的,其最大的优点是,实现节能的同时, 缩短芯片的启动时间。在空闲模式下,部分片内晶振仍在工作,此时的工作电流跟外部晶振的频率 有关。 待机模式 I 主要用于降低电流损耗,在该模式下晶体振荡器仍然是工作的;待机模式 II 则是在 FIFO 寄存器为空且 CE=1 时进入此模式;待机模式下,所有配置字仍然保留。 掉电模式: 在掉电模式下,为了得到最小的工作电流,一般此时的工作电流为 900mA 左右。掉电模式下, 配置字的内容仍保存在 nRF24L01 片内,这是它和断电状态的最大区别。 接收和发生模式: 通过神舟王 407 对 nRF24L01 无线模块的配置,收发模式可以分为三种,分别为:Enhanced ShockBurstTM 收发模式、ShockBurstTM 收发模式和直接收发模式三种。它们规定了无线模块间进 行通信的相关协议。 工作在直接收发模式下时,数据一般在低频状态下进行设置,以保证接收机能探测到信号。 Enhanced ShockBurstTM 收发模式和 ShockBurstTM 收发模式,前者比后者多了一个确认数据传输的 信号,保证数据传输的可靠性。如下图为两种模式的数据包格式: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 645 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 我们这里详细分析 Enhanced ShockBurstTM 收发模式。通过对这个模式的分析了解,模块间进 行数据交换的流程。 Enhanced ShockBurstTM 收发模式: Enhanced ShockBurstTM 收发模式下,使用片内的先入先出堆栈区,数据低速从微控制器送入, 但高速(1Mbps)发射,这样可以尽量节能,因此,使用低速的微控制器也能得到很高的射频数据发射 速率。与射频协议相关的所有高速信号处理都在片内进行,这种做法有三大好处:尽量节能;低的 系统费用(低速微处理器也能进行高速射频发射);数据在空中停留时间短,抗干扰性高。Enhanced ShockBurstTM 技术同时也减小了整个系统的平均工作电流。 在 Enhanced ShockBurstTM 收发模式下, NRF24L01 自动处理字头和 CRC 校验码。在接收数 据时,自动把字头和 CRC 校验码移去。在发送数据时,自动加上字头和 CRC 校验码,在发送模式 下,置 CE 为高,至少 10us,将时发送过程完成后。 Enhanced ShockBurstTM 发射流程 A. 把接收机的地址和要发送的数据按时序送入 NRF24L01; B. 配置 CONFIG 寄存器,使之进入发送模式。 C. 微控制器把 CE 置高(至少 10us),激发 NRF24L01 进行 Enhanced ShockBurstTM 发射; D.N24L01 的 Enhanced ShockBurstTM 发射 (1) 给射频前端供电; (2)射频数据打包(加字头、CRC 校验码); (3) 高速发射数据包; (4)发射完成,NRF24L01 进入空闲状态。 Enhanced ShockBurstTM 接收流程 A. 配置本机地址和要接收的数据包大小; B. 配置 CONFIG 寄存器,使之进入接收模式,把 CE 置高。 C. 130us 后,NRF24L01 进入监视状态,等待数据包的到来; D.当接收到正确的数据包(正确的地址和 CRC 校验码),NRF2401 自动把字头、地址和 CRC 校 验位移去; E. NRF24L01 通过把 STATUS 寄存器的 RX_DR 置位(STATUS 一般引起微控制器中断)通知微控 制器; F. 微控制器把数据从 NewMsg_RF2401 读出; G. 所有数据读取完毕后,可以清除 STATUS 寄存器。NRF2401 可以进入四种主要的模式之一。 nRF24L01 在掉电模式下转入发射模式或接受模式前必须经过 1.5mS 的待机模式。断电后寄存器 内容丢失,模块上电需重新配置。具体配置时序如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 646 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 单片机和 nRF24L01 通信时相关的控制指令: 单片机和 nRF24L01 通过 SPI 通信。SPI 口为同步串行通信接口。在对 nRF24L01 操作时,以 SPI 相关的指令共有 8 个,。这些控制指令由 nRF24L01 的 MOSI 输入,相应的状态和数据信息是从 MISO 输出给 MCU。控制指令如下表: nRF24L01 寄存器说明: nRF24L01 的收发模式由配置字决定。nRF24L01 所有的配置字都由配置寄存器定义,这些配置 寄存器可通过 SPI 口访问。nRF24L01 寄存器有 25 个,常用的配置寄存器如下表。 地址(H) 寄存器名称 功能 00 CONFIG 设置 24L01 工作模式 01 EN_AA 设置接收通道及自动应答 02 EN_RXADDR 使能接收通道地址 03 SETUP_AW 设置地址宽度 嵌入式专业技术论坛 (www.armjishu.com)出品 第 647 页,共 771 页 www.armjishu.com V1.1 04 07 0A~0F 10 11~16 SETUP_RETR STATUS RX_ADDR_P0~P5 TX_ADDR RX_PW_P0~P5 ARM 技术论坛 神舟王 STM32F407 用户手册 设置自动重发数据时间和次数 状态寄存器,用来判定工作状态 设置接收通道地址 设置发送地址(先写低字节) 设置接收通道的有效数据宽度 神舟王 407 开发板和 nRF24L01 无线模块通信所遵循的时序: 其中 Cn 表示 SPI 指令位;Sn 表示状态寄存器位;Dn 表示数据位。每个字节高位在前。 SPI 读时序: SPI 写时序: 由时序图可知: 1) 当 CSN 引脚由高电平向低电平跳变时;SPI 接口开始等待一条指令。当 CSN 引脚由低电平向高电 平跳变时;结束当前 SPI 的活动。 2) SCK 时钟线,由低电平向高电平跳变,高电平时取数据。 3) 无论是读操作还是写操作,MISO 线都返回状态寄存器位 Sn。 到此我们总结nRF24L01模块工作的基本流程: 发送数据时,首先将 nRF24L01 配置为发送模式;接着把发送地址和发送数据按照时序要求经 过 SPI 总线写入 nRF24L01 缓存区,发送数据必须在 SPI 片选 CSN 为低时,连续写入。而发送地址 在发射时写入一次即可,然后使能管脚 CE 置高并保持 10uS 以上,同时延迟 130uS 后发送数据;如 果开启自动应答功能时,nRF24L01 在发送数据后就进入接收模式,接收应答信号。若收到应答,则 表示此次通信成功;若没有收到应答,就自动重新发射该数据(自动重启功能需开启)。当发送成功 后,IRQ 中断标志变低,通过 SPI 通知处理器。在一次发送成功后,如果发送堆栈中有数据而且使 能为高时,则进入下一次发射;否则进入空闲模式。 在接收数据时,先将nRF24L01设置为接收模式,接着延迟130uS进入接收状态等待数据的到来。 当接收检测到有效的地址和CRC时,就将数据包存储在接收堆栈中,同时中断标志位IRQ置低,通知 处理器取数据。如果开启自动应答,接收方同时接入发射状态,回传应答信号。直到接收结束,便 将使能关闭,进入空闲模式。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 648 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.50.4 硬件设计 神舟王407开发板板载有两个2.4G无线数传模块NRF24L01 (或 NRF24L01+)连接器。单片机的IO 与NRF24L01无线模块相连,模拟SPI协议与NRF24L01通信。 第一块2.4G无线数传模块NRF24L01的硬件接口原理图如下所示: 第二块2.4G无线数传模块NRF24L01的硬件接口原理图如下所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 649 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.50.5 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 650 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:Printf_Init() 主要是 2.4G 无线模块实验需要用到的串口,LED 灯和按键的初始化。配置 LED 灯使用的 GPIO 管脚为推挽输出模式,按键使用的 GPIO 管脚 配置为上拉输入模式,另外配置了串口 1 作为我们的 输入输出设备。 代码分析 2:NRF24L01_Init() 2.4G 无线模块初始化,查看是否能检测到 2.4G 无线模块 代码分析 3:然后紧接着初始化第 2 个 2.4G 无线模块,NRF24L01_module2_Init() NRF24L01_module2_Check()查看是否能检测到第 2 个 2.4G 无线模块,检测成功程序继续往下执行, 检测失败将从串口输出错误故障 嵌入式专业技术论坛 (www.armjishu.com)出品 第 651 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 4:然后进入一个死循环,让用户使用按键来判断是选择哪种模式,总共有两种模式,是用 户自己定义的,一种是模块 1 发,模块 2 收;另外一种是模块 1 收,模块 2 发。 1) 第一种模式 2) 第二种模式 3) 设置选择是采用第一种模式还是采用第二种模式 WIRELESS_MODE_SET(void)函数里可以看到 有 3 种选择方式,可以通过不同的按键进行选择,选择了不同的按键,会使得 WireLess_Work_Mode 赋予不同的值。 以下是 WireLess_Work_Mode 被赋予的不同的值: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 652 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 5:读取 SPI 寄存器值 ,regaddr:要读的寄存器 NRF24L01_Write_Reg(u8 regaddr,u8 data) 代码分析 6: NRF24L01_Write_Reg(u8 regaddr,u8 data)通过 SPI 写寄存器 代码分析 6:SPI2_ReadWriteByte(u8 TxData) SPI 读写数据函数,如果 TxData 是 0xff,则表示是读数 据;如果不是,则表示对 2.4G 无线模块写数据到对应的寄存器中 代码分析 7:SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data)是最底层的数据发送函数,通过 SPI 总线把数据发送出去 7.50.6 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 嵌入式专业技术论坛 (www.armjishu.com)出品 第 653 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.50.7 实验现象 硬件连接,将两块 2.4G 无线模块与神舟王开发板连接,如下图。 将程序下载到神舟王 407 核心板后,用随板配置的串口线连接神州王串口 1 与电脑的串口, 打开超级终端,并按如下参数配置串口。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 654 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 关闭电源,重新打开电源运行,并按复位键,正常情况下,超级终端窗口显示串口打印信息如下图。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 655 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 按下神舟王开发板上的 KEY 1 键,2.4G 无线模块 1 为发送模式,同时,2.4G 无线模块 2 为接收模式; 如下图 按下神舟王开发板复位键;再按 KEY 2 键,2.4G 无线模块 1 为接收模式,同时,2.4G 无线模块 2 为发送模式;如下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 656 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.51 PS2键盘实验(神舟王STM32F407-库函数版) 7.51.1 PS/2接口简介 PS/2 原是“Personal System 2”的意思,“个人系统 2”,是 IBM 公司在上个世纪 80 年代推出的 一种个人电脑。以前完全开放的 PC 标准让 IBM 觉得利益受了损失。所以 IBM 设计了 PS/2 这种电 脑,目的是重新定义 PC 标准,不再采用开放标准的方式。在这种电脑上 IBM 使用了新型 MCA 总 线,新的 OS/2 操作系统。PS/2 电脑上使用的键盘鼠标接口就是现在的 PS/2 接口。因为标准不开放, PS/2 电脑在市场中失败了。只有 PS/2 接口一直沿用到今天。 本章节通过王 407 的 IO 模拟 PS/2 协议,接收来自 PS/2 键盘的按键数据。模拟之前首先看下 PS/2 的硬件接口,再看下 PS/2 的协议,然后再用神舟王 407 的 IO 接口模拟。 7.51.2 PS/2键盘鼠标的硬件接口 PS/2 接口是在较早电脑上常见的接口之一,用于鼠标、键盘等设备。一般情况下,PS/2 接口的 鼠标为绿色,键盘为紫色,PS/2 接口外观如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 657 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 PS/2 接口是一种 6 针的圆型接口。但只使用其中的 4 针传输数据和供电,其余 2 个为空脚,其 中“Male”表示公的、插头;“Female”母的,插座管脚图如下: 管脚定义如下: 管脚 信号名 1 DATA 2 n/c 3 GND 4 VCC 5 CLK 6 n/c 描述 按键数据(Key Data) 空(Not connected) 地(Gnd) 5V电源(Power, +5 VDC) 时钟(Clock) 空(Not connected) 7.51.3 PS/2的协议 可以看到 PS/2 实际最少可以由两根管脚进行控制,一根是 CLK 时钟信号线,一根是数据线,按 照一定的规则,把数据传输到另外一端就可以了。 PS/2 每笔数据传输所的时序图如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 658 页,共 771 页 www.armjishu.com ARM 技术论坛 V1.1 具体解释这个时序图的协议过程: 神舟王 STM32F407 用户手册 每帧包含 11 位,每位在时钟的下降沿被主机读 1 个起始位 总是逻辑 0 8 个数据位 低位(LSB)在前 1 个奇偶校验位 奇校验 1 个停止位 总是逻辑 1 PS/2 通信协议是一种双向同步串行通迅协议。通迅的两端通过 CLOCK(时钟信号端)同步,并 通过 DATA(数据端口)交换数据。任何一方如果想要抑制另外一方的通迅时,只需要把 CLOCK 拉 到低电平。 PS2 标准,规范每笔数据传输包含起始位(start bit)、扫描码(scan code)、奇同位检 查(odd parity)、以及终止位(stop bit)共计 11 位,并以双向串行数据传输的方式,达到通信的目的。且 当主机端(host)或从机端(slave)并无传送或接收数据时,数据传输端口及时钟信号端口均将升为高 电位。 在这里明白了协议沟通的方式,数据就是这么进行交换的,下面用一个实际例子来看一下具体 怎么使用 PS/2 协议的。 7.51.4 键盘与PS/2协议实例分析 键盘其实就是一个大型的按键矩阵,它们由安装在电路板上的处理器(叫做“键盘编码器”)来 监视着。虽然不同的键盘可能采用不同的处理器,但是它们完成的任务都是一样的,即监视哪些按 键被按下,哪些按键被释放了,并将这些信息传送到主机。如果有必要,处理器处理所有的去抖动, 并在它的 16 字节的缓冲区里缓冲数据。主机端包含了一个“键盘控制器”与键盘处理器进行通讯, 并解码来自键盘处理器的信息,然后高速系统当前按键对应的处理事情。主机与键盘之间的通讯仍 旧采用 IBM 的协议。 键盘处理器花费很多时间来扫描或监视按键矩阵。如果发现有按键按下、释放或长按,键盘就 发送“扫描码”的信息到主机。扫描码有两种不同的类型:“通码”和“断 码”。当一个键被按下去 或长按的时候,键盘就发送通码;当一个键被释放的时候,键盘就发送断码。每个键盘被分配了唯 一的通码和断码,这样主机通过查找唯一的扫描码就可以确定是哪个按键被按下或释放。 每个键一整套的通断码组成了“扫描码集”,现在大多数的键盘采用第三套扫描码。由于没有一 个简单的公式可以计算扫描码,所以要知道某个特定按键的通码和断码,只能采用查表的方法来获 得。需要特别注意的是,按键的通码值表示键盘上的一个按键,并不表示印刷在按键上的那个字符, 这就意味着通码和 ASCII 码之间没有任何关联。 在与键盘通信的时候,PS/2 接口是输入接口,而不是传输接口。所以 PS2 口根本没有传输速率 的概念,只有扫描速率。在 Windows 环境下,PS/2 鼠标的采样率默认为 60 次/秒,USB 鼠标的采样 率为 120 次/秒。较高的采样率理论上可以提高鼠标的移动精度。PS/2 接口设备不支持热插拔,强行 带电插拔有可能烧毁主板。 扫描到键盘数据之后,传输给中心系统进行解码分析,然后进行相应的操作。 第三套键盘扫描码可以参考一下,比如字符’A’按下是发送数据 1C,弹起按键发送数据 F0,1C, 具体其他整张表的数据如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 659 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 按键 A B C D E F G H 按下 1C 32 21 23 24 2B 34 33 I 43 J 3B K 42 L 4B M 3A N 31 O 44 P 4D Q 15 R 2D S 1B T 2C U 3C V 2A W 1D X 22 Y 35 Z 1A 0 45 弹起 F0,1C F0,32 F0,21 F0,23 F0,24 F0,2B F0,34 F0,33 按键 9 ` = \ BKSP SPACE 按下 46 0E 4E 55 5C 66 29 TAB 0D F0,48 CAPS 14 F0,3B L SHFT 12 F0,42 F0,4B F0,3A F0,31 F0,44 F0,4D F0,15 F0,2D F0,1B F0,2C F0,3C F0,2A F0,1D F0,22 F0,35 F0,1A F0,45 L CTRL 11 L WIN 8B L ALT 19 R SHFT 59 R CTRL 58 R WIN 8C R ALT 39 APPS 8D ENTER 5A ESC 08 F1 07 F2 0F F3 17 F4 1F F5 27 F6 2F F7 37 弹起 F0,46 F0,0E F0,4E F0,55 F0,5C F0,66 F0,29 F0,0D F0,14 F0,12 F0,11 F0,8B F0,19 F0,59 F0,58 F0,8C F0,39 F0,8D F0,5A F0,08 F0,07 F0,0F F0,17 F0,1F F0,27 F0,2F F0,37 按键 按下 [ 54 INSERT 67 HOME 6E PG UP 6F DELETE 64 END 65 PG DN 6D U ARROW 63 L ARROW 61 D ARROW 60 R ARROW 6A NUM 76 KP / 4A KP * 7E KP - 4E KP + 7C KP EN 79 KP . 71 KP 0 70 KP 1 69 KP 2 72 KP 3 7A KP 4 6B KP 5 73 KP 6 74 KP 7 6C KP 8 75 弹起 F0,54 F0,67 F0,6E F0,6F F0,64 F0,65 F0,6D F0,63 F0,61 F0,60 F0,6A F0,76 F0,4A F0,7E F0,4E F0,7C F0,79 F0,71 F0,70 F0,69 F0,72 F0,7A F0,6B F0,73 F0,74 F0,6C F0,75 嵌入式专业技术论坛 (www.armjishu.com)出品 第 660 页,共 771 页 www.armjishu.com V1.1 1 16 2 1E 3 26 4 25 5 2E 6 36 7 3D 8 3E F0,16 F0,1E F0,26 F0,25 F0,2E F0,36 F0,3D F0,3E F8 3F F9 47 F10 4F F11 56 F12 5E PRNT SCRN 57 SCROLL 5F PAUSE 62 ARM 技术论坛 神舟王 STM32F407 用户手册 F0,3F KP 9 7D F0,47 ] 5B F0,4F ; 4C F0,56 ' 52 F0,5E , 41 F0,57 . 49 F0,5F / 4A F0,62 F0,7D F0,5B F0,4C F0,52 F0,41 F0,49 F0,4A 7.51.5 实验原理 本实验通过神舟王 407 的 IO 模拟 PS/2 协议,完成对整个 PS/2 接口的模拟和控制。 7.51.6 硬件设计 PS/2 接口的原理图: 神舟王 407 开发板上对应的控制引脚: 可以看到原理图中的 CLK 是 PS/2 协议中的时钟线,DA 是 PS/2 协议中的数据数据线;在这里 通过神舟王 407 对这两根线进行连接完成对整个 PS/2 接口的模拟和控制。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 661 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.51.7 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 代码分析 1:Printf_Init()初始化串口串口打印 代码分析 2:PS2_IO_init()初始化 PS/2 接口,主要是两根信号线,一根是 PS2_CLK,另一根是 PS2_DAT 嵌入式专业技术论坛 (www.armjishu.com)出品 第 662 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 3:PS2_EXTI_Config()函数 因为 PG8 管脚连接了 PS/2 的 CLK 时钟,接下来就是配置 PS/2 外部中断线,每一个 PS/2 的 CLK 时钟信号一来,都会产生一个中断,产生中断就会执行这个 PS2_CLK_EXTI_IRQn 中断函数(#define PS2_CLK_EXTI_IRQn EXTI9_5_IRQn),这个函数从 PS/2 协议中可以得知,应该要完成读取数据 的功能,一个时钟周期就要读取一个数据 bit。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 663 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 4:中断函数 EXTI9_5_IRQHandler()中调用了 PS2_KEY_ISR()函数,每来一个 CLK 时 钟就会产生一次中断,每次中断都会进入这个中断函数,每次进入中断函数都会调用一次 PS2_KEY_ISR()函数 代码分析 5:PS2_KEY_ISR()在这个函数中 bBitCounter 是一个全局变量,每次进入中断就会加 1 每中断进来之后,都通过 bBitCounter++来计数,并且通过‘if(bBitCounter > 1 && bBitCounter < 10)’ 来判断只采集 8 位 bit 给 bKeyCode 判断 bBitCounter ==11 表示中断 11 次后表示一帧数据收完,清变量准备下一次接收,对 PS/2 协议来 说,它需要接收到的数据是一种每帧包含 11 位的串行数据: 1 个起始位 总是逻辑 0 嵌入式专业技术论坛 (www.armjishu.com)出品 第 664 页,共 771 页 www.armjishu.com V1.1 8 个数据位 低位(LSB)在前 1 个奇偶校验位 奇校验 1 个停止位 总是逻辑 1 在我们的代码中截取的是中间那 8 个数据位。 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 6:PS2_KeyDeCode(unsigned char bKeyCode)获取获取 PS2 按键 ASIIC 码,看看原来里面的 case 语句的数字已经跟键盘的 0~9 的字符都对应了 PS/2 编码的。 读到这个码之后,将读取到的键盘输入到这个结构体中来, 代码分析 7:PS2_KEY_Scan()这个函数最终把键盘的 ASCII 码返回从结构体中读取出来了 嵌入式专业技术论坛 (www.armjishu.com)出品 第 665 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 8:这样就把 ASCII 码读取到了,读取到之后就好处理了,想怎么显示就怎么显示,在这 个程序中,我们将 ASCII 码显示到 TFT 彩屏上和打印到了串口输出的超级终端上。 7.51.8 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.51.9 实验现象 将固件下载到神州王后,从新上电运行,正常情况下开发板的屏幕上会显示如图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 666 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 同时超级终端上会显示 在神州王的 PS2 接口上接上 PS2 接口的键盘就可以在 PS2 键盘上任意输入值输入的同时将在超级终 端上显示如图(如 123456) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 667 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 当然,液晶屏上也一样会同步显示超级终端上的字符,我们接下来敲一些其他字符,可以看到液晶 屏上也同步显示出来了: 7.52 IR红外线接收发送实验 (神舟王STM32F407-库函数版) 7.52.1 红外收发的简介 在了解红外收发前,我们先来了解一下什么是红外,在日常生活中,我们通过眼睛能看到各种 颜色的光。那我们是否了解各种颜色的光之间有什么区别的呢?难道就只是颜色不一样?那为什么 嵌入式专业技术论坛 (www.armjishu.com)出品 第 668 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 光又分为那么多种颜色呢? 其实,光的颜色是由它的波长来决定的,那么波长又是什么呢?为了能让用户更能理解它的定 义,我们不是科学家,不深入研究,只是了解一下它的定义就行了,我们前面知道了知道光的颜色 是由波长决定的。光的波长就是光在单位时间内通过的位移(位移是从空间的一个位置运动到另一 个位置,它的位置变化叫做在这一运动过程中的位移)。光的本质是电磁波,所以就会有频率的产生。 光的频率在传播中保持不变,意思是在光通过不同介质的时候,频率不变而波长发生改变。因此, 光的波长由光的频率(颜色),以及传播的介质决定。 波长的单位我们可以用 nm 或者 um 来表示,各种颜色有各自的波长,人的眼睛能看到的可见光 按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为 620~760nm; 紫光的波长范围为 380~440nm。比紫光波长还短的光叫紫外线,比红光波长还长的光叫红外线。在 1800 年 4 月 24 日英国伦敦皇家学会(ROYAL SOCIETY)的威廉·赫歇尔发表太阳光在可见光谱的红 光之外还有一种不可见的延伸光谱,具有热效应。他所使用的方法很简单,用一支温度计测量经过 棱镜分光后的各色光线温度,由紫到红,发现温度逐渐增加,可是当温度计放到红光以外的部分, 温度仍持续上升,因而断定有红外线的存在。红外线遥控就是利用波长为 760nm~400um 之间的近 红外线来传送控制信号的。下图为各种光的波长示意图,红光外的为红外光,紫色光以外的为紫外 光。 7.52.2 红外收发的特点与用途 1).红外的特点有: z 具有很强热效应 z 易于被物体吸收 z 穿透能力比可见光强 z 小角度(30 度锥角以内),短距离 z 点对点直线数据传输,保密性强 z 传输速率较高 2).红外的用途有: 通讯技术———常被应用在计算机及其外围设备、移动电话、数码相机、工业设备、网络接入 嵌入式专业技术论坛 (www.armjishu.com)出品 第 669 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 设备,如调制解调器等,像我们这章所用到的红外收发,还有深海探测等无线通讯方面的技术 医疗用途———红外线对人体皮肤、皮下组织具有强烈的穿透力。外界红外线辐射人体产生的 一次效应可以使皮肤和皮下组织的温度相应增高,促进血液的循环和新陈代谢,促进人的健康,红 外线还有杀菌的能力。 因为我们这章用到的是红外通讯技术,所以它的其他用途我们就不作说明了,主要说下用作红 外收发通讯的用途。 红外通讯就是通过红外线传输数据。在电脑技术发展早期,数据都是通过线缆传输的,线缆传 输连线麻烦,需要特制接口,颇为不便。无线通信技术逐渐发展起来。 7.52.3 红外的发送工作原理 红外遥控有发送和接收两个组成部分。发送端将待发送的二进制信号编码调制为一系列的脉冲 串信号,通过红外发射管发射红外信号。红外接收完成对红外信号的接收、放大、检波、整形,并 解调出遥控编码脉冲,流程图如下: 把需要发送的信号编码调制为一系列的脉冲串信号由红外 LED 发送出去。 二进制信号的调制由单片机来完成,它把编码后的二进制信号调制成一定频率的间断脉冲串, 相当于用二进制信号的编码乘以这个间断脉冲信号得到的间断脉冲串,即是调制后用于红外发射二 极管发送的信号,如下图所示,要使红外发光二极管产生调制光,只需在它的驱动管上加上一定频 率的脉冲电压。一般由键盘电路、红外编码芯片、电源和红外发射电路组成 在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型,这样就要求信号 按一定的编码传送,编码则会由编码芯片或电路完成。通过对用户码的检验,每个遥控器只能控制 一个设备动作,这样可以有效地防止多个设备之间的干扰。就像是电视机、空调有专门的遥控器, 遥控器上的按键各有各自的功能。 红外遥控发射芯片采用 PPM 编码方式(脉冲位置调制,又称脉位调制,由头码+脉冲数组成,称为 PPM 编码方式) , 当发射器按键按下后 , 将发射一组 108ms 的编码脉冲。遥控编码脉冲由前导码、 16 位地址码(8 位地址码、 8 位地址码的反码)和 16 位操作码(8 位操作码、 8 位操作码的反码) 组成, 反码表示正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。由一个 9ms 的高电 平 ( 起始码 ) 和一个 4. 5ms 的低电平 ( 结果码 ) 组成作为接受数据的准备脉冲。解码的关键是如何识 别“0”和“1”,从位的定义我们可以发现“0”、“1”均以以脉宽为 0. 56ms 的电平开始、周期为 1. 12ms 的 嵌入式专业技术论坛 (www.armjishu.com)出品 第 670 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 组合表示二进制的 “0” ;以脉宽为 1. 68ms 、周期为 2. 24ms 的组合表示二进制的 “1”,根据这样的 定义,我们就能读出发送的数据是什么了。 下图为我们的红外发送装置,它由键盘电路、红外编码芯片、电源和红外发射电路组成,组合 成一起就能把按键编码成一定的数据发送出去给红外接收了 嵌入式专业技术论坛 (www.armjishu.com)出品 第 671 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.52.4 红外的接收工作原理 我们首先了解一下红外接收头,再看红外接收原理: 红外线接收头是目前使用非常广泛的一种通信和遥控器件,在现实生活中几乎随处可见,例如 电视机、录像机、空调机等等,都"不约而同"地采用红外线遥控,它的广泛使用源于它多方面的优 点:抗干扰能力好、编码及解码容易、功耗小、成本低等。我们可以从它的特性、实物图与尺寸及 引脚定义和它的接收方式去了解它。 红外接收头的特性: ●小型设计; ●内置专用 IC; ●宽角度及长距离接收; ●抗干挠能力强; ●能抵挡环境干挠光线; ●低电压工作; 红外接收头实物图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 672 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 尺寸及引脚定义结构图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 673 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 接收角度: 红外接收原理: 了解了红外接收头后,我们再来了解下它是如何工作的,它的原理是什么。红外接收头内置接 收管将红外发射管发射出来的光信号转换为微弱的电信号,此信号经由 IC 内部放大器进行放大,然 嵌入式专业技术论坛 (www.armjishu.com)出品 第 674 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 后通过接收管的处理将波形整形后还原为遥控器发射出的原始编码,经由接收头的信号输出脚输入 到电器上的编码识别电路,红外解码的关键就是识别 0 和 1。 我们前面介绍过红外接收是完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉 冲的,这个是由接收头内部完成的。经过它的接收放大和解调会在输出端直接输出原始的信号 红外接收头一般是接收、放大、解调一体头,一般红外信号经接收头解调后,数据 “0”和“1” 的区别通常体现在高低电平的时间长短或信号周期上,这个我们上面有介绍。单片机解码时,通常 将接收头输出脚连接到单片机的外部中断,结合定时器判断外部中断间隔的时间从而获取数据。重 点是找到数据“0”与“1”间的波形差别。 在这里特别强调:编码与解码是一对逆过程,不仅在原理上是一对逆过程,在码的发收过程也 是互反的,即以前发射端原始信号是高电平,那接收头输出的就是低电平,反之亦然。因此为了保证 解码过程简单方便,在编码时应该直接换算成其反码。如下图为红外发送与红外接收头接收的电平 对比情况 红外接收过程: 接收电路的红外接收管是一种光敏二极管,使用时要给红外接收二极管加反向偏压,它才能正 常工作而获得高的灵敏度。红外接收二极管一般有圆形和方形两种。由于红外发光二极管的发射功 率较小,红外接收二极管收到的信号较弱,所以接收端就要增加高增益放大电路。然而现在不论是 业余制作或正式的产品,大都采用成品的一体化接收头,红外线一体化接收头是集红外接收、放大、 滤波和比较器输出等的模块,性能稳定、可靠。所以,有了一体化接收头,人们不再制作接收放大 电路,这样红外接收电路不仅简单而且可靠性大大提高。 红外接收头包含两个芯片,一个是 PD(即红外接收管),一个是 IC。其中 PD 接收来自发射管的光信 嵌入式专业技术论坛 (www.armjishu.com)出品 第 675 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 号(该信号已被调制),将光信号转换为电信号,即光电转换,常用于光接收器中。PD 芯片属于典 型的 PIN 结构光电二极管。由 PD 接收转换而来的电信号通过 IC 进行放大,自动增益控制,滤波, 解调,波形整形,比较器输出交由后面的电路进行识别还原。以上就是红外接收头的接收过程。 红外接收头在完成解码的时候,通过接收头的信号输出脚输入到电器上的编码识别电路或者是单片 机中完成各种操作,如我们例程中的控制 LED、在数码管或者是 1602 屏上显示接收到的数据。 7.52.5 硬件设计 在神舟王407中,设计了红外收和红外发两套装置,J4为红外发送的插槽,通过PG6管脚 发命令给红外发送传感器,让其发送数据出去;J41为红外接收探头的接口,红外数据经 过PG8的引脚传输给处理器上。 7.52.6 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 676 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:整个代码的关键是在中断函数里采集红外的数据,通过一个 STRUCT 结构体把这个采 集的数据传输过来,这个结构体是一个全局的结构体 typedef union _Remote_Infrared_data_union //定义红外线接收到的数据结构体类型 { Remote_Infrared_data_struct RemoteInfraredDataStruct; u32 uiRemoteInfraredData; }Remote_Infrared_data_union; 所以只需要当红外数据来临的时候,产生一个中断,然后在中断中让中断函数把这个数据采集 到保存到 Remote_Infrared_data_union 的结构体中去,这样就可以了 代码分析 2:Printf_Init()初始化串口通信 代码分析 3:Remote_Infrared_IO_init()红外接收 IO 口初始化 1) 配置 PG8,也就是红外接收头的 GPIO 管脚配置 嵌入式专业技术论坛 (www.armjishu.com)出品 第 677 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 2) Remote_Infrared_EXTI_Config()配置 PG8 管脚为中断管脚,产生中断调用中断函数 EXTI9_5_IRQn 代码分析 4:Remote_Infrared_TX_init()红外发送 IO 口初始化 代码分析 5:KEY_Config()配置按键 代码分析 6:STM324xG_LCD_Init()液晶屏初始化 代码分析 7:Remote_Infrared_KeyDeCode()把从中断获取到的数据放到 STRUCT 结构体中,然后从 STRUCT 结构体中取出数据,进行代码匹配,再输出给用户 7.52.7 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 嵌入式专业技术论坛 (www.armjishu.com)出品 第 678 页,共 771 页 www.armjishu.com V1.1 在线调试 小节进行操作。 7.52.8 实验现象 用到外设器件:红外遥控器 ARM 技术论坛 神舟王 STM32F407 用户手册 将程序下载到神舟王 407 核心板后,关闭电源开关,用随板配置的串口线连接神州王串口 1 与电脑 的串口,重新打开电源运行并按复位键,正常情况下, 神舟王开发板上的 DS1 灯在闪烁,其它的三个常亮。液晶彩屏显示如图 超级终端窗口显示串口打印信息如下图。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 679 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 红外遥控器操作,按下 0、按下 1、按下 2、按下 3、按下 4、按下 5、按下 6 显示信息结果以下图。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 680 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.53 VS1003示例音乐播放(神舟王STM32F407-库函数版) 7.53.1 VS1003芯片介绍 本实验我们通过 VS1003 播放音乐。在此之前,我们先了解一 VS1003 芯片的基本信息。 1)VS1003 特性 首先我们先了解一下,我们芯片—VS1003。它是来自芬兰 VLSI 半导体公司,功能强大,价格便宜, 简单易用。下面是它的一些性能: VS1003: VS1003 音频解码格式:MP3,MP3+V,WMA,WAV,MIDI,SP-MIDI;录音编码格式: IMA ADPCM(单声道),麦克风和线入(Line input)两种输入方式;支持 MP3 和 WAV 流;低功耗; 具有内部锁相环时钟倍频器;高质量的立体声数模转换器(DAC);16 位可调片内模数转换器(ADC); 高质量的立体声耳塞驱动(30 欧);单独的模拟、数字和 IO 供电电源;串行的数据和控制接口(SPI); 2、SPI 接口,控制信号线均引出 3、1 个耳机和音响输出接口 4、1 个麦克风,用于录音 5、1 个 line_in 输入接口 6、电源指示灯 7、板载 3.3V 和 2.5V LDO 1117,最大提供 800mA 电流 8、单电源供电: +5VDC ,电容滤波 9、12.288 Mhz 晶振 10、PCB 尺寸: 50x40.5 mm 2):VS1003 的属性 VS1003 是一个单片 MP3/WMA/MIDI 音频解码器和 ADPCM 编码器。它包含一个高性能,自主 产权的低功耗 DSP 处理器核 VS_DSP^4,工作数据存储器,为用户应用提供 5KB 的指令 RAM 和 0.5KB 的数据 RAM。串行的控制和数据接口,4 个常规用途的 I/O 口,一个 UART,也有一个高品质可变 采样的 ADC 和立体声 DAC,还有一个耳机放大器和地线缓冲器。 VS1003 通过一个串行接口来接收输入的比特流,它可以作为一个系统的从机。输入的比特流被 解码,然后通过一个数字音量控制器到达一个 18 位过采样多位 E—△DAC。通过串行总线控制解码 器。除了基本的解码,在用户 RAM 中它还可以做其他特殊应用,例如 DSP 音效处理。 VS1003 的内部结构如下图所示。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 681 页,共 771 页 www.armjishu.com ARM 技术论坛 V1.1 3): VS1003 的内部寄存器 神舟王 STM32F407 用户手册 在 VS1003 的使用中除了对管脚作用的了解,还需要对 VS1003 的内部寄存器有很好 的了解。VS1003 共有 16 个 16 位寄存器,地址分别为 0x0~0xF;除了模式寄存器 (MODE,0x0)和状态寄存器(STATUS,0x1)在复位后的初始值分别为 0x800 和 0x3C 外, 其余的寄存器在 VS1003 初始化后的值均为 0。这里我们对 VS1003 部分寄存器进行设置, 其中主要介绍几个重要的 SCI 寄存器的功能及其设置。 SCI 寄存器表: 1:SCI_MODE (地址 0x0,RW,可读写)模式寄存器在 VS1003 中是一个比较重要的寄存器,其每 一位都对应着 VS1003 的不同设置。 Bit0:SM_DIFF 微分。 SM_DIFF=0 正常音频相位;SM_DIFF=1 左声道反转。当 SM_DIFF 置位时,VS1003 将左声道 反相输出,立体声输入将产生环绕效果,对于单声道输入将产生差分(反相)左/右声道信号。 Bit1:SM_SETTOZERO 置零。 Bit2:SM_RESET。 SM_RESET=1,VS1003 软件复位。软复位后该位自动清零。 Bit3:SM_OUTOFWAV。 SM_OUTOFWAV=1,停止 WAV 解码。当你要中途停止 WAV、WMA 或者 MIDI 文件的解码时, 置位 SM_OUTOFWAV,并向 VS1003 持续发生数据(对于 WAV 文件发送 0)直到将 SM_OUTOFWAV 清零;同时 SCI_HIDAT1 也将被清零。 Bit4:SM_PDOWN。 SM_PDOWN=1,软件省电模式,该模式不及硬件省电模式(可由 VS1003 的 XRESET 来激活)。 Bit5:SM_TESTS SM_TESTS=1,进入 SDI 测试模式。 Bit6:SM_STREAM SM_STREAM=1,使能 VS1003 的流模式。 Bit7:SM_PLUSV。 SM_PLUSV=1,MP3+V 解码使能。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 682 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 Bit8:SM_DACT。 SM_DACT=0,SCLK 上升沿有效;SM_DACT=1,SCLK 下降沿有效。 Bit9:SM_SDIORD。 SM_SDIORD=0,SDI 总线字节数据 MSB 在前,即须先发生 MSB;SM_SDIORD=1,SDI 总线 字节数据 LSB 在前,即须发送 LSB;该位的设置不会影响 SCI 总线。 Bit10:SM_SDISHARE。 SM_SDISHARE=1,SDI 与 SCI 将公用一个片选信号(同时 SM_SDINEW=1),即将 XDCS 与 XCS 这两根信号线合为一条,能省去一个 I/O 口。 Bit11:SM_SDINEW。 SM_SDINEW=1,VS1002 本地模式(新模式)。VS1003 在启动后默认进入该模式。(这里所说 的模式指的是总线模式。) Bit12:SM_ADPCM。 SM_ADPCM=1,ADPCM 录音使能。同时置位 SM_ADPCM 和 SM_RESET 将使能 VS1003 的 IMA ADPCM 录音功能。 Bit13:SM_ADPCM_HP。 SM_ADPCM_HP=1。使能 ADPCM 高通滤波器。同时置位 SM_ADPCM_HP、SM_ADPCM 和 S M_RESET 将开启 ADPCM 录音用高通滤波器,对录音时的背景噪音有一定的抑制作用。 Bit14:SM_LINE_IN 录音输入选择。 SM_LINE_IN=1,选择线入(line in);SM_LINE_IN=0,选择麦克风输入(默认)。 2:SCI_BASS(地址 0x2, RW, 可读写)重音/高音设置寄存器。 VS1003 内置的重音增强器 VSBE 是种高质量的重音增强 DSP 算法,能够最大限度的避免音频 削波。当 SB_AMPLITUDE(bit: 7~4)不为零时,重音增强器将使能。可以根据个人需要来设置 SB_AMPLITUDE。 3:SCI_CLOCKF(地址 0x3, RW, 可读写)。 Bit0~bit10:SC_FREQ 当 XTALI 输入的时钟不是 12.288 时才需要设置该位段,其默认值为 0, 即 VS1003 默认使用的是 12.228M 的输入时钟。 4:SCI_AUDATA(地址 0x5,RW,可读写)。 当进行正确的解码时,该寄存器的值为当前的采样率(bit:15~bit1)和所使用的声道(bit0)。采 样率须 2 的倍数;bit0=0,单声道数据,bit0=1,立体声数据。写该寄存器半直接改变采样率。 5:SCI_VOL(地址 0xB, RW, 可读写)。 音量控制寄存器。高八位用于设置左声道,低八位用于设置右声道。 VS1003 的数据流程: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 683 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 1:首先,依赖于音频数据,且非设置为 ADPCM 编码模式,MP3,WMA,PCMWAV,IMA ADPPCM WAV 或 MIDI 的数据从 SDI 总线接收并解码。 2:解码后,如果 SCI_AIADDR 非零,则应用代码从寄存器所指向的地址开始执行。 3:然后数据流是否经过低音、高音增强器,取决于 SCI_BASS 寄存器。: 4:之后,数据流向音量控制单元,同时拷贝数据进音频 FIFO. 5:音频 FIFO 锁存住数据,通过音频中断将数据送进采样率变换器和 DAC。音频 FIFO 的大小 是 2048 立体声(2x16bit)采样,即 8KB。 6:采样率变换器把所有不同的采样率变为 XTALI/2,或 128 次最高可用采样率。这个变换用一 个固定的输入时钟频率,经过复杂的 PLL 时钟配置后,几乎允许无限制的采样率精确度。对于 12.288MHz 的时钟,DAC 工作在 128x48KHz 也就是 6.144 上,并建立一个立体声同相位模拟信号。 过采样的输出被片上的模拟滤波器进行低通滤波。滤波后的信号前往耳机放大器 7.53.2 实验原理 STM32 神舟王 407 开发板具有音频播放功能,使用专业的 MP3 解码芯片 VS1003,可 以将保存在 NAND FLASH 或 SD 卡中的音频文件通过 SPI 接口传送到 VS1003 解码后播放出来。同 时可驱动二级,也可通过板载咪头或麦克风实现录音功能。本实验实现它的播放功能。VS1003 对 MP3 音频数据流进行解析,并转换成模拟信号进行输出。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 684 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 VS1003 与 STM32F407 的数据通信具体分析: VS1003 与 STM32F407 的数据通信是通过 SPI 总线方式进行的。VS1003 通过串行命令接口(SCI) 和串行数据接口(SDI)来接收单片机的控制命令和 MP3 的数据;通过 XCS、XDCS 引脚的置高/低 来确认是哪一个接口处于传送状态。VS1003 的功能控制,是通过 SCI 口写入特定寄存器实现的。 在音频流解码系统中,要以 VS1003 为从机数据应答模块得到顺畅的模拟音频流,必须依据 VS1003 关于 SPI 协议下其自身特定的 SPI 工作原理对单片机进行编程控制才能实现。 VS1003 特定的 SPI 协议可分为两大类:SCI(串行命令接口)传输和 SDI(串行数据接口)传输。 SCI 传输是指 VS1003 为实现基于 SPI 协议的数据传输而先进行的命令传输。该命令传输也基于 SPI 协议,但具体协议内容因命令的不同而不同。STM32F407 必须依据 SCI 命令的协议格式去编写代码 才有可能实现初步的 SPI 通信。 SCI 传输协议通常包含一个 8bit 的指令字节、一个 8bit 的地址字节和一个 16bit 的数据字节。每 次 SCI 传输后数据请求返回引脚(DREQ)都会被设置为低,VS1003 是不允许在数据请求返回管脚 变为高之前开始新的 SCI 或 SDI 传输的。 SDI 传输是指 VS1003 基于 SPI 协议的数据传输,完全是音频流数据,VS1003 在接收 SDI 数据 的同时完成片内的音频解码数据处理任务,以 2B 为单位进行 SDI 数据的传输和处理,没传输完 2B 的二进制音频数据,VS1003 就在数据请求返回管脚上设置一个低电平。该管脚在再次变为高电平前, 主机不能连续向从机发送 SDI 数据,否则数据将被自动舍弃无效。 更多资料请参考《vs1003 数据手册》。 7.53.3 硬件设计 神舟王 407 开发板上 VS1003 开发板的硬件原理图: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 685 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.53.4 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 686 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:Printf_Init()初始化串口打印 代码分析 2:VS1003_Init()初始化 VS1003 芯片 1) 初始化连接 VS1003 芯片的 GPIO 管脚的时钟以及输入和输出 2) 调用 VS1003_SPI_Init()把 VS1003 芯片的 SPI 信号初始化为 SPI 接口,这里比较繁琐的,有兴 趣的可以详细研究一下芯片手册,以及时序图,这个函数完全是按照芯片手册来操作的,如果做 项目可以直接移植过去 代码分析 3:VS1003_Reset()对 VS1003 芯片进行复位操作 代码分析 4:VS1003_SoftReset()软复位操作 嵌入式专业技术论坛 (www.armjishu.com)出品 第 687 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 5:将音乐文件保存在数组中 代码分析 6:VS1003_WriteData( (void*)( MP3_DATA + index ) ); 调用这个函数播放数组中的音乐文件,每次在代码中写入 32 个数据 嵌入式专业技术论坛 (www.armjishu.com)出品 第 688 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 代码分析 7:VS1003_SPI_ReadWriteByte( uint8_t TxData )一次写入一个 8 位的数据 1) 首先查看数据 DR 寄存器是否为空,如果不是空的,证明 VS1003 芯片中还有数据,这样的话鸡 就一直 while 循环直到数据写空 2) 如果为空了,就调用 SPI_I2S_SendData(SPI1, TxData)将数据写到 SPI 的总线上,代码实现也很简 单,就是直接把数据赋值给 DR 寄存器,就可以了 3) 一直等待数据被 VS1003 接收完毕,没接收完的话就一直 while()循环 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) 4) 接收完毕返回,再继续传第二个数据 7.53.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.53.6 实验现象 将固件下载到神州王后,从新上电运行,正常情况下,我们 J39(MP3 音频输出)接口上接上耳机 或者音箱后(如下图)可以听到三段简短的音频 嵌入式专业技术论坛 (www.armjishu.com)出品 第 689 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 同时超级终端上会显示如图且每当这三短音频播放一次终端会自动计数一次 7.54 神舟王407读取U盘实验(神舟王STM32F407-库函数版) 7.54.1 意义与作用 这章节我们学习神舟开发板的 STM32 处理器扮演 USB HOST 主设备的例程。USB HOST 主设 备接口最常见的就是在我们的 PC 机上,所以可谓昔日 PC 的 USB HOST,落入 ST 寻常单片机。一 个设备支持 USB HOST,那么它就可以从另外一个 USB 设备中取得数据。产品中集成了 STM32F407 处理器就可以使您的设备脱离 PC 而连接鼠标、键盘、硬盘、U 盘、MP3、USB 游戏手柄、USB HUB、 USB 网卡、USB 打印机、手机、USB SIM 手机卡读卡器等一堆设备,使您的产品功能增强,可扩展 性增强。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 690 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.54.2 实验原理 本实验使用神舟 STM32 开发板的 USB 接口作为 USB HOST 主设备实现访问 U 盘文件的功能。 实验还包含了 FATFS 文件系统,依次显示 U 盘信息,罗列 U 盘的文件列表、写入 STM32.TXT 文件, TFT LCD 显示 U 盘“Media/”文件夹下的图片。通过该实现使大家了解如何使用 STM32 的 USB 实 现即插即用的功能。 在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述 符,端点描述符,字符串描述符,报告描述符等等。更详细的说明请参看USB HID协议,该协议可 从Http://www.usb.org下载。关于STM32的USB知识可以参考附件的《STM32 USB固件的中文资 料.pdf 》和《STM32的USB详解.pdf》等文档。 下图为USB 描述符的层次结构: FatFs简介:FatFs是一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, SH, Z80, H8, ARM 等等,不需要做任何修改。(对应的英文:FatFs is a generic FAT file system module for small embedded systems. The FatFs is written in compliance with ANSI C and completely separated from the disk I/O layer. Therefore it is independent of hardware architecture. It can be incorporated into low cost microcontrollers, such as AVR, 8051, PIC, ARM, Z80, 68k and etc..., without any change.) FatFs最新版本可以在http://elm-chan.org/fsw/ff/00index_e.html下载。 FatFs的结构图如下所示:其中L1为物理的存储设备本实验具体为SD卡,RTC可以在创建和修建 文件时加入时间信息;L2层位硬件接口驱动层,上一章节的实验就是L2层的实验,L3层为本实验新 增的内容,本实验L4层调用L3层的进口函数实现在串口输出SD卡里的文件列表的功能。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 691 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 BMP 文件介绍 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象 处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。 Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位 图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此 把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0 以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图 像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够 在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有 时它也会以.DIB或.RLE作扩展名)。 TFT LCD 简介 触摸屏一般分为电阻、电容、表面声波、红外线扫描和矢量压力传感等,其中使用最多的是四 线或无线电阻触摸屏。四线电阻触摸屏是由两个透明电阻膜构成的,在它的水平和垂直电阻网上施 加电压,就可以通过A/D转换面板在触摸点测量出电压,从而对应出坐标值。 我们一般液晶所 用的触摸屏,最多的就是电阻式触摸屏了(多点触摸属于电容式触摸屏,比如M8,IPhone等支持多 点触摸的手机所用的屏就是电容式的触摸屏), TFTLCD自带的触摸屏属于电阻式触摸屏,下面 简单介绍下电阻式触摸屏的原理。 电阻式触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的 电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明 氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层、它的 内表面也涂有一层涂层、在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层 隔开绝缘。 当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两 个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再 根据获得的位置模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。 电阻屏的特点有: 1)是一种对外界完全隔离的工作环境,不怕灰尘、水汽和油污。 2)可以用任何物体来触摸,可以用来写字画画,这是它们比较大的优势。 3)电阻触摸屏的精度只取决于 A/D 转换的精度,因此都能轻松达到 4096*4096。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 692 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 从以上介绍可知,触摸屏都需要一个 AD 转换器, 一般来说是需要一个控制器的。 TFTLCD 模块选择的是四线电阻式触摸屏,这种触摸屏的控制芯片有很多,包括:ADS7843、ADS7846、 TSC2046、XPT2046 和 AK4182 等。这几款芯片的驱动基本上是一样的,也就是你只要写出了 ADS7843 的驱动,这个驱动对其他几个芯片也是有效的。而且封装也有一样的,完全 PINTOPIN。所以在替换 起来,很方便。 神舟王 407 的触摸屏附在 LCD 屏的表面上,与 LCD 屏相配合使用,主要是用的触摸芯片是 ADS7843, 业界上与 ADS7843 芯片相兼容的触摸芯片还有 ADS7846、AK4182、XPT2046 以及 TSC2046 等,驱 动基本上一致。 7.54.3 硬件设计 USB 2.0 OTG 全速接口作为 HOST 设备 神舟王407开发板含有一个USB 2.0 OTG全速接口,接口速率12Mbps,它既可以作为OTG与其它 OTG设备相连通过ID信号协商主从角色;也可以固定作为USB SLAVE从设备与PC等主设备相连实现 USB读卡器,USB鼠标,USB固件升级等功能;还可以固定作为USB HOST连接U盘,USB键鼠等从 设备。当作为USB从设备设备时通过D+、D-引脚向主机发出设备已连接的信号,并指示设备的 工作速度。 神舟王407开发板的STM32处理器的USB 2.0 OTG在作为HOST时已经内置下拉电阻。 OTG就是On The Go,正在进行中的意思。USB OTG使USB装置摆脱了原来主从架构的限制, 实现了端对端的传输模式。USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节 省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG)。OTG两用设备完 全符合USB2.0标准,并可提供一定的主机检测能力,支持主机通令协议(HNP)和对话请求协 议(SRP)。在OTG中,初始主机设备称为A设备,外设称为B设备。可用电缆的连接方式来决 定初始角色。mini-AB插座增添了ID引脚,以用于识别不同的电缆端点。mini-A插头中的ID引脚 接地,mini-B插头中的ID引脚浮空。当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主 机),而检测到ID引脚浮空的设备则认为是B设备(外设)。系统一旦连接后,OTG的角色还可 以更换。主机与外设采用新的HNP,A设备作为默认主机半提供VBUS电源,并在检测到有设备 连接时复位总线、枚举并配置B设备。OTG标准为USB增添的第二个新协议称为对话请求协议 (SRP)。SRP允许B设备请求A设备打开VBUS电源并启动一次对话。一次OTG对话可通过A设 备提供VBUS电源的时间来确定(注:A设备总是为VBUS供电,即使作为外设)。也可通过A设 备关闭VBUS电源来结束会话以节省功耗,这在电池供电产品中是非常重要的。例如,在两台OTG 设备通过连接互相交换信息时,一台连接在mini-A端,是A设备,默认为主机。另一台是B设备, 默认为外设。当在不需要USB通信时,A设备可以关闭VBUS线,此时B设备就会检测到该状态 并进入功低耗模式。 MiniAB USB连接器的外形结构图和管脚线序如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 693 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 MiniAB USB 连接器的信号定义如下表所示 引脚 功能 颜色 1 VBUS 红色 2 D− 白色 3 D+ 4 ID 5 接地 表格 7 MiniAB USB 连接器信号定义 绿色 黑色 备注 USB电源(4.4–5.25V): VCC、Power、5V、5VSB字样 USB数据线(负): DATA-、USBD-、PD-、USBDTUSB数据线(正): DATA+、USBD+、PD+、USBDT+ 用于协商主从角色 地线: GND、Ground STM32F407ZGT 处理器管脚功能具体如下 管脚 功能描述 PA11 USB 接口差分信号的负端 PA12 USB 接口差分信号的正端 PA9 PA10 控制 USB 接口对外部设备供电。本次实现作为从设备不涉及 USB OTG 时用于协商主从设备角色。本次实现作为从设备不涉及 USB OTG 线 神舟王 407 开发板板载 MiniAB USB 连接器,所以本实验需要使用开发板配套的 USB OTG 线将 U 盘与神舟王 407 开发板连接起来。 神舟王407开发板的USB 2.0 OTG接口的原理图如下图所示,作为HOST主设备是可以为USB外设 供电。途中Q1为PNP型三极管,当PF10输出低电平时打开供电三极管Q1,USB外设获得电源;当PD10 嵌入式专业技术论坛 (www.armjishu.com)出品 第 694 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 输出高电平时关闭三极管Q1,USB外设失去电源供应。 图表 28 USB OTG 电路接口原理图 7.54.4 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 695 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:USBH_Init ()初始化 USB HOST(USB 有主设备和从设备两种,USB HOST 是 USB 主 设备),可以看到传入进去的参数都是地址,也就说由 USB 内部协议去定义这些参数具体的值 函数 USBH_Init ()初始化按键、指示灯、LCD、定时器 2、USB 接口等代码如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 696 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 USB 中断配置 嵌入式专业技术论坛 (www.armjishu.com)出品 第 697 页,共 771 页 www.armjishu.com V1.1 定时器 2 中断配置 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 2:USBH_Process(USB_OTG_CORE_HANDLE *pdev , USBH_HOST *phost) 嵌入式专业技术论坛 (www.armjishu.com)出品 第 698 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 这个函数是一直在轮询去发现是否有新的 USB 设备插入一直去检测。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 699 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 检测到设备(U 盘)连接时状态机的状态为“HOST_DEV_ATTACHED” 设备枚举阶段状态机的状态为“HOST_ENUMERATION” 设备枚举阶段等待从设备(U 盘)响应时状态机的状态为“HOST_USR_INPUT” 嵌入式专业技术论坛 (www.armjishu.com)出品 第 700 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 等待设备枚回复标志类请求响应时状态机的状态为“HOST_CLASS_REQUEST” 其它状态 嵌入式专业技术论坛 (www.armjishu.com)出品 第 701 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 连接 U 盘的几个主要的功能应用函数(位于 usbh_usr.c 文件中): USH_USR_FS_INIT 状态为初始化 FATFS 文件系统,获得 U 盘的容量以及是否写保护等信息: USH_USR_FS_READLIST 状态为罗列 U 盘的两级文件列表: USH_USR_FS_WRITEFILE 状态为写入 STM32.TXT 文件: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 702 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 USH_USR_FS_DRAW 状态为 LCD 显示 U 盘“Media/”文件夹下的图片: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 703 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.54.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.54.6 实验现象 要用到的外设器件:U 盘一个,(在电脑上建一个文件夹名字:Media,文件夹里面放几张图片,注 意图片的格式后缀是.bmp,图片大小是:240*320,最后将整个文件件复制到 U 盘根目录下);数据 线一条: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 704 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 首先给神舟王 407 核心板下载“神舟王 407 读取 U 盘实验”程序,下载完毕后; 神舟王开发板选择电源线供电,注意 DC5V 位置跳帽;上电运行硬件连接图: 接下来,在神舟王开发板按下 KEY 2 按键,一下一下的按直到神舟王开发板上的 3.2 寸彩屏出现 U 盘里面的图片证明读取 U 盘成功。如下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 705 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.55 神舟王407使用SD卡USB读卡器实验(神舟王STM32F407-库函数版) 7.55.1 SD卡读卡器实验的意义与作用 神舟王407开发板资源丰富,关于USB部分,本节将介绍,如何通过USB接口访问神舟王407上 插入的SD卡。即用STM32处理器实现我们常说的SD卡读卡器。 通过本实验,我们将对 USB 接口更进一步的认识,同时,我们还可以对 SD 卡有一个更深入的了解。 本实验参考 ST 的 Mass_Storage 例程,针对神舟王 407 的硬件修改代码设计,使用 SDIO 方式来读写 SD 卡,实现 SD 读卡器功能。 7.55.2 SD卡基本知识 SD卡(Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器 的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体 播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。大小犹如一张 邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及 很好的安全性。 SD卡一般支持2种操作模式: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 706 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 1,SD卡模式; 2,SPI模式; 主机可以选择以上任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。SPI模式允许 简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。 在神舟王407号中,是使用SDIO接口来访问SD卡,即所说的SD卡模式。 SD卡的引脚排序如下图所示: SD卡引脚功能描述如下表所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 707 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.55.3 实验原理 SD卡读卡器实验原理简介:首先程序运行后,初始化实验需要使用的到串口和GPIO管脚,然后 初始化访问SD卡要使用的SDIO接口与USB接口。检测SD卡在,待SD卡插入之后,就开始USB的配 置,在配置成功之后既可以在电脑上发现可移动磁盘了。 其中 DS2 和 DS3 LED 用于指示初始化过程,DS1 用来指示 USB 正在读写 SD 卡。 7.55.4 硬件设计 SD卡读卡器实验要用到的硬件资源有: ¾ 串口 1:串口 1 在本实验中打印程序运行过程中的提示信息。关于串口,在前面的实验已经 进行了详细的讲解,在这里就不在重复。 具体见 串口 1 的发送与接收实验。 ¾ LED 指示灯:LED 指示灯主要用于指示程序运行状态。 ¾ SD 卡座:神舟王 407 最大支持 8G 的 SD 卡。这个支持是软件上的。要看文件系统,看你 移什么样的文件系统到系统里,常用的 FAT 最大是支持 8G。硬件上的通信都是同 样的几根信号线。 ¾ USB 接口:使用 USB 接口与电脑连接,将 SD 卡插入神舟王 407 的 SD 卡座后,运行程序, 可以在电脑上检测到一个 U 盘设备。并可以进行读写操作。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 708 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 SD 卡读卡器实验使用的资源主要是 USB 接口和 SD 卡座两部分,分别如下图所示: 7.55.4.1 1.USB接口硬件原理 上图中的 J52 为神舟王 407 上的 USB 接口 B 型座。U1 为 USB 接口 ESD 防护器件。,满足 ESD 防护 标准 IEC61000-4-2(ESD 15kV air, 8kV Contact) 。 STM32F407 ZGT处理器管脚功能具体如下 管脚 功能描述 PA11 PA12 USB 接口差分信号的负端 USB 接口差分信号的正端 7.55.4.2 7.55.4.3 2.SD卡的硬件特性 神舟王407开发板载标准的SD卡座,采用SDIO接口通信,通过这个接口,我们就可以外扩大容 量存储设备,可以用来记录数据,存放音乐文件等。其原理图如下: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 709 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 STM32F407ZG 处理器的 SD/SDIO MMC 卡主机模块(SDIO)在 AHB 外设总线和多媒体卡 (MMC)、SD 存储卡、SDIO 卡和 CE-ATA 设备间提供了操作接口。 SDIO 的主要功能如下: — 与多媒体卡系统规格书版本 4.2 兼容。支持三种不同数据总线模式:1 位(默认)、4 位和 8 位。 — 与较早的多媒体卡系统规格版本全兼容(向前兼容)。 — 与 SD 存储卡规格版本 2.0 全兼容。 — 与 SD I/O 卡规格版本 2.0 全兼容:支持良种不同的数据总线模式:1 位(默认)和 4 位。 — 完全支持 CE-ATA 功能(与 CE-ATA 数字协议版本 1.1 全兼容)。 — 8 位总线模式下数据传输速率可达 48MHz。 — 数据和命令输出使能信号,用于控制外部双向驱动器。 SDIO 的逻辑框图如下: 在神舟王 407 中,使用的是 SDIO 接口来读写访问 SD 卡,其中 SDIO 工作在 4 位数据模式 ,具体 的管脚功能如下表。 管脚 功能 描述 嵌入式专业技术论坛 (www.armjishu.com)出品 第 710 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 PD3 PC8 PC9 PC10 PC11 PC12 PD2 SD_NCD SD 卡在位检测 SDIO_D0 多媒体卡/SD/SDIO 卡数据。双向数据总线 SDIO_D1 SDIO_D2 SDIO_D3 SDIO_CK 多媒体卡/SD/SDIO 卡时钟。从主机至卡的时钟线 SDIO_CMD 多媒体卡/SD/SDIO 卡命令。双向的命令/响应信号线 7.55.5 软件设计 进入例程的文件夹,然后打开\Project \ MDK-ARM \ Project.uvproj 文件 可以看到工程已经被打开,下面开始具体分析程序代码: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 711 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 代码分析 1:USBH_Init ()初始化了回调函数,当 SD 卡插入的时候,产生 USB 中断 代码分析 2:调用中断函数,对 SD 卡进行初始化,并识别成一个盘符 7.55.6 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.55.7 实验现象 将固件下载到神州王后,插入 SD 卡,将神州王的 USB 接口与电脑连接后,重新上电运行,电脑 上将提示发现 USB 设备.打开我的电脑可以看见多了一个可移动磁盘如下图; 嵌入式专业技术论坛 (www.armjishu.com)出品 第 712 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 进入电脑的设备管理器里面的通用串行总线控制器里面可以看见 USB SD 读卡器的详细信息如下图 同时在神州王上的 DS1、DS2、DS3、DS4 等 4 个小灯同时闪烁,显示屏上会显示当前 SD 卡的一些 相关信息如下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 713 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.56 神舟王407使用DFU固件升级(神舟王STM32F407-库函数版) 7.56.1 意义与作用 DFU的全称是Device Firmware Upgrade,就是设备固件的更新升级的意思。神舟王407开发板支 持的固件更新升级方法有很多种:通过Jlink下载、通过串口升级、通过网口升级、通过USB接口升 级等等。 神舟王407开发板只要在上电前将BOOT0跳至1ÅÆ2, BOOT1跳至2ÅÆ3连接USB即可实现设备 的固件升级。这种方法是使用STM32F407芯片出厂时内部固化的代码实现的。为了讲解该功能的原 理,本节不使用出厂固件,而是通过实际的代码介绍如何通过USB接口更新升级固件的功能。 7.56.2 实验原理 首先程序运行后,首先检测按键2或者按键3或者按键4 有没有按下,如果按下则运行USB DFU 的固件,然后等待来自USB的数据,将其解析后存入对应的FLASH地址处;如果没有按下则检测 0X0800A000地址处的代码是否合法,如果合法则运行带代码;如果不合法则运行USB DFU的固件, 然后等待来自USB的数据,将其解析后存入对应的FLASH地址处。 在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述 符,端点描述符,字符串描述符,报告描述符等等。更详细的说明请参看USB HID协议,该协议可 从Http://www.usb.org下载。关于STM32的USB知识可以参考附件的《STM32 USB固件的中文资 料.pdf 》和《STM32的USB详解.pdf》等文档。 下图为USB 描述符的层次结构: 7.56.3 硬件设计 注:本实验的硬件设计与“神舟王407读取U盘实验(神舟王STM32F407-库函数版)”对应章节相同, 此处不再重复,请参考“神舟王407读取U盘实验(神舟王STM32F407-库函数版)”对应章节 7.56.4 软件设计 关于DFU升级程序是ST官方提供的,需要详细研究的,可以下载这个文档: http://www.usb.org/developers/devclass_docs/DFU_1.1.pdf 1.先是下载个 DFU 程序到 STM32 芯片里面,今后就可以使用 DFU 下载并升级程序了 嵌入式专业技术论坛 (www.armjishu.com)出品 第 714 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 2. 本例程的 USB 例子,里面有个按键,当复位启动的时候,按下按键就会进入到 DFU 模式中去, 如果步要这个按键的话,就需要其他手段来选择是运行 DFU 模式还是运行用户程序 如何生成 USB 下载应用程序映像*.DFU 文件呢? 下面讲述如果您自己修改的代码,如何得到可以通过 USB 下载的*.dfu 映像文件到神舟 系列开发板。 首先在项目的 Workspace 工程名上点击右键选择“OPTION”或者按快捷键“ALT + F7” 打开 OPTION 选项卡,选择其中的 Output Converter 选项并安装如下错误!未找到引用 源。所示的方法设置。 编 译工程后将得到*.Hex 文件(MP3 播放器工程得到就是 ARMJISHU_MP3_PLAYER.hex 文件)。 然后打开“DFU File Manager”程序,如图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 715 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 错误!未找到引用源。所示,点击后会出现错误!未找到引用源。,我们选择第一个由 S19、HEX 或 BIN 文件得到 DFU 文件。点击 OK 后会出现 DFU File Manager 程序运行 界面.图表所示的 在错误!未找到引用源。中我们选择“S19 or HEX”会弹出错误!未找到引用源。, 如图显示 我们假设编译已经产生了 HEX 文件,且文件名为“ARMJISHU_MP3_PLAYER.hex”, 将其选中并打开,如错误!未找到引用源。所示。选择好文件后的 DFU File Manager 程 序运行界面如图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 716 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 错误!未找到引用源。所示,此时点击“Generate”按钮,出现如错误!未找到引用源。 所示,输入文件名后点击“保存”按钮。保存成功后会出现错误!未找到引用源。此时 就可以通过 USB 下载转换得到的这个“ARMJISHU_MP3_PLAYER.dfu”映像到神舟系 列开发板中运行。 7.56.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.56.6 实验现象 使用神舟王配套的USB线缆连接PC机与开发板的USB口,并为开发板上电。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 717 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 此时PC机右下角会提示“发现新硬件” 并弹出如下对话框要求安装驱动: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 718 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 一般选择“自动安装”即可,如果自动安装失败,则可以选则“从列表或指定位置 安装”按如下方式进行: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 719 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 选择前面安装软件的文件夹的位置,选中“Driver”文件夹点击确定。一般位于 “C:\Program Files\STMicroelectronics\Software\DfuSe\Driver”路径。 点击下一步 嵌入式专业技术论坛 (www.armjishu.com)出品 第 720 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 可能还会弹出以下对话框,选择前面安装软件的文件夹的位置,如果是32位的PC机 选中“Driver\x86\ STTub30.sys”文件。 一 般 位 于 “ C:\Program Files\STMicroelectronics\Software\DfuSe\Driver\x86\ STTub30.sys”路径。 安装完成!点击“完成”,右键点击“我的电脑”选择“管理”选择“设备管理”显示以下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 721 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 第三步,运行Flash_Loader_Demonstrator软件, 嵌入式专业技术论坛 (www.armjishu.com)出品 第 722 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 在弹出界面的中,选择USB(DFU),点击“Next”。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 723 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 嵌入式专业技术论坛 (www.armjishu.com)出品 第 724 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 由上图的运行界面可以看出,软件已经识别出了 Internal Flash,128 个 sectors,每 个 sectors 是 2K 字节。选中 Verify after Download,然后点击下方的“Choose”如图所示 选择光盘“神舟王光盘\编译好的固件\DFU 固件升级\ARMJISHU_LED_0x8008000.dfu” 文件。 如上所示,选择好文件后,文件名“ARMJISHU_LED_0x8008000.dfu”出现在界面 中部,此时点击“Upgrade”开始下载应用程序固件,此时会弹出下图所示的确认对话 嵌入式专业技术论坛 (www.armjishu.com)出品 第 725 页,共 771 页 www.armjishu.com V1.1 框,点击“是”。 ARM 技术论坛 神舟王 STM32F407 用户手册 此时开始擦除、下载和校验过程以及对应的界面如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 726 页,共 771 页 www.armjishu.com V1.1 下载成功结束的界面如下图所示: ARM 技术论坛 神舟王 STM32F407 用户手册 下载成功结束后,我们需要将启动模式设置为 User Boot 模式,即将 JP19 的 2-3 脚 短接,复位神舟开发板即可看到程序运行的实验现象。 或者后点击 按钮程序开始运行,会弹出如下所示的界面: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 727 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.57 神舟王407使用USB鼠标_按键控制(神舟王STM32F407-库函数版) 7.57.1 意义与作用 人机接口设备HID(Human Interface Device)类别是Windows最早支持的USB类别。由其名称可 以了解HID设备是计算机直接与人交互的设备,例如键盘、鼠标和游戏杆等。不过HID设备不一定要 有人机接口,只要符合HID类别规范,就都是HID设备。 本章节我们学习HID里的一种特殊设备:免驱鼠标。 7.57.2 实验原理 本实验使用神舟 STM32 开发板的 USB 接口实现免驱鼠标功能,就是不需要安装驱动程序即可 在 Windows 平台上使用。免驱鼠标是属于人机交互设备 HID(Human Interface Device)。试验中使用 神舟 STM32 开发板的四个按键实现是 windows 的鼠标指针上、下、左、右移动的功能。通过该实现 使大家了解如何使用 STM32 的 USB 实现即插即用的功能。 在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述 符,端点描述符,字符串描述符,报告描述符等等。更详细的说明请参看USB HID协议,该协议可 从Http://www.usb.org下载。关于STM32的USB知识可以参考附件的《STM32 USB固件的中文资 料.pdf 》和《STM32的USB详解.pdf》等文档。 下图为USB 描述符的层次结构: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 728 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.57.3 关于OTG的基础知识 USB 2.0 OTG 全速接口作为 Device 设备 神舟王407号开发板含有一个USB 2.0 OTG全速接口,接口速率12Mbps,它既可以作为OTG与其 它OTG设备相连通过ID信号协商主从角色;也可以固定作为USB SLAVE从设备与PC等主设备相连实 现USB读卡器,USB鼠标,USB固件升级等功能;还可以固定作为USB HOST连接U盘,USB键鼠等 从设备。当作为USB从设备设备时通过D+、D-引脚上的1500Ω上拉电阻可向主机发出设备已连 接的信号,并指示设备的工作速度。电阻上拉至D+表示全速运行,电阻上拉至D-表示低速运行。 当作为USB主设备时内部D+和D-含有15kΩ下拉电阻用于检测上拉电阻的状态。 OTG就是On The Go,正在进行中的意思。USB OTG使USB装置摆脱了原来主从架构的限制, 实现了端对端的传输模式。USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节 省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG)。OTG两用设备完 全符合USB2.0标准,并可提供一定的主机检测能力,支持主机通令协议(HNP)和对话请求协 议(SRP)。在OTG中,初始主机设备称为A设备,外设称为B设备。可用电缆的连接方式来决 定初始角色。mini-AB插座增添了ID引脚,以用于识别不同的电缆端点。mini-A插头中的ID引脚 接地,mini-B插头中的ID引脚浮空。当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主 机),而检测到ID引脚浮空的设备则认为是B设备(外设)。系统一旦连接后,OTG的角色还可 以更换。主机与外设采用新的HNP,A设备作为默认主机半提供VBUS电源,并在检测到有设备 连接时复位总线、枚举并配置B设备。OTG标准为USB增添的第二个新协议称为对话请求协议 (SRP)。SRP允许B设备请求A设备打开VBUS电源并启动一次对话。一次OTG对话可通过A设 备提供VBUS电源的时间来确定(注:A设备总是为VBUS供电,即使作为外设)。也可通过A设 备关闭VBUS电源来结束会话以节省功耗,这在电池供电产品中是非常重要的。例如,在两台OTG 设备通过连接互相交换信息时,一台连接在mini-A端,是A设备,默认为主机。另一台是B设备, 默认为外设。当在不需要USB通信时,A设备可以关闭VBUS线,此时B设备就会检测到该状态 并进入功低耗模式。 MiniAB USB连接器的外形结构图和管脚线序如下图所示: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 729 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 MiniAB USB 连接器的信号定义如下表所示 引脚 功能 颜色 1 VBUS 红色 2 D− 白色 3 D+ 4 ID 5 接地 表格 8 MiniAB USB 连接器信号定义 绿色 黑色 备注 USB电源(4.4–5.25V): VCC、Power、5V、5VSB字样 USB数据线(负): DATA-、USBD-、PD-、USBDTUSB数据线(正): DATA+、USBD+、PD+、USBDT+ 用于协商主从角色 地线: GND、Ground 7.57.4 硬件设计 神舟王407开发板的USB 2.0 OTG接口的原理图如下图所示,支持从USB接口取电或通过PF10控 制对USB设备供电。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 730 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 图表 29 USB OTG 电路接口原理图 STM32F407ZGT 处理器管脚功能具体如下 管脚 功能描述 PA11 USB 接口差分信号的负端 PA12 USB 接口差分信号的正端 PF10 控制 USB 接口对外部设备供电。本次实现作为从设备不涉及 PA10 USB OTG 时用于协商主从设备角色。本次实现作为从设备不涉及 嵌入式专业技术论坛 (www.armjishu.com)出品 第 731 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 7.57.5 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.57.6 实验现象 下载固件到神州王后,将神州王的 USB 接口与电脑连接后,重新上电运行,正常情况下可以看见神 州王的彩屏上会显示信息如图 神州王的 DS1\DS2\DS3\DS4 同时闪烁 此时按照屏幕上的提示按下神州王上的 KY1、KY2、KY3、 KY4 四个按键,可以看见电脑上的鼠标指针会跟据不同的按键按下而相应的按上下左右四个方向移 动。 7.58 神舟王407使用USB鼠标_触摸屏控制(神舟王STM32F407-库函数版) 7.58.1 意义与作用 人机接口设备 HID(Human Interface Device)类别是 Windows 最早支持的 USB 类别。由其名称 可以了解 HID 设备是计算机直接与人交互的设备,例如键盘、鼠标和游戏杆等。不过 HID 设备不一 定要有人机接口,只要符合 HID 类别规范,就都是 HID 设备。通过本实验,我们将对 USB 接口更 进一步的认识。 7.58.2 实验原理 本实验使用神舟 STM32 开发板的 USB 接口实现免驱鼠标功能,就是不需要安装驱动程序即可 在 Windows 平台上使用。免驱鼠标是属于人机交互设备 HID(Human Interface Device)。试验中使用 神舟 STM32 开发板的液晶屏实现是 windows 的鼠标指针移动的功能。通过该实现使大家了解如何使 嵌入式专业技术论坛 (www.armjishu.com)出品 第 732 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 用 STM32 的 USB 实现即插即用的功能。 在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,配置描述符,接口描述 符,端点描述符,字符串描述符,报告描述符等等。更详细的说明请参看USB HID协议,该协议可 从Http://www.usb.org下载。关于STM32的USB知识可以参考附件的《STM32 USB固件的中文资 料.pdf 》和《STM32的USB详解.pdf》等文档。 下图为USB 描述符的层次结构: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 733 页,共 771 页 www.armjishu.com V1.1 7.58.3 硬件设计 ARM 技术论坛 神舟王 STM32F407 用户手册 注:本实验的硬件设计与“神舟王407读取U盘实验(神舟王STM32F407-库函数版)”对应章节相同, 此处不再重复,请参考“神舟王407读取U盘实验(神舟王STM32F407-库函数版)”对应章节 7.58.4 下载与测试 如果使用JLINK下载固件,请按 如何使用JLINK V8下载固件到神舟王407号开发板 小节进行操 作。 如果使用串口下载固件,请按 如何使用串口下载一个固件到神舟王407号开发板小节进行操作。 如果在MDK开发环境中,下载编译好的固件或者在线调试,请按 如何通过MDK编译和 在线调试 小节进行操作。 7.58.5 实验现象 将程序下载到神舟王 407 核心板上,关闭电源,重新打开电源并按复位键。 神舟王开发板上的 4 个 LED 灯,按一定的频率在闪烁,如下图 嵌入式专业技术论坛 (www.armjishu.com)出品 第 734 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 同时,神舟开发板上的 3.2 寸液晶彩屏显示,如下图 在神舟王开发板 3.2 寸液晶彩屏上,用手指尖触摸屏幕上的任意一处不放,同时并观看电脑屏幕上的 鼠标在移动。触摸离 3.2 寸屏幕的中心点越远鼠标移动的速度越快。 嵌入式专业技术论坛 (www.armjishu.com)出品 第 735 页,共 771 页 www.armjishu.com V1.1 ARM 技术论坛 神舟王 STM32F407 用户手册 7.59 神舟王407以太网tftpserver文件传输((神舟王STM32F407-库函数版) 7.59.1 以太网实现tftpserver文件传输实验 10/100 以太网媒体访问控制器(MAC)是基于 ARM Cortex-M4 的 STM32 互联系列(Connectivity Line)微控制器的特色亮点之一。STM32 神舟王 407 开发板使用的即是 LQFP144 封装的 STM32 互联 系列微控制器 STM32F407ZG。STM32 神舟王 407 开发板支持 10M/100M 自适应,全双工半双工自 适应。她的优异性能可以满足需要灵活的工业标准连接功能的挑战性需求。 我们将陆续介绍神舟王 407 开发板太网硬件平台的建立原理和方法,以及基于神舟王 407 开发 板太网硬件平台实现 TFTP 文件传输功能。 TFTP(Trivial File Transfer Protocol, 中文名叫简单文件传输协议)是 TCP/IP 协议族中的一个用 来在客户机与服务器之间进行简单文件传输的协议,提供不复杂、开销不大的文件传输服务。TFTP 使用的端口号为 UDP 的 69(注意:TFTP 不一定非要在 UDP 上实现),因此它可以穿越许多防火墙。 不过它也有缺点,比如传送不可靠、没有密码验证等。虽然如此,它还是非常适合传送小型文件的。 注意 TFTP 和 FTP 协议有区别,本实验为 TFTP 实验。【FTP (File Transfer Protocol 文件传输协议)是 用于在互联网中传输文件的协议。FTP 服务器程序一般工作在 20 和 21 两个端口, 端口 21 用于在客 户端和服务器之间传输控制流数据流,而端口 20 用于传输 FTP 数据流】 那么就让我们通过神舟王 407 开发板太网硬件平台认识一下 TFTP 协议,实现一个通过 TFTP 访 问神舟王 407 开发板上的 SD 卡文件的实例。 7.59.2 意义与作用 嵌入式系统是继 IT 网络技术之后,又一个新的技术发展方向。由于嵌入式系统具有体积小、性 能强、功耗低、可靠性高以及面向行业应用的突出特征,目前己经广泛地应用于军事国防、消费电 子、网络通信、工业控制等各个领域。随着计算机技术与通信技术的发展,嵌入式系统的研究与开 嵌入式专业技术论坛 (www.armjishu.com)出品 第 736 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 发也有着越来越重要的实际意义。而 ARM 是业界领先的 32 位嵌入式 RISC 处理器技术提供商,占 领了大约 75%的市场。它可为一个完整系统的开发提供全面的技术支持,技术具有性能高、成本低 和能耗省的特点。ARM 的微处理器核心正迅速地成为便携式通信设备、手持计算、多媒体数字消费 和嵌入式解决方案市场中 MSC 批量生产的标准。 有了 STM32 神舟王 407 开发板以太网硬件平台,以及已经移植好的 TCP/IP 协议栈,我们可以 很轻松的实现各种网络应用。 TFTP 是一个传输文件的简单协议,它基于 UDP 协议而实现。TFTP 全称为 Trivial File Transfer Protocol, 中文名叫简单文件传输协议大家可以从它的名称上看出,它适合传送“简单”的文件。与 FTP 不同的是,它使用的是 UDP 的 69 端口,因此它可以穿越许多防火墙。此协议设计的时候是进 行小文件传输的。因此它不具备通常的 FTP 的许多功能,它只能从文件服务器上获得或写入文件, 不能列出目录,不进行认证,它传输 8 位数据。传输中有三种模式:netascii,这是 8 位的 ASCII 码 形式,另一种是 octet,这是 8 位源数据类型;最后一种 mail 已经不再支持,它将返回的数据直接返 回给用户而不是保存为文件。 7.59.3 实验原理 神舟王 407 开发板的处理器 STM32F407 内部集成有高性能以太网模块,支持通过以太网收发数 据,符合 IEEE 802.3-2002 标准。该以太网模块灵活可调,使之能适应各种不同的客户需求。该模块 支持两种标准接口,连接到外接的物理层(PHY)模块:IEEE 802.3 协议定义的独立于介质的接口(MII) 和简化的独立于介质的接口(RMII)。适用于各类应用,如交换机、网络接口卡等。 STM32F407还有很多其它优点,例如,为整个微控制器提供时钟信号的25MHz晶振还可以给外 设提供时钟信号,从而可以简化硬件设计。这两个系列能够输出25MHz或50MHz时钟信号,可以驱 动外部以太网物理层(PHY)芯片,从而可节省一个为外设提供时钟信号的晶振。STM32F407以太网 MAC支持MII和RMII,提高了设计人员选择最佳的PHY芯片的灵活性。 内部集成的以太网模块符合以下标准: ● IEEE 802.3-2002标准的以太网MAC协议 ● IEEE 1588-2002的网路精确时钟同步标准 ● AMBA2.0标准的AHB主/从端口 ● RMII协会定义的RMII标准 神舟王407开发板的处理器STM32F407内部集成的MAC结构图如下错误!未找到引用源。所示。 神舟王407开发板的处理器STM32F407内部集成的MAC有以下特性: 嵌入式专业技术论坛 (www.armjishu.com)出品 第 737 页,共 771 页 www.armjishu.com ARM 技术论坛 神舟王 STM32F407 用户手册 V1.1 ● 通过外接的PHY接口,支持10/100M位/秒的数据传输速率。 ● 通过兼容IEEE 802.3标准的MII接口,外接高速以太网PHY。 ● 支持全双工和半双工操作: ─ 支持符合CSMA/CD协议的半双工操作 ─ 支持符合IEEE 802.3流控的全双工操作 ─ 在全双工模式下,可以选择性地转发接收到的PAUSE控制帧到用户的应用程序 ─ 支持背压流控的半双工操作 ─ 在全双工模式下当输入流控信号失效时,会自动发送PAUSE帧。 ● 在发送时插入前导符和帧开始数据(SFD),在接收时去掉这些域。 ● 以帧为单位,自动计算CRC和产生可控制的填充位。 ● 在接收帧时,自动去除填充位/CRC为可选项。 ● 可对帧长度进行编程,支持最长为16K字节的标准帧。 ● 可对帧间隙进行编程(40~96位,以8位为单位改变) ● 支持多种灵活的地址过滤模式: ─ 多达4个48位完美的目的地址(DA)过滤器,可在比较时屏蔽任意字节。 ─ 多达3个48位源地址(SA)比较器,可在比较时屏蔽任意字节。 ─ 64位Hash过滤器(可选的),用于多播和单播(目的)地址。 ─ 可选的令所有的多播地址帧通过 ─ 混杂模式,支持在做网络监测时不过滤,允许所有的帧直接通过。 ─ 允许所有接收到的数据包通过,并附带其通过每个过滤器的结果报告。 ● 对于发送和接收的数据包,返回独立的32位状态信息。 ● 支持检测接收到帧的IEEE 802.1Q VLAN标签。 ● 应用程序有独立的发送、接收和控制接口。 ● 支持使用RMON/MIB计数器(RFC2819/RFC2665)进行强制