STM32库开发实战指南pdf下载

STM32库开发实战指南百度网盘pdf下载

作者:
简介:STM32库开发实战指南
出版社:机械工业出版社
出版时间:2013-05-01
pdf下载价格:0.00¥

免费下载


书籍下载


内容介绍

编辑推荐
该书从什么是寄存器,怎么用寄存器编程开始讲起,再到如何构建库函数雏形,最后到如何熟练地使用固件库编程。 全书由浅入深,步步为营,着重讲解单片机外设的功能框图,让你知道怎么从0开始编程。全书配套完整工程代码,极具操作性。 本书还配套完整的160集视频教程,视频从0开始手打代码教学,让一个初学者知道程序是怎么从0开始写出来的。
内容简介
  《STM32库开发实战指南》基于STM32F103芯片,紧紧围绕“库”的分析和使用展开。在大量实例的基础上,《STM32库开发实战指南》对于如何综合运用固件库开发项目给出了具体的范例;在固件库的使用和学习的基础上,又进一步讲解了结合嵌入式实时操作系统、TCP/IP协议栈进行嵌入式系统开发的方法,让读者循序渐进、系统地掌握基于STM32官方库进行开发的方法。   《STM32库开发实战指南》内容翔实,案例丰富,操作性极强,可作为高校电子信息、通信工程、信息工程等相关专业的教材,也适合作为从事嵌入式领域科技工作者的参考书。
作者简介
刘火良,网名野火,嵌入式开发工程师,野火嵌入式开发工作室的创始人,长期从事基于ARM Cortex—M系列MC LJ嵌入式开发工作,积累了丰富的实战开发经验。作者在国内最受嵌入式开发工程师欢迎的阿莫电子论坛中担任版主。担任版主期间,为网友贡献了大量的实战开发教程和资料,累计下载量超过3万次,且被广泛转载,深得网友喜爱。


杨森,网名flyleaf,嵌入式开发工程师,野火嵌入式开发工作室发起人,对嵌入式实时操作系统有深入的研究和理解。曾推出《从零开始移植μC/OS到野火STM32开发板》,以全新的视角自上而下讲解μC/OS移植方法,深受网友好评。
目录
STM32库开发实战指南

