首页资源分类嵌入式处理器ARM MCU > stm32f10x系类开发板之s-107学习笔记第二版

stm32f10x系类开发板之s-107学习笔记第二版

已有 445510个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:stm32f10x学习笔记STM32

    分    享:

    文档简介

    stm32f10x系类开发板之s-107学习笔记第二版

    文档预览

    STM32F10X 系列开发板学习笔记 S-107 开发套件 s-107 学习笔记 s-107 学习笔记 ................................................................................................................................1 ②联系方式 ..............................................................................................................................4 核心模块 ..................................................................................................................................6 底板 ........................................................................................................................................10 红外学习控制模组 ................................................................................................................12 无线 2.4G 套件.......................................................................................................................13 S-107 开发板(STM32F107VCT6)简介............................................................................15 学习笔记 ........................................................................................................................................17 编译器的使用 ........................................................................................................................18 基本功能学习 ................................................................................................................................32 1.GPIO ----LED 灯闪烁 .........................................................................................................32 2 .systick 点滴时钟的学习.....................................................................................................41 3. 定时器 tim 的学习.............................................................................................................48 4.串口的学习--- 《STM32F10x-UART1 串口输出》 ..........................................................54 5. 串口的学习---《-STM32F10x-串口输入输出》 ..............................................................59 6.串口的学习---《-STM32F10x-串口中断输入输出》 ........................................................64 7.外部中断的学习------《STM32F10x-外部中断》 ..............................................................68 8.模拟采集 ADC 学习 ...........................................................................................................73 9. flash 做为 e2pprom 存储数据测试 ....................................................................................79 10. I2C 写入读取数据--AT24C01 测试程序.........................................................................86 11. 网络之---RS-485 的学习................................................................................................104 12. s-107 开发板(stm32f107vct6)之 ---can 的学习.........................................................109 13. sd 卡 fat 文件系统的学习 ...........................................................................................123 14.RTC 实时时钟的学习—万年历 时间戳.......................................................................137 15 红外遥控器学习 以及电气控制(支持所有频率遥控器) .......................................144 16.无线 2.4g 的通信控制 .....................................................................................................151 17.温度传感器 DS18B20 读取温度...................................................................................157 USB 接口的学习..........................................................................................................................167 18.USB 从设备实现鼠标的功能..........................................................................................176 19. usbhost 主功能测试---读 U 盘 ......................................................................................179 Web 学习 ......................................................................................................................................185 20.网络 Internet 学习之 web 控制 led 灯............................................................................186 21.网络 Internet 学习之 web 显示模拟值 ..........................................................................199 22.网络 Internet 学习之通过 VB 上位机进行 ip 查询和配置...........................................205 23.网络 Internet 学习之 通过 VB 上位机控制 led 灯和显示温度....................................213 应用篇 ..........................................................................................................................................217 24.应用篇之 通过网络控制继电器开断(提供 VB 上位机)...............................................217 25.应用篇之 通过串口 无线控制红外家电 电视空调等(提供 VB 上位机)...................223 26.应用篇之 通过网络控制红外家电 电视空调等(提供 VB 上位机).............................229 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 TFT 彩屏的学习 ..........................................................................................................................236 27. TFT 彩屏学习之---点亮彩屏.........................................................................................237 28. TFT 彩屏学习之---显示 sd 卡得文本文件....................................................................239 29. TFT 彩屏学习之---jpg 图片解码 ...................................................................................240 30. TFT 彩屏学习之---gif 动态图片解码 ............................................................................240 31. TFT 彩屏学习之---GUI 的实现.....................................................................................241 综合测试程序 ..............................................................................................................................242 32. 开发板综合测试程序---用来测试整个硬件功能 ........................................................242 27 未完待续。。。。。..............................................................................................................246 硬件电路图 ..................................................................................................................................247 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 版本 V1.0 V1.1 STM32F10X 系列开发板学习笔记 S-107 开发套件 ①修改历史 更改描述 初始版本 初次修改版 本 修订日期 2011-10-18 2011-11-1 修订人 萧星 萧星 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 ②联系方式 官方网址 http://www.stmsky.com/bbs/thread-21203-1-1.html 邮箱 1340409209@qq.com 淘宝 http://shop60442272.taobao.com/ 合作官方 http://shop60176961.taobao.com/ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 硬件资源简介 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 核心模块 S-107 是以意法半导体的 stm32f107vct6 为核心的 2 次开发模 块,模块引出了网口信号和其余的所有功能引脚。使产品开发省略比 较复杂的 mcu 硬件运行电路。对于要求网络功能的用户来说 只需要 在软件驱动的基础上做应用控制即可。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 封装图: STM32F10X 系列开发板学习笔记 S-107 开发套件 引脚: 引脚名称 J1 J2 J3 J4 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 引脚序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 STM32F10X 系列开发板学习笔记 S-107 开发套件 PD13 PD14 PD15 PC6 PC7 PC8 PC9 PA9 PA10 PA11 PA12 PA13 PA14 PA15 PC10 PC11 PC12 PD0 PD1 PD2 3V3 3V3 BOOT0 PE0 PE1 PE2 PE3 PE4 PE5 PE6 VBAT PC13 RESET PA4 PA5 PA6 PA7 PC4 PC5 PB0 GND PA13 PA14 3V3 GND RTX LINK RDRD+ TDTD+ 3V3 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 21 PD3 PB1 22 PD4 PE7 23 PD5 PE8 24 PD6 PE9 25 PD7 PE10 26 PB3 PE11 27 PB4 PE12 28 PB5 PE13 29 PB6 PE14 30 PB7 PE15 31 GND 32 GND 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 底板 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 资源 如图 STM32F10X 系列开发板学习笔记 S-107 开发套件 LED 灯 串口 USB 从 USB 主 CAN 485 温度传感器 tft 彩屏(可选) 模拟输入 红外学习发射 sd 卡 蜂鸣器 网络接口 I2C 无线 2.4G 按键 RTC 继电器控制接口 以及更多的应用 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 红外学习控制模组 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 自主开发的红外学习模块 通过串口命令学习和发射学习的功能,兼 容无线的远程控制,只要把无线 2.4g 模块查到如下图所示的位置 即 可实现红外的远程学习 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 无线 2.4G 套件 本模块为串口和无线透传模块 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 S-107 开发板(STM32F107VCT6)简介 图一 s-107 开发板是使用 cortex-m3 内核的 stm32f107VCT6 为核心 的核心开发板,为什么要选用这款芯片呢? Ø cortex 内核是更先进的 arm 内核。 Ø st 的 mcu 在市场上占有较高的占有率,拥有最高的性 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 价比,使用的企业更多。 Ø 面向社会 我们学习的任何知识,最主要的是学以致用, 所以我们一般首选市场上使用最广泛的技术。 Ø stm32f107vct6 不仅涵盖 stm32f103 的所有功能 并且在 此基础上增加了在物联网概念畅行的今天 将会使用更 多的网络功能。使我们的学习更好的做到一步到位。 正是基于上面的原因,我们推出了这款开发板 而且我们将结 合上位机开发来配合硬件的操作,使我们更系统的学习嵌入式知识。 熟悉一门上位机语言,对于我们学电子开发的工程师朋友来说,不仅 是在工作上还是在以后的创业道路上,都是不可或缺的,因为很多系 统性的项目都是需要上位机的支持的。 本开发板的特点: ü 开发板硬件资源涵盖了现有的 stm32f10x 系类的所有接 口 功 能 , 可 以 一 步 到 位 的 对 stm32f103 stm32f105 stm32f107 系列芯片都有所掌握。 ü 所有程序代码都带有串口和彩屏可选的调试信息,让我 们在学习中对程序的理解更加直观。 ü 超低的价格,直接使其能够面向所有的层次使用者。 ü 完善的交流平台 stm 家园 www.stmsky.com 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 学习笔记 作者 萧星 2011-10-15 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 编译器的使用 我们只学习现今使用最多的 iar 和 mdk(keil)就可以了,我们的学 习资料里面 提供了相关的安装程序,请没有用过的朋友自己安装一 下 就可以开始下面的操作了。 1. 1 工程的建立 对于想自己从新建立工程的朋友请参看我们的 相关工程建立的 说明文档或者联系作者,这里我们将直接使用 st 的库里面 提供的空 的工程文档。 这里先说一下 为什么要用库文件 而不是像他们一样直接操作 寄存器,因为它不是 51 而标准化、易阅读、 易移植是行业所提倡 的,甚至 arm 公司也联合了很多半导体公司一起来定制统一的工程结 构,因为随着硬件的性能越来越强大 我们已经不太需要因为硬件存 储和速度的限制而对代码的执行效率苦恼。而现今社会开发人员的频 繁更替 更需要我们能够写出更易阅读和移植的程序来降低代码的 维护和更新成本。使用标准的库,我们可以更好的阅读和维护前人的 工程,能够更好的使我们的代码在不受任何的影响下 更换不同的硬 件平台。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 首先我们先看一看 st 提供的库里面的内容(名称有些更改) 打开“s-107 工程”文件夹下的“st 提供的芯片功能测试源代码”文 件夹 列表如下: St 提供了 几乎所有的功能测试代码,这里只是源代码 不是整 个工程,现在我们做的就是怎样简单的把这些源代码形成工程,方便 我们编译测试。我们以建立 gpio 的工程为例来详细说一下,当然其 他的 方法是一样的 也就是说 只要知道一个 您就可以很容易的去 建立其他的功能测试了。 操作步骤: 1 打开 GPIO 文件夹 拷 贝 以 下 路 径 下 的 所 有 文 件 === 》》》 STM32F10x_功 能 \Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle 到 空 工 程 ===》STM32F10x_功能程序\Project\STM32F10x_StdPeriph_Template 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 如图 STM32F10X 系列开发板学习笔记 S-107 开发套件 这样 我们就把一个空工程 改成了 gpio 操作的工程了 其他 的操作也是一样 下面我们来完善一下 不同编译器下的一些配置修 改,使代码能成功编译下载运行 1.2 IAR 工程修改—前提安装好 iar5.40 打开上图 EWARM 里面的工程 双击 打开后 如图 我们选择 stm3210C-EVAL 因为我们用的是 stm32f107 当然了 这 个只是一个表面选项 其实我们在配置中选择 stm32f103 也可以直 接下载到 103 的芯片里 ,也就是说 我们在学习 107 的时候也学习了 103。因为程序的操作都是一样的 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 我们先看一下配置界面的一些设置 如图 右键—option 打开配置界面 配置修改如下: 我们提供的工程已经做好了配置 我们简单看一下学习一下主要的几 个配置 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 选择相应的调试下载工具 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 勾选下载到 flash STM32F10X 系列开发板学习笔记 S-107 开发套件 好了 这样 工程配置就完成了 可以编译下载了 温馨小提示: 对于代码的优化在配置中都有相关选项 分为速度和大 小两种优化。在库文件的使用的 没有用到的文件 可以不必添加进 来,这样可以节省很多的代码空间。当然这些细节我们在后面的学习 中仔细观察和理解都能掌握。一句话 闻道有先后 不要觉得别人比我 们知道的多 其实只是知道的早点而已 我们能做的就是尽早的赶上 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 1.3 MDK 工程的修改---安装我们自带的 mdk 程序 点击工程下面的 MDK-ARM 文件加下的工程图标 打开后 如图: 简单的对工程配置做些修改即可 对照图示参看一下 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 如果使用 jlink 则前面两个图选择 相应的选择 提示 选择 jlink 的时候 要点击 上面的 Settings 选择和您使用的芯片 相应的选项 点击 Setting 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 点击 add 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 点击 add STM32F10X 系列开发板学习笔记 S-107 开发套件 点击 ok 就可以了编译了。有任何问题和不懂的 请联系 和作者联系 大家一起沟通学习。 总结 以上只是简单的图示展示了工程的建立和配置过程。有任何疑 问请到论坛发帖 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 基本功能学习 1.GPIO ----LED 灯闪烁 工程文件名称《STM32F10x-GPIO 控制 led 闪烁》 为什么几乎学习任何一款单片机都是先从点亮 led 灯开始呢? 我一直认为我们的工作就是给一个没有生命的一堆器件已灵魂,给予 他生命。而任何生命体的诞生,最重要的就是能够正常呼吸,也就是 心脏的跳动,闪灯也许就是心脏跳动的最佳体现,有了生命,我们就 能慢慢教会他“说话”,教他做很多复杂的工作。所以我们的工作是 在创造新的生命,我们的代码写的是否稳健直接决定了生命体的健康 状况。 Ok 说了一些废话 下面进入正题 1.1 先看一下硬件需要的准备 首先要先通过原理图查看控制 LED 的 4 个引脚 分别是 PA4 PA5 PA6 PA7 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的四个引脚 如图: 然后接上仿真器 上电 下载程序 1.2 硬件小知识 系统的基本功能 输入与输出 对于任何一个外围接口来说 输入输出功能是其最基本也是任 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 何复杂接口形成的基础。只要会操作了 io,任何的接口都是可以模拟 实现的。内部处理器 cortex-m3 是基础,他引出了诺干 io,各个芯片 厂商用 io 实现各种功能 封装成硬件 就是我们使用的 mcu 了、 其实处理器和外部世界交换数据的方式主要有三种: 程控输入输出 处理器不时的在其方便的时候接受和发送数 据 我们看到的就是 串口 spi 等接口的平时的操作 中断驱动 io 外部事件通过向处理器请求当前运行程序挂 起和执行外部事件服务而控制处理器。当外部设备中断处理器时,处 理器就挂起当前任务,开始执行一个中断服务程序,中断服务程序可 能包含从输入设备向没存或者从内存向输出设备传输数据 直接存储器访问 DMA 允许在没有处理器不断参与的情况下在主存和 IO 设备之间直接传输 数据。DMA 一般用在数据传输非常重要的高速系统中,并不是所有 的处理器都支持 DMA 操作。 JTAG 这里只说他是一个国际标准,在后期 Motorola 增加 了很多功能,功能相当强大 我们主要还是用它的下载和处理器内部 寄存器的访问功能。 先说这么多 还是开始学习 stm32 吧 从开启时钟和操作 io 开始 1.2 程序说明 程序的大体操作: 学习 要点 知道怎么把外部时钟通过分频倍频配置到我们需要 的内核时钟。 首先肯定是开启生命体的心脏,也就是系统时钟。 SystemInit(); //系统时钟配置函数 通过不同的定义 来选择 不同的主频 这里设置是 72m 这个函数都干了什么?跟踪函数到最后你就会明白了 static void SetSysClockTo72(void) 设置到 72M { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* 使能外部晶振 */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* 等到外部晶振稳定振荡 */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 do { HSEStatus = RCC->CR & RCC_CR_HSERDY; StartUpCounter++; }while((HSEStatus==0)&&(StartUpCounter!=HSE_STARTUP_TIMEO UT)); if ((RCC->CR & RCC_CR_HSERDY) != RESET) { HSEStatus = (uint32_t)0x01; } else { HSEStatus = (uint32_t)0x00; } if (HSEStatus == (uint32_t)0x01) { /* 打开与存取缓存 */ FLASH->ACR |= FLASH_ACR_PRFTBE; /* 设置 falsh 等待周期为 2 */ FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY); FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2; /* HCLK = SYSCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1; /* PCLK2 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1; /* PCLK1 = HCLK */ RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2; #ifdef STM32F10X_CL 如果是 stm32f107 则 因为外部晶振是 25M 并 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 且有两个倍频通道 给 usb 和网口使用 这里单独配置 /*ConfigurePLLs -----------------------*/ /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */ /* PREDIV1 configuration: PREDIV1CLK = PLL2 / 5 = 8 MHz */ RCC->CFGR2 &= (uint32_t)~(RCC_CFGR2_PREDIV2 | RCC_CFGR2_PLL2MUL | RCC_CFGR2_PREDIV1 | RCC_CFGR2_PREDIV1SRC); RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5); /* Enable PLL2 */ RCC->CR |= RCC_CR_PLL2ON; /* Wait till PLL2 is ready */ while((RCC->CR & RCC_CR_PLL2RDY) == 0) { } /* PLL configuration: PLLCLK = PREDIV1 * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)~(RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLMULL9); #else 如果不是 stm32f107 /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL)); RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); #endif /* STM32F10X_CL */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /* Enable PLL */ RCC->CR |= RCC_CR_PLLON; /* Wait till PLL is ready */ while((RCC->CR & RCC_CR_PLLRDY) == 0) { } /* Select PLL as system clock source */ RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW)); RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL; /* Wait till PLL is used as system clock source */ while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)0x08) { } } else { /* If HSE fails to start-up, the application will have wrong clock configuration. User can add here some code to deal with this error */ } } 以上程序乍一看 很难看懂 如果你能直接看懂下面的图 也许会对 你理解程序更有帮助 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 这里可以清楚的看见每路时钟的分配 主要是前面 时钟源的选择 以 及倍频分频部分。Ok 时钟就是这样配置 然后我们再来健全我们的各项功能,这里是控制最基础的 IO 口,那 就要打通这部分的经络==打开使用的 PA 口的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 打开功能时钟 当然如果我们使用的是别的功能比如串口等 那就得打开相应串口的 时钟,后面涉及到的会一一讲到。 打开经络-时钟后 我们就可以安排他的功能了 做为普通 IO 输出,初 始化如下: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;//选择使用的 io GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//转换速度 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//配置为上 拉输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化前面配置的参数 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 //初始化 IO 口 这样准备工作就做好了 我们就可以通过控制输出的电平高低来 控 制 LED 灯了 for(i=0;i<=0x1ffff;i++); GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置高 IO 口 for(i=0;i<=0x1ffff;i++); GPIO_ResetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置低 io 口 这里使用 循环延时来实现闪烁的效果,后面在学习定时器的时候 将 会使用内部定时器实现延时,这是后话。 整体程序如下: int main(void) { SystemInit(); //系统时钟配置函数 通过不同的定义 来选择不 同的主频 这里设置是 72m RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 打开功能时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5| GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 IO 口 while (1) { for(i=0;i<=0x1ffff;i++); GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置高 IO 口 for(i=0;i<=0x1ffff;i++); GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_6 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 | GPIO_Pin_7);//置低 io 口 } } 温馨小提示:虽然使用的是库,但是对于我们学习者来说,知道 相关的寄存器操作原理,对于我们来说 在以后的工作中,会更加有 底气的去判断一些项目的难易程度,所以我建议大家参看寄存器的说 明。看懂每一个函数是在怎样操作寄存器。是的这样的工作总是枯燥 无味的。还有一点在一开始提醒我们,也许在第一遍看程序和手册的 时候 总是有些迷茫,觉得不知道在做什么,也不知道怎么下手,这 很正常,这和读书一样 先把书看厚 再把书看薄。先简单的根据现成 的例程去学习一边,不懂不要紧,任何的豁然开朗都是在自己亲自动 手后的过程,所以我很建议大家无论多么难,都要亲自自己去做一下。 这样知识才真正成为自己的,拾起来很快。过目不忘的人不多 切忌。 我们一定要做到对知识的理解。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 2 .systick 点滴时钟的学习 -----工程《STM32F10x-systick》 2.1 先看一下硬件需要的准备 首先要先通过原理图查看控制 LED 的 4 个引脚 分别是 PA4 PA5 PA6 PA7 如图: 跳线:短接图示的四个引脚 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 2.2 硬件小知识 电容: 哈哈 这里讲电容 大家肯定是不屑一顾的,电容我们用的最多是稳压 很少的 应用是用来隔直流。电容是怎样做到稳压的呢,其实电容的稳压只是对电压的 ac 部分稳压,一个不稳定的电源一般就是 固定电压和波形电压的叠加,电容在 这里起了对 AC 分量的平衡,主要是它具有充放电过程。 电容常用的有陶瓷电容 电解电容和胆电容 但是你知道他们的不同吗? u 1 陶瓷电容容值较小 主要是用于集成电路电源引脚的退偶电容 u 2 电解电容是圆柱型的 主要是用来电源的退偶 但是这种电源的精 确性很差 和标称的电容值相差甚远,对电容要求严格的电路是不能 使用的。 电解电容另一个问题是容易老化,所以在一个要长久使用 的产品上是不易使用的,当然因为他的价格很低,现在仍在电子设 备中大量使用,而且对于一般的产品的寿命 他的寿命还是远远高于 他们的。 u 3 胆电容 和电解电容一样 一般是用在电源退偶中,但是他的使用 寿命和精度是很好的,所以要设计出经典的产品,在允许的情况下 我们应该尽可能的选择 胆电容 而非电解电容 2.2 程序的学习 这个工程也是闪灯的程序,不过我们的目的不在于对 LED 灯的控 制,我们看一看怎么设置不同的延时基时—basetime。 先看一下工程源代码 初始化的代码 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 SystemInit(); //系统时钟配置函数 通过不同的定义 来选择不 同的主频 这里设置是 72m RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开功能时钟 配置 io 口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 IO 口 if (SysTick_Config(SystemCoreClock / 100))//配置 点滴时钟的频率 { /* Capture error */ while (1); } 初始化代码前面的功能我们已经有所了解了—初始化时钟到 72m 初 始化 LED 控制引脚 PA4 PA5 PA6 PA7 这 里 我 们 主 要 研 究 一 下 systick 配 置 函 数 -- SysTick_Config(SystemCoreClock / 100) 我们看一看 函数的源码:寻找源码的方法 可以通过搜索关键词 static __INLINE uint32_t SysTick_Config(uint32_t ticks) { if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* 判断参数是否合法 */ SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /*设置从装载计数值 这个值决定了 basetime */ NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* 设 置 该 中 断 的 优 先 级 这 个 通 过 函 数 NVIC_SetPriority(SysTick_IRQn,...)更改 */ SysTick->VAL=0; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /* 装载初始的计数值 */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* 使能中断和 systick 功能 请结合 CTRL 寄存器 每位的功能和上面三个参数的值相结合来看 */ return(0); /* 成功后返回 0 */ } 下面是 CTRL 的寄存器讲解 我们可以算出 3 个变量的或值然后放 到寄存器中 来参看上面赋值的意义: 这里我们以这个为例子学习一下怎么利用寄存器文档来更深入的对 程序进行理解 学习,后面涉及到这些操作的 我将会一言以代之。 该寄存器在 我们提供的文档资料的《STM32F10xxx Cortex-M3 编 程手册》里的 148 页 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 这里对寄存器的每一位都给出了详细的讲解.不要说看不懂英文啊, 咱们可以不会说 但是至少能看懂。 我们再看一看上面 3 个赋值 通过几个关键字的比较 我们应该可以看出 是配置的最后 3 位置一 配置的信息如下: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 这样 就配置好了 systick 时钟,那中断 basetime 是多少呢 我们看一 下 函数的参数: SysTick_Config(SystemCoreClock / 100)---- SystemCoreClock / 100 其 中 SystemCoreClock 定义为 我们前面 SystemInit(); //系统时钟配置函数 通过不同的定义 来选择不同的 主频 这里设置是 72m 定义的时钟 72m 那么参数就是 72m/100=720000 也就是在 72m 的运算频率下 计数值从 720000 减到 0 是产生一次中断 进入中断函数("stm32f10x_it.c"里面的 void SysTick_Handler(void) 函 数中 去运行) 也就是 10ms 进入一次中断 进行一次里面的函数 oid TimingDelay_Decrement(void) { if (TimingDelay != 0x00) { TimingDelay--; } } 对我们的延时函数的计时参数进行一次减一操作 void Delay(__IO uint32_t nTime) { TimingDelay = nTime; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 while(TimingDelay != 0); } 我们的循环 函数是 GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置高 IO 口 /* 延时 1s */ Delay(100); /* 熄灭 LED */ GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置低 io 口 /* Insert 100 ms delay 延时 1s */ Delay(100); 10ms 减一次 100 正好是 1s 的时间 这样就实现了 1s 中进行一次对灯 的反转。 温馨提示: 3.5.0 的库 对函数的封装更加的上层 这就使我们在分 析代码的时候显得非常的繁琐,但是对于学习者 我们必须要知道函 数最底层的操作。等到我们对这些操作比较熟练的时候,在以后用起 来就用一个函数就能搞定用寄存器操作几次完成的配置了。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 3. 定时器 tim 的学习 --《STM32F10x-TIM2 定时器中断》 3.1 先看一下硬件需要的准备 首先要先通过原理图查看控制 LED 的 4 个引脚 分别是 PA4 PA5 PA6 PA7 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的四个引脚 如图: 然后接上仿真器 上电 下载程序 3.2 硬件小知识 RC 电路 的应用,我们常用的 rc 电路主要有三种: 1 电阻和电容并联在一起 这里我们不具体讲解相关充放电时间的计算 请大家参看有关资料,我们简 单讲一下具体的应用 看一下具体电路 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 那么这个电路一般使用在什么时候呢,这个是一个典型的放电延时电路, 他可以在我们的设备突然断电时,仍能工作一段时间 做一下简单的保护操作 放电时序 这个时间 t 是可以具体算出来的,这里我们就不做介绍了 有兴趣的同学请 看相关数字电路知识 积分电路 2 RC 串联电路 这个电路的主要作用是上电延时 我们复位常用的电路就是这个原理,我们 常说的低通滤波电路 在我们的嵌入式设计中 其实 mcu 的每一个 引脚都可以 看成是这样的电路,因为 pcb 的走线可以看成电阻 芯片引脚都是一个小电容。 这也就是我们再设计高频电路布线时经常要考虑的问题。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 在高频中 电压的突然掉电 也有可能引起阻尼振荡。 3 高通滤波 电容和电阻位置互换 这个就是我们所说的高通滤波 也是我们说的隔直流电路图 一般的频率信 号采集会用到,滤掉叠加的直流电压部分去分析 3.2 程序的学习 本程序是利用定时器中断来实现 LED 灯闪烁的效果,主要是看一 下如何配置 tim 的不同功能 这里使用的是最基本的计数功能。 SystemInit(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); NVIC_Configuration(); GPIO_Configuration();//LED 引脚配置灯 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 // TIM2 Configuration:向上计数中断: /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 7200; TIM_TimeBaseStructure.TIM_Prescaler = 9999; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);//开启计数中断 /* TIM2 enable counter */ TIM_Cmd(TIM2, ENABLE);//开启时钟 红 色 部 分 是 tim 的 配 置 这 里 配 置 的 是 计 数 中 断 频 率 为 72000/7200*(9999+1)=1s 也就是 1s 中中断一次。相关寄存器的操作 请参看中有关 tim 部分的寄存器说明 中断函数的操作:it.c 里面 if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { 如果是计数中断到来 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 先清除计数中断标志位 等带下一次中断 GPIO_WriteBit(GPIOA,GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_4))); GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5))); GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_6))); GPIO_WriteBit(GPIOA,GPIO_Pin_7, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_7))); 反转 IO 口 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 } 1.3 NVIC 中断向量的配置 以本程序中得配置 我们来看一下,以后遇到中断功能的都需要配置 这个中断向量—优先级。 void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); /* Enable the TIM2 global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 这里配置了 tim2 的中断 优先级分组为 0 4 抢占优先级是 0 子优先级为 1 说一下优先级 PriorityGroup 这里用 4 位来分配给 抢占优先级 和子优先级 比如说 如果是 NVIC_PriorityGroup_1 则 抢占优先级占 1 位 只能配置为 0 1 两个优先级 子优先级占 3 位 可以配置为 0-7 八个优先级 如果是 NVIC_PriorityGroup_2 22 NVIC_PriorityGroup_3 3 1等 这样可以分出 16 个不同的优先级别 这 16 个优先级的先后顺 序是 抢占优先级越小 优先级越高 0 就高 在抢占优先级一样的情 况下 子优先级越小 优先级越高 也就是 0 0 最高 如果抢占优先级和子优先级都一样呢?这时候就要开内核的 硬件中断机制了。Cortex 内核拥有高效的中断处理机制 相关具体内 容请参看 《cortex 内核讲解》 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 4.串口的学习--- 《STM32F10x-UART1 串口输出》 这里先讲一下 串口的操作 因为后续的工程 一些信息是通过串 口打印出来,以便大家更好的理解程序 4.1 先看一下硬件需要的准备 首先要先跳线选择 串口功能 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的引脚 如图: 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 硬件小知识: 串行输入输出时在每一个传输方向上使用一根信号线传输数据。 所有的串行接口要在发送数据端将并行数据转换为串行比特流,而在 接受端反过来,将数据比特力转换为并行数据,当系统之间进行并行 传输数据-无论是在具体实现上还是从价格上考虑---都不太实用时, 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 就可以采取串行通信。这样的串行通信可能发生在计算机和终端之 间,也可能发生在计算机和打印机,掌上电脑或者远程红外设备之间, 还可能是更高级的形式----高速网咯 如以太网。对于嵌入式设备来 说,连接到一台主机采用简单的串口接口是最容易也是最廉价的方 式,这个串口可能是应用的一部分 也可能只是作为调试之用。 这一节我们用到的是 RS-232 接口。 USART 通用同步异步收发器 我们平时用的是 UART 异步收发器。 这个接口是串行接口中最简单的形式。 他也是遵循串行接口的操纵 串转并 并转串 串口的时序 4.2 程序的学习 SystemInit(); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB 2Periph_AFIO, ENABLE);//配置串口和复用功能的时钟。 GPIO_Configuration(); /* 配置串口 为波特率 11520 数据位 8 位 停止位 1 位 无奇偶校 验 无硬件流控 */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength= USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx| USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure);//初始换前面的参数 USART_Cmd(USART1, ENABLE); //开启串口功能 /* 输出信息 */ printf("\n\r S-107 USART Study \n\r"); printf("\n\r www.stmsky.com/bbs \n\r"); printf("\n\r stm 家园 \n\r"); printf("\n\r www.stmsky.com/bbs \n\r"); printf("\n\r http://shop60442272.taobao.com/ \n\r"); 这里我们只是测试输出的程序。主要是两个问题 就是串口的配置 和串口的输出函数的使用。 串口的配置 就是前面 一些主要参数的定义 根据我们实际的需要 来配置 就是这么简单 串口输出函数 这里使用了从定义的 printf 函数 PUTCHAR_PROTOTYPE { USART_SendData(USART1, (uint8_t) ch);//发送一个字符 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 RESET)//等待发送完成 {} return ch; } 这个是编译器兼容的 printf 函数的原型,这里我们也可以不必使用这 个函数 可以自己定义,想想应该怎么做呢?可以亲自改一下试试。 程序调试结果: 温馨 小提示: 这里只是用查询的方式 做了输出的操作,那怎么用 查询的接受呢?下面 我们会有相关的历程 但是我觉得应该自己按 照自己的学习方式 试一下。提示 st 官方历程中 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 这里面列出了 几乎所有的串口不同的应用方式 。 自己写输出 主要是判断一次发送的字符个数 提示一下 #define countof(a) (sizeof(a) / sizeof(*(a))) 这个函数的作用 5. 串口的学习---《-STM32F10x-串口输入输出》 5.1 先看一下硬件需要的准备 首先要先跳线选择 串口功能 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的引脚 如图: 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 5.2 程序的学习 先看一下源代码 /* System Clocks Configuration */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_AFIO, ENABLE); /* Configure the GPIO ports */ GPIO_Configuration(); /*串口配置 ------------------------------------------------------*/ /* 115200 8 n 1 */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength= USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx| USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); while (1) { while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)//等待接受为空 { } 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 chars = (USART_ReceiveData(USART1)); //接受字符 USART_SendData(USART1, chars);//发送接收到的字符 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)//等得发送完成 { } 红色前面的配置 我们已经很熟悉了 这里不多说 主要看一下红色 部分 功能是接收字符然后发送出去。在接收的时候一定要先等待接 收寄存器为空的标志置位,为什么?咱们可以把这句话去掉就知道了 没试过的朋友可以试试。发送后照样是要等待发送完成标志位置一。 总之 自己多试试 想怎么改就怎么改 看一下调试结果 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 串口把接受的信息 随机打印出来 温馨小提示:对于串口 我建议大家按照自己的想法 改一下程序 然 后通过调试助手来查看效果 会对串口配置部分 有更深的理解。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 6.串口的学习---《-STM32F10x-串口中断输入输出》 中断是在任务稍多的项目中 无系统状态下经常使用的一种程 序运行方式,他在一定程度上保障了程序的实时性。这里我们介绍一 下串口的中断发送和接受。 串口的中断接受,首先我们应该想到的是 我们怎么知道数据接受 完了呢?一般情况下有两种方式: 1 规定带有帧结束标志的数据,比如一些串口功能器件发来的数据 我 们应如何判断一个完整的数据 以便后续的分析呢,我们拿 gps 模块 为例,gps 的数据的个数是不断变化的,因为很多参数的数据是不固 定的 怎样才能一帧一帧的接受分析 经常用的就是判断数据的开始 和结束标志 2 就是根据帧间隔 很多数据采集设备发来的数据都是隔一段时间 传输一次 这样的数据我们就可以根据字节间的间隔来判断一帧的结 束,比如一个连续的数据帧的字节间隔是固定的 这个由波特率决定 比如时间算出来是 T1 那么我们就可以认为在大于 1.5 倍 T1 间隔没 有数据收到就认为一帧的接受结束。 作者经验有限 就知道这两种方式 如果谁有好的方式 请一起 交流 我们的工程测试程序是根据 第 2 种来实现 串口的中断接受 这 里因为是测试所以帧判断的 tim 时间为 1s,也就是说只要你发送的数 据间隔小于 1s 我们都认为是一帧的数据。 程序源码: /* System Clocks Configuration */ SystemInit(); TIM2_Configuration(); //配置 tim2 计数中断 这个前面已经讲 过 这里不细说 /* NVIC configuration */ NVIC_Configuration();// 配置中断优先级 这里也讲过了 参看一 下里面的程序 我们就能明白里面的操作了 /* Configure the GPIO ports */ GPIO_Configuration();// 串口引脚配置 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /* 串口配置------------------------------------------------------*/ /* 115200 8 n 1 */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength= USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl=USART_Hardwa reFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx| USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能接 受中断 // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能中 断 这里先不使能 在后面中断发送之前发送 USART_Cmd(USART1, ENABLE); 使能串口 1 中断配置 就是加了两个开启中断的函数 具体的寄存器操作 请参 看 数据手册的 串口部分。 当有数据发来的时候 程序则会进入中断函数: void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { TIM_Cmd(TIM2, ENABLE); TIM2->CNT &= 0x0000;//定时器延时设置 每次接受清零 当 接受间隔超过定时器定的值时 进入 tim 中断 认为一帧接受完成 RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 USART_ClearITPendingBit(USART1, USART_IT_RXNE); } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { Uart_send_counter--; if(Uart_send_counter>0) { USART_SendData(USART1, *Uart_send_pointer++); } else USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } 在进入中断函数后 首先先打开 time 计时 并且清除计数值,接受完 数据后 一定要清除接收中断标志位。如果 1s 时间没有数据接受 tim 的计数值将达到上限而进入 tim 中断函数: void TIM2_IRQHandler(void) {/******处理完数据后一定要把 Uart0_rev_count 清零, 但是为了安全一开始就请零可能更好,这样的话 我 们 规 定 用 Uart0_rev_countmap 来 代 替 Uart0_rev_count******************** 注 意 : 这 里 的 命 名 是 不 规 范 的 , 以 后 要 改 为 timX 对 应 usartx*******/ u32 Uart0_rev_countmap; /***清楚 tim 中断和关闭 tim 中断,在 uart 接受中断里 使能****/ TIM_Cmd(TIM2, DISABLE); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); /****copy RxCounter1 的值****/ Uart0_rev_countmap=RxCounter1; RxCounter1=0; 有相应的 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /*****测试语句 返回接受的语句 顺便测试中断发送 这里以后是数据处理函数***********************/ Uart_InterruptsendY(USART1,RxBuffer1,Uart0_rev_countmap); } 这里面我们把接受到的数据通过中断的方式发送出来,具体的函数请 到串口中断里面的串口发送部分寻找。 测试截图: 点击发送 程序会把中断接收到的数据通过中断发送的方式 发送 出来。 温馨提示:中断的使用也有自己的条件 就是不能有中断太频繁的外 设,如果有的话 也许中断就会出现可靠性方面的考验,当然任何问 题都会有解决的方式。但是知道这些 对项目前期评估选型很有必要。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 7.外部中断的学习------《STM32F10x-外部中断》 7.1 先看一下硬件需要的准备 原理图部分 如图: 跳线:短接图示的引脚 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 硬件小知识: 噪声: 噪声是数字系统里的一个重要问题,噪声可能干扰信号传输,从而导致数据被 破坏或者导致程序崩溃。嵌入式系统所发生的问题可能与噪声相关 也可能和噪 声无关,例如 电源供电不足 退偶电容不够 边际时序冗余以及软件 bug 都可能 在运行时导致随机的短时脉冲波形干扰。然而,即便是构思巧妙的系统也可能被 噪声毁坏掉。设计里的噪声问题是固有的。来自集成电路的开关噪声,铃声以及 话音串扰都是设计嵌入式系统所要考虑的问题。其他形式的噪音可能是因环境影 响而起 例如马达或者是无线电辐射。麻烦的是,对数字系统而言,电磁问题越 来越严重了。数字系统被来自无线电 TV 和移动电话发射塔的不断增加的辐射 所包围着。同时,由于设计朝着告诉低功耗发展,集成电路变得日益敏感。 上述噪声源在设计和测试间可能不会出现,而一旦系统投入使用,哪些问题便 会出现,嵌入式系统垮掉的可能是因为硬件问题 软件问题或者在一个街区以外 的工厂打开了压缩器从而在供电上产生了一个峰值信号所造成的,由噪声所产生 的场问题可能只会偶尔发生,但常常很难对其进行跟踪。有些问题常常没给几天 就会出现。任何问题都是令人不满的,都必须加以解决。但是确认问题的原因却 并非总是那么容易,所以经验在工作中很重要,有些东西不是原理知识能解决的。 无论如何 我们最好从一开始设计时就使系统尽可能的免收这些问题的困扰。你 必须考虑的,不仅仅是你的系统可能产生的电磁辐射,还有外部作用对系统的影 响。这也并不能保证你的系统就不会出现任何问题,但尽量多地考虑到可能的问 题对系统是有帮助的。这里说这么多,因为在我接触的很多工程师 都是在满足 功能的实现,并没有一开始就去考虑可靠性的问题。 总之这一切我们称之为电磁干扰 但是我们应该注意些什么呢? 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 1 在硬件布线的时候 最小化电流环路面积 也就是电源 通过信号线再接地 到电源的面积,当然这主要是高频电路所考虑的 2 保持电源平稳 一点 退偶电容很重要,如果可以 在器件的供电引脚尽可 能的加一个退偶电容。 7.2 程序的学习 本工程我们看一下 外部中断的 配置过程 这个工程为了简化代码和增强易读性我们把程序装配到了上层函数 和分类文件里。来看一下程序 SystemInit(); LED_GPIOconfig(); EXTI_key_Config(); 前面两个函数很容易理解了,我们主要看后面外部中断的配置: void EXTI_key_Config(void) { /* Enable GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2P eriph_GPIOD, ENABLE); /* Enable AFIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); /* Configure PB.09 pin as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Connect EXTI9 Line to PB.09 pin */ GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource6); GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource13); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource14); /* Configure EXTI9 line */ EXTI_InitStructure.EXTI_Line= EXTI_Line6|EXTI_Line13|EXTI_Line14; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* Enable and set EXTI9_5 Interrupt to the lowest priority */ NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 这里通过参看原理图可以知道 我们使用的是 PC6 PD13 PD14 3 个引脚做为按键,配置过程比较固化,我们简单说一下:先开启用到 的端口时钟和复用功能时钟,配置使用的端口为浮空输入,定位终端 线(就像连线一样),配置中断参数,配置中断优先级。这样就配置 好了外部中断,只要有满足中断的信号来到 就会产生中断到相应的 中断函数: void EXTI9_5_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line6) != RESET) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 { /* Toggle LED2 */ GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5))); /* Clear the EXTI line 9 pending bit */ EXTI_ClearITPendingBit(EXTI_Line6); } } void EXTI15_10_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line13) != RESET) { /* Toggle LED2 */ GPIO_WriteBit(GPIOA,GPIO_Pin_5,(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5))); /* Clear the EXTI line 9 pending bit */ EXTI_ClearITPendingBit(EXTI_Line13); } if(EXTI_GetITStatus(EXTI_Line14) != RESET) { /* Toggle LED2 */ GPIO_WriteBit(GPIOA,GPIO_Pin_5,(BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5))); /* Clear the EXTI line 9 pending bit */ EXTI_ClearITPendingBit(EXTI_Line14); } 进入中断后 首先判断一下是哪一个中断,然后进入相应的处理函数 操作,这里我们用三个按键来控制同一个灯的反转。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 温馨小提示:外部中断配置时 一定要开启复用功能 不然可能导致中 断不能正常产生。 8.模拟采集 ADC 学习 ---- 8.1 先看一下硬件需要的准备 原理图 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的引脚 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 硬件小知识 关于模数转换,我们应该知道 决定精度的就是采样频率。 关于 dma DMA 是在内存的两个区域之间或者内存和 io 设备之间以流水线方 式传输大块数据的一种方式。 他的特点是无需系统内核的管理,为了 dma 传输,dma 控制器必须获得 地址和数据总线的使用权。常见的 DMA 传输有: 1 标准模块传输 2 命令模式传输 3 连续传输 4 数据链传输 还有一点 不是所有的嵌入式系统都支持 DMA 传输的,但是 stm32 支持。 这里我们就是用 dma 的方式 不间断的传输 adc 转换值 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 8.2 程序的学习 本程序使用 adc 通道 14 芯片引脚 pc4 来采集外部的模拟量,采用 循环采集并通过 dma 通道传输给内存数组,然后经过简单的均值换 算,打印到串口。 这里主要看一下怎么配置 adc 和 dma, 先说一下 dma DMA 的定义是--Direct Memory Access,直接内存存取 DMA 的特点就 是不需要指令的参与自动的传输设置好的数据,大大提高了 cpu 的效 率。传输不受任何中断的干扰,做到了实时准确的传输。他就像一个 做好了水渠,水源源不断的从源端流向水渠的另一端。那我们做的工 作就是怎么实现构造这样一个水渠。可以想一想,首先我们的要设置 源端和目的端 告诉它流的方向,还有水渠的宽度一次能流多少水。 水流的方式 是一次性还是循环源源不断的流等参数。这里还有一点 需要注意,那就是目的地可能不止是一个。怎们一到多,这里和真实 的水渠就有点不一样了,因为这里我们不能是并行的,那就得比如有 16 个目的地那就得 1-16 这样循环了,在快速的循环中 我们看到的几 乎是同时的,想想电视或者 led 灯显示的原理,足够快扫描频率我们 看到的是一个完整的画面。 先看一下程序 RCC_Configuration(); /* GPIO configuration ------------------------------------------------------*/ GPIO_Configuration(); USART1_Configuration(); /* DMA1 channel1 configuration ----------------------------------------------*/ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; 配置 DMA 的 寄存器端为 adc1 的数据输出地址---水渠的一端 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADCConvertedValue; 配置 DMA 的 内存端为我们定义的数组首地址---水渠的一端 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; 规定数据传输方向 寄存器端为源端 DMA_InitStructure.DMA_BufferSize = 16; 目的端的个数 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; 循环扫描目的端使能增长 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; 水渠的宽度 数据时 16 位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; 模式是循环传输 DMA_InitStructure.DMA_Priority = DMA_Priority_High; 优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); /* Enable DMA1 channel1 */ DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; 单独的 adc 转换 我们只用了一个 ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 数据右边对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 Adc 通道一个 ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel14 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5); 设置 adc 通道 14 为第一个通道 这里只有一个 /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE); /* Enable ADC1 reset calibration register */ ADC_ResetCalibration(ADC1); /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1)); 校验转换精度 /* Start ADC1 calibration */ ADC_StartCalibration(ADC1); /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1)); /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); 我们还有个历程 给出了多个通道的操作 请参看相关历程。因为硬 件只引出一个 adc,所以多个 adc 的工程 大家可以理解一下软件 主 要是相关配置数字和通道数的关系,一定要理解 程序运行截图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 9. flash 做为 e2pprom 存储数据测试 ----《STM32F10x-内部 flash 读写测试》 9.1 先看一下硬件需要的准备 原理图 如图: 无 跳线:短接图示的引脚 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 9.2 flash 读写程序的学习 Stm32 的一个唯一不能满足有些客户的就是没有真正的 e2,但是对 于一些存储次数少得应用,内部的 flash 依然是不错的选择,现在我 们看一下怎样应用内部的 flash 存储数据。首先我们要知道 stm32 内 部 flash 的操作细节,flash 的读和写都是以 32 位为操作单元的。也就是 读写都是 32 位。但是这个对我们的操作并没有太大的影响,但是对 于一些位数据我们知道这些可以更好的来应用,还有一个重要的就是 在读写的时候开始地址必须是一页的开始地址,不然读写是不行的, stm32 的一页是 1k 为单元的。 下面看一下程序: 主要的两个函数: EE_WriteVariable(地址, 要写入的数据); 写数据 EE_ReadVariable(地址, 存储数据的数组);读数据 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 看一下原型: STM32F10X 系列开发板学习笔记 S-107 开发套件 * Return : - Success or error status: * - 0: if variable was found * - 1: if the variable was not found * - NO_VALID_PAGE: if no valid page was found. ********************************************************************* **********/ u16 EE_ReadVariable(u16 VirtAddress, u16* Data) { u16 ValidPage = PAGE0; u16 AddressValue = 0x5555, ReadStatus = 1; u32 Address = 0x08010000, PageStartAddress = 0x08010000; /* Get active Page for read operation */ ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE); /* Check if there is no valid page */ if (ValidPage == NO_VALID_PAGE) { return NO_VALID_PAGE; } /* Get the valid Page start Address */ PageStartAddress = (u32)(EEPROM_START_ADDRESS + (u32)(ValidPage * PAGE_SIZE)); /* Get the valid Page end Address */ Address = (u32)((EEPROM_START_ADDRESS - 2) + (u32)((1 + ValidPage) * PAGE_SIZE)); 前面检测地址的有效性 /* Check each active page address starting from end */ while (Address > (PageStartAddress + 2)) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 { /* Get the current location content to be compared with virtual address */ AddressValue = (*(vu16*)Address); /* Compare the read address with the virtual address */ if (AddressValue == VirtAddress) { 读取数据 /* Get content of Address-2 which is variable value */ *Data = (*(vu16*)(Address - 2)); /* In case variable value is read, reset ReadStatus flag */ ReadStatus = 0; break; } else { /* Next address location */ Address = Address - 4; } } /* Return ReadStatus value: (0: variable exist, 1: variable doesn't exist) */ return ReadStatus; } Return * * * found * : - Success or error status: - FLASH_COMPLETE: on success, - PAGE_FULL: if valid page is full - NO_VALID_PAGE: if no valid page was - Flash error code: on write Flash error 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 ********************************************************************* **********/ u16 EE_WriteVariable(u16 VirtAddress, u16 Data) { u16 Status = 0; /* Write the variable virtual address and value in the EEPROM */ Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data); 写入数据 /* In case the EEPROM active page is full */ if (Status == PAGE_FULL) { /* Perform Page transfer */ Status = EE_PageTransfer(VirtAddress, Data); } /* Return last operation status */ return Status; } 本工程把读写的相关函数已经封装到 eeprom.c 文件,大家在使用的时 候直接把文件添加到工程,调用读写函数即可,很方便工程中实现 flash 的读写功能,简单看一下调用的方式: void flash_save(u16* CFG) { int count; int i; count = Uart0_rev_countmap; FLASH_Unlock(); /* EEPROM Init */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 EE_Init(); for (i = 0; i < count; i++) { EE_WriteVariable(VirtAddVarTab[0]+i, CFG[i]); } FLASH_Lock(); } 保存数据 这里就是很方便的调用我们封装好的函数即可,值得我们 注意的是就是在操作的前后要先解锁 flash 然后上锁即可 void flash_read(void) { int count; int i; count = Uart0_rev_countmap; FLASH_Unlock(); /* EEPROM Init */ EE_Init(); for(i = 0; i < count; i++) { EE_ReadVariable(VirtAddVarTab[0]+i, &read1[i]); } FLASH_Lock(); } 读数据,操作和写一样 解锁 flash 后调用读函数就好了。 下载调试程序 看一下结果? 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 Ok 这一节我们学习了一下 flash 的相关操作,这里章节有限 不能很 具体的说一下每一个细节,请使用的朋友自己通过我们做好的函数 一一分析,也是对这一操作深入的了解。有任何疑问欢迎进入我们的 论坛 stm 家园 http://www.stmsky.com/bbs/thread-21203-1-1.html 进行 讨论。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 10. I2C 写入读取数据--AT24C01 测试程序 10.1 先看一下硬件需要的准备 原理图 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的四个引脚 如图: 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 硬件小知识: I2C (内部集成电路)总线是价格非常低,却很有效的用 以互联小规模嵌入式 系统内的外设网络。I2C 总线有时候也叫做 IIC,他已经有 20 多年的历史了,I2C 接口和 SPI 接口的作用相同 但是两者使用方法有些不同 I2C 总线用两根线来连接多支路总线中得多个设备,这种总线是双向 低速的, 并与公共时钟同步,直接将一个设备接到 i2c 总线上或是从该总线上取下,而不 会影响其他设备,很多 mcu 都集成了 i2c 控制器,I2C 速度比较慢,标准模式下 传输速度为 100kbps 在快速模式下为 400kbps 利用 I2C 接口在设备之间进行连接所使用的两根线是 SDA 串行数据和 SCL 串 行时钟 他们都是开漏引脚。为什么开漏呢?因为开漏和开路集极引脚具有输出 驱动,能够把信号线置位接地,但是不能够把信号线提升至高电平,因而具有这 样的优势,连接于信号的不止一个的设备可以使其降低至低电平,若非如此,如 果一个设备试图把信号至于低电平而另外一个设备却把它置位高电平那么就会 产生短路,导致严重的后果 当处于空闲状态产生(没有设备)时,就由电阻将 其置为高电平。使用 I2C 总线进行通信的设备驱动这两根线变为低电平,再不使 用的时候就让他保持高电平。每个连接到 I2C 的设备都有一个惟一地址,这个设 备可以是数据发送者(总线主机),接受者(总线从机),也可以二者都是(如图) I2C 是多主机总线,这意味着可以有多个设备充当总线主机的角色。 SDA 和 SCL 都是双向的,共享一根信号线来完成主机传送和从机响应,I2C 只 用一个工作模式 而 spi 那种接口有多种工作模式,I2C 的时钟 SCL 和数据线 SDA 之间的时序关系很简单直观。当空闲的时候,SDA 和 SCL 都是高电平,只 有 SDA 变为低电平,,接着 SCL 也变为低电平时才开始 I2C 总线的数据传输(如 图),当 SDA 和 SCL 都变为低电平时,就是告诉总线的所有接受设备数据包的 传输开始了。在 SCL 变为低电平后,SDA 才发送(高电平或者低电平)第一个 有效数据位,这被称为开始条件。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 对于被传输的每一位,当 SCL 为低电平时 SDA 上位必须变为有效,该位是在 SCL 的上升沿对 SDA 上的数据位进行采样的,也必须一直保持有效直到 SCL 再次变为低电平,然后 SDA 就在 SCL 再次变为高电平之前传输下一个位(如图) 最后,SCL 变回高电平(无效),接着 SDA 也变为高电平(如图),数据传输结 束,这被称为结束条件 无论多大的数据包都可以通过 I2C 总线进行传输,像 SPI 总线一样,I2C 总线也 是高位先传输。如果数据接受者无法再接受更多的数据,他可以通过将 SCL 保 持低电平来中断传输。这样可以迫使数据发送者等待,直到 scl 被重新释放。 发送方发出的每个字节都必须经过接受方确认,每个字节的第 8 个数据位一旦 传输结束,发送方就释放数据线 SDA。然后主机在 SCL 上产生一个额外的时钟 脉冲,这会触发接受方通过将 SDA 置为低电平,发送方就会中断传输,并且采 取适当的错误处理措施。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 I2C 是多主机总线,因此存在同一时间会有多个主机试图开始数据传输的可能。 由于 I2C 总线默认的状态是高电平,所以一个主机发送数据位 0 时会将 SDA 置 为低电平,而如果这个数据位是 1 将总线置为默认状态,所以两个主机要同时传 输数据,一个主机发送数据位为一将总线置为默认状态。但又检测到总线被另外 一个主机置为了低电平(发送数据位 0),该主机将记录一个错误状态,并且终 止数据传输 那么怎样判断正在操纵的设备呢,因为 I2C 不像 SPI 那样有片选信号, 但是 I2C 总线每个设备都有一个唯一的地址,数据包传输时先发送地址位,接着 才是数据,一个地址字节由 7 个地址位和一个指示位组成,如果指示位 0,意味 着这个传输是一个写操作。被选中的从机将接受数据并将其作为输入,如果是指 示位是 1,就是要求从从机将数据发送会主机,如图 是一个 I2C 数据包的示意 图 有一个特殊的地址,称为全呼叫地址,向所有的 I2C 设备进行广播,这个 地址由八个 0 组成,全呼叫是一种是主机可以确定哪些从机有效的机制,它有几 种类型,一个全呼叫的第二个字节说明呼叫从机的目的,一旦接受到第二个字节, 每个从机就会检查这个指令对自己是否有效,如果有效就会主动向主机进行确 认,否则不予理睬。如果第二个字节是 0x06 就是让有效的从机进行复位,并且 将他的地址告诉主机,若第二个字节是 0x04,相应的从机就是需将他们的地址 告诉主机 不必复位。当这个字节为其他内容的时候(最低位为 0)——,从机 可以对这个全呼叫不予理睬,如果第二个字节(最低位为 1)这个全呼叫就是一 个主机设备通过向系统中其他主机发送自己的地址来声明自己,这个字节其它位 包含主机地址 另外一个特殊的地址字节成为开始字节,这个字节是 ox01,它用来告诉主 机一次大规模的数据发送即将开始,这点对于没有专用 I2 硬件而又必须通过软 件轮询来对 I2C 总线进行监听的主机来说尤为重要,当一个主机探测到另外一个 主机产生的开始字节时,他就会降低自己对总线的轮询频率,为其他的软件任务 提供更多的时间 I2C 还支持 10 位的寻址,可连接外设 1024 个,使用 7 位或者 10 位可以 同时在一个系统中出现,10 位地址由两个字节组成,如果第一个地址字节以 11110XX 开始 就是一个 10 位地址。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 也许您看了描述 还是不很理解,那我们的目的也达到了,你就会更有目的 的去看程序了,因为你有很多的不解,会在程序中找到答案 10.2 程序分析 Stm32 的硬件 i2c 长期以来饱受争议,因为很多客户在使用的时 候总是操作不成功,这个要怪罪于 stm32 以前的 i2c 库存在的时序问 题,做为一直从事 stm32 技术支持的作者,因为很早就意识到了问题 的根结,所以也没有遇到过网上所说的问题。而 st 在 3.5.0 的库里面 也对这方面做了完善的更正,现在问题已经不复存在了。这里我们就 使用新库给大家看一下具体的操作过程。如果大家在使用中 还是遇 到 以 前 的 问 题 请 和 作 者 联 系 或 者 到 官 方 论 坛 stm 家 园 www.stmsky.com 发帖讨论。 我们先看一下 程序源码: GPIO_Configuration(); /*串口配置------------------------------------------------------*/ /* 115200 8 n 1 */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength= USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 USART_InitStructure.USART_Mode=USART_Mode_Rx| USART_Mode_Tx; /* Configure USARTy */ USART_Init(USART1, &USART_InitStructure); /* Configure USARTz */ USART_Cmd(USART1, ENABLE); sEE_Init(); sEE_WriteBuffer(Tx1_Buffer,sEE_WRITE_ADDRESS1, BUFFER_SIZE1);//写入数据 NumDataRead = BUFFER_SIZE1;//设置读取的数据个数 sEE_ReadBuffer(Rx1_Buffer,sEE_READ_ADDRESS1,(uint16_t *)(&NumDataRead)); while (NumDataRead > 0) { } sEE_DeInit(); printf("\n\r S-107 I2C 数据读写学习 \n\r"); printf("\n\r www.stmsky.com/bbs \n\r"); printf("\n\r stm 家园 \n\r"); printf("\n\r www.stmsky.com/bbs \n\r"); printf("\n\r http://shop60442272.taobao.com \n\r"); printf("\n\r 保存到 AT24C01 的数据: \n\r"); USART_SENDS(Tx1_Buffer,BUFFER_SIZE1); printf("\n\r \n\r"); printf("\n\r 读到 AT24C01 的数据: \n\r"); USART_SENDS(Rx1_Buffer,BUFFER_SIZE1); 主要看 蓝色部分程序 其余程序为调试代码,这里主要的函数是两个 读写函数: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 sEE_WriteBuffer(Tx1_Buffer, sEE_WRITE_ADDRESS1, BUFFER_SIZE1);//写入数据 sEE_ReadBuffer(Rx1_Buffer,sEE_READ_ADDRESS1,(uint16_t *)(&NumDataRead)); //读出写入的数据 简单说一下参数即可 因为 st 已经对底层做了全面的封装 对于 我们的操作相当方便 只要知道几个简单的参数就行了 函数的参 数分别为 存储读写数据的数组首地址 要读写的存储元件首地址 要读写的数据个数 ok 我们知道这三个函数 就能很容易的使用这 两个函数了,下面我们再看看配置的和硬件存储器件有关的设置: #define sEE_Block0_ADDRESS 0xA0 /* E2 = 0 */ #define I2C_SPEED 100000 #define I2C_SLAVE_ADDRESS7 0xA0 #define sEE_PAGESIZE 8 主要是上面四个参数的更改 这里我们用的是 at24c01 的程序,所 有参数是按照器件的 datasheet 的参数设置的,如果我们在项目开发中 不是用的这个器件 则需要按照期间本身的设计 对上面的参数做出 简单修改即可,对于数据读写有问题的 放低 speed 多测试一下,毕 竟不同的器件 性能是不一样的。 我们再看一看 读写函数的原型: void sEE_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite) { uint8_t NumOfPage = 0, NumOfSingle = 0, count = 0; uint16_t Addr = 0; Addr = WriteAddr % sEE_PAGESIZE; count = sEE_PAGESIZE - Addr; NumOfPage = NumByteToWrite / sEE_PAGESIZE; NumOfSingle = NumByteToWrite % sEE_PAGESIZE; /*!< If WriteAddr is sEE_PAGESIZE aligned */ if(Addr == 0) { /*!< If NumByteToWrite < sEE_PAGESIZE */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 if(NumOfPage == 0) { /* Store the number of data to be written */ sEEDataNum = NumOfSingle; /* Start writing data */ sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); } /*!< If NumByteToWrite > sEE_PAGESIZE */ else { while(NumOfPage--) { /* Store the number of data to be written */ sEEDataNum = sEE_PAGESIZE; sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); WriteAddr += sEE_PAGESIZE; pBuffer += sEE_PAGESIZE; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 } if(NumOfSingle!=0) { /* Store the number of data to be written */ sEEDataNum = NumOfSingle; sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); } } } /*!< If WriteAddr is not sEE_PAGESIZE aligned */ else { /*!< If NumByteToWrite < sEE_PAGESIZE */ if(NumOfPage== 0) { /*!< If the number of data to be written is more than the remaining space in the current page: */ if (NumByteToWrite > count) { /* Store the number of data to be written */ sEEDataNum = count; /*!< Write the data conained in same page */ sEE_WritePage(pBuffer, WriteAddr, 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); /* Store the number of data to be written */ sEEDataNum = (NumByteToWrite - count); /*!< Write the remaining data in the following page */ sEE_WritePage((uint8_t*)(pBuffer + count), (WriteAddr + count), (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); } else { /* Store the number of data to be written */ sEEDataNum = NumOfSingle; sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); } } /*!< If NumByteToWrite > sEE_PAGESIZE */ else { NumByteToWrite -= count; NumOfPage = NumByteToWrite / sEE_PAGESIZE; NumOfSingle = NumByteToWrite % sEE_PAGESIZE; if(count != 0) { /* Store the number of data to be written */ sEEDataNum = count; sEE_WritePage(pBuffer, WriteAddr, (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); WriteAddr += count; pBuffer += count; } while(NumOfPage--) { /* Store the number of data to be written */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 sEEDataNum = sEE_PAGESIZE; sEE_WritePage(pBuffer,WriteAddr, (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); WriteAddr += sEE_PAGESIZE; pBuffer += sEE_PAGESIZE; } if(NumOfSingle != 0) { /* Store the number of data to be written */ sEEDataNum = NumOfSingle; sEE_WritePage(pBuffer,WriteAddr, (uint8_t*)(&sEEDataNum)); /* Wait transfer through DMA to be complete */ sEETimeout = sEE_LONG_TIMEOUT; while (sEEDataNum > 0) { if((sEETimeout--) == 0) {sEE_TIMEOUT_UserCallback(); return;}; } sEE_WaitEepromStandbyState(); } } } } uint32_t sEE_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t* NumByteToRead) { 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /* Set the pointer to the Number of data to be read. This pointer will be used by the DMA Transfer Completer interrupt Handler in order to reset the variable to 0. User should check on this variable in order to know if the DMA transfer has been complete or not. */ sEEDataReadPointer = NumByteToRead; /*!< While the bus is busy */ sEETimeout = sEE_LONG_TIMEOUT; while(I2C_GetFlagStatus(sEE_I2C, I2C_FLAG_BUSY)) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /*!< Send START condition */ I2C_GenerateSTART(sEE_I2C, ENABLE); /*!< Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */ sEETimeout = sEE_FLAG_TIMEOUT; while(!I2C_CheckEvent(sEE_I2C, I2C_EVENT_MASTER_MODE_SELECT)) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /*!< Send EEPROM address for write */ I2C_Send7bitAddress(sEE_I2C,sEEAddress, I2C_Direction_Transmitter); /*!< Test on EV6 and clear it */ sEETimeout = sEE_FLAG_TIMEOUT; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 while(!I2C_CheckEvent(sEE_I2C, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } #ifdef sEE_M24C08 /*!< Send the EEPROM's internal address to read from: Only one byte address */ I2C_SendData(sEE_I2C, ReadAddr); #elif defined (sEE_M24C64_32) /*!< Send the EEPROM's internal address to read from: MSB of the address first */ I2C_SendData(sEE_I2C, (uint8_t)((ReadAddr & 0xFF00) >> 8)); /*!< Test on EV8 and clear it */ sEETimeout = sEE_FLAG_TIMEOUT; while(!I2C_CheckEvent(sEE_I2C, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /*!< Send the EEPROM's internal address to read from: LSB of the address */ I2C_SendData(sEE_I2C, (uint8_t)(ReadAddr & 0x00FF)); #endif /*!< sEE_M24C08 */ /*!< Test on EV8 and clear it */ sEETimeout = sEE_FLAG_TIMEOUT; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 while(I2C_GetFlagStatus(sEE_I2C, I2C_FLAG_BTF) == RESET) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /*!< Send STRAT condition a second time */ I2C_GenerateSTART(sEE_I2C, ENABLE); /*!< Test on EV5 and clear it (cleared by reading SR1 then writing to DR) */ sEETimeout = sEE_FLAG_TIMEOUT; while(!I2C_CheckEvent(sEE_I2C, I2C_EVENT_MASTER_MODE_SELECT)) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /*!< Send EEPROM address for read */ I2C_Send7bitAddress(sEE_I2C, sEEAddress, I2C_Direction_Receiver); /* If number of data to be read is 1, then DMA couldn't be used */ /* One Byte Master Reception procedure (POLLING) ---------------------------*/ if ((uint16_t)(*NumByteToRead) < 2) { /* Wait on ADDR flag to be set (ADDR is still not cleared at this level */ sEETimeout = sEE_FLAG_TIMEOUT; while(I2C_GetFlagStatus(sEE_I2C, I2C_FLAG_ADDR) == RESET) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /*!< Disable Acknowledgement */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 I2C_AcknowledgeConfig(sEE_I2C, DISABLE); /* Call User callback for critical section start (should typically disable interrupts) */ sEE_EnterCriticalSection_UserCallback(); /* Clear ADDR register by reading SR1 then SR2 register (SR1 has already been read) */ (void)sEE_I2C->SR2; /*!< Send STOP Condition */ I2C_GenerateSTOP(sEE_I2C, ENABLE); /* Call User callback for critical section end (should typically re-enable interrupts) */ sEE_ExitCriticalSection_UserCallback(); /* Wait for the byte to be received */ sEETimeout = sEE_FLAG_TIMEOUT; while(I2C_GetFlagStatus(sEE_I2C, I2C_FLAG_RXNE) == RESET) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /*!< Read the byte received from the EEPROM */ *pBuffer = I2C_ReceiveData(sEE_I2C); /*!< Decrement the read bytes counter */ (uint16_t)(*NumByteToRead)--; /* Wait to make sure that STOP control bit has been cleared */ sEETimeout = sEE_FLAG_TIMEOUT; while(sEE_I2C->CR1 & I2C_CR1_STOP) { 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /*!< Re-Enable Acknowledgement to be ready for another reception */ I2C_AcknowledgeConfig(sEE_I2C, ENABLE); } else/* More than one Byte Master Reception procedure (DMA) -----------------*/ { /*!< Test on EV6 and clear it */ sEETimeout = sEE_FLAG_TIMEOUT; while(!I2C_CheckEvent(sEE_I2C, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) { if((sEETimeout--) == 0) return sEE_TIMEOUT_UserCallback(); } /* Configure the DMA Rx Channel with the buffer address and the buffer size */ sEE_LowLevel_DMAConfig((uint32_t)pBuffer, (uint16_t)(*NumByteToRead), sEE_DIRECTION_RX); /* Inform the DMA that the next End Of Transfer Signal will be the last one */ I2C_DMALastTransferCmd(sEE_I2C, ENABLE); /* Enable the DMA Rx Channel */ DMA_Cmd(sEE_I2C_DMA_CHANNEL_RX, ENABLE); } /* If all operations OK, return sEE_OK (0) */ return sEE_OK; } 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 这里使用的是 i2c 的 dma 的功能实现的读写操作,这样做我觉得很有 必要,因为在以前的 i2c 操作中 使用中断是相当有难度的,不使用中 断而是查询的话 则需要考虑其他中断对 I2C 操作的干扰 因为 I2C 的 时序是非常严格的。如果使用 dma 我们就完全可以避免上面的困扰, 我们多做的就是要判断什么时候传输完成。程序源码请使用者自己按 照手册 I2C 的原理说明顺序看一下 更深入的了解一下 i2C 的机制 当 然对于使用者 工程代码已经能够满足大家的需要了。因为专业人士 已经为我们做了底层的一切。 看一下调试截图: 11. 网络之---RS-485 的学习 11.1 先看一下硬件需要的准备 原理图 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的引脚 如图: 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 硬件小知识: RS-485,我们现在经常使用的网络接口 主要是 485 can lan。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 RS-485 是一种用来连接小型控制器的简单网咯,成本非常低并且 容易实现。CAN 是一种在工业应用中使用的网络,在这些地方传统 网络不适用,AN 适用于有电气干扰和条件状况较差的地方,并且是 一种在对电气要求严格的环境中可以采用的网络。以太网是企业内部 互联网络,他可以连接所有计算机及其他网络设备。 RS-485 由 RS-422 演变而来,用来组建低成本网络,并且普遍的用 在许多工业应用中。RS-485 是最简单和最容易实现的网络之一,并且 还允许多个系统仅通过一根双绞线来交换数据。 RS-485 基于主机/从机体系结构。所有的事务都由主机进行初始化, 而从机只有在接受到特定指令后才进行传输。RS-485 支持许多不同的 协议,经常人们做自己的事情,并制定于将处理的应用的相关的协议。 我们看一下典型的 RS-485 收发器 max485 为例: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 由于是连接到一个公共网络,他必须能够在这个网络上进行监听 和传输,所以收发器有两个控制输入端:数据使能 DE 和接收使能 RE .对 DE 输入一个高电平,则允许 DI 输入端的数据在网络上传输, 对 DE 输入一个低电平则禁止 DI 的输出在网络上传传输。同样地, 对 RE 输入一个低电平,就使接收器可以接受数据,这样网络上的数 据都流向 RO。通常情况下 DE 和 RE 由处理器的一个 io 线控制着, 现在你已注意到了,DE 是高电平有效,而 RE 是低电平有效,这种 情况并不是偶然发生的。处于网络中的一个节点不会在发送数据时接 收数据,反过来毅然。因此,在任何一个时刻,一个节点要么处于发 送状态,要么处于接受状态。所以我们可以使用一个 io 来控制 DE RE 就可以实现控制数据的接受和发送。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 IO 高电平 数据发送 IO 低电平 处于接受监听状态。 RS-485 的半双工和全双工 连接图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 11.2 代码分析 12. s-107 开发板(stm32f107vct6)之 ---can 的学习 12.1 先看一下硬件需要的准备 原理图 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的引脚 如图: 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 硬件小知识: STM32F10X 系列开发板学习笔记 S-107 开发套件 控制器局域网络 CAN 自 20 世纪 70 年代末期到 80 年代,汽车行业的飞速发展,汽车的 功能越来越智能,这些复杂 数量极多的控制单元怎么联系到一起, 以前的 k 线已经不能满足了。急需一种具有很强的抗干扰、错误检测 和处理能力,可以重发失败的数据包通信结构 正因为这样在 80 年代末,博士 bosch 在欧洲开发出了 CAN,最初 用在汽车上,由于其强大性,can 的应用范围已远远超出了最初的汽 车应用。现在,我们在工业自动化、火车、轮船导航和控制系统、医 疗系统、影印机、农业机器、自动化、电梯等应用中都能看见 CAN。 CAN 已经成为了国际标准。 CAN 在网络中支持多主机,在整个分布式系统中每个主机负责各 自局部的监听和控制。CAN 信息包都包含地址信息和优先级作为信 息包得头部分。CAN 网络采用线路与逻辑,最大总线长度 1000 米。 当以最大的速率在双绞线上传输数据时,总线长度可达 40 米,总线 每个末端都要求有终端电阻,以避免传输信号反射。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 12.2 程序的学习 stm32 的 can 内置 2.0B 内核,速度最高 1m,有 3 个发送邮箱,高达 14 个滤波器使我们省去很多的软件 报文判断。有些 can 的过滤器只 能屏蔽某些帧或者接受某些帧,而 stm32 can 可以为我们定义接受 屏 蔽 某一个帧报文。拥有两个接受缓存 fifo。存数 6 个报文。 运行模式:初始化模式 正常模式 CAN_Mode_Normal 休眠模式 测试模式 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 静默模式 CAN_Mode_Silent 环回模式 CAN_Mode_LoopBack 回送静默模式 CAN_Mode_Silent_LoopBack 我们最为关心的是正常模式 因为他是所有通讯的基础。 ok 下面就 让我们进入 can 的双节点通信。 这里我们的程序实现的功能是 双 can 做为两个节点的互相通信, 如果在我们的多点应用中,可以很容易拿工程的程序修改,实现多点 的通信,主要是对过滤器的修改。 下边我们来看一下程序,这里的关键主要是 can 的参数配置和发送 接收数据的解析。 SystemInit(); UART1_Configuration(); #ifdef lcddebug //lcd 调试定义 TFT_Configuration(); ili9320_Initializtion(); ili9320_Clear(0x0000); #endif TFT_ShowString(260,100," CAN TEST "); TFT_ShowString(300,10," s-107 demo-can "); TFT_ShowString(280,10," normal operation "); CANBUS_Config(); CAN_Test(); 主要的程序是 蓝色的标记部分 其余的是调试配置部分。看一下源 码: <======================================== =============*/ void CANBUS_Config(void) { /* GPIO clock enable */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOB, ENABLE); /* CAN1 Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1|RCC_APB1Perip h_CAN2, ENABLE); //配置 IO,中断 CAN_CANGPIO_NVIC_Config(); CAN_Config(); /* IT Configuration for CAN1 */ CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); /* IT Configuration for CAN2 */ CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE); } 上面两句开启了了 can 中断接受 有数据帧接受到后将会进入中 断 CAN_Config();源码 <======================================== =============*/ void CAN_Config(void) { /* CAN register init */ CAN_DeInit(CAN1); CAN_DeInit(CAN2); CAN_StructInit(&CAN_InitStructure); /* CAN1 cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;//配置时间戳 CAN_InitStructure.CAN_Prescaler = 8;//;//2//分频比 CAN_Init(CAN1, &CAN_InitStructure); CAN_Init(CAN2, &CAN_InitStructure); // 波特率计算公式 //CPU 是 72M 速度,PCLK 是 36M // 波 特 率 为 36M/ ( CAN_Prescaler* (CAN_SJW+CAN_BS1+CAN_BS2)) // 36M/4*(1+3+5)=36M/36=1M 波特率 // 36M/8*(1+3+5)=36M/72=500k 波特率 // 36M/16*(1+3+5)=36M/72=250k 波特率 // 36M/32*(1+3+5)=36M/72=125k 波特率 // 36M/40*(1+3+5)=36M/72=100k 波特率 /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); /* CAN filter init */ CAN_FilterInitStructure.CAN_FilterNumber=14; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); // 前 面 是 过 滤 器 设 置 具体的参数定义 请参看 can 相关寄存器的描述 /* transmit */ TxMessage1.StdId = 0x00000AAA;标准帧 id TxMessage1.ExtId = 0x00; TxMessage1.RTR = CAN_RTR_DATA; TxMessage1.IDE = CAN_ID_STD; TxMessage1.DLC = 8; TxMessage2.StdId = 0x00000AAA; TxMessage2.ExtId = 0x00; TxMessage2.RTR = CAN_RTR_DATA; TxMessage2.IDE = CAN_ID_STD; TxMessage2.DLC = 8;//数据帧的设置,具体参数定义请参看 can 相关寄存器。 } 看一下数据发送语句: TxMessage1.Data[0] = 's'; TxMessage1.Data[1] = 't'; TxMessage1.Data[2] = 'm'; TxMessage1.Data[3] = 's'; TxMessage1.Data[4] = 'k'; TxMessage1.Data[5] = 'y'; TxMessage1.Data[6] = '-'; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 TxMessage1.Data[7] = '+'; 数据赋值 Init_RxMes(&RxMessage1); Init_RxMes(&RxMessage2); CAN_Transmit(CAN1, &TxMessage1); 数据发送语句 //Hex2Asc(HEX_ASCdata,TxMessage1.Data,8); TFT_ShowString(230,10,"SEND:"); TFT_ShowString(210,10,TxMessage1.Data); 调试代码 显示发送的值 当有数据接受后 进入中断 void CAN1_RX0_IRQHandler(void) { CAN_INTflag=1; 接受数据标志位置 1 告诉主程序有数据接受 进行下一 步处理 CAN_INT=1; CAN_Receive(CAN1, CAN_FIFO0, &RxMessage1); 接受数据到 邮箱缓存 cancount = cancount+1; } 看一下接受数据处理 while(!CAN_INTflag) { }等待接受标志位为一 CAN_INTflag=0; 清除标志位 等待下次几首 TFT_ShowString(180,10,"RECIVE:"); TFT_ShowString(160,6,RxMessage2.Data); 显示接受到得数据,如果为了更加确定数据的正确性 我们可以先判 断数据帧 id 是不是该节点的: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 if (RxMessage1.StdId == 0x00000AAA) { printf("\r\nRecevie CAN2ok \r\n"); printf("\nCAN2 get data NO.%d \n",RxMessage2.Data[0]); printf("\n%d \n ",RxMessage2.Data[1]); printf("\n%d \n ",RxMessage2.Data[2]); printf("\n%d \n ",RxMessage2.Data[3]); printf("\n%d \n ",RxMessage2.Data[4]); printf("\n%d \n ",RxMessage2.Data[5]); printf("\n%d \n ",RxMessage2.Data[6]); printf("\n%d \n ",RxMessage2.Data[7]); } */ 温馨小提示: can 的 难点 就在于 波特率的设定 如果是近距离通信 几十米 那就可以忽略了 如果几公里 波特率 位序 时序 都需要好好计算 不然通信 是不成功的 稍后我将 优化代码的同时 为大家讲一下 波特率 各个参数的计算 Can 控制器器只需要进行少量的设置就可以进行通信,就可以像 RS232/48 那样使用。 其中较难设置的部分就是通信波特率的计算。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)就是: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 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; D. 同步跳转宽度 SJW 那么 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) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 关于 CAN 的波特率的计算,在数据手册上已经有很详细的说明。在 此,简要的把计算方法给出来: Tcsc :bit 位每一编码的时间长度,每 bit 可以配置为 8~25 位编码,常 设为 16 。 Tcsc=1/波特率/编码长度 ;按上计算 Tcsc=1/1MHz/16=62.5ns (取 63) 。 BRP = (Tcsc x MCK) - 1=6.3-1 (可以取 5) 各种延迟(Tprs :) Delay of the bus driver: 50 ns Delay of the receiver: 30ns Delay of the bus line (20m): 110ns Tprs = 2 * (50+30+110) ns = 380 ns PROPAG= 380 ns/ Tcsc-1 =6.08Tcsc-1 (可取 6) Tphs1 + Tphs2 = bit time - Tcsc - Tprs = (16 - 1 - 7)Tcsc= 8 常取 Tphs1 = Tphs2 ,所以 Tphs1 = Tphs2 =4 ; Tsjw = Min(4 Tcsc,Tphs1) = 4 Tcsc (From 1 to Tphs1 ) SJW = Tsjw/Tcsc - 1 = 3 ; 现 在 CAN_BR 中 的 各 个 参 数 就 都 有 了 ( BRP=5 ; SJW=3 ; PROPAG=6;PHASE1=PHASE=4),填进去就应该 OK 了 。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 假设我们先不考虑 BTR0 中的 SJW 位和 BTR1 中的 SAM 位。那么, BTR0 和 BTR1 就是 2 个分频系数寄存器;它们的乘积是一个扩展的 分频系数。即: BTR0×BTR1=F_BASE/Fbps (1) 其中: 内部频率基准源 F_BASE = Fclk/2,即外部晶振频率 Fclk 的 2 分 频。注意任何应用中,当利用外部晶振作为基准源的时候,都是先经 过 2 分频整形的。 (1)式中,当晶振为 16M 时,F_BASE=8000K 当晶振为 12M 时,F_BASE=6000K Fbps 就是我们所希望得到的 CAN 总线频率。单位为 K。 设(1)式中 BTR0=m,BTR1=n,外部晶振 16M,则有: n =8000/ Fbps (2) 这样,当 Fbps 取我们希望的值时,就会得到一个 m * n 的组合值。 当 n 选定,m 值也唯一。 n 值 CAN 规范中规定 8~25。(也就是 BTR1 的值)基本原则为: Fbps 值越高时,选取 n(通过设置 BTR1)值越大。其原因不难理解。 我假定一般应用中选取 n=10,也就是: 同步段+相位缓冲段 1+相位缓冲段 2 =1+5+4 则(2)式简化为 m=800/Fbps m 的最大设置值为 64,SJA1000 最大分频系数 m*n=64x25=1600。 因此标准算法中通常以 16M 晶振为例。其实有了公式(1),任何晶 振值(6M~24M)都很容易计算。 SAM 的确定:低频时,选 SAM=1,即采样 3 次。高频 100K 以上 时,取 SAM=0,即采样 1 次。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 SJA 重同步跳宽选取: 与数字锁相环技术有关。n 值选得大时,SJA 可以选得大,即一次可以修正多个脉冲份额 Tscl。n 值小或频率低时, 选 SJA=1。即 BTR0.7 和 BTR0.6 都设为 0。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 13. sd 卡 fat 文件系统的学习 《STM32F10x-fats》 13.1 先看一下硬件需要的准备 原理图 如图: 跳线:短接图示的引脚 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 硬件小知识: 串行外围设备接口(SPI) SPI 接口是由 MOTOROLA 公司开发,用来在微控制器和外围设备 芯片之间提供一个低成本,易使用的接口。这种接口用来连接存储器、 模数转换、数模转换、实时时钟日历、lcd 驱动器、音频信号,甚至 其他处理器。支持 spi 接口的元件很多,并且还在一直在增加。 与标准的串行端口不同,spi 是一个同步协议接口,所有的传输都 参照一个共同的时钟,这个同步时钟信号由主机(处理器)产生,接 受数据的外设(从设备)使用时钟来对串行比特流的接受进行同步化, 可能会有许多芯片连到主机的同个 spi 接口上,这时主机通过触发从 设备的片选输入引脚来选择接受数据的从设备,没有被选中的外设将 不会参加 spi 传输。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 SPI 使用 4 个信号:主机输出/从机输入(MOSI)、主机输入/从机 输出(MOSI)、串行时钟(SCLK OR SCK)和外设芯片选择(CS)。有 些处理器有 SPI 接口专用的芯片选择,称为从机选择(SS) MOSI 信号由主机产生,从机接受,在有些芯片上,MOSI 只被简 单的标为串行输入(SI),或者串行数据输入(SDI),MOSI 信号由从 机产生,不过还是在主机的控制下产生的。在一些芯片上,MOSI 有 时被称为串行输出(SO),或者串行数据输出(SDO).外设片选信号通 常只是由主机的备用 io 引脚产生 下图是微处理器通过 spi 和外设进 行连接的示意图: 主机和从机都包含一个串行移位寄存器,主机通过向他的 spi 串行寄 存器写入一个字节来发起一次传输,寄存器是通过 MOSI 信号线将字 节传给从机,从机也将自己移位寄存器中得内容通过 MISO 信号线返 回给主机,这样 两个移位寄存器中得内容就被交换了。从机的写操 作和读操作是同步完成的,因此 SPI 称为很有效的协议 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 如果只是进行写操作,主机只需忽略收到的字节,反过来,如果主 机要读取从机的一个字节,就必须发送一个空字节来引发从机的传 输。 根据时钟极性和时钟相位的不同 spi 有四个工作模式,时钟极性 有高低两极、时钟相位有 0 和 1.不同的组合会产生不同的开始有效电 平和触发沿 是上升沿触发 还是下降沿触发,这个在我们的 spi 设备 操纵中相当重要,我们要根据芯片到底支持哪个时序来配置或者是模 拟 spi。 四种 不同的时序图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 具体的原理 请参看 stm32 数据手册 13.2 程序的学习 用到 sd 卡 基本上就就会用到相关的文件系统 对 sd 卡存储文件 进行方便的操作,这里我们使用的是 sd 卡得 spi 接口 因为 stm32f107 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 没有 sdio 的接口,有用到 sdio 接口的朋友可以和作者联系或者直接 在 stm 家园 www.stmsky.com 发帖。 这里我们主要学习 spi 的使用和相关文件系统的移植以及之后的操 作。 先看一下 spi 的操作: Spi 的原理其实就是一个循环移位寄存器,在使用中,他通过两边寄 存器的循环移位来实现数据从一方到对方的传输,也就是说读和写是 同一个过程。不同的是我们读得时候只关心过来的数据,所以一般是 发一个空字节来读取对方的数据。写的过程则会直接忽略移过来的数 据。 Spi 的配置: void SPI_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; /* GPIOA and GPIOC Periph clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOD, ENABLE); /* SPI3 Periph clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2P eriph_GPIOA, ENABLE); /* Configure SD CS pin : PD2*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); 配置 cs 脚 sd 卡片选 /* Configure SPI1 pins: SCK, MISO and MOSI */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_Remap_SPI3 ,ENABLE); /* SPI1 Config */ //////SPI 模块配置////// //一开始 SD 初始化阶段,SPI 时钟频率必须<400Ks SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;全 双工 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//芯片作为主设备 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 8 位数据位 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;设置时序 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_256;//SPI_BaudRat ePrescaler_4;// ; 这里配置 spi 的时钟 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 位顺序 SPI_InitStructure.SPI_CRCPolynomial = 7;crc 校验 SPI_Init(SPI3, &SPI_InitStructure); /* SPI1 enable */ SPI_Cmd(SPI3, ENABLE);使能 spi3 } Spi 的设置 模式 基本就是这样,以后再用到 spi 的时候按照这个配置 下来就 ok 了。 文件系统的操作: 简单看一下调试流程: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 void FATFS_TEST(void) { INT8U temp,temp1,num ; while(1) { //注意哦,要输出\符号,必须写成\\,\属于转义字符 printp("\r\n"); printp("\r\n"); printp("\r\n \\\\\\|/// "); printp("\r\n \\\\ - - // "); printp("\r\n ( @@ ) "); printp("\r\n +---------------------oOOo-(_)-oOOo----------------------+"); printp("\r\n | |"); printp("\r\n | Welcome to use FATFS test program |"); printp("\r\n stm --Designer:stmsky-- |"); printp("\r\n sky --Date:2011.10.03-- |"); printp("\r\n 家 FATFS Version: R0.06 |"); printp("\r\n 园 WWW.STMSKY.COM |"); printp("\r\n 淘宝: http://shop60442272.taobao.com/ |"); printp("\r\n | USART Config--COM:115200bps,8Bit,NP |"); printp("\r\n | Oooo 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 |"); printp("\r\n +-----------------------oooO--( )----------------------+"); printp("\r\n ( ) )/ "); printp("\r\n \\ ( (_/ "); printp("\r\n \\_) "); printp("\r\n"); printp("\r\n"); temp=0 ; while(1) //display menu { if(temp<10) { putchar1(' '); putchar1(temp+'0'); } else { putchar1(temp/10+'0'); putchar1(temp%10+'0'); } putchar1(':'); printp(FATFS_Function[temp][1]); putchar1(' '); putchar1(' '); temp++; if((int)(FATFS_Function[temp][0])==0) { 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 printp("\r\n"); break ; } if((temp%4)==0) printp("\r\n"); } printp("\r\n----------Please select the function to test? >> "); 菜单 temp=0 ; temp1=0 ; num=0 ; //如果不是回车键 while( temp1!=0x0D ) { temp1=getchar1(); if(temp1==0x1B) //如果是 ESC 键。退出 FATFS 测试 { printp("\r\nExit FATFS test program\r\n"); return ; } if( temp1>='0'&&temp1<='9' ) { putchar1(temp1); num++; switch(num) { case 1 :temp=temp1-'0' ;break ; case 2 : { temp=temp*10+temp1-'0' ; num=0 ; putchar1(' '); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 break ; } default :num=0 ;break ; } } } if( temp<(sizeof(FATFS_Function)/8-1) ) { //printp("\r\nThe result:\r\n"); ((void(*)(void))(FATFS_Function[temp][0]))(); } else printp("\r\ninput error!\r\n"); printp("\r\npress any key to return display menu..."); getchar1(); } } 这个函数主要是调试用,我们可以结合串口调试信息,很容易的看懂 程序具体的调用过程,进而分析各个文件操作细节: 主要的几个函数 void *FATFS_Function[][2]= { (void*)Test_f_getfree, "磁盘容量", (void*)Test_f_readdir, "读目录 ", (void*)Test_f_mkdir, "创建路径", (void*)Test_f_read, "读文件 ", (void*)Test_f_write, "文件拷贝", (void*)Test_f_rename, "重命名 ", (void*)Test_f_unlink, "删除文件", (void*)Test_f_mkfs, "格式化 ", 0x00,0x00 }; 具体的 请读者自己去看 有问题请到 stm 家园 www.stmsky.com 发 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 帖 调试信息: STM32F10X 系列开发板学习笔记 S-107 开发套件 输入 字符 0 显示 sd 卡容量 输入字符 1 读出目录 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 其他功能请读者 自己测试一下。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 14.RTC 实时时钟的学习—万年历 时间戳 14.1 先看一下硬件需要的准备 原理图 如图: 跳线:短接图示的引脚 如图: 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 14.2 程序的学习 Stm32 内置了 rtc 时钟,不过在相当长得时间内饱受争议,主要是 对晶振的要求比较高,不过现在这些问题已经有了很多的解决方式, 笔者也接触了一个专门适合 stm32 的 晶振供应商,对不起振的概率 事件有了很好的避免。Rtc 部分主要学习一下其原理: STM32 内部 RTC 功能非常实用,它的供电和时钟是独立于内核的, 可以说是 STM32 内部独立的外设模块,有加上 RTC 内部寄存器不受 系统复位掉电的影响,我们可以才用外部电池供电和 32768 表振晶体 来实现真正 RTC(实时时钟)功能。的这里引用手册里一段概述“RTC 由两个主要部分组成。第一部分(APB1 接口)用来和 APB1 总线相 连。此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读 写操作。APB1 接口以 APB1 总线时钟为时钟,用来与 APB1 总线接 口。 另一部分(RTC 核)由一系列可编程计数器组成,分成两个主要 模块。第一个模块是 RTC 的预分频模块,它可编程产生最长为 1 秒 的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的 可编程分频器(RTC 预分频器)。在每个 TR_CLK 周期中,如果在 RTC_CR 寄存器中设置了相应允许位,则 RTC 产生一个中断(秒中 断)。第 2 个模块是一个 32 位的可编程的计数器,它可被初始化为 当 前 的 系 统 时 间 。 系 统 时 间 以 TR_CLK 速 度 增 长 并 与 存 储 在 RTC_ALR 寄存器中的可编程的时间相比较,如果 RTC_CR 控制寄存 器中设置了相应允许位,则比较匹配时将产生一个闹钟中断。” 对于第一次实用 RTC 的时候我们要对它进行配置一番,现在大致 说一下(代码是通过调用 RTC_Config 函数来实现的): void RTC_Config(void) { /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); //我们在 BKP 的后备寄存器 1 中,存了一个特殊字符 0xA5A5 //第一次上电或后备电源掉电后,该寄存器数据丢失, //表明 RTC 数据丢失,需要重新配置 if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) { //重新配置 RTC RTC_Configuration(); //配置完成后,向后备寄存器中写特殊字符 0xA5A5 BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); } else { //若后备寄存器没有掉电,则无需重新配置 RTC //这里我们可以利用 RCC_GetFlagStatus()函数查看本次复 位类型 if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) { //这是上电复位 } else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 { //这是外部 RST 管脚复位 } //清除 RCC 中复位标志 RCC_ClearFlag(); //虽然 RTC 模块不需要重新配置,且掉电后依靠后备电池 依然运行 //但是每次上电后,还是要使能 RTCCLK??????? //RCC_RTCCLKCmd(ENABLE); //等待 RTC 时钟与 APB1 时钟同步 //RTC_WaitForSynchro(); //使能秒中断 RTC_ITConfig(RTC_IT_SEC, ENABLE); //等待操作完成 RTC_WaitForLastTask(); } #ifdef RTCClockOutput_Enable /* Enable PWR and BKP clocks */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /* Allow access to BKP Domain */ PWR_BackupAccessCmd(ENABLE); /* Disable the Tamper Pin */ BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled */ /* Enable RTC Clock Output on Tamper Pin */ BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock); #endif return; } 1.打开电源管理和备份寄存器时钟,提到备份寄存器这里要说一 下,引用手册--“备份寄存器是 10 个 16 位的寄存器,可用来存储 20 个字节的用户应用程序数据。他们处在备份域里,当 VDD 电源被切 断,他们仍然由 VBAT 维持供电。当系统在待机模式下被唤醒,或 系统复位或电源复位时,他们也不会被复位。”我们正式通过在备份 寄存器写固定的数据来判断芯片是否第一次实用 RTC,从而在系统运 行 RTC 时提示配置时钟的。 2.使能 RTC 和备份寄存器的访问(复位默认关闭)。引用手册--“复 位后,对备份寄存器和 RTC 的访问被禁止,并且备份域被保护以防 止可能存在的意外的写操作。电源控制寄存器(PWR_CR)的 DBP 位必 须被置 1,以允许访问备份寄存器和 RTC.”因为程序要对 RTC 和备 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 份寄存器操作,所以必须使能。 3.选择外部低速晶体为 RTC 时钟,并使能时钟; 4.使能秒中断,程序里在秒中断里置位标志位来通知主程序显示 时间数据,同时在 32 位计数器到 23:59:59 时清零; 5.设置 RTC 预分频器值产生 1 秒信号计算公式 fTR_CLK = fRTCCLK/(PRL+1),我们设置 32767 来产生秒信号; 在这里要注意一下,所有在对 RTC 寄存器操作之前都要判断读写 操作是否完成,也就是说当前是否有读写操作。系统内核是通过 RTC 的 APB1 接口来访问 RTC 内部寄存器的,所以在上电复位,休眠唤 醒的时候,我们要先对 RTC 时钟与 RTC APB1 时钟进行重新同步, 在同步完成后再对器进行操作,因为 RTC 的 AP1 接口使用的系统 APB1 的时钟。上述配置在初次使用 RTC 时进行配置,在以后使用过 程中,只要 RTC 外部电池持续供电,无论系统掉电还复位我们都无 需重复配置,使用使能秒中断就可以了这一点很是方便嘿嘿... 我们这里 列出了两个历程 一个 RTC 万年历 一个 时间戳 看一下调试截图: Rtc 万年历的截图 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 时间戳的截图: 提示:有任何疑问 请到 stm 家园 www.stmsky.com 发帖讨论。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 15 红外遥控器学习 以及电气控制(支持所有频率遥控器) 15.1 先看一下硬件需要的准备 需要的硬件 红外模组 将模组查到板子的座子上: 如图指示的红外模组 插座: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 板子跳线: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 15.2 程序的学习--- STM32F10x-红外学习和控制 这里程序很简单 就是前面做过的串口的中断收发 这里只是做一个 板子串口和红外模组串口的通道,我们通过上位机发射命令来学习和 发射红外 SystemInit(); TIM2_Configuration(); /* NVIC configuration */ /* Configure the GPIO ports */ GPIO_Configuration(); /*串口配置 ------------------------------------------------------*/ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /* 9600 8 n 1 */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength= USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx| USART_Mode_Tx; /* Configure USARTy */ USART_Init(USART2, &USART_InitStructure); /* Configure USARTz */ USART_Init(USART1, &USART_InitStructure); /* Enable USARTy Receive and Transmit interrupts */ USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能中 断 这里先不使能 在后面中断发送之前发送 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART2, ENABLE); USART_Cmd(USART1, ENABLE); NVIC_Configuration(); 中断函数: void TIM2_IRQHandler(void) {/******处理完数据后一定要把 Uart0_rev_count 清零, 但是为了安全一开始就请零可能更好,这样的话 我 们 规 定 用 Uart0_rev_countmap 来 代 替 Uart0_rev_count******************** 注 意 : 这 里 的 命 名 是 不 规 范 的 , 以 后 要 改 为 timX 对 应 usartx*******/ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 u32 Uart0_rev_countmap; /***清楚 tim 中断和关闭 tim 中断,在 uart 接受中断里 有相应的 使能****/ TIM_Cmd(TIM2, DISABLE); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); /****copy Uart0_rev_count 的值****/ Uart0_rev_countmap=RxCounter1; RxCounter1=0; /***** 返回接受的语句 这里以后是数据处理函数***********************/ if(USART1FLAG=='A') Uart_InterruptsendY(USART2,RxBuffer1,Uart0_rev_countmap); else Uart_InterruptsendY(USART1,RxBuffer1,Uart0_rev_countmap); 串口一接受的给串口 2 串口 2 接受的给串口 1 形成通道 } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { USART1FLAG='V'; USART2FLAG='A'; TIM_Cmd(TIM2, ENABLE); TIM2->CNT &= 0x0000;//定时器延时设置 每次接受清零 当 接受间隔超过定时器定的值时 进入 tim 中断 认为一帧接受完成 RxBuffer1[RxCounter1++] = USART_ReceiveData(USART2); USART_ClearITPendingBit(USART2, USART_IT_RXNE); } 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) { Uart_send_counter--; if(Uart_send_counter>0) { USART_SendData(USART2, *Uart_send_pointer++); } else USART_ITConfig(USART2, USART_IT_TXE, DISABLE); } } void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART1FLAG='A'; USART2FLAG='V'; TIM_Cmd(TIM2, ENABLE); TIM2->CNT &= 0x0000;//定时器延时设置 每次接受清零 当 接受间隔超过定时器定的值时 进入 tim 中断 认为一帧接受完成 RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); USART_ClearITPendingBit(USART1, USART_IT_RXNE); } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { Uart_send_counter--; if(Uart_send_counter>0) { USART_SendData(USART1, *Uart_send_pointer++); } else 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } 这个前面已经讲过了 这里主要是 给了一个大家可以通过串口调试 助手的串口转发程序,通过串口 1 转发给 红外模块使用的串口 2 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 16.无线 2.4g 的通信控制 16.1 先看一下硬件需要的准备 需要的硬件: 跳线: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 16.2 程序的学习 这里程序很简单 就是前面做过的串口的中断收发 这里只是做一个 板子串口和无线模块串口的通道,我们通过上位机发射数据 将会通 过 usb 无线接受到电脑 SystemInit(); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 TIM2_Configuration(); /* NVIC configuration */ /* Configure the GPIO ports */ GPIO_Configuration(); /* USARTy and USARTz configuration ------------------------------------------------------*/ /* 9600 8 n 1 */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength= USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx| USART_Mode_Tx; /* Configure USARTy */ USART_Init(USART2, &USART_InitStructure); /* Configure USARTz */ USART_Init(USART1, &USART_InitStructure); /* Enable USARTy Receive and Transmit interrupts */ USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能中 断 这里先不使能 在后面中断发送之前发送 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART2, ENABLE); USART_Cmd(USART1, ENABLE); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 NVIC_Configuration(); 中断函数: void TIM2_IRQHandler(void) {/******处理完数据后一定要把 Uart0_rev_count 清零, 但是为了安全一开始就请零可能更好,这样的话 我 们 规 定 用 Uart0_rev_countmap 来 代 替 Uart0_rev_count******************** 注 意 : 这 里 的 命 名 是 不 规 范 的 , 以 后 要 改 为 timX 对 应 usartx*******/ u32 Uart0_rev_countmap; /***清楚 tim 中断和关闭 tim 中断,在 uart 接受中断里 有相应的 使能****/ TIM_Cmd(TIM2, DISABLE); TIM_ClearITPendingBit(TIM2, TIM_IT_Update); /****copy Uart0_rev_count 的值****/ Uart0_rev_countmap=RxCounter1; RxCounter1=0; /***** 返回接受的语句 这里以后是数据处理函数***********************/ if(USART1FLAG=='A') Uart_InterruptsendY(USART2,RxBuffer1,Uart0_rev_countmap); else Uart_InterruptsendY(USART1,RxBuffer1,Uart0_rev_countmap); 串口一接受的给串口 2 串口 2 接受的给串口 1 形成通道 } void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 { USART1FLAG='V'; USART2FLAG='A'; TIM_Cmd(TIM2, ENABLE); TIM2->CNT &= 0x0000;//定时器延时设置 每次接受清零 当 接受间隔超过定时器定的值时 进入 tim 中断 认为一帧接受完成 RxBuffer1[RxCounter1++] = USART_ReceiveData(USART2); USART_ClearITPendingBit(USART2, USART_IT_RXNE); } if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) { Uart_send_counter--; if(Uart_send_counter>0) { USART_SendData(USART2, *Uart_send_pointer++); } else USART_ITConfig(USART2, USART_IT_TXE, DISABLE); } } void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART1FLAG='A'; USART2FLAG='V'; TIM_Cmd(TIM2, ENABLE); TIM2->CNT &= 0x0000;//定时器延时设置 每次接受清零 当 接受间隔超过定时器定的值时 进入 tim 中断 认为一帧接受完成 RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1); USART_ClearITPendingBit(USART1, USART_IT_RXNE); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { Uart_send_counter--; if(Uart_send_counter>0) { USART_SendData(USART1, *Uart_send_pointer++); } else USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } 看一下调试结果: USB 无线 开发板无线 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 17.温度传感器 DS18B20 读取温度 17.1 先看一下硬件需要的准备 需要的硬件: 原理图 数据引脚请参看 原理图排阵引脚定义 18.2 硬件小知识 引脚定义 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 硬件小知识: DS18B20 测温系统具有测温系统简单、测温精度高、连接方便、占用口线少等 优点 DS18B20 为单总线 12 位(二进制)温度读数。内部有 64 位唯一的 ID 编码。 工作电压从 3.0~5.5V。测量温度范围从-55℃~125℃。最高±0.0625℃分辩率。 它的电路 有两种实现方式: 1 DS18B20 寄生电源供电方式电路 在寄生电源供电方式下,DS18B20 从单线信号线上汲取能量:在信号线 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 DQ 处于高电平期间把能量储存在内部电容里,在信号线处于低电平期间消 耗电容上的电能工作,直到高电平到来再给寄生电源(电容)充电。 独特的寄生电源方式有三个好处: 1)进行远距离测温时,无需本地电源 2)可以在没有常规电源的条件下读取 ROM 3)电路更加简洁,仅用一根 I/O 口实现测温 这种方式对供电电压要求比较高 必须在 5v 不然会造成很大的误差,只 适合简单的单点采集。可靠性难以保证,不能用电池供电。一般不建议采用。 2 DS18B20 的外部电源供电方式 在外部电源供电方式下,DS18B20 工作电源由 VDD 引脚接入,此时 I/O 线不需要强上拉,不存在电源电流不足的问题,可以保证转换精度,同时在 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 总线上理论可以挂接任意多个 DS18B20 传感器,组成多点测温系统。注意: 在外部供电的方式下,DS18B20 的 GND 引脚不能悬空,否则不能转换温度, 读取的温度总是 85℃。 外部电源供电方式是 DS18B20 最佳的工作方式,工作稳定可靠,抗干 扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。 3 DS1820 使用中注意事项 DS1820 虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点, 但在实际应用中也应注意以下几方面的问题: 1) 较小的硬件开销需要相对复杂的软件进行补偿,由于 DS1820 与微 处理器间采用串行数据传送,因此,在对 DS1820 进行读写编程时, 必须严格的保证读写时序,否则将无法读取测温结果。在使用 PL/M、 C 等高级语言进行系统程序设计时,对 DS1820 操作部分最好采用 汇编语言实现。 2) 在 DS1820 的有关资料中均未提及单总线上所挂 DS1820 数量问题, 容易使人误认为可以挂任意多个 DS1820,在实际应用中并非如此。 当单总线上所挂 DS1820 超过 8 个时,就需要解决微处理器的总线 驱动问题,这一点在进行多点测温系统设计时要加以注意。 3) 连接 DS1820 的总线电缆是有长度限制的。试验中,当采用普通信 号电缆传输长度超过 50m 时,读取的测温数据将发生错误。当将总 线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达 150m,当采用 每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加 长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。 因此,在用 DS1820 进行长距离测温系统设计时要充分考虑总线分 布电容和阻抗匹配问题。 4) 在 DS1820 测温程序设计中,向 DS1820 发出温度转换命令后,程 序总要等待 DS1820 的返回信号,一旦某个 DS1820 接触不好或断 线,当程序读该 DS1820 时,将没有返回信号,程序进入死循环。 这一点在进行 DS1820 硬件连接和软件设计时也要给予一定的重 视。 5) 测温电缆线建议采用屏蔽 4 芯双绞线,其中一对线接地线与信号线, 另一组接 VCC 和地线,屏蔽层在源端单点接地 该器件的寄存器操作 以及功能的实现 我们下面程序讲解中将会涉及到 18.3 程序的学习 ------《STM32F10x-温度传感器》 DS18B20 的核心功能是直接数字温度传感器。温度传感器可以配置 成 9、10、11 和 12 位方式。相应的精度分别为:0.5℃、0.25℃、0.125℃和 0.0625℃。默认的分辨率为 12 位。DS18B20 在空闲低功耗状态下加电(寄生电 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 源工作方式)。主机必须发出 Convert T [44h]命令使其对测量温度进行 A-D 转 换。接下来进行采集转换,结果存于两字节高速温度寄存器并返回到空闲低功耗 状态。如果 DS18B20 在外部 VDD 供电方式下,单片机可以在发出 Convert T 命 令并总线为 1 时(总线为 0 表示正在转换)发出“read time slots”命令。 DS18B20 芯片内部共有 8 字节的寄存器,其中地址编号 0,1 为温度寄存器, 里面存储着 DS18B20 温度转换后的 AD 值,其格式如表 1 所示。地址编号 2,3 为 温度报警寄存器,里面为报警设定值,地址编号 4 为配置寄存器(这三个寄存器 在读取之前请使用“重新调入 EEPROM”命令将存储在 EEPROM 里的内容调出,同 样,在向温度报警寄存器里写入内容后,也要使用“复制到存储器”命令 48H 将温度报警寄存器内的内容存入 EEPROM 当中,以免掉电丢失数据)。 DS18B20 内部寄存器映射如下图所示 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 下面我们看一下 我们程序的操作,这里对于 stm32 的学习 基本是 io 口的操作, 其实就单片机而言 只不过是我们使用的一个工具,只要平台合适,主要功能的 实现 都是在他上层我们的应用程序。 SystemInit(); //系统时钟配置函数 通过不同的定义 来选择不同的主频 这里设置是 72m RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ GPIOD, ENABLE);//打开功能时钟 USART_CONFIG(); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 IO 口 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化 IO 口 if (SysTick_Config(720000))//配置 点滴时钟的频率 用来精确延时 { /* Capture error */ while (1); } while (1) { tempend=get1820data(); if(tempS==0) temper[0]='-'; else temper[0]='+'; temper[1]=tempend/100+0x30; temper[2]=(tempend%100)/10+0x30; temper[3]='.'; temper[4]=tempend%10+0x30; printf("\n\r 当前温度:"); printf(temper); printf("\n\r"); /* 点亮 LED */ GPIO_SetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置高 IO 口 /* 延时 1s */ delay(100); /* 熄灭 LED */ GPIO_ResetBits(GPIOA,GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//置低 io 口 /* Insert 100 ms delay 延时 1s */ delay(100); } } 程序实现每闪一次灯读取一次温度值,并且通过串口打印 或者是 lcd 显示 这里我们主要看一下 驱动程序部分 //从 ds18b20 得到温度值 //精度:0.1C //返回值:温度值 (-550~1250) short get1820data(void) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 { u8 TL,TH; short tem; start1820 (); res1820 (); check1820 (); write1820byte (0xcc);// skip rom write1820byte (0xbe);// convert TL=read1820byte(); // LSB TH=read1820byte(); // MSB // ds1820 start convert if(TH>7) { TH=~TH; TL=~TL; tempS=0;//温度为负 }else tempS=1;//温度为正 tem=TH; //获得高八位 tem<<=8; tem+=TL;//获得底八位 tem=(float)tem*0.625;//转换 return tem; //返回温度值 } 主要的函数: start1820 (); // ds1820 start convert res1820 (); check1820 (); write1820byte (0xcc);// skip rom write1820byte (0xbe);// convert TL=read1820byte(); // LSB TH=read1820byte(); // MSB 这个就是读取温度的时序,里面的是相关寄存器操作,这里就不浪费空 间贴出了,大家自己在程序里看一下,我们看一下最重要的基础操作读写寄 存器时序: //从 DS18B20 读取一个字节 //返回值:读到的数据 u8 read1820byte (void) // read one byte { u8 i,j,dat; dat=0; for (i=1;i<=8;i++) { 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 j=read1820bit(); dat=(j<<7)|(dat>>1); } return dat; } //写一个字节到 DS18B20 //dat:要写入的字节 void write1820byte (u8 dat) { u8 j; u8 testb; DS18B20_IO_OUT();//SET PA0 OUTPUT; for (j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if (testb) { DS18B20_DQ_SET(0);// Write 1 tdelay(2); DS18B20_DQ_SET(1); tdelay(45); } else { DS18B20_DQ_SET(0);// Write 0 tdelay(45); DS18B20_DQ_SET(1); tdelay(2); } } } 重点就是时序的实现 也就是里面延时函数的值 一定要精确。Ok 这样 我们就实现了温度的读取,只用一个 io 就能实现简单的时序了 看一下工程调试截图 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 USB 接口的学习 硬件小知识: USB 通用串行总线规范是以 Intel 为主,并由康柏、微软、IBM、DEC 及日本 NEO 等共同制定的串行接口规格。USB2.0 规范向下兼容 USB1.1,数 据的传输率达 120~240Mbps,为大数据量高速实时传输提供了强有力的通信 方式,支持宽带数字摄像设备及下一代扫描仪、打印机及存储设备。 一个 USB 系统可以从三个方面加以描述:USB 互连、USB 从端口和 USB 主端口。 1. USB 互连 USB 互连是指一个 USB 主端口(USB Host)与 USB 从端口相连并和 其通信的方式,它包括以下几方面。 ·总线的拓扑结构:USB 主端口和 USB 从端口的连接模式。 ·数据流模型:描述了数据在系统中通过 USB 从产生方到使用方的流动 方式。 ·任务规划:USB 提供多个从端口共享的连接,对 USB 从端口必须进行 规划以分配带宽。 USB 的总线拓扑结构如图所示,它是一个星型结构,集线器(Hub)位 于每个星型结构的中心,USB 协议规定最多允许 5 级集线器进行级连。这种 集线器级连的方式使得外设的扩展很容易。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 数据流模式对于 USB 设备很关键。USB 协议支持以单向或双向的方式,在 USB 主端口和一个 USB 设备之间交换功能数据和控制信息。USB 的数据传 输是在主端口和一个 USB 从端口上的特定端点之间进行的,一个给定的 USB 从端口支持多个数据传输端点。USB 主端口将分别处理一个 USB 从端口的任 一端点与其他端点上的通信,这种主端口和一个 USB 从端口之间的联系称为 管道。 图 USB 总线拓扑结构 在 USB 技术的体系结构中有基本的数据传送类型,任一给定的管道都必须 能够支持其中的一种传输方式。 2.USB 从端口 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 USB 从端口包括 USB 集线器和功能设备(FunctiON)两大类。它们都必 须有标准的 USB 接口,理解 USB 协议,支持标准的 USB 操作(如配置、复位 等)。它们的描述信息也必须具有 USB 协议定义的标准格式。集线器为 USB 总 线提供扩展和连接;功能设备是具有一定特殊应用功能的设备,它能发送数据到 主机,也可以接收来自主机的数据和控制信息。 3.USB 主端口 USB 主机是 USB 系统的核心,在一个 USB 系统中只有一个主端口主端口 的 USB 接口称为 USB 控制器,通过它主机和外围 USB 设备进行通信。在主机 中还集成了一个根集线器(Root Hub),用于直接与外设相连或与一般 USB Hub 级连。主机所具有的功能包括: ·检测 USB 设备的插入和拔出。 ·管理主机与设备之间的数据流。 ·对设备进行必要的控制。 ·收集各种状态信息。 ·对插入的设备供电。 stm32f107 103 系类内部集成了 USB 控制器,可以接出 USB Host 端口,用于 系统调试。 对于初学者市场上有一本《电脑圈圈》的书 特别不错 例程很多 建议开发 usb 设备的工程师看一下 Usb 优势: USB 具有很多优点,例如即插即用,容易使用,方便携带,传输速度快, 可扩展性强,标准统一,价格便宜等等。目前流行的 USB 设备有移动硬盘,数 码相机,MP3,U 盘,USB 鼠标、键盘、游戏杆,USB MIDI 键盘,USB 摄相 头,USB 打印机,USB 扫描仪,USB 声卡,USB 话筒,USB 网卡,USB 显示 器,USB 电话,具有 USB 口的各种仪表仪器等等,只要是能跟电脑打交道的, 就基本上可以通过 USB 来实现,足见 USB 功能的强大。 Usb 操作: Usb 最重要的是枚举 这里我们摘录 电脑圈圈 的学习笔记和大家分享: USB 主机在检测到 USB 设备插入后,就要对设备进行枚举了。为什么要枚举 呢?枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信, 这样主机就可以根据这些信息来加载合适的驱动程序。调试 USB 设备,很重要 的一点就是 USB 的枚举过程,只要枚举成功了,那么就已经成功大半了。 在说枚举之前,先大概说一下 USB 的一种传输模式——控制传输。这种传输 在 USB 中是非常重要的,它要保证数据的正确性,在设备的枚举过程中都是使 用控制传输。控制传输分为三个过程:①建立过程。②可选的数据过程。③状态 过程。建立(Setup)过程都是由 USB 主机发起,它开始于一个 Setup 令牌包, 后面紧跟一个 DATA0 包。如果是控制输入传输,那么数据过程就是输入数据; 如果是控制输出传输,那么数据过程是输出数据。如果在设置过程中,指定了数 据长度为 0,则没有数据过程。数据过程之后是状态过程。状态过程刚好与数据 过程的数据传输方向相反:如果是控制输入传输,则状态过程是一个输出数据包; 如果是控制输出传输,则状态过程是一个输入数据包。状态阶段用来确认所有的 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 数据都已经正确传输。 好了,下面我们来看看枚举的详细过程。 首先,USB 主机检测到 USB 设备插入后,就会先对设备复位。设备复位后, USB 主机就会对地址为 0 的设备发送获取设备描述符的标准请求。所有的 USB 设备在总线复位后其地址都为 0,这样主机就可以跟那些刚刚插入的设备通过地 址 0 通信。主机在建立阶段发出获取设备描述符的输入请求,设备收到该请求后, 在数据过程将设备描述符返回给主机。主机在成功获取到一个数据包的设备描述 符后并且确认没有什么错误后(注意:有些 USB 设备的端点 0 大小不足 18 字 节(但至少具有 8 字节),而标准的设备描述有 18 字节,在这种情况下,USB 设备只能暂时按最大包将部分设备描述符返回,而主机在成功获取到前面一部分 描述符后,就不会再请求剩下的设备描述符部分,而是进入设置地址阶段),就 会返回一个 0 长度的状态数据包给设备。 然后主机再对设备复位一下,接下来就会进入到设置地址阶段。这时 USB 主 机发出一个设置地址的请求(建立过程,设置地址无数据过程),地址包含在建 立包中,具体的地址 USB 主机会负责管理,它会分配一个唯一的地址给新的设 备。USB 设备在收到地址后,返回 0 长度的状态包,主机收到 0 长度的状态包 之后,会返回一个 ACK 给设备。设备在收到这个 ACK 之后,就可以启用新的 地址了。这样设备就分配到了一个唯一的设备地址,以后主机就通过它来进行访 问该设备。 然后主机再次获取设备描述符,这次跟第一次可能有点不一样,这次需要获 取完全部的 18 个字节的设备描述符。当然,如果你的端点 0 缓冲大于 18 字节 的话,那就跟第一次的情形一样了。 接下来,主机就会获取配置描述符。配置描述符总共为 9 字节。主机在获取 到配置描述符后,根据里面的配置集合总长度,再获取配置集合。配置集合包括 配置描述符,接口描述符,端点描符等等。 如果有字符串描述符的话,还要获取字符串描述符。另外 HID 设备还有 HID 描述符等。使用 BUS HOUND 以及通过串口返回信息,很容易看到具体的过程。 总之是主机请求什么,你的程序就响应什么。 下面这些数据是使用 BUS HOUND 抓的,这个是在 WIN2000 下抓到的,如果 在 WINXP 下,就看不到设置地址之前的数据。 写了注释下面的部分就是主机和设备之间的数据通信,而其它的则是主机跟根集 线器之间的通信数据。 Device Phase Data Description Cmd.Pha se.Ofs(rep) Delta ------ ----- -------------------------------------------------- ---------------- ----------------- - ----- 14.1 DI 02 . 1.1.0 3.4 sc 14.0 CTL a3 00 00 00 01 00 04 00 GET STATU S 2.1.0(2) 17us 14.0 DI 01 01 01 00 .... 2.2. 0 27us 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 14.0 CTL 23 01 10 00 01 00 00 00 CLEAR FEATU RE 4.1.0 110us 14.0 CTL a3 00 00 00 01 00 04 00 GET STATU S 5.1.0(2) 56us 14.0 DI 01 01 00 00 .... 5.2. 0 14us 14.0 CTL 23 03 04 00 01 00 00 00 E 7.1.0 109ms 14.1 DI 02 . ms 14.0 CTL a3 00 00 00 01 00 04 00 S 9.1.0 23us 14.0 DI 03 01 10 00 .... 0 22us 14.0 CTL 23 01 14 00 01 00 00 00 SET FEATUR 8.1.0 90 GET STATU 9.2. CLEAR FEATU RE 10.1.0 8us 14.0 CTL a3 00 00 00 01 00 04 00 GET STATU S 11.1.0 19ms 14.0 DI 03 01 00 00 .... 11.2. 0 34us /////////////第一次获取设备描述符请求////////////////////// 14.0 CTL 80 06 00 01 00 00 40 00 GET DESCRIP TOR 12.1.0 239us /////////////第一次返回设备描述符////////////////////////// /////////////由于该端点缓冲只有 16 字节,因此只读到 16 字节/////////// 14.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 0 0 ........e.6!.... 12.2.0 67ms 14.0 CTL a3 00 00 00 01 00 04 00 GET STATU S 13.1.0 49us 14.0 DI 03 01 00 00 .... 13.2. 0 27us 14.0 CTL 23 03 04 00 01 00 00 00 SET FEATUR E 14.1.0 24us 14.1 DI 02 . 15.1.0 11 2ms 14.0 CTL a3 00 00 00 01 00 04 00 S 16.1.0 21us 14.0 DI 03 01 10 00 .... 0 25us 14.0 CTL 23 01 14 00 01 00 00 00 RE 17.1.0 8us ////////////////设置地址,地址为 2///////////////////////////////// 14.0 CTL 00 05 02 00 00 00 00 00 S 18.1.0 19ms GET STATU 16.2. CLEAR FEATU SET ADDRES 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 ///////////第二次获取设备描述符请求////////////////////////////// 14.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIP TOR 19.1.0 40ms ////////////第二次返回了全部的 18 字节设备描述符////////////////// 14.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 0 0 ........e.6!.... 19.2.0 75ms 02 01 .. 19.2.16 ////////////获取 9 字节的配置描述符///////////////////////////// 14.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIP TOR 20.1.0 44us ////////////返回 9 字节的配置描述符///////////////////////////// ////////////可以看到配置描述符集合长度为 0x20(即 32)字节////// 14.0 DI 09 02 20 00 01 01 00 80 dd .. ...... 20.2.0 50ms 14.0 CTL a3 00 00 00 02 00 04 00 GET STATU S 21.1.0 214ms 14.0 DI 00 01 00 00 .... 21.2. 0 34us //////////再一次获取设备描述符////////////////////////////// 17.0 CTL 80 06 00 01 00 00 12 00 GET DESCRIP TOR 22.1.0 3.8ms /////////返回设备描述符//////////////////////////////// 17.0 DI 12 01 10 01 00 00 00 10 65 10 36 21 01 00 00 0 0 ........e.6!.... 22.2.0 67ms 02 01 .. 22.2.16 //////////获取配置描述符/////////////////////// 17.0 CTL 80 06 00 02 00 00 09 00 GET DESCRIP TOR 23.1.0 28us ///////////返回配置描述符/////////////////////// 17.0 DI 09 02 20 00 01 01 00 80 dd .. ...... 23.2.0 50ms /////////获取 0x20 字节的配置描述符集合,包括配置描述符,接口描述符,端点 描述符等///////// 17.0 CTL 80 06 00 02 00 00 20 00 GET DESCRIP TOR 24.1.0 30us /////////返回了 0x20 字节的配置描述符集合///////////// 17.0 DI 09 02 20 00 01 01 00 80 dd 09 04 00 00 02 08 06 .. ............. 24.2.0 83ms 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00 P..... @......@.. 24.2.16 ////////获取字符串描述符的语言 ID/////////////// 17.0 CTL 80 06 00 03 00 00 02 00 GET DESCRIP TOR 25.1.0 29us ///////设备返回语言 ID,第一字节表示语言 ID 的长度/////////////// 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 17.0 DI 04 03 .. 25.2.0 45ms ////////根据长度获取 4 字节的字符串描述符的语言 ID/////////////// 17.0 CTL 80 06 00 03 00 00 04 00 GET DESCRIP TOR 26.1.0 17ms ////////设备返回完整的语言 ID//////////////// 17.0 DI 04 03 09 04 .... 26.2. 0 53ms /////////获取索引为 2 的字符串描述符/////////// 17.0 CTL 80 06 02 03 09 04 02 00 GET DESCRIP TOR 27.1.0 27us //////////设备返回字符串描述符,第一字节为该字符串描述符的长度////////// 17.0 DI 12 03 .. 27.2.0 46ms /////////根据长度获取索引为 2 的字符串描述符/////////// 17.0 CTL 80 06 02 03 09 04 12 00 GET DESCRIP TOR 28.1.0 23us /////////设备返回完整的 0x12 字节字符串描述符///////// 17.0 DI 12 03 32 00 30 00 37 00 31 00 30 00 39 00 38 00 ..2. 0.7.1.0.9.8. 28.2.0 70ms 32 00 2. 28.2.16 ////////////////设置配置/////////////////////////////// 17.0 CTL 00 09 01 00 00 00 00 00 SET CONFI G 29.1.0 28us ////////////////设置接口//////////////////////////////// 17.0 CTL 01 0b 00 00 00 00 00 00 SET INTERFA CE 30.1.0 22ms //////////////获取最大逻辑单元///////////////////////// 17.0 CTL a1 fe 00 00 00 00 01 00 GET MAX LU N 31.1.0 158us 17.0 DI 00 . 31.2.0 5 3ms ///////////////USB 大容量存储设备的命令块封包(CBW)//////// 17.2 DO 55 53 42 43 c8 58 25 81 24 00 00 00 80 00 06 12 U SBC.X%.$....... 32.1.0 3.0ms 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00 ... $........... 32.1.16 以下是我在做 USB 键盘时,通过串口发回的调试信息,从这也可以看到枚举的 过程。 系统启动................................ 断开 USB 连接........................ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 USBD12 芯片初始化 设置地址..................... 地址为: 0 连接 USB............... USB 总线复位................................ USB 总线挂起................................ USB 总线复位................................ USB 总线挂起................................ USB 总线复位................................ USB 标准请求................................ 获取描述符................................ 获取设备描述符................................ USB 总线复位................................ USB 标准请求................................ 设置地址..................... 地址为: 2 USB 标准请求................................ 获取描述符................................ 获取设备描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ 获取配置描述符................................ USB 标准请求................................ 获取描述符................................ 获取字符串描述符................................ 获取语言 ID................................ USB 标准请求................................ 获取描述符................................ 获取字符串描述符................................ 获取设备序列号................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ 获取配置描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ 获取字符串描述符................................ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 获取语言 ID................................ USB 标准请求................................ 获取描述符................................ 获取字符串描述符................................ 获取产品字符串................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ 获取字符串描述符................................ 获取语言 ID................................ USB 标准请求................................ 获取描述符................................ 获取字符串描述符................................ 获取产品字符串................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ 获取设备描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ 获取配置描述符................................ USB 标准请求................................ 获取描述符................................ 获取配置描述符................................ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 获取描述符................................ USB 标准请求................................ 设置配置................................ USB 类请求................................ 设置空闲................................ USB 标准请求................................ 获取描述符(从接口).............................. 获取报告描述符................................ USB 标准请求................................ 获取描述符(从接口).............................. USB 标准请求................................ 获取描述符(从接口).............................. USB 标准请求................................ 获取描述符(从接口).............................. USB 标准请求................................ 获取描述符(从接口).............................. USB 标准请求................................ 获取描述符(从接口).............................. USB 标准请求................................ 获取描述符(从接口).............................. USB 标准请求................................ 获取描述符(从接口).............................. 18.USB 从设备实现鼠标的功能 18.1 先看一下硬件需要的准备 原理图 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 短接 如图: 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 18.2 程序的学习 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 19. usbhost 主功能测试---读 U 盘 19.1 先看一下硬件需要的准备 原理图 如图: 跳线:短接图示的引脚 如图: 无 然后接上仿真器 上电 下载程序 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 硬件小知识: 通用串行总线 USB USB 使用一根屏蔽的 4 线电缆与网络上的设备进行互联。数据传 输通过一根差分双绞线进行,这两个线分别标为 D- D+,另外两根线 是 VBUS 和 GND.其中 VBUS 向 USB 设备供电。 从一个设备连同到主机称为上行连接,同理,从主机到设备的连 接叫作下行连接。为了防止回环情况的发生。上行和下行端口使用不 同的连接器。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 外围引脚电路 在不同的应用中得接法: 在上行端口也就是作为从设备的时候,DP 要接上来电阻,在 下行中不需要接,但是要求 DP DM 接下拉电阻 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn 19.2 代码分析 STM32F10X 系列开发板学习笔记 S-107 开发套件 这里代码太复杂 不是几句能说清楚的 我们把所有调试信息都打 印了出来,有任何问题请到论坛 www.stmsky.com stm 家园发帖 这里贴几张调试图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 大家对照调试信息做就好了。 对于 usb 的 host 应用,st 原厂已经做了很多底层的封装,但是这 里仍然有我们需要完善的地方才能完全的运用出来。正是考虑到这一 点,我们在这款开发板上对此应用做了调试的完善,把所有的调试过 程信息打印出来,以便我们在应用的时候调试跟踪。 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 Web 学习 硬件小知识: 以太网(Ethernet) 任何一个人,即使与计算机关系甚远。只要他接触了计算机,就一定听说过 以太网。20 世纪 70 年代早期,在施乐公司 PARC 研究中心开发出来的这个局 域网标准已经在每一个可能的应用中找到了它的位置。而且随着时间的不断推 移,已经包含从无线网络到千兆以太网的许多标准 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 在这一部分,我们将向你展示如何将一个简单的以太网接口添加到嵌入式 计算机中。还有真正的百兆接口需要特别注意 pcb 涉及和 EMC 问题。 以 太 网 标 准 和 协 议 的 详 细 内 容 可 以 从 Charles E.Spurgeon 所 写 的 《Ethernet:The Definitive Guide》 一书中得到,该书已由 O’Reilly 公司出版, 这本绝佳的书籍对以太网进行了准确详细的论述,是每一个从事基于以太网开发 的人员不可缺少的一本书,也是一本基本的读物 通过将以太网添加到你的嵌入式系统中,你就可以连接到一个网络,并且 访问这个网络所有可能带来的东西。你可以向一个主机高速发送书籍并且访问打 印机、文件服务器、数据库,甚至 Internet。你还可以检测和控制远方的嵌入式 系统,或者,甚至可以令它在其可能出问题的时候向你发送电子邮件。使用我们 这款开发板,你就拥有了一个自己的简单 web 服务器。再添加一个模数转换, 一些传感器,你的 web 服务器就变成了一个气象站。可以向 Internet 上的任何 人显示当前或者过去的气象状况。使用一个高速的处理器,几个以太网端口及合 适的软件,你就有了自己简单的网关和防火墙。我们也实现了网口到串口的网桥。 只要你能想象得到的都是可能实现的。 网络信号的线标准: 20.网络 Internet 学习之 web 控制 led 灯 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 20.1 先看一下硬件需要的准备 插好电源 5v 网线 即可 把网线接到路由 或者 pc 机 默认 IP 是 192.168.0.8 20.2 程序的学习 Lwip 的简单介绍 摘自网络: lwip 是瑞典计算机科学院的一个开源的 TCP/IP 协议栈实现. lwIP 是 TCP/IP 协议栈的一个实现。lwIP 协议栈主要关注的 是怎么样减少内存的使用和代码的大小,这样就可以让 lwIP 适用 于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内 存要求,lwIP 对 API 进行了裁减,可以不需要复制一些数据。 Lwip 源码层次 这里也是摘自网络的文章 说的比较有层次 希望对大家有帮 助 LWIP(Light weight internet protocol)主要模块包括:配置模块,初始 化模块,NetIf 模块,mem(memp)模块,netarp 模块,ip 模块,udp 模 块,icmp 模块,dhcp 模块,tcp 模块,snmp 模块等。下面我们主要 对需关心的协议处理进行说明和梳理。 配置模块 配置模块通过各种宏定义的方式对系统、子系统进行配置。比如:通 过宏,配置了 mem 管理模块的参数。该配置模块还通过宏,配置了 协议栈所支持的协议簇,通过宏定制的方式,决定了支持那些协议。 主要的文件是 opt.h 初始化模块 初始化模块入口的文件为 tcpip.c,其初始化入口函数为: void tcpip_init(void (* initfunc)(void *),void *arg) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 该入口通过调用 lwip_init ()函数,初始化了所有的子模块,并启动了 协议栈管理进程。同时,该函数还带有回调函数及其参数。可以在需 要的地方进行调用。 协议栈数据分发管理进程负责了输入报文的处理、超时处理、API 函 数以及回调的处理,原型如下: static void tcpip_thread(void *arg) NetIf 模块 NetIf 模块为协议栈与底层驱动的接口模块,其将底层的一个网口设 备描述成协议栈的一个接口设备(net interface)。该模块的主要文件为 netif.c。其通过链表的方式描述了系统中的所有网口设备。 NetIf 的数据结构描述了网口的参数,包括 IP 地址、MAC 地址、link 状态、网口号、收发函数等等参数。一个网口设备的数据收发主要通 过该结构进行。 Mem(memp)模块 Mem 模块同一管理了协议栈使用的内容缓冲区,并管理 pbuf 结构以 及报文的字段处理。主要的文件包括 mem.c、memp.c、pbuf.c。 netarp 模块 netarp 模块是处理 arp 协议的模块,主要源文件为 etharp.c。其主要入 口函数为: err_t ethernet_input(struct pbuf *p,struct netif *netif) 该入口函数通过判断输入报文 p 的协议类型来决定是按照 arp 协议进 处理还是将该报文提交到 IP 协议。如果报文是 ARP 报文,该接口则 调用 etharp_arp_input,进行 arp 请求处理。 如果是 ip 报文,该接口就调用 etharp_ip_input 进行 arp 更新,并 调用 ip_input 接口,将报文提交给 ip 层。 在该模块中,创建了设备的地址映射 arp 表,并提供地址映射关 系查询接口。同时还提供了 arp 报文的发送接口。如下: err_t etharp_output(struct netif *netif, struct pbuf *q, struct ip_addr *ipaddr) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 该接口需要注册到 netif 的 output 字段,ip 层在输出报文时,通过 该接口获取目标机的 MAC 地址,组合最终报文后,由该接口调用底 层设备的驱动接口发送数据。 在 etharp_output 接口中,判断报文类型,如果是广播包或者组播 包,就调用 etharp_send_ip(组装目标 mac 和源 mac)接口, etharp_send_ip 调用 netif 结构中的设备驱动注册的 linkoutput 钩子函数 发送最终报文。如果是单播包,etharp_output 接口就调用 etharp_query 进行 ip 地址和 MAC 地址的映射,来获取到目标机的 MAC 地址。并 在 etharp_query 中调用 etharp_send_ip 来发送最终组合报文。 ip 模块 ip 模块实现了协议的 ip 层处理,主要文件为 ip.c。其主要入口函数 为: err_t ip_input(struct pbuf *p, struct netif *inp) 该接口通过判断输入报文的协议类型,将其输入到相应的上层协 议模块中去。比如,将 udp 报文送到 udp_input。 该模块另外一个接口是输入函数,原型如下: err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, u8_t ttl, u8_t tos, u8_t proto) 该接口通过路由表或者传输 ip 后,调用 netif 的 output 字段函数钩 子发送报文。 udp 模块 udp 模块实现了 udp 协议层的协议处理,主要文件为 udp.c。该模 块通过 PCB 控制块将应用端口跟应用程序做了绑定。在接收到新报 文时,分析其对应的 PCB,找到对应的处理钩子,进行应用的处理。 主要入口函数为: void udp_input(struct pbuf *p, struct netif *inp) 该模块负责输出的接口如下: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 err_t udp_send(struct udp_pcb *pcb, struct pbuf *p) 该模块负责将一个 PCB 跟一个本地端口进行绑定的接口如下: err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) 该模块负责将一个 PCB 跟一个远端端口绑定的接口如下: err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port) icmp 模块 该模块负责 icmp 协议的处理,其比较简单。主要的处理接口如下: Void icmp_input(struct pbuf *p, struct netif *inp) 上述接口负责 icmp 输入报文的分析和处理。 igmp 模块 igmp 模块负责分组管理。其主要的接口函数如下: void igmp_input(struct pbuf *p, struct netif *inp, struct ip_addr *dest) 该接口负责 IGMP 协议报文的处理,比如分析当前报文是请求还 是应答。 err_t igmp_joingroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) 该接口将一个网口加入一个组。 err_t igmp_leavegroup(struct ip_addr *ifaddr, struct ip_addr *groupaddr) 该接口将一个网口从一个组中移出。 dhcp 模块 dhcp 模块用于获取设备 ip 地址的相关信息。其处理入口主要有这 么几个:dpch 的启动、dpch 的接收报文处理以及定时器模块的处理。 主要的接口原型如下: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 err_t dhcp_start(struct netif *netif) 该接口用于设备启动 dhcp 模块,主要是客户端的功能。该模块实 现设备 dhcp 描述结构生成,并将 dhcp 的端口绑定到 udp 协议中,以 及将本 dhcp 模块跟远端服务器端口进行绑定。最后启动 dhcp 申请。 static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port) 该接口为一个注册接口,用于 dhcp 报文接收。在 start dhcp 时, 该接口通过 dhcp 的 udp pcb 注册到 udp 协议层。Udp 进行报文处理 后,根据端口调用该注册接口。该接口中,实现 dhcp 报文的协议处 理。 Void dhcp_fine_tmr() Void dhcp_coarse_tmr() 这两个函数接口实现了 dhcp 的相关超时处理监控。上面一个用于 请求应答超时处理。下面一个用于地址租用情况的到期处理。 从源码分析看,上述的接口在应用 lwip 的协议栈时,需要重点关 注。对于小内存应用的场合,该协议栈的内存管理以及 pbuf 应用部 分需要自行改写。 关于 lwip 源码的理解学习,请大家自己多看看相关资料。水好深, 作者这里也是略知皮毛 下面看一看我们的源码程序: int main(void) { /* Setup STM32 system (clocks, Ethernet, GPIO, NVIC) and STM3210C-EVAL resources */ System_Setup(); 这个是系统相关初始化 包括时钟 io 口 tft 屏 (我们板子可以挂屏 但是默认是没有的 我们所有的调试 支持串口 和 tft 两种 debug 方式),以及网络底层驱动的程序 /* Initilaize the LwIP satck */ LwIP_Init();这个是初始化 lwip 的堆栈 并且我们在这里顺便设置 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 了网卡的静态 ip 以及 mac 地址 在使用网络时 首先调用该函数 Ok 上面两个是网络操作必须使用的初始化函数 大家只要在开 发中加上即可 简单看一下里面的源码 理解一下所做的工作即可 HelloWorld_init(); 这句函数是初始化一个 tcp 的端口 这里我们先不做介绍 我们 WEB 操作用不到这个,但是我这里并没有去掉 因为 stm32f107vct6 有很多的端口 可以支持同时开辟多个不同功能的连接 各自的通信 通道也是不同的 主要是通过 端口来判断 数据是传输给谁的 httpd_init(); 这个在这里是我们比较关注的,http 的初始化。我们看一下源码: 简单说一下 大家就会知道他的流程了 void httpd_init(void) { struct tcp_pcb *pcb; pcb = tcp_new(); 开辟一个新的 tcp 栈 tcp_bind(pcb, IP_ADDR_ANY, 80);绑定 ip 和端口号 这里是服务 器模式 因为 web 必须要设置成服务器 端口号 固定的 80 端口 IP_ADDR_ANY 这个是 ip 这个标号在 lwip 中指示的是可以使 用任意已经存在的网卡 ip 我们也可以自己填写固定的。 INADDR_ANY 是个宏定义,他的数据实际就是 0 htonl 是把网络地址转换到程序可以识别的数据。 在 IP 地址上规定 0.0.0.0 为广播地址,也就是任意地址的意思, 但是你无法设置其它网卡上的端口方式,最后的结果就是进行了本网 卡设置。 网卡的 ip 我们在初始化的时候已经设置了 这里他默认分配到改 ip 192.168.0.8 pcb = tcp_listen(pcb); 监听 tcp_accept(pcb, http_accept); 连接传递函数 链接函数 有连接的时候进入 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 函数源码 ------------------------------------------------------------------------------------------------static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err) { struct http_state *hs; /* Allocate memory for the structure that holds the state of the connection. */ hs = mem_malloc(sizeof(struct http_state)); if (hs == NULL) { return ERR_MEM; } /* Initialize the structure. */ hs->file = NULL; hs->left = 0; /* Tell TCP that this is the structure we wish to be passed for our callbacks. */ tcp_arg(pcb, hs); /* Tell TCP that we wish to be informed of incoming data by a call to the http_recv() function. */ tcp_recv(pcb, http_recv); 接受传递函数在这个函数里我们将按 照 web 传递的信息传递 相关 web 源码 判断程序如下 else if (strncmp(data, "GET /method=get", 15) == 0) 是不是 led 控 制命令 { i = 15; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 GPIO_ResetBits(GPIOA,GPIO_Pin_4); GPIO_ResetBits(GPIOA,GPIO_Pin_5); GPIO_ResetBits(GPIOA,GPIO_Pin_6); GPIO_ResetBits(GPIOA,GPIO_Pin_7); while(data[i]!=0x20/* */) { i++; if (data[i] == 0x6C /* l */) { i++; if (data[i] == 0x65 /* e */) { i++; if (data[i] == 0x64 /* d*/) { i+=2; if(data[i]==0x31 /* 1 */) { GPIO_SetBits(GPIOA,GPIO_Pin_4); } if(data[i]==0x32 /* 2 */) { GPIO_SetBits(GPIOA,GPIO_Pin_5); } if(data[i]==0x33 /* 3 */) { GPIO_SetBits(GPIOA,GPIO_Pin_6); } if(data[i]==0x34 /* 4 */) { GPIO_SetBits(GPIOA,GPIO_Pin_7); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 } } } } } pbuf_free(p); fs_open("/STM32F107LED.html", &file); 打 开 固 定 的 ledweb 源码 这里每次更新的 web 都是一样的 不带有 led 状态读取功 能 这些功能我们将在以后不断更新中加入 hs->file = file.data; hs->left = file.len; send_data(pcb, hs); /* Tell TCP that we wish be to informed of data that has been successfully sent by a call to the http_sent() function. */ tcp_sent(pcb, http_sent);上传 led 控制 web 源码 } 我们的这里看一下 led 控制源码: 关于 web 页面的更改 作者这里使用网页 3 剑客的 dreamweaver 进行更改 大家可以使用自己善用的网页制作工作 制作自己需要的 网页 将网页源码做成数组 以备上传使用 ------------------------------------------------------------------------------------------------static const char data_STM32F107LED_html[] = { "" "" "" 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 "" "" "S-107 开发板 led 控制" "" "" "

    STM32F107 Leds control " "        

    " "
    " "" "" "" "" "" "" "" "" "" "
    首页" "Led 控制" "数据显示" "
    " "
    " 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 "
    " "
    " " 开 发 板 LED1-LED4 控 制 演 示
    " "
    " "
    " "
    " "" "" "" "" "" "" "
    STM32" "Webserver LEDs 控 制
    " "
    " "
    LED1
    " "LED2
    " "LED3
    " "LED4" "
    " "
    " "
    " "

    " "


    " "

    " "" 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 "_____________________________________________________ __________________________________________________________
    " "
     " "           " "           " "           " "       " "   " "         All rights" "reserved ?2009 STMicroelectronics " "" }; tcp_err(pcb, conn_err); tcp_poll(pcb, http_poll, 10); return ERR_OK; } } ------------------------------------------------------------------------------------------------- tftpd_init(); 这个也不用 /* Infinite loop */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 while (1) { /* Periodic tasks */ System_Periodic_Handle(); 实时监测 模拟实时的 rtos } } Ok 大 概 的 例 程 就 是 这 样 有 任 何 疑 问 请 到 官 方 论 坛 www.stmsky.com stm 家园发帖一起交流 调试截图: 21.网络 Internet 学习之 web 显示模拟值 21.1 先看一下硬件需要的准备 和上一个工程是同一个工程 我们直接来看一下和这个功能相关的函 数操作即可 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 21.2 程序的学习 前面对 http 的初始化已经有了一定的了解 这里我们直接讲一下 web 的操作 数值显示的 web 发送: if (strncmp(data, "GET /STM32F107ADC", 17) == 0) { char Digit1=0, Digit2=0, Digit3=0; int ADCVal = 0; pbuf_free(p); ADCVal = ADC_GetConversionValue(ADC1);得到模拟转换 值 ADCVal = ADCVal/8; Digit1= ADCVal/100; Digit2= (ADCVal-(Digit1*100))/10; Digit3= ADCVal-(Digit1*100)-(Digit2*10); 取出 3 位数字 以备 显示 /* Update the ADC value in STM32F107ADC.html */ *((data_STM32F107ADC_html)+ 2111) = 0x30 + Digit1; /* ADC value 1st digit */ *((data_STM32F107ADC_html)+ 2112) = 0x30 + Digit2; /* ADC value 2nd digit */ *((data_STM32F107ADC_html)+ 2113) = 0x30 + Digit3; /* ADC value 3rd digit*/ 把转换的数值显示到 web 相关位置,这个位置取决于我们 web 源 码 变量的位置 下面我们将会涉及到 *((data_STM32F107ADC_html)+ 2112) 这个的含义就是指存储改 web 的数组的 2112 个字符 我们例程该变量 xxx 在 2111 2112 2113 位 置 fs_open("/STM32F107ADC.html", &file); 打开源码文件 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 我们讲一下这个文件系统的打开函数 我们这里为了使用简单 这里 打开的文件 我们已经定义到了 工程的数组 在以后的实例更新中 我们将会演示直接从 sd 开中获取文件的方式 显示网页 hs->file = file.data; hs->left = file.len; 文件的数据首地址和长度 send_data(pcb, hs);告诉网络协议 我们现在的状态 /* Tell TCP that we wish be to informed of data that has been successfully sent by a call to the http_sent() function. */ tcp_sent(pcb, http_sent); 发送源码 } 我们看一下 web 源码: char data_STM32F107ADC_html[]={ "" "" "" "" "" "" "" "s-107 数据显示例程" "" "

    数 据 显 示 条

    " "
    " "" "" "" "" "" "" "" "" "" "
    首页" "Led 控制" "数据显示" "
    " "
    " "
    " "
    数据显示界面" "
    " "
    " "
    " "
    " "" "" "" "" 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 "" "" "
    STM32" "请使用开发板上的模拟调试按钮改变进度条" " :
    " "
    " "" "" "" "" "" "" "
    " "" "" "" "" "" "" "
     
    " "
    " "" "" "" "" "" "" "" "" "" "" "" "" "
    0V0.5V1V1.5V2V2.5V3V
    " "" 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 "


    " "

    " "
    " "
    " "" "" "_____________________________________________________ __________________________________________________________
    " "
     " "           " "           " "           " "       " "   " "         All rights" "reserved ?2009 STMicroelectronics " "" "" }; 注意该函数的定义 char data_STM32F107ADC_html[] 而不是 const 因 为这些数据时要一直变化的 flash 不能一直写 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 看一下里面 变量 也就是模拟值 我用黑体标记了 另外我们使用了实时刷新的计数 加代码 " 这里设置 1s 更新一次 但是在实际应用中 也许这种整页的刷新可能 有点慢 不过局域网是很快的 大家可以在项目中测试一下。后面我们 更新历程中 将会做一下局部刷新的方式。 Ok 我们看一下演示效果 22.网络 Internet 学习之通过 VB 上位机进行 ip 查询和配置 22.1 先看一下硬件需要的准备 网络方面和上面操作一样 不需要更改 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 Led 跳线:短接图示的四个引脚 如图: 然后接上仿真器 上电 下载程序 22.2 程序的学习 我们看一下源码: int main(void) { /* 硬件初始化 (clocks, Ethernet, GPIO, NVIC) / System_Setup(); /* Initilaize the LwIP satck */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn LwIP_Init(); STM32F10X 系列开发板学习笔记 S-107 开发套件 堆栈申请 ip 设置 void LwIP_Init(void) { struct ip_addr ipaddr; struct ip_addr netmask; struct ip_addr gw; uint8_t macaddress[6]={0,0,0,0,0,1}; /* Initializes the dynamic memory heap defined by MEM_SIZE.*/ mem_init(); /* Initializes the memory pools defined by MEMP_NUM_x.*/ memp_init(); IP4_ADDR(&ipaddr, 192, 168, 0, 8); IP4_ADDR(&netmask, 255, 255, 255, 0); IP4_ADDR(&gw, 192, 168, 0, 1); 设置静态 ip Set_MAC_Address(macaddress); 设置 mac 地址 创建一个网络接口 netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input); /* 寄存器初始化*/ netif_set_default(&netif); /* When the netif is fully configured this function must be called.*/ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 netif_set_up(&netif); } -------------------------------------------------------------------------------------------------------------------- HelloWorld_init(); 这里不用 httpd_init(); 这里不用 tftpd_init(); 主要看一下这个程序 这里我们开了一个 udp 连接 用来配置参数 看一下源码 server_init(); void server_init(void) { struct udp_pcb *upcb; /* Create a new UDP control block */ upcb = udp_new(); 开启一个 udp 连接 udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT); 设置 ip 地址和服务器端口 /* Set a receive callback for the upcb */ udp_recv(upcb, udp_server_callback, NULL); 回调函数 我们在接受 到数据后进入回调函数 在里面我们将根据接受的数据命令 上传 ip 信息或者是配置 ip 看一下源码 ------------------------------------------------------------------------------------------------ void udp_server_callback(void *arg, struct udp_pcb *upcb, struct pbuf *p, struct ip_addr *addr, u16_t port) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 { struct tcp_pcb *pcb; __IO uint8_t iptab[4]; uint8_t iptxt[20]; uint8_t ipPORT[8]={23,0,0,0xa3,0xfc,0xa0,0x20,0x90,}; char *data; addr->addr=0xffffffff; iptab[0] = (uint8_t)((uint32_t)(addr->addr) >> 24); iptab[1] = (uint8_t)((uint32_t)(addr->addr) >> 16); iptab[2] = (uint8_t)((uint32_t)(addr->addr) >> 8); iptab[3] = (uint8_t)((uint32_t)(addr->addr)); sprintf((char*)iptxt, "is: %d.%d.%d.%d ", iptab[3], iptab[2], iptab[1], iptab[0]); 串口调试信息 这里我们不用 我们可以用上位机 扫描 ip 信息 ///配置部分 data = p->payload; 得到数据网络发过来的数据 /* udp 建立连接 udp 只有在客户端一方发来数据后才能建立连接 进行通信 这里建立连接 以备通信 */ udp_connect(upcb, addr, UDP_CLIENT_PORT); if(data[0]==0&&p->len==1) 检测命令是不是获取 ip 信息 { p->payload=ipPORT; p->tot_len= p->tot_len+7; p->len=p->len+7; /* Tell the client that we have accepted it */ udp_send(upcb,p); 上传端口号 同时 ip 信息也自动打包上传了 我们在上位机拆解就能知道 ip 和端口号了 } 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 else if(p->len>=8) 如果不是获取 ip 信息命令 这里我们就认为是 配置 ip 命令 { if(data[0]==0xaa) { LwIP_Initchanged(data);配置传下来的新的 ip 参数 udp_send(upcb,p); 回传接受的数据 告诉上位机 我们已经配 置成功 } } udp_disconnect(upcb); 断开 udp 连接 等待下一次连接 udp_bind(upcb, IP_ADDR_ANY, UDP_SERVER_PORT);从 新建 立 udp 连接 等待下一次的数据 /* Set a receive callback for the upcb */ udp_recv(upcb, udp_server_callback, NULL); 使下一次传输还来到这里 传递相同的回调函数 addr->addr=0xC0A80108; pcb = tcp_new(); 建立一个新的 tcp 服务器连接 制 led 灯 if(pcb !=NULL) { 用来和上位机通过 tcp 通信 来控 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn err_t err; STM32F10X 系列开发板学习笔记 S-107 开发套件 /* Assign to the new pcb a local IP address and a port number */ err = tcp_bind(pcb, IP_ADDR_ANY, TCP_PORT);//addr IP_ADDR_ANY if(err != ERR_USE) { pcb = tcp_listen(pcb); tcp_accept(pcb, tcp_server_accept);设置回调函数 我们的 led 控制命令将进入这里 ---------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------- } else { tcp_close(pcb); } } /* Free the p buffer */ pbuf_free(p); } } while (1) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 { /* Periodic tasks */ System_Periodic_Handle(); } } 大家对照程序注释和工程 一步步看下来 应该对操作流程有了一个 大致的了解,俗话说万事开头难,希望我们的笔记对您有帮助 只要 入门了 再深入就看我们具体的项目需求了,有任何问题请到官方论 坛 www.stmsky.com/bbs stm 家园发帖 一起交流 看一下调试结果: 点击扫描就可以扫描到 ip 双击 ip 即可进入 ip 配置界面 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 Ok 大家根据工程和开发板测试即可。 23.网络 Internet 学习之 通过 VB 上位机控制 led 灯和显示温 度 23.1 先看一下硬件需要的准备 LED 跳线:短接图示的四个引脚 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 23.2 程序的学习 这里的功能已经包含到上面讲到的配置的工程里 我们看一下 具体 进入的函数 在前面的工程中找到 tcp_accept(pcb, tcp_server_accept);设置 回调 函数 我 们的 led 控制命令将进入这里 我们只需看一下这个回调函数的操作即可 static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { char *data; data = p->payload; 得到数据 LED_CONFIG_ONLY(data[0],data[1]);解析数据 控制 led 灯 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 pbuf_free(p); return ERR_OK; } Led 灯控制 void LED_CONFIG_ONLY(u8 cnt,u8 status) { if(cnt==0) { if(status==0x55) GPIO_SetBits(GPIOA,GPIO_Pin_4); else if(status==0xaa) GPIO_ResetBits(GPIOA,GPIO_Pin_4); } else if(cnt==1) { if(status==0x55) GPIO_SetBits(GPIOA,GPIO_Pin_5); else if(status==0xaa) GPIO_ResetBits(GPIOA,GPIO_Pin_5); } else if(cnt==2) { if(status==0x55) GPIO_SetBits(GPIOA,GPIO_Pin_6); else if(status==0xaa) GPIO_ResetBits(GPIOA,GPIO_Pin_6); } else if(cnt==3) { if(status==0x55) GPIO_SetBits(GPIOA,GPIO_Pin_7); else if(status==0xaa) 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 GPIO_ResetBits(GPIOA,GPIO_Pin_7); } 上位机的操作 和上面一样先扫描到 ip 然后把端口号改为 4 点击连接 就可以连上 板子了 点击打开关闭即可 这里作者写笔记的时候没有加上温度的获取 我们在板子随带的光 盘程序中将会加入这一部分 大家可以看看函数的变化 也可以自己 理解一下 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 应用篇 24.应用篇之 通过网络控制继电器开断(提供 VB 上位机) 24.1 先看一下硬件需要的准备 继电器控制接口 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 然后接上仿真器 上电 下载程序 24.2 程序的学习 这里的功能已经包含到上面讲到的配置的工程里 我们看一下 具体 进入的函数 在前面的工程中找到 tcp_accept(pcb, tcp_server_accept);设置 回调 函数 我 们的 led 控制命令将进入这里 我们只需看一下这个回调函数的操作即可 static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { char *data; /* Read the led number */ // data = *(((char *)p->payload)); 淘宝网站 http://shop60442272.taobao.com/ 联系 qq 1340409209 合作公司淘宝 http://shop60176961.taobao.com/ PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 data = p->payload; if(data[0]=='L'&&p->len==3) LED_CONFIG_ONLY(data[1],data[2]); else if(data[0]=='S'&&p->len==3) { study[8]=data[1]; study[9]=data[2]; crc=getCRC16(study,10); study[10]=(crc>>8)&0xff;; study[11]=crc&0xff; SendData(study, 12); } else if(data[0]=='C'&&p->len==3) { control[8]=data[1]; control[9]=data[2]; crc=getCRC16(control,10); control[10]=(crc>>8)&0xff;; control[11]=crc&0xff; SendData(control, 12); } else if(data[0]=='J'&&p->len==3) { Relay_CONFIG_ONLY(data[1],data[2]); //55 是打开 aa 是关闭 继电器 控制部分 } 看一下控制源代码: void Relay_CONFIG_ONLY(u8 cnt,u8 status) //55 是打开 aa 是关闭 { if(cnt==4) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_6); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_6); } else if(cnt==1) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_0); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_0); } 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 else if(cnt==2) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_2); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_2); } else if(cnt==3) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_4); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_4); } else if(cnt==5) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_8); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_8); } else if(cnt==6) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_10); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_10); } else if(cnt==7) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_12); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_12); } else if(cnt==8) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_14); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_14); } else if(cnt==9) { 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_1); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_1); } else if(cnt==10) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_3); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_3); } else if(cnt==11) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_5); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_5); } else if(cnt==12) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_7); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_7); } else if(cnt==13) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_9); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_9); } else if(cnt==14) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_11); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_11); } else if(cnt==15) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_13); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_13); } else if(cnt==16) { if(status==0x55) GPIO_SetBits(GPIOE,GPIO_Pin_15); else if(status==0xaa) GPIO_ResetBits(GPIOE,GPIO_Pin_15); } 以上是单独控制 一个继电器的开关 else if(cnt==17) { GPIO_Write(GPIOE,status&0xff); } 组合控制 } 其实继电器控制和 io 控制一样 大同小异 本质就是控制 io 口 看一下调试界面: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 25.应用篇之 通过串口 无线控制红外家电 电视空调等(提 供 VB 上位机) 25.1 先看一下硬件需要的准备 首先要先跳线选择 串口功能 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 如图: 跳线:短接图示的四个引脚 如图:无 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 25.2 程序的学习 本程序 通过串口一到串口 2 的透明输出和输入来演示串口对红外 学习模块的操作 初始化 串口 1 2 这个程序和无线 2.4g 的完全一样这里不细说 /* System Clocks Configuration */ SystemInit(); 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 TIM2_Configuration(); /* NVIC configuration */ /* Configure the GPIO ports */ GPIO_Configuration(); /* USARTy and USARTz configuration ------------------------------------------------------*/ /* 115200 8 n 1 */ USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /* Configure USARTy */ 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 USART_Init(USART2, &USART_InitStructure); /* Configure USARTz */ USART_Init(USART1, &USART_InitStructure); /* Enable USARTy Receive and Transmit interrupts */ USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); // USART_ITConfig(USART1, USART_IT_TXE, ENABLE);//使能中 断 这里先不使能 在后面中断发送之前发送 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART2, ENABLE); USART_Cmd(USART1, ENABLE); NVIC_Configuration(); 调试软件: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 我们来看一下 红外模组的相关参数 具体的参数请参看模块的单独 手册 特点: 1.采用高速 32 位处理器,处理速度快,学码精度高;内置看门狗,可靠性高。 2.可学习型,适应不同种类的有载波的遥控器,适应新出的电器。 3.支持载波自适应学习,范围 30kHz-45kHz,适用性广。 4.采用波形数据压缩存储存,最大存储键数 64 只,每键存储代码长度:424 位,满足 常用电器的需求。 5.接口:RS232(TTL)/无线,使用方便。 6.工作电压:3.6-5V。 7.功耗:串口型:IR-u64T 学习<3mA,发射<5mA,休眠<8uA 无线型:IR-u64F 无线接收<4mA,学习<3mA,发射<5mA,休眠<15uA 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 8.无线型距离:空旷地 200 米(弹簧天线),采用高性能天线距离可以达到 500 米。 9.发射距离:≥5 米(供电为 5V,可以调整红外发射功率增大距离)。 红色 LED 状态说明如下: 学习过程 发射过程 进入学习状态 闪烁 1 次 闪烁 2 次 闪烁 3 次 闪烁 4 次 闪烁 5 次 闪烁 1 次 闪烁 2 次 闪烁,300ms 亮,300ms 灭,总共 10 次,超时自动退出 接收到红外码熄灭 1s 后,闪烁 1 次 接收到红外码熄灭 1s 后,闪烁 2 次 接收到红外码熄灭 1s 后,闪烁 3 次 接收到红外码熄灭 1s 后,闪烁 4 次 接收到红外码熄灭 1s 后,闪烁 5 次 开始发送亮,发送完毕熄灭 收到发射指令后,闪烁 2 次 串口命令匹配 学习码成功 载波超范围 红外码长度超范围 存储出错 红外学习出现乱码 发送红外码 该按键无学习码 相关的命令 通信说明 串口配置:波特率 9600,数据位 8 位,停止位 1 位,无校验 字头(6 字节固定) 长度 0x01,0x05,0x02,0x06,0x00,0x00 0x03 命令代码 xx 数据 xx xx CRC 校验 2 字节 命令代码:0x01-学习;0x02-发射 数据:学习和发射的具体键号,两个字节,低字节在前 CRC 校验:从字头的第一个字节到数据的最后一个字节的 CRC16 校验和,低字节 在前。 举例说明: 学习 1 号按键:01 05 02 06 00 00 03 01 01 00 5f a9 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 发射 1 号按键:01 05 02 06 00 00 03 02 01 00 5f 59 26.应用篇之 通过网络控制红外家电 电视空调等(提供 VB 上位机) 26.1 先看一下硬件需要的准备 首先要先跳线选择 串口功能 如图: 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 跳线:短接图示的四个引脚 如图:无 然后接上仿真器 上电 下载程序 串口线使用直连线 或者笔记本电脑直接用 usb 转串口 即可 26.2 程序的学习 打开相应的工程《STM32F107_网络功能之上位机通信》 这里 对于网络初始化的操作我们不再讲解,前面的历程已经做了详 解 我们主要看一下 数据接受函数里面的操作,看一下代码 static err_t tcp_server_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) { char *data; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 /* Read the led number */ // data = *(((char *)p->payload)); data = p->payload; if(data[0]=='L'&&p->len==3)// 如果是 led 的控制 LED_CONFIG_ONLY(data[1],data[2]); else if(data[0]=='S'&&p->len==3) 如果是红外模块学习的操作。 { study[8]=data[1]; 上位机一共发送 3 个数据控制命令 后面两 个是控制字节 代表学习的键值 study[9]=data[2]; crc=getCRC16(study,10); 得到要通过串口发走的数据的 crc 校 验 study[10]=(crc>>8)&0xff;; study[11]=crc&0xff; SendData(study, 12); 通过串口发送学习命令 } else if(data[0]=='C'&&p->len==3) 如果是控制红外线发送命令 { control[8]=data[1]; control[9]=data[2]; crc=getCRC16(control,10); control[10]=(crc>>8)&0xff;; 淘宝网站 http://shop60442272.taobao.com/ 合作公司淘宝 http://shop60176961.taobao.com/ 联系 qq 1340409209 PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn STM32F10X 系列开发板学习笔记 S-107 开发套件 control[11]=crc&0xff; SendData(control, 12); } /* Free the p buffer */ pbuf_free(p); return ERR_OK; } 这样就实现了网络控制红外的学习和控制操作 void SendData(u8 *data, u8 len) { u8 i; USART_ClearFlag(USART1,USART_FLAG_TC); for(i=0;i

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高进,我们会尽快处理。