5.STM32上第一个程序-GPIO控制LED

转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂
第一部分、章节目录
3.5.1.STM32的GPIO模块数据手册详解1
3.5.2.STM32的GPIO模块数据手册详解2
3.5.3.原理图分析与MDK工程建立
3.5.4.写代码控制GPIO点亮熄灭LED1
3.5.5.写代码控制GPIO点亮熄灭LED2
3.5.6.STM32时钟设置函数移植与讲解1
3.5.7.STM32时钟设置函数移植与讲解2
3.5.8.STM32时钟设置函数移植与讲解3
3.5.9.STM32时钟设置函数移植与讲解4
3.5.10.STM32时钟设置函数移植与讲解5
3.5.11.在PZ6806L开发板上实现GPIO和时钟编程控制
3.5.12.在PZ6808L开发板上实现GPIO和时钟编程控制1
3.5.13.在PZ6808L开发板上实现GPIO和时钟编程控制2
3.5.14.STM32外设编程经验总结

第二部分、章节介绍
3.5.1.STM32的GPIO模块数据手册详解1
本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各种模式及其配置方法。
3.5.2.STM32的GPIO模块数据手册详解2
本节继续讲解STM32的数据手册中GPIO部分,主要是GPIO配置的寄存器列表及寄存器位详解。
3.5.3.原理图分析与MDK工程建立
本节分析ARM3.0的GPIO控制LED相关的原理图,并且建立MDK工程,简单讲一下启动文件。
3.5.4.写代码控制GPIO点亮熄灭LED1
本节编写代码控制GPIO以点亮熄灭LED,主要内容是寄存器地址的确定以及使用C语言操作寄存器的编程技巧。
3.5.5.写代码控制GPIO点亮熄灭LED2
本节解决了时钟模块没打开的问题,并且定义了宏来访问寄存器,使我们的代码更加规范。
3.5.6.STM32时钟设置函数移植与讲解1
本节移植STM32时钟设置函数,并且结合前面课程讲过的时钟框图对时钟设置函数进行讲解
3.5.7.STM32时钟设置函数移植与讲解2
本节接上节继续移植时钟部分的设置代码,到了HSE时钟稳定阶段
3.5.8.STM32时钟设置函数移植与讲解3
本节完成时钟设置的源码移植并且进行测试。
3.5.9.STM32时钟设置函数移植与讲解4
本节使用调试的方式寻找代码中的问题,解决了超时计算的bug和if判断中的bug,但是时钟还是有问题不能工作
3.5.10.STM32时钟设置函数移植与讲解5
本节添加了FLASH ACR寄存器相关的操作代码后,时钟终于正常工作了。并且通过flash函数的闪烁速度对比可以明显看出PLL启动后主频发生了改变。
3.5.11.在PZ6806L开发板上实现GPIO和时钟编程控制
本节在PZ6806L开发板上移植实现GPIO的控制和时钟模块的编程,这种移植可以让大家学会在不同硬件差异下编程的相同点和不同点。
3.5.12.在PZ6808L开发板上实现GPIO和时钟编程控制1
本节在PZ6808L开发板上移植实现GPIO的控制和时钟模块的编程,让大家看看在F4上编程和F1上有什么差异
3.5.13.在PZ6808L开发板上实现GPIO和时钟编程控制2
本节接上节在PZ6808L开发板上移植实现GPIO的控制和时钟模块的编程.
3.5.14.STM32外设编程经验总结
本节对整个课程进行总结,并对比了51单片机和stm32单片机外设编程的差别,告诉大家stm32学习的关键点和思路方法。

第三部分、随堂记录
3.5.1.STM32的GPIO模块数据手册详解1

3.5.2.STM32的GPIO模块数据手册详解2