前言
致谢
第一部分 库开发初级篇
第1章 为什么学习STM32
1.1 嵌入式技术知识结构
1.2 嵌入式工程师成长之路
1.3 为什么学习STM32
1.4 如何学习STM32
第2章 初识STM32固件库
2.1 STM32神器之库开发
2.1.1 什么是STM32库
2.1.2 为什么采用库开发
2.2 STM32结构及库层次关系
2.2.1 CMSIS标准
2.2.2 库目录、文件简介
2.2.3 STM32固件库文件间的关系
2.2.4 使用库帮助文档
第3章 GPIO入门之流水灯
3.1 安装MDK
3.2 建立工程模板
3.2.1 新建工程
3.2.2 配置J-LINK硬件调试
3.3 如何编译和下载程序
3.3.1 如何编译程序
3.3.2 如何下载程序
第4章 深入分析流水灯例程
4.1 STM32的GPIO
4.2 STM32的地址映射
4.2.1 温故而知新——stm32f10x.h文件
4.2.2 外设基地址
4.2.3 总线外设基地址
4.2.4 寄存器组基地址
4.3 STM32固件库对寄存器的封装
4.4 STM32的时钟系统
4.4.1 时钟树&时钟源
4.4.2 高速外部时钟
4.4.3 HCLK、FCLK、PCLK1、PCLK2
4.5 LED具体代码分析
4.5.1 实验描述及工程文件清单
4.5.2 配置工程环境
4.5.3 编写用户文件
4.5.4 初始化结构体——GPIO_InitTypeDef类型
4.5.5 初始化库函数——GPIO_Init()
4.5.6 开启外设时钟
4.5.7 控制I/O输出高、低电平
4.5.8 led.h文件
4.5.9 main文件
4.6 GPIO_Init()函数的实现
4.6.1 规范的位操作方法
4.6.2 GPIO_Init()实现代码分析
4.6.3 再论开发方式
4.7 开发步骤总结
第5章 调试程序
5.1 MDK软件仿真调试
5.2 使用J-LINK进行硬件调试
5.2.1 硬件调试
5.2.2 软件编译过程
5.3 MDK使用小技巧
第二部分 库开发中级篇
第6章 GPIO再举例之按键实验
6.1 GPIO的8种工作模式
6.1.1 4种输入模式
6.1.2 4种输出模式
6.2 按键实验分析
6.3 按键代码分析
6.3.1 实验描述及工程文件清单
6.3.2 配置工程环境
6.3.3 main文件
6.3.4 GPIO初始化配置
6.3.5 利用固件库的数据类型
6.3.6 实现LED反转
6.3.7 实验现象
第7章 EXTI之按键中断实验
7.1 STM32的中断和异常
7.2 NVIC中断控制器
7.2.1 NVIC结构体成员
7.2.2 抢占优先级和响应优先级
7.2.3 NVIC的优先级组
7.3 EXTI外部中断
7.4 中断检测按键实验分析
7.4.1 实验描述及工程文件清单
7.4.2 配置工程环境
7.4.3 main文件
7.4.4 配置外部中断
7.4.5 AFIO时钟
7.4.6 NVIC初始化配置
7.4.7 EXTI初始化配置
7.4.8 编写中断服务函数
7.4.9 实验现象
第8章 串口通信(USART)
8.1 异步串口通信协议
8.2 直通线和交叉线
8.3 串口工作过程分析
8.3.1 波特率控制
8.3.2 收发控制
8.3.3 数据存储转移
8.4 串口通信实验分析
8.4.1 实验描述及工程文件清单
8.4.2 配置工程环境
8.4.3 main文件
8.4.4 USART初始化配置
8.4.5 printf()函数重定向
8.4.6 USART1_printf()函数
8.4.7 实验现象
第9章 库函数开发小结
9.1 初始化
9.2 数据输入输出
9.3 状态位、标志位
9.3.1 事件
9.3.2 标志位的检查与清除
9.4 外设函数分类
第10章 DMA——为CPU减负
10.1 DMA功能简介
10.2 DMA工作分析
10.3 DMA实例之串口通信
10.3.1 实验描述及工程文件清单
10.3.2 配置工程环境
10.3.3 main文件
10.3.4 DMA初始化
10.3.5 使用DMA中断
10.3.6 实验现象
第11章 ADC实验(DMA方式)
11.1 ADC简介
11.2 STM32的ADC主要技术指标
11.3 ADC工作过程分析
11.4 ADC采集数据实例(采用DMA模式)
11.4.1 实验描述及工程文件清单
11.4.2 配置工程环境
11.4.3 main文件
11.4.4 ADC初始化
11.4.5 计算电压值
11.4.6 实验现象
第12章 SysTick(系统滴答定时器)
12.1 SysTick——操作系统的心跳
12.2 SysTick工作分析
12.3 使用SysTick精确延时实验分析
12.3.1 实验描述及工程文件清单
12.3.2 配置工程环境
12.3.3 main文件
12.3.4 配置并启动SysTick
12.3.5 定时时间的计算
12.3.6 编写中断服务函数
12.3.7 使用SysTick测量时间的功能
12.3.8 实验现象
第13章 STM32定时器
13.1 定时器功能简介
13.2 定时器工作分析
13.2.1 基本定时器
13.2.2 通用定时器
13.2.3 高级定时器
13.3 PWM输出实例分析
13.3.1 实验描述及工程文件清单
13.3.2 配置工程环境
13.3.3 main文件
13.3.4 定时器初始化
13.3.5 实验现象
第14章 I2C接口
14.1 I2C协议简介
14.1.1 物理层
14.1.2 协议层
14.2 STM32的I2C特性及架构
14.2.1 I2C接口特性
14.2.2 I2C架构
14.3 I2C接口读写EEPROM实验
14.3.1 实验描述及工程文件清单
14.3.2 配置工程环境
14.3.3 main文件
14.3.4 I2C接口初始化
14.3.5 对EEPROM的读写操作
14.3.6 使用I2C读写EEPROM流程总结
14.3.7 实验现象
第15章 SPI模块
15.1 SPI协议简介
15.1.1 SPI信号线
15.1.2 SPI模式
15.2 STM32的SPI特性及架构
15.2.1 STM32的SPI特性
15.2.2 STM32的SPI架构分析
15.3 SPI接口读取Flash实例分析
15.3.1 实验描述及工程文件清单
15.3.2 配置工程环境
15.3.3 main文件
15.3.4 SPI初始化
15.3.5 控制Flash的命令
15.3.6 读取厂商ID
15.3.7 擦除Flash内容
15.3.8 向Flash写入数据
15.3.9 从Flash读取数据
15.3.10 小结
15.3.11 实验现象
第16章 CAN控制器
16.1 CAN协议简介
16.1.1 物理层
16.1.2 CAN的报文种类及结构
16.1.3 同步
16.2 STM32的CAN特性及架构
16.2.1 CAN特性
16.2.2 CAN架构
16.3 双CAN通信实验分析
16.3.1 实验描述及工程文件清单
16.3.2 配置工程环境
16.3.3 main文件
16.3.4 配置CAN接口
16.3.5 打包报文
16.3.6 发送报文
16.3.7 接收报文、编写中断服务函数
16.3.8 实验小结
16.3.9 实验现象
第三部分 库开发高级篇
第17章 SDIO之SD卡驱动
17.1 SD协议简介
17.1.1 卡的种类
17.1.2 SDIO基本架构
17.2 STM32的SDIO接口
17.2.1 从SDIO的时钟说起
17.2.2 SDIO的命令格式
17.2.3 数据传输格式
17.3 SD卡读写实验分析
17.3.1 实验描述及工程文件清单
17.3.2 配置工程环境
17.3.3 main文件
17.3.4 SDIO初始化
17.3.5 卡的上电识别流程
17.3.6 卡的初始化流程
17.3.7 对SD卡进行读写
17.3.8 原版官方驱动例程的bug
17.3.9 实验现象
第18章 文件系统之FATFS_R0.09
18.1 什么是文件系统
18.2 FATFS文件系统简介
18.2.1 FATFS的目录结构
18.2.2 FATFS帮助文档
18.2.3 FATFS源码
18.3 移植FATFS文件系统实验
18.3.1 实验描述及工程文件清单
18.3.2 配置工程环境
18.3.3 为文件系统添加底层驱动
18.3.4 添加简体中文和长文件名支持
18.3.5 main文件
18.3.6 实验现象
第19章 MP3播放器
19.1 MP3文件探秘
19.1.1 文件格式
19.1.2 MP3文件的原始数据
19.1.3 MP3文件格式
19.2 VS1003硬件解码芯片
19.2.1 VS1003芯片简介
19.2.2 TDA1308芯片
19.3 MP3播放器实验
19.3.1 实验描述及工程文件清单
19.3.2 配置工程环境
19.3.3 main文件
19.3.4 控制VS1003进入准备状态
19.3.5 播放MP3文件
19.3.6 STM32的堆栈
19.3.7 实验现象
第20章 USB大容量存储器实例
20.1 USB协议分析
20.1.1 协议版本
20.1.2 USB电气特性
20.1.3 USB通信模型
20.1.4 USB枚举
20.2 STM32的USB控制器
20.3 USB读取SD卡——模拟U盘实验
20.3.1 实验描述及工程文件清单
20.3.2 配置工程环境
20.3.3 USB固件库说明
20.3.4 main文件
20.3.5 基本配置
20.3.6 USB初始化
20.3.7 中断服务函数
20.3.8 BOT和SCSI协议
20.3.9 实验现象
第21章 LCD触摸屏画板
21.1 LCD控制器简介
21.1.1 ILI9341控制器结构
21.1.2 像素点的数据格式
21.1.3 ILI9341的通信时序
21.2 用STM32驱动LCD
21.2.1 FSMC简介
21.2.2 用FSMC模拟8080时序
21.3 触摸屏感应原理
21.4 TSC2046触摸屏控制器
21.5 LCD触摸屏画板实验
21.5.1 实验描述及工程文件清单
21.5.2 配置工程环境
21.5.3 main文件
21.5.4 初始化FSMC模式
21.5.5 FSMC模拟8080读写参数、命令
21.5.6 液晶屏画点函数
21.5.7 触摸屏校正
21.5.8 检测触点、画点
21.5.9 实验现象
第22章 字库及BMP图片显示
22.1 什么是字模
22.2 制作字模
22.3 BMP图片格式
22.4 显示中英文及BMP图片实验
22.4.1 实验描述及工程文件清单
22.4.2 配置工程环境
22.4.3 main文件
22.4.4 显示汉字
22.4.5 在SD卡上读取与保存BMP图像
22.4.6 实验现象
第23章 OV7670摄像头驱动
23.1 摄像头的分类
23.1.1 数字摄像头与模拟摄像头的区别
23.1.2 CCD与CMOS的区别
23.2 OV7670介绍
23.2.1 OV7670功能框架
23.2.2 OV7670管脚封装
23.3 SCCB总线
23.3.1 SCCB接口定义
23.3.2 SCCB时序描述
23.4 摄像头模块
23.4.1 摄像头模块硬件介绍
23.4.2 OV7670输出时序
23.4.3 FIFO时序
23.4.4 摄像头的驱动原理
23.5 摄像头驱动实验
23.5.1 实验描述及工程文件清单
23.5.2 配置工程环境
23.5.3 main文件
23.5.4 SCCB总线的软件实现
23.5.5 初始化OV7670
23.5.6 采集并显示图像
23.5.7 实验现象
第24章 以太网及LwIP协议栈移植
24.1 互联网模型
24.2 以太网
24.2.1 PHY层
24.2.2 MAC子层
24.2.3 以太网控制器
24.3 MAC之上的网络层
24.3.1 为什么在MAC之上还有分层
24.3.2 TCP/IP协议中各层次的功能
24.3.3 LwIP协议栈
24.4 ENC28J60+LwIP以太网实验
24.4.1 实验描述及工程文件清单
24.4.2 配置工程环境
24.4.3 main文件
24.4.4 LwIP对底层数据结构的封装
24.4.5 初始化协议栈
24.4.6 LwIP对底层操作的封装
24.4.7 轮询和计时
24.4.8 opt.h文件和debug
24.4.9 LwIP应用
24.4.10 网页服务器
24.4.11 实验现象
第25章 Wi-Fi模块EMW3180驱动
25.1 资料与工具下载
25.2 EMW3180简介
25.3 EMW3180驱动实验
25.3.1 实验描述及工程文件清单
25.3.2 配置工程环境
25.3.3 EMSP_API函数
25.3.4 API函数一览
25.3.5 main文件
25.3.6 em380c_hal.c文件
25.3.7 实验现象
第四部分 库开发系统篇
第26章 μC/OS-Ⅲ及其源代码介绍
26.1 μC/OS简介
26.1.1 操作系统与裸机的区别
26.1.2 μC/OS实时操作系统
26.2 μC/OS-Ⅲ与μC/OS-Ⅱ的主要区别
26.3 μC/OS-Ⅲ源码
26.4 μC/OS-Ⅲ工程架构
第27章 移植μC/OS-Ⅲ到STM32
27.1 搭建μC/OS工程文件结构
27.2 修改μC/OS代码
27.2.1 修改os_cpu.h文件
27.2.2 修改os_cpu_c.c
27.2.3 修改os_cpu_a.asm文件
27.2.4 修改cpu_a.asm文件
27.2.5 修改startup_stm32f10x_hd.s文件
27.2.6 修改stm32f10x_it.c文件
27.3 编写用户文件
27.3.1 编写includes.h文件
27.3.2 编写BSP相关文件
27.3.3 创建任务
27.4 配置μC/OS-Ⅲ
第28章 运行多任务
28.1 创建用户任务
28.2 编写用户代码
28.3 任务执行流程
参考文献
光盘内容
前言
  前言
  单片机是对8/16位MCU(微控制器)的另外一种叫法。传统的8/16位单片机,久经岁月的洗礼,仍然在工业控制应用中大放光芒。然而,现在的工程师面对的更多的工业控制产品需求是多功能、易用界面、低功耗以及多任务等。基于这样的需求,以往的8/16位单片机已不能满足要求,工程师必须寻找新的符合要求的MCU。工程师虽然可以选择诸如ARM7、ARM9这类速度更快的32位MCU,但是鉴于对成本和开发门槛等种种考虑,它们还是不能满足需求。正是看准了这个市场,ARM公司推出了其全新的基于ARMv7架构的32位Cortex-M3微控制器内核。紧随其后,ST(意法半导体)公司就推出了基于Cortex-M3内核的MCU——STM32。STM32凭借其产品线的多样化、极高的性价比、简单易用的开发方式,迅速在众多Cortex-M3 MCU中脱颖而出,成为最闪亮的一颗新星。STM32一上市就迅速占领了中低端MCU市场,颇有星火燎原之势,这与它倡导的基于固件库的开发方式密不可分。采用库开发的方式可以快速上手,仅通过调用库里面的API(应用程序接口)就可以迅速搭建一个大型的程序,写出各种用户所需的应用,这就大大降低了学习的门槛和开发周期。然而,又因为在开发中只是调用API,而忽略了底层寄存器的操作,库开发被习惯了寄存器开发方式的工程师指为“于浮沙筑高台”,没有学习的价值。这种看法具有一定的片面性,他显然没有意识到这是一种全新的学习方法。试问,对于初学者,面对一个32位且有如此多寄存器的单片机,如果还像我们以往操作8位机,通过配置寄存器的方式来实现,那会是多么繁杂的一项工作?除此之外,库的开发方式自顶向下,它是迈向更高端嵌入式Linux开发的一个垫脚石。
  库开发已成主流,这是不争的事实。STM32固件库之所以流行并被大家所喜爱,可以归结为以下两个原因:
  (1)技术潮流
  1)于个人:库开发大大地降低了学习的门槛,提高了学习的效率,使个人初步了解了大的程序设计,是一种自顶向下的学习方法,可以从上层的API层层跟踪到底层,可以彻彻底底地了解寄存器,了解CPU的内存分布,再到启动代码、开发环境的配置等。如果再深究,还会涉及编译器甚至工具链。库的学习,可不仅仅是简单地调用API,我们需要去分析这个库是如何构建的,是如何从内存到寄存器,寄存器到结构体,结构体到更各层的API,再到层层外设的文件关联。这里面涉及了太多的C语言的知识,如关键字、宏、结构体、指针、类型转换、条件编译、断言、内联函数等。这些知识的学习,又岂能说是“于浮沙筑高台”。如果你的C语言还停留在基本语法的阶段,那么通过对库的使用和学习,你的C语言将会得到脱胎换骨的提升。学会了库开发还可以快速地迁移到ST其他系列单片机的学习,如STM32F207、STM32F407,这些MCU的固件库基本上都是兼容的。反观如此庞大的固件库,还要相互兼容,细心的人一定可以从中获益良多!
  2)于公司:在公司产品开发中,产品上市速度是非常重要的成功因素,库开发可以极大地缩短产品研发周期,以便快速抢占市场。而且库让程序的维护成本更低,程序的升级更快捷。用库来开发,真可谓事半功倍,一箭双雕。
  (2)市场趋势
  有人曾经质疑STM32的固件库降低了MCU的性能,然而,他却没有考虑到STM32的性能和资源已经不是传统的8/16单片机可比的了。强大的硬件应该与消耗这些资源的软件相匹配,否则资源就被浪费了。硬件和软件是相辅相成、共同促进的。所以硬件改善后,工程师对于MCU的关注应该从全局着眼。
  本书采用MDK开发环境,全部例程基于3.5.0版本的固件库讲解,不是简单地调用库,而是试图通过对固件库的使用详细讲解什么是库、为什么使用库、怎样使用库等一系列问题,进而引导读者使用高效率的库开发方法。
  本书采用原理分析、代码讲解、实验运用这三点连线的讲解方式,循序渐进,适合在校大学生和科研机构开发人员学习使用。全书分为四个部分,第一部分(第1~5章)是库开发初级篇,涉及入门的两个主题。一个是嵌入式工程师成长之路,属于方法论的问题,涉及了一个工程师从学生时代开始,在每一个不同的阶段应该学习什么、该如何进阶等。另一个是通过对库的了解和GPIO的学习,让读者快速掌握STM32的开发方法,这是入门的第一步。第二部分(第6~16章)是库开发中级篇,讲解了STM32各个外设的使用,是学习的一个进阶阶段,也是STM32学习的重中之重。第三部分(第17~25章)是库开发高级篇,是STM32各个外设的实战演练,如MP3、液晶、摄像头、Wi-Fi等,是属于项目实战的例子,一般可直接用于工程项目的开发。第四部分(第26~28章)是库开发系统篇,这是嵌入式系统开发的必经之路,是区别裸与不裸的分水岭;这部分讲解了μC/OS最新版本μC/OS-Ⅲ在STM32中的移植,通过该移植应用实践,相信可以为以后进阶到WinCE、Linux操作系统的学习打下坚实的基础。
