二、GPIO口和寄存器
1、GPIO口
GPIO的8种工作模式:
(1)输入模式
1)上拉输入:增加高电平的驱动能力
2)下拉输入:增加低电平的驱动能力
3)浮空输入: 不具备高低电平驱动能力,直接输入的电平做转换
4)模拟输入:检测模拟电压,数据传给ADC做转换(ADC:8位/12位/16位----103板子用的是12位)
TTL肖特基触发器:把高低电平值转换成逻辑值
(2)输出模式
1)推挽输出:直接把逻辑值输出成高低电平
2)开漏输出:只能输出低电平,输出位1时是高阻态(未知状态,电路上电压由电路来决定),经常用在总线,需要增加上拉电阻配合使用,具有读取的功能。
3)复用推挽输出:
4)复用开漏输出:
复用:把IO用做复用其它外设功能时选择复用模式
通用:只是把IO做普通输出的功能
2、寄存器
片上外设存储相应配置数据/状态数据/数据值等的空间。
- 寄存器的分类:
- 配置寄存器:配置IO口模式
- 数据寄存器:保存发送和接收的数据
- 状态寄存器:保存当前设备的工作状态
3、点灯编写代码
(1)根据原理图确定要使用的IO口
由原理图可知LED1使用PE2端口,而且灯是低电平点亮。
(2)查看数据手册可知PE端口在APB2总线上
查看参考手册APB2的外设时钟使能寄存器确定PE口在6号位
(3)查看参考手册的GPIO章节
这里配置寄存器每4位控制一个端口
MODE2:输入/输出模式选择,我们选输出模式11
CNF2:具体的那种输入/输出,我们选用推挽输出模式 00
代码:
*************led.h*****************************************************
#ifndef LED_H
#define LED_H
#include "stm32f10x.h"
void led1_Config(void);
void led1(uint8_t flag);
#endif
*************led.c************************************************************
#include "led.h"
void led1_Config(void)
{
//1、开时钟
RCC->APB2ENR |=(0x01<<6);//打开时钟
//2、进行配置 0011
GPIOE->CRL &= ~(0xf<<8);//清零 xxxx 0000 xxxx xxxx
GPIOE->CRL |= (0x3<<8);//置1 xxxx 0011 xxxx xxxx
}
void led1(uint8_t flag)
{
if(flag == 1)//开灯
GPIOE->ODR &= ~(0x1<<2);
else if(flag == 0)//关灯
GPIOE->ODR |= (0x1<<2);//置1
}
*********main.c*******************************************
#include"led.h"
int main(void)
{
led1_Config();
led1(1);//开灯
//led1(0);//关灯
while(1)
{
;
}
}