赞
踩
数据手册第8章:通用和复用功能I/O(GPIO 和AFIO)
3.4.1.1、GPIO功能描述
(1)每个I/O端口(GPIOx)包含的寄存器
(2)每个端口的每个位可以由软件分别配置成多种输入输出模式。
详细了解可以看这个文件:GPIO输入输出模式详解
(3)每个端口都可以配置三种最大输出翻转速度
在配置寄存器里设置即可
后面都是关于硬件设计的,只要做了解即可!
(4)外设的GPIO配置
PS:GPIO端口和引脚的关系:一个GPIO端口是一组GPIO引脚,一个引脚就是在板子上的一个接线点,比如下面,PA是一个GPIO端口,PAx(x=0...15)就是一个引脚
(1)GPIO寄存器描述
端口位清除寄存器 端口位清除寄存器(GPIOx_BRR) (x=A..E)
端口配置锁定寄存器 端口配置锁定寄存器(GPIOx_LCKR) (x=A..E)
(2)复用
AFIO的起始地址:0x4001 0000
3.4.3.1、硬件接线
(1)杜邦现连接P0端口到LED接口J19,这样相当于8个LED分别对应PB8-PB15
(2)LED是共阴,所以GPIO输出0就亮,输出1就灭!
接线如下:
3.4.3.2、MDK工程建立
(1)根据STC51的经验
- int main(void)
- {
-
- }
原因在于,我们没有给它加启动文件!
- ;从启动文件都main.c代码段
- ; Reset Handler
-
- Reset_Handler PROC
- EXPORT Reset_Handler [WEAK]
- IMPORT __main
- LDR R0, =__main
- BX R0
- ENDP
再次编译就无误了!
至此,一个新建立的工程就算完成了,目前还没开始在main.c中写代码!
3.4.4.1、编程思路
3.4.4.2、寄存器信息确认
(1)STM32 GPIOB的起始地址是:0x40010C00
(2)有可能涉及到的GPIO的地址:
(3)会用到的寄存器
3.4.4.3、C语言操作寄存器
(1)ARM是内存与IO统一编址的
(2)每个寄存器都有地址
(3)常见面试题:用C语言向内存地址0x30000004写入16,如何做?
- *(unsigned int *)0x30000004 = 16;
- 或者
- unsigned int *p = (unsigned int *)0x30000004;
- *p = 16;
(4)编程
(5)代码如下(但是你会发现,灯根本不亮,为什么呢?后面分析)
-
- #define GPIOB_CRH 0x40010C04
- #define GPIOB_ODR 0x40010C0C
-
- int main(void)
- {
- //GPIOB设置成推挽输出模式,速度是50MHz
- *((unsigned int *) GPIOB_CRH) = 0x33333333;
- *((unsigned int *) GPIOB_ODR) = 0x00000000;
- //也可以用BSRR将PB8-PB15都复位成0
- //*((unsigned int *) GPIOB_BSRR) = 0xff000000;
- while(1);
- }
3.4.6.1、LED不亮问题解决
(1)为什么LED灯不亮呢?
(2)GPIO的时钟使能如何实现?
通过查询RCC寄存器组的基地址和RCC_APB2ENR的地址偏移量,得到RCC_APB2ENR的地址为0x40021018
- #define GPIOB_CRH 0x40010C04
- #define GPIOB_ODR 0x40010C0C
- #define RCC_APB2ENR 0x40021018
-
- int main(void)
- {
- //GPIO时钟使能
- *((unsigned int *)RCC_APB2ENR) = 0x00000008;
- //GPIOB设置成推挽输出模式,速度是50MHz
- *((unsigned int *) GPIOB_CRH) = 0x33333333;
- *((unsigned int *) GPIOB_ODR) = 0x00000000;
-
- while(1);
- }
3.4.6.2、GPIO点亮LED灯的流程
到这里我们基本上已经完成了GPIO点亮小灯的设置,下面是关于官方时钟示例代码的移植。为什么移植?
上节课讲过,上电复位之后,系统的默认时钟是内部的HSI,我们研究下如何将时钟从HSI转换到HSE。
3.4.6.4、时钟代码移植
官方示例代码:LED闪烁
重点是:void Set_SysClockTo72MHz(void);
新建rcc.h和rcc.c实现HSI—>HSE的转换!主要是根据时钟框图
咱们时钟配置过程:HSE OSCIN(8M)——PLLSRC——PLLMUL(倍频*9=72M)——PLLCLK——SYSCLK(72M)—— AHB预分频(*1)——APB2(*1=72M)——PCLK2
3.5.7.1、STM32和51或其他简单单片机的相同
(1)开关环境都是Keil
(2)都是看原理图和数据手册
(3)都是用C语言
3.4.7.2、STM32和51或其他简单单片机的不同
(1)工程会更复杂,会用到Keil的一些高级设置
(2)原理图和数据手册比简单单片机更复杂(复杂不是难)
(3)STM32会用到C语言的更多高级特性
3.4.7.3、外设编程思路
(1)都是套路
(2)会出现问题,这时候就需要调试能力(不一定非要调试器)
(3)注意熟悉和体会这种套路,后面引入库函数就是从这里讲起的
本节课结束!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。