关注同名微信公众号“混沌无形”,阅读更多有趣好文!
1.引脚是否兼容5V的判断:引脚表中PF表示5V,原理图中有ADC的引脚为3.3V
2.PT:容忍5V,没有PT标示,就不能
3. 每组IO口含下面7个寄存器。7个寄存器,一共可以控制一组GPIO的16个IO口
- GPIOx_CRL :端口配置低寄存器
- GPIOx_CRH:端口配置高寄存器
控制着每个IO的模式和输出速率
- GPIOx_IDR:端口输入寄存器
- GPIOx_ODR:端口输出寄存器
- GPIOx_BSRR:端口位设置/清除寄存器
- GPIOx_BRR :端口位清除寄存器
- GPIOx_LCKR:端口配置锁存寄存器
(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出
详细见点击打开链接
4.新建头文件:
#ifndef _LED_H
#define _LED_H
内容
#endif
5.ifdef条件编译:满足一定条件,编译一组语句,不满足时,编译另一组
#ifdef 标识符(一般已经用#define定义了)
程序段1
#else
程序段2
#endif
或者:
#ifdef 标识符(一般已经用#define定义了)
程序段1
#endif
6.GPIO初始化实例(通过操作CRH和CRL寄存器来配置)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO
7.读取IO的电平状态-IDR
在固件库中操作 IDR 寄存器读取 IO 端口数据是通过 GPIO_ReadInputDataBit 函数实现的:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
比如读 GPIOA.5 的电平状态,方法是:
GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);
返回值是 1(Bit_SET)或者 0(Bit_RESET);
8.控制IO的输出电平-ODR
在固件库中设置ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现的:
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
该函数一般用来往一次性一个 GPIO 的多个端口设值。
9.配置BSRR寄存器——端口位设置/清除寄存器,和ODR类似(设置IO输出位)
BRR寄存器是端口位清除寄存器
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//置1,输出为高
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//置0,输出为低
设置 GPIOB.5 输出 1,那么方法为:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
反之如果要设置 GPIOB.5 输出位 0,方法为:
GPIO_ResetBits (GPIOB, GPIO_Pin_5);
10.IO的一般操作步骤:
1) 使能 IO 口时钟。调用函数为 RCC_APB2PeriphClockCmd()。
2) 初始化 IO 参数。调用函数 GPIO_Init();
3) 操作 IO。操作 IO 的方法就是上面我们讲解的方法。
11.GPIO时钟使能函数:RCC_APB2PeriphClockCmd()
如:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //使能 PA,PD 端口时钟
解释:因为IO是挂在APB2上的外设,需要使能该时钟
12.位带操作(操作ODR和IDR寄存器)
#define LED0 PAout(8) // 给PA8命名为LED0
#define LED1 PDout(2) // PD2
操作:LED0 = 1;//通过位带操作控制 LED0 的引脚 PA8 输出高电平
LED0=0;//通过位带操作控制 LED0 的引脚 PA8 输出低电平
GPIO_SetBits(GPIOA, GPIO_Pin_8); //设置 GPIOA8 输出 1,等同 LED0=1;
GPIO_ResetBits (GPIOA, GPIO_Pin_8); //设置 GPIOA8 输出 0,等同 LED0=0;
GPIOA->BRR=GPIO_Pin_8; //设置 GPIOA.8 输出 1,等同 LED0=1;
GPIOA->BSRR=GPIO_Pin_8; //设置 GPIOA.8 输出 0,等同 LED0=0;
13.某个端口有多个功能,则采用下面的函数 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);// 关闭JTAG,使能SWD,可以使用SWD模式调试
14.在初始化端口的时候,对于设置为输入的IO口,不用设置IO速率
15.工程编译结束,解释以下数据意义(程序大小=编译之后的Code和RO-data之和):
Code:程序所占用的FLASH的大小
RO_data:即Read Only-data,表示已经被初始化的程序全局变量,如const类型(FALSH)
RW_data:即Read Write-data,表示已被初始化的全局变量(SRAM)
ZI-data:即Zero Init-data,表示未被初始化的全局变量(SRAM)
16.J-LINK 的JTAG和SWD仿真模式
JTAG是英文“Joint Test Action Group(联合测试行为组织)”------在线系统测试
SWD使用针脚少,高速模式下较稳定
*****将STM32的JTAG下载引脚:JTDO、JTDI、JTCK 当成普通IO口进行操作:
(1)打开复用时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,EANBLE);
(2)调用重映射函数:GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
17.例:无符号32位整型数据表示方式:unsigned int 32 (C语言标准)== uint32_t == u32;详见点击打开链接
如果喜欢的话,可以关注同名微信公众号“混沌无形”,阅读更多有趣好文!