3.5.3.原理图分析与MDK工程建立
3.5.3.1、硬件接线
(1)杜邦现连接P0端口到LED接口J12,这样相当于8个LED分别对应PB8-PB15
(2)因为GPIO接到了LED的正极,所以输出1就表示亮,0表示灭
3.5.3.2、MDK工程建立
注意:单片机中用到的C语言其实不是标准的,而是有点定制性的C语言。
之前认识:整个程序从main函数开始执行,main执行完了整个程序就完了。
起始代码:从CPU复位开始执行的第1句指令,到main函数之前所做的事情就是起始代码。
3.5.3.3、关于其实代码
(1)其实代码是哪里来的
(2)不同的CPU的其实代码一般是不同的
(3)起始代码是用汇编写的,一般不需要看懂,知道点就行了

3.5.4_5.写代码控制GPIO点亮熄灭LED1_2
3.5.4.1、寄存器信息确认
(1)STM32 PortB的起始地址是:0x40010C00
(2)有可能涉及到的GPIO的地址:
寄存器名 偏移量 寄存器地址
GPIOB_CRL 0x00 0x40010C00
GPIOB_CRH 0x04 0x40010C04 *
GPIOB_IDR 0x08 0x40010C08
GPIOB_ODR 0x0C 0x40010C0C *
GPIOB_BSRR 0x10 0x40010C10 ?
GPIOB_BRR 0x14 0x40010C14 ?

3.5.4.2、C语言操作寄存器
(1)ARM是内存与IO统一编址的,所以ARM中的所有外设都是通过寄存器的方式来操作的
(2)每个寄存器都有地址,C语言通过这些地址来操作这些寄存器位,用到的C语言技巧主要是C语言的位操作和C语言指针。
(3)常见面试题:用C语言向内存地址0x30000004写入16
*(unsigned int *)0x30000004 = 16; 或者:
unsigned int *p = (unsigned int *)0x30000004; *p = 16;

3.5.6_7.STM32时钟设置函数移植与讲解1_2
3.5.6.1、时钟模块回顾
(1)一个疑惑:前面代码并没有设置时钟为什么能够运行
(2)时钟框图
3.5.6.2、时钟设置示例代码分析
(1)相关寄存器及定义
(2)代码详解
RCC->CR 就相当于是rRCC_APB2ENR

3.5.6.3、时钟代码移植

3.5.8_9_10.STM32时钟设置函数移植与讲解3_4_5

3.5.11.在PZ6806L开发板上实现GPIO和时钟编程控制
硬件:LED1-8接PC0-7,GPIO接到负极所以输出0就亮

3.5.12_13.在PZ6808L开发板上实现GPIO和时钟编程控制1_2
硬件:LED1-2接PF9-10,GPIO接负极输出0就亮

学到了什么:
1、F1和F4在寄存器级别是不兼容的,F1的程序不能直接拿过来到F4去用
2、不管是F1还是F4(甚至是其他的ARM的CPU),他们写代码的思路和方法都是一样的,用到的C语言的技巧和调试思路也是一样的
3、当你接触一个新东西的时候,有很多未知会带来一些不可知的变化和bug,这个时候需要耐心和毅力,去和能work的正确的示例去对比,去查找,去发现,去验证。
4、F4的开发比F1要复杂一些,所以学习要强调按部就班,有F1基础后再去学F4,F4的开发更多依赖于库(官方事先准备好的一些代码)基本上不会自己完全从头去操作寄存器去写了。

3.5.14.STM32外设编程经验总结
3.5.14.1、STM32和51或其他简单单片机的相同
(1)开关环境都是Keil
(2)都是看原理图和数据手册
(3)都是用C语言
3.5.14.2、STM32和51或其他简单单片机的不同
(1)工程会更复杂,会用到Keil的一些高级设置
(2)原理图和数据手册比简单单片机更复杂(复杂不是难)
(3)STM32会用到C语言的更多高级特性
3.5.14.3、外设编程思路
(1)都是套路
(2)会出现问题,这时候就需要调试能力(不一定非要调试器)
(3)注意熟悉和体会这种套路,后面引入库函数就是从这里讲起的

你可能感兴趣的:(STM32)