2016年4月11日 星期一

[books] - 學習 stm32f4 的若干書籍

我不是一個能從網路資訊拼湊出知識進而學習的人, 大多時候我都是去找一本適合的書來仔細閱讀, 這是很偷懶/舒服的學習方式, 省去找資料的時間。

以下是我學習 stm32f4 購買的書籍, 和大家分享之。

arm cortex-m3: 嵌入式系統設計入門
20130326 購於 ruten, 20130329 拿到 390 NT。
這本書很奇怪, 在我知道的時候似乎已經絕版了, 所以我才會從二手市場購得本書。

有位朋友還是直接詢問旗標出版社才買到, 剛好有庫存。

不過目前 (201310), 出版社似乎又繼續出版了, 大概是目前的 cm3 蠻流行的, 此書的需求性變高了吧!

我認為這是本學習 cm3 一定要買的書籍, 目前簡體中文已經有了第三版, 建議購買那本。這本可算是 arm 官方出版的吧。裡頭介紹了 cm3 的架構, 相關暫存器的使用方式, gnu, keil toolchin 的使用。

chapter 5 提到記憶體相關架構, bit-band 我之前一直搞不清楚, 後來看了這本才懂, 其實是很簡單的東西。還有 ldrex/strex 這兩個 exclusive access 指令, 因為 cm3 沒有 swp, 需要用這兩個指令來實作 mutex/spin lock, 這是 atomic 的操作, 我就是看了這章, 花了好大功夫實作出 spin lock。

p5-12 有個小方格有介紹 bit-band & bit-bang; p 5-7 介紹 bit-band 運算, 書上寫的很清楚,不難理解。

chapter 7, 8, 9, 11 是相關的, 都在談中斷/例外, 講述如何操作 nvic 暫存器, 中斷行為, cm3 特有的中斷特性。我花了不少時間重新瀏覽這幾章的內容, 算是 cm3 的重點。

p7-2 整理了系統所有的例外 (表 7-1)

p8-9 0xe000ed04 可以用來得知目前執行的是哪個中斷服務程式。



Cortex-M3之STM32嵌入式系统设计
這是我為了學習 stm32f407 第一本買的書。

這本書吸引我的原因是以 gcc 來當作書中的開發工具, 而不是比較流行的 iar, KEIL ... 我需要的正是這樣的書籍。

5.5.2 link script 的介紹更是深得我心, 我終於知道為什麼我老是搞不清楚 AT LMA/VMA 的區別, 因為我沒接觸過這樣的平台, x86 pc 不會有這樣的分野, 所以無法感受出 LMA/VMA 的差別, 有著 1M flash 和記憶體從 0x20000000 定址的 stm32 平台, 比較容易察覺 LMA/VMA 的用途。

ref:
Linker Script,LMA,VMA

不過當然不只這樣, 還有很多 LD 相關的資訊, 我覺得很受用, 基本上若是不懂 link script, 應該是無法寫出作業系統之前的程式, 當然, 若是用廠商提供的工具/函式庫, 這些都不用煩惱。但把這些知識補完, 是很重要的。
目录

前言
第1章 概述
1.1 嵌入式系统定义
1.2 嵌入式系统的发展
1.2.1 从单片机到嵌入式系统
1.2.2 从芯片级设计到系统级设计
1.2.3 从面向器件到面向任务的设计
1.2.4 从单处理器设计到多处理器设计
1.3 嵌入式系统的应用
1.4 ARM系列嵌入式系统处理器
1.4.1 ARM处理器分类
1.4.2 ARM Cortex处理器
1.4.3 ARM Coretx-M3处理器
1.4.4 ARM Cortex-A8处理器
1.5 从8/16位处理器到ARM Cortex-M3/M
1.6 常见的Cortex-M0/M3系列MCU

第2章 STM32最小系统设计
2.1 STM32F103C最小系统设计方案
2.2 最小系统设计的要素
2.2.1 STM32外部晶振
2.2.2 复位电路
2.2.3 LED、Key及BOOT跳线
2.2.4 稳压电源及ISP下载口
2.2.5 IO端口
2.3 PCB图设计