精彩书摘
  嵌入式技术是专用计算机系统技术,它以应用为核心,以计算机技术为基础,软硬件均可裁剪,适用在对功能、稳定性、功耗有严格要求的系统之中。嵌入式技术的开发人员需要对整个计算机体系(从底层硬件到软件操作系统)都有了解,而在这个体系之中,每个部分都可以分出一些小领域,因而技术要求很高,见图1-1。
  这个图只是粗略地概括了嵌入式技术的知识结构,但从中已经可以看出它涉及的知识面非常广,难怪众多学生甚至技术人员总是“迷茫”。不少电子专业出身的嵌入式技术人员主要从事硬件抽象层(中间层)的开发,这一层是沟通嵌入式系统的硬件层和软件操作系统的桥梁,因而主要的工作是开发驱动程序、板级应用支持、协调软硬件的开发,因而对软硬件都要有深入的了解。
  若希望从事硬件抽象层的开发,应该如何学习这些知识,才能从学生过渡到工程师呢?见图1-2,对于希望成为其他方向的嵌入式技术人员也可以参考。
  从图1-2可以看出,越往上层深入,就越接近于纯软件开发,但这并不代表嵌入式技术人员就不需要了解硬件,相反,上层的知识都是以底层为基础的,很多人说的“做嵌入式软件开发至少要读懂原理图”就是这个道理。
  在嵌入式技术领域的公司,除了工程师还分很多职业岗位。一般公司的研发部门职位见图1-3。
  一般需要3~5年过渡到下一级的岗位,在小公司里项目经理一般也兼任部门经理。部门经理不一定要懂技术,并不是非由项目经理升职而成。直接与技术相关的是开发工程师和系统架构师,开发工程师会针对嵌入式技术的不同领域有不同的区分。在小公司里,熟悉软硬件的跨领域工程师很受欢迎,而大公司则分工明确,更看重在某领域研究得深入的开发工程师。作为系统架构师,则需要熟悉整个嵌入式领域,能够协调不同领域的开发工程师进行项目开发。
  对于职业规划,不同的人有不同的见解,情况千差万别,以上所述仅供读者参考。
  可以发现,在嵌入式领域STM32芯片介于低端和高端之间,它相对于普通的8/16位机有更多的片上外设,更先进的内核架构,可以运行μC/OS等实时操作系统;相对于可运行Linux操作系统的高端CPU,其成本低,实时性强。这个定位使得STM32不仅占领了大部分中端控制器的市场,更是成为提升开发者技术的优良过渡平台,为后续的学习打下坚实的基础。
  因为STM32的开发方式较普通的单片机开发还是有很大的不同,所以学习时要注意如下几点:
  1)转变思维,适应使用固件库的开发方式,加强运用C语言的能力,建立工程意识。
  2)熟悉Cortex-M系列芯片架构,了解CMSIS标准,熟悉STM32的总线架构。
  3)掌握I2C、SPI、SDIO、CAN、TCP/IP等各种通信协议,掌握了这些协议,开发软件驱动就变得相对容易了。
  上面有关的内容本书都会详细讲解,但“纸上得来终觉浅,绝知此事要躬行”,读者亲自编程实践是不能少的。
  初级篇可以帮助初学者快速上手STM32,写出自己的应用程序。以点亮LED灯的实例,从软件工程的角度深入剖析什么是固件库、为什么使用固件库和怎样使用固件库;从STM32固件库、新建工程、编译和下载程序出发,了解如何操作GPIO,让新手步步为营,尽享STM32的学习乐趣。
  我们对初学者的要求是具有基本的单片机基础,如51、AVR等,曾使用C语言写过单片机程序,但不需精通。读者在学习STM32的时候,无需太担心自己的基础,我们更需要的是学习的勇气,需要的是拿下STM32的决心。试问,我们刚开始学习最简单的单片机的时候,是不是也没基础呢,是不是因此就停止了自己学习的脚步了呢?不是的。我们需要做的是认定一个目标,行动起来,坚持朝向目标的苦行,其中艰辛芳华,唯你自知。