第3章 STM32程序设计入门
3.1 STM32入门之Hello World程序
3.1.1 开发环境
3.1.2 编写STM32的C程序
3.1.3 用GCC编译stm32程序

3.1.4 STM32程序下载
3.1.5 在Obtain_Studio中编译Hello World程序
3.2 不同开发板的Hello World程序
3.3 基于STM32固件库的入门程序
3.3.1 STM32固件库
3.3.2 STM32固件库外设的初始化和设置
3.3.3 基于STM32固件库的程序设计
3.4 基于STM32固件库的Hello World程序代码分析

第4章 GPIO应用
4.1 认识STM32 GPIO
4.1.1 GPIO功能特点
4.1.2 STM32 IO口的优点
4.1.3 STM32固件库中提供的GPIO库函数
4.2 KEY_LED程序
4.2.1 创建stm32_C++KEY_LED项目
4.2.2 stm32_C++KEY_LED项目程序分析
4.3 低层代码分析
4.3.1 GPIO端口的定义
4.3.2 AHB/APB桥的配置
4.3.3 GPIO引脚的配置
4.3.4 GPIO的读写

第5章 GCC编译器的安装与应用
5.1 GCC介绍
5.1.1 GCC概述
5.1.2 MinGW简介
5.1.3 MinGW的安装
5.1.4 MinGW测试
5.1.5 常见GCC用法
5.2 ARM GCC编译器
5.2.1 WinARM编译器
5.2.2 Sourcery G++ Lite for ARM EABI编译器
5.3 Obtain_Studio集成开发系统
5.3.1 Obtain_Studio集成开发系统介绍
5.3.2 Obtain_Studio集成开发系统常用技巧
5.4 GCC Make编译文件设计
5.4.1 GCC Make常用命令
5.4.2 makefile文件规则
5.4.3 makefile文件函数
5.5 GCC编译器LD脚本
5.5.1 C/C++程序内存空间
5.5.2 GCC LD脚本基础
5.5.3 STM32程序中的LD脚本程序

第6章 STM32外部中断
6.1 STM32外部中断
6.2 STM32外部中断实例
6.3 STM32中断配置
6.3.1 STM32外部中断程序分析
6.3.2 中断通道配置
6.3.3 中断优先级配置
6.3.4 外部中断模式配置
6.3.5 外部中断响应函数配置

第7章 面向对象程序设计
7.1 程序风格
7.1.1 程序风格的比较
7.1.2 编程风格在程序设计中的作用
7.2 跨越开发板
7.2.1 端口映射的方法
7.2.2 模式设置的方法
7.3 分类与封装
7.3.1 什么是分类与封装
7.3.2 封装的实现
7.4 隐藏与权限
7.4.1 隐藏
7.4.2 权限
7.5 继承
7.5.1 CGpio类的继承
7.5.2 测试CLed和CKey类
7.6 组装
7.6.1 GPIO的组装
7.6.2 GPIO组装的测试
7.7 C++在嵌入式系统中的应用
7.7.1 C++介绍
7.7.2 兼容C语言
7.7.3 在C++程序中调用C函数
7.7.4 面向对象程序设计语言
7.7.5 泛型编程语言
7.7.6 STL编程
7.7.7 接口编程

第8章 USART通信
8.1 从51单片机到STM32的串口通信
8.2 USART通用串口通信设计
8.2.1 USART通用串口
8.2.2 USART通用串口通信设计方案
8.3 USART通用串口程序设计入门
8.3.1 USART数据发送程序设计
8.3.2 USART数据接收程序设计
8.4 中断方式的数据接收
8.4.1 中断方式的数据接收程序设计
8.4.2 多个串口驱动对象的协同工作
8.5 USART驱动程序的设计
8.5.1 USART驱动程序
8.5.2 printf与cout的实现
8.6 深入STM32 USART的工作原理
8.6.1 USART工作原理
8.6.2 发送器
8.6.3 接收器
8.6.4 USART初始化函数USART_Init
8.6.5 USART波特率的计算方法

第9章 STM32的工作原理
9.1 STM32启动原理
9.1.1 STM32启动过程分析
9.1.2 STM32软件复位与功耗控制
9.2 系统时钟分析
9.2.1 系统时钟种类
9.2.2 STM32固件库设置时钟
9.2.3 系统时钟配置
9.3 存储器以及存储器映射
9.4 NVIC嵌套中断向量控制器
9.4.1 NVIC嵌套中断向量控制器
9.4.2 STM32的NVIC优先级
9.5 STM32向量表及配置
9.5.1 STM32复位后从哪个地址开始执行
9.5.2 STM32向量表
9.5.3 用户程序中的向量表

第10章 定时器与日历
10.1 SysTick定时器
10.1.1 关于SysTick
10.1.2 SysTick测试程序
10.1.3 SysTick程序分析
10.2 RTC定时器
10.2.1 RTC定时器介绍
10.2.2 RTC的本质与测试程序
10.2.3 日历算法
10.2.4 STM32的RTC日历测试程序
10.2.5 STM32 RTC程序分析
10.2.6 RTC秒中断
10.2.7 RTC闹钟
10.2.8 RTC校准
10.3 通用定时器
10.3.1 STM32定时器的种类
10.3.2 通用定时器介绍
10.3.3 通用定时器基本应用程序设计
10.3.4 通用定时器常用模式
10.3.5 输出模式测试实例
10.3.6 输入捕获模式测试实例

第11章 ADC应用
11.1 ADC与数字信号处理系统设计
11.1.1 数字信号处理系统设计
11.1.2 STM32简单的ADC应用实例
11.1.3 过采样技术
11.1.4 欠采样技术
11.2 STM32的ADC简介
11.3 STM32 ADC入门实例
11.3.1 STM32 ADC入门测试程序
11.3.2 STM32 ADC程序分析
11.3.3 STM32内部温度测量
11.4 STM32 ADC注入方式
11.4.1 STM32 ADC注入方式简介
11.4.2 STM32双ADC模式
11.4.3 STM32 ADC注入方式实例

第12章 DMA应用
12.1 STM32的DMA简介
12.1.1 任务转移策略
12.1.2 STM32的DMA功能
12.2 DMA在ADC中的应用
12.2.1 任务转移策略的DMA ADC应用实例
12.2.2 DMA_ADC程序分析
12.3 DMA在USART中的应用
12.3.1 任务转移策略的USART DMA数据发送
12.3.2 任务转移策略的USART DMA数据接收
12.3.3 任务队列策略的USART DMA发送中断应用
12.3.4 任务循环策略的USART DMA接收中断应用

第13章 备份寄存器与看门狗程序
13.1 STM32备份寄存器
13.1.1 备份寄存器特点
13.1.2 BKP应用实例
13.2 STM32看门狗
13.2.1 STM32看门狗介绍
13.2.2 独立看门狗介绍
13.2.3 独立看门狗程序设计
13.2.4 窗口看门狗介绍
13.2.5 窗口看门狗测试程序

第14章 TFT驱动与显示
14.1 LCD概述
14.1.1 LCD简介
14.1.2 LCD接口
14.2 Ili9xx系列TFT驱动芯片
14.3 TFT测试程序
14.3.1 TFT测试程序准备工作
14.3.2 TFT测试主程序
14.3.3 字符的显示
14.4 基于FSMC的TFT驱动程序设计
14.4.1 STM32的FSMC功能
14.4.2 FSMC与TFT端口连接与端口映射
14.4.3 FSMC与TFT的内存空间映射与操作
14.4.4 FSMC初始化
14.4.5 TFT初始化
14.4.5 TFT驱动程序统一接口函数的实现
14.5 基于GPIO的TFT驱动程序设计

第15章 触摸屏驱动
15.1 触摸屏介绍
15.2 触摸屏驱动IC
15.3 触摸屏测试项目
15.4 触摸屏驱动程序分析
15.5 触摸屏校准
15.5.1 触摸屏校准算法
15.5.2 触摸屏校准的实现

第16章 SD卡驱动与FAT文件系统
16.1 STM32的SDIO接口
16.1.1 常见存储卡种类
16.1.2 SD卡结构
16.1.3 STM32的SDIO接口
16.2 FAT文件系统
16.2.1 FAT文件系统概述
16.2.2 FatFs介绍
16.3 STM32 SDIO接口
16.4 SD卡文件读写实例
16.4.1 准备工作
16.4.2 SD卡文件读写实例
16.4.3 SD卡文件操作类CFile的设计
16.4.4 目录操作

第17章 μC/OS-Ⅱ在STM32上的移植
17.1 μC/OS-Ⅱ概述
17.1.1 μC/OS-Ⅱ简介
17.1.2 μC/OS-Ⅱ的组成部分
17.2 μC/OS-Ⅱ移植到STM
17.3 μC/OS-Ⅱ工作原理
17.3.1 μC/OS-Ⅱ启动过程
17.3.2 任务切换的相关函数解析

第18章 汉字与图形图像显示
18.1 汉字显示
18.1.1 汉字库
18.1.2 程序中加入汉字库实现汉字显示
18.1.3 使用SD卡上的汉字库实现汉字显示
18.2 图形绘制
18.3 图像显示
18.3.1 位图与bmp文件格式
18.3.2 bmp文件操作
18.3.3 bmp图像显示测试程序

第19章 摄像头驱动与图像采集
19.1 摄像头接口
19.1.1 图像传感器
19.1.2 OV7670摄像头
19.1.3 CMOS摄像头接口
19.2 CMOS摄像头测试程序
19.3 深入CMOS摄像头驱动程序原理
19.3.1 SCCB协议
19.3.2 SCCB协议驱动程序设计
19.3.3 CMOS摄像头驱动程序设计

第20章 以太网及Web远程控制系统设计
20.1 ENC28J60以太网控制器
20.2 网络测试程序
20.2.1 Web Server测试
20.2.2 UDP通信测试
20.3 IP/ICMP协议与Ping命令的实现
20.3.1 以太网数据包结构
20.3.2 IP协议
20.3.3 ICMP协议
20.3.4 Ping命令
20.3.5 Ping命令的实现
20.4 UDP通信原理
20.4.1 UDP协议
20.4.2 UDP通信的实现
20.5 Web Server程序设计
20.5.1 Web Server原理
20.5.2 TCP设计
20.5.3 Web Server设计
20.6 ENC28J60驱动程序设计
20.6.1 STM32 SPI接口
20.6.2 STM32 SPI驱动程序
20.6.3 ENC28J60驱动程序
参考文献


書中雖然展示的是 gnu toolchain, 不過是在 windows 環境, 而且還用了一個 ide, 和我原始人的開發環境有些差別, 不過已經很類似了。

第三章的 STM32程序设计入门讓我得以完成第一支 cm3 作業系統之前的程式, 這是很重要的一小步, 完成之後才會有後續複雜的程式。

嵌入式系統大部份都會使用 c, 這本書很罕見的提供 c++ 資訊, 使用 class 來完成嵌入式程式, 我很喜歡 c++, 所以我也打算使用 c++, 可以從本書獲得一些參考資料。




STM32F207 高性能网络型 MCU 嵌入式系统设计
20130618 購於台南若水堂 307 nt/59 rmb。

其實我只想看第 15 章, 提到 process switch 的部份, 所以我猶豫很久, 才決定買了下來。其他章節其實還是有可看之處。

我已經寫了一個 process switch 的版本, 不過這是我自己胡思亂想寫出來的, 我並不確定這是所謂一般的寫法, 所以我還是參考一下 scmrtos 的寫法 (書中介紹的實作便是 scmrtos), 彌補自己的不足。

果然有所不足, context switch 需要使用 pendsv, 所以要補上這個才比較完整。

裡頭提到了 scmrtos: 這是 c++ 寫的 rtos, 書中的 process switch 範例就是以他為主的說明。

就算我有了 x86 context switch 的經驗, 也還是花了不少時間才弄懂這樣的寫法, cm3 process switch 便是我的心得。
目录

第1章 ARM Cortex处理器概述 
第2章 从STM32F1到STM32F2的硬件兼容性设计 
第3章 从STM32F1到STM32F2的程序设计 
第4章 STM32F2固件库的使用 
第5章 STM32F2的启动原理及时钟控制 
第6章 STM32F2新增的FSMC接口及LCD屏控制 
第7章 STM32F2新增的日历功能及应用 
第8章 STM32F2中断及SysTick应用 

第9章 STM32F2增强的闹钟、时间戳与篡改检测 
第10章 STM32F2增强的定时器 
第11章 STM32F2新增的ETH以太网接口及LwIP应用 
第12章 STM32F2新增的DCMI数码相机接口及应用 
第13章 STM32F2增强的USART接口与应用 
第14章 STM32F2增强的ADC模块及应用 
第15章 一步一步设计自己的嵌入式操作
系统 第16章 一步一步设计自己的嵌入式GUI库 
参考文献 

STM32F207 高性能网络型 MCU 嵌入式系统设计範例程式碼 (需要註冊):
http://www.buaapress.com.cn/filedetail.php?ddid=205&pdtid=1&sdtid=3&pmenuid=5





20140507 購於台南若水堂 359nt
後來同個作者出了 stm32f4 的版本, 這比較符合我的需求。我從這本學到了 ccm 和浮點相關的部份。


















20150920 成大若水堂 268nt

《STM32自学笔记》随书资料, 我在 http://bbs.cepark.com/ 找不到, 最後在 《STM32自学笔记 - 随书资料.rar》找到。

這本我打算用來學習 spi, 可惜還沒學成。

由於我已經完成了 spi 的程式, 這本大概就會比較少翻了。請參考:
作業系統之前的程式 for stm32f4discovery (18.3) - 載入並執行 sd card 上的 elf































嵌入式系统及其应用:基于Cortex-M3内核和STM32F103系列微控制器的系统设计与开发, 這本有點像是大雜會, 包含的內容很廣, 有點像是 arm cortex-m3: 嵌入式系統設計入門 + Cortex-M3之STM32嵌入式系统设计。買這本最主要是看上其談論 cm3 架構的部份。這本書不推薦, 不是不好, 而從其他書就可以獲取類似的知識了。































精通STM32F4(库函数版) 精通STM32F4(寄存器版)
20160103 購於台南若水堂 356 nt X 2, 這兩本書的價錢一樣。

書中教材都在這: http://www.openedv.com/thread-13912-1-1.html

甚至連這兩本書也在其中, 真是太佛心了, 所以沒有買書的朋友也可在 https://pan.baidu.com/s/1dEQxWDN 下載這本書。



書中介紹一些書籍, 不過都用中文名稱, 但有些其實是英文手冊, 我把這些英文對照列出:
  • STM32F3与F4系列Cortex M4内核编程手册 - PM0214 Programming manual STM32F3 and STM32F4 Series Cortex®-M4 programming manual
  • Cortex M3与M4权威指南 (fig 10)
這兩本我都只看了前五章, 很受用, 讓我理解了 clock source tree 那些很複雜的參數設定, M, N, P, Q, R, 這些神祕的參數, 強烈建議看過一次。

暫存器的版本針對暫存器的讀寫來完成這些程式, 而庫函式的版本則是使用 stm32 提供的函式庫 (不是 cube 而是舊的那套) 來完成一樣的功能, 不過在前 5 章還是有些小地方的差異, 仔細閱讀能得到更多。

gpio和 usart 也提供了很仔細的說明。

寄存器 (暫存器) 的版本:
5.2.5 p81 詳細介紹了 gpio 的暫存器操作, stm32f407 gpio 的設定真的很煩雜, 除了軟體還有硬體相關的知識才能搞懂它。
ref: STM32输入输出模式理解

库函数版的 gpio AF 用法, 讓我理解 AF 繁雜的設定。

《STM32开发指南》ALIENTEK战舰STM32开发板资料公布
有不少學習資料



這兩本書也相當實用, 說明了 cube 新的函式庫用法, 裡頭的 sdram 說明也很不錯。



fig 10
還沒看




























20161016 購於文今二手書店 390nt
這本定價 780, 我覺得真的太貴了, 而且我有 cm3 的版本了, 所以一直沒有下手, 等到二手書才出手, 390 也不算便宜。

1 則留言:

  1. 能否分享一下《Cortex-M3之STM32嵌入式系统设计》的光盘代码

    回覆刪除

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。