1、STM32F103 通过配置寄存器来控制I/O口
1.1、GPIO的概述
1.2、端口位配置表
1.3、GPIO各寄存器的配置
2、程序例举:
2.1、配置寄存器,使GPIOA.0、GPIOA.1置位:
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h" //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include "stm32f10x_map.h"
void Delay_Ms(u16 time);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
// GPIOA->CRL = 0X00 ;
// GPIOA->CRH = 0XFFFFFFFF ;
/*--------控制STM32引脚GPIOA.0 GPIOA.1推挽输出高电平--------*/
//1、设置GPIOA的引脚的工作模式,即配置寄存器GPIOA_CRL 、 GPIOA_CRH
GPIOA->CRL = 0x33 ; // 00---00 0011 0011 CNF0 = 00 MODE = 11
//2、设置从引脚上输出的为高/低电平,即配置寄存器GPIOA_ODR
GPIOA->ODR = 0X00000000 ;
GPIOA->ODR = 0X00000003 ; // 1 1
while (1)
{
;
}
}
2.2、配置寄存器,使GPIOA.0作为GPIOA.8的跟随器:(即A.8输入什么样的电平信号,A.0就输出怎样的电平信号)
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h" //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include "stm32f10x_map.h"
void Delay_Ms(u16 time);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : main
* Description : 从GPIOA.8输入一个电平信号,将该电平信号从GPIOA.0口输出
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
/*--------控制STM32引脚GPIOA.0 GPIOA.1推挽输出高电平--------*/
//1、设置GPIOA的引脚的工作模式,即配置寄存器GPIOA_CRL 、 GPIOA_CRH
//GPIOA.0推挽输出,速度50MHZ , GPIOA.8浮空输入
GPIOA->CRL = 0x03 ; // CNF0 = 00 MODE0 = 11
GPIOA->CRH = 0x04 ; // CNF0 = 01 MODE0 = 00
//2、配置寄存器GPIOA_ODR、GPIOA_IDR ,实现GPIOA.0输出 跟随 GPIOA.8的输入
while(1)
{
if((GPIOA->IDR & 0X0100) == 0X0100) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
GPIOA->ODR = 0X01 ;
}
else
{
GPIOA->ODR = 0X00 ;
}
}
return 1 ;
}
2.3、配置寄存器,使GPIOA.0-.7作为GPIOA.8-.15的跟随器:(即A.8-.15输入什么样的电平信号,对应的A.0-.7就输出怎样的电平信号)
方法一:通过配置GPIOA->IDR和GPIOA->ODR寄存器实现
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h" //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include "stm32f10x_map.h"
void Delay_Ms(u16 time);
/* Private functions ---------------------------------------------------------*/
/*******************************************************************************
* Function Name : main
* Description : 从GPIOA.8输入一个电平信号,将该电平信号从GPIOA.0口输出
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
/*--------控制STM32引脚GPIOA.0 GPIOA.1推挽输出高电平--------*/
//1、设置GPIOA的引脚的工作模式,即配置寄存器GPIOA_CRL 、 GPIOA_CRH
//GPIOA.0推挽输出,速度50MHZ , GPIOA.8浮空输入
GPIOA->CRL = 0x03 ; // CNF0 = 00 MODE0 = 11
GPIOA->CRH = 0x04 ; // CNF0 = 01 MODE0 = 00
//2、配置寄存器GPIOA_ODR、GPIOA_IDR ,实现GPIOA.0输出 跟随 GPIOA.8的输入
while(1)
{
if((GPIOA->IDR & 0X0100) == 0X0100) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
GPIOA->ODR = 0X01 ;
}
else
{
GPIOA->ODR = 0X00 ;
}
}
return 1 ;
}
方法二:通过配置 置位/清除寄存器(低16位置位,高16位清零) 和 位清零寄存器
[objc] view plain copy
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h" //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include "stm32f10x_map.h"
void Delay_Ms(u16 time);
/* Private functions -----------------------------------------------------------------------------*/
/**************************************************************************************************
* Function Name : main
* Description : 从GPIOA.8-.16输入一个电平信号,GPIOA.0-.7口分别将对应引脚输入的电平信号输出
* Input : None
* Output : None
* Return : None
****************************************************************************************************/
int main(void)
{
/*--------控制STM32引脚GPIOA.0 GPIOA.1推挽输出高电平--------*/
//1、设置GPIOA的引脚的工作模式,即配置寄存器GPIOA_CRL 、 GPIOA_CRH
//GPIOA.0-.7推挽输出,速度50MHZ , GPIOA.8-.16浮空输入
GPIOA->CRL = 0x33333333 ; // CNF0 = 00 MODE0 = 11
GPIOA->CRH = 0x44444444 ; // CNF0 = 01 MODE0 = 00
//2、配置寄存器GPIOA_ODR、GPIOA_IDR ,实现GPIOA.0输出 跟随 GPIOA.8的输入
while(1)
{
/*----------------------第0位----------------------*/
if((GPIOA->IDR & 0X0100) == 0X0100) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
GPIOA->BSRR = 0X01 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
GPIOA->BRR = 0X01 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第1位----------------------*/
if((GPIOA->IDR & 0X0200) == 0X0200) //寄存器GPIOA->IDR的第9位为1,表示从在GPIOA.9口输入了高电平
{
GPIOA->BSRR = 0X02 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
GPIOA->BRR = 0X02 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第2位----------------------*/
if((GPIOA->IDR & 0X0400) == 0X0400) //寄存器GPIOA->IDR的第10位为1,表示从在GPIOA.10口输入了高电平
{
GPIOA->BSRR = 0X04 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
GPIOA->BRR = 0X04 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第3位----------------------*/
if((GPIOA->IDR & 0X0800) == 0X0800) //寄存器GPIOA->IDR的第11位为1,表示从在GPIOA.11口输入了高电平
{
GPIOA->BSRR = 0X08 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
GPIOA->BRR = 0X08 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第4位----------------------*/
if((GPIOA->IDR & 0X1000) == 0X1000) //寄存器GPIOA->IDR的第12位为1,表示从在GPIOA.12口输入了高电平
{
GPIOA->BSRR = 0X10 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
GPIOA->BRR = 0X10 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第5位----------------------*/
if((GPIOA->IDR & 0X2000) == 0X2000) //寄存器GPIOA->IDR的第13位为1,表示从在GPIOA.13口输入了高电平
{
GPIOA->BSRR = 0X20 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
GPIOA->BRR = 0X20 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第6位----------------------*/
if((GPIOA->IDR & 0X4000) == 0X4000) //寄存器GPIOA->IDR的第14位为1,表示从在GPIOA.14口输入了高电平
{
GPIOA->BSRR = 0X40 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
GPIOA->BRR = 0X40 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第7位----------------------*/
if((GPIOA->IDR & 0X8000) == 0X8000) //寄存器GPIOA->IDR的第15位为1,表示从在GPIOA.15口输入了高电平
{
GPIOA->BSRR = 0X80 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
GPIOA->BRR = 0X80 ; //通过配置清零寄存器将对应位清零
}
}
return 1 ;
}
方法三:通过配置 置位/清除寄存器(低16位置位,高16位清零) 和 位清零寄存器 (对相关寄存器用宏定义封装)
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h" //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include "stm32f10x_map.h"
#define SET_GPIOA GPIOA->BSRR
#define RESET_GPIOA GPIOA->BRR
/* Private functions -----------------------------------------------------------------------------*/
/**************************************************************************************************
* Function Name : main
* Description : 从GPIOA.8-.16输入一个电平信号,GPIOA.0-.7口分别将对应引脚输入的电平信号输出
* Input : None
* Output : None
* Return : None
****************************************************************************************************/
int main(void)
{
/*--------控制STM32引脚GPIOA.0 GPIOA.1推挽输出高电平--------*/
//1、设置GPIOA的引脚的工作模式,即配置寄存器GPIOA_CRL 、 GPIOA_CRH
//GPIOA.0-.7推挽输出,速度50MHZ , GPIOA.8-.16浮空输入
GPIOA->CRL = 0x33333333 ; // CNF0 = 00 MODE0 = 11
GPIOA->CRH = 0x44444444 ; // CNF0 = 01 MODE0 = 00
//2、配置寄存器GPIOA_ODR、GPIOA_IDR ,实现GPIOA.0输出 跟随 GPIOA.8的输入
while(1)
{
/*----------------------第0位----------------------*/
if((GPIOA->IDR & 0X0100) == 0X0100) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
SET_GPIOA = 0X01 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
RESET_GPIOA = 0X01 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第1位----------------------*/
if((GPIOA->IDR & 0X0200) == 0X0200) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
SET_GPIOA = 0X02 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
RESET_GPIOA = 0X02 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第2位----------------------*/
if((GPIOA->IDR & 0X0400) == 0X0400) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
SET_GPIOA = 0X04 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
RESET_GPIOA = 0X04 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第3位----------------------*/
if((GPIOA->IDR & 0X0800) == 0X0800) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
SET_GPIOA = 0X08 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
RESET_GPIOA = 0X08 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第4位----------------------*/
if((GPIOA->IDR & 0X1000) == 0X1000) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
SET_GPIOA = 0X10 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
RESET_GPIOA = 0X10 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第5位----------------------*/
if((GPIOA->IDR & 0X2000) == 0X2000) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
SET_GPIOA = 0X20 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
RESET_GPIOA = 0X20 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第6位----------------------*/
if((GPIOA->IDR & 0X4000) == 0X4000) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
SET_GPIOA = 0X40 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
RESET_GPIOA = 0X40 ; //通过配置清零寄存器将对应位清零
}
/*----------------------第7位----------------------*/
if((GPIOA->IDR & 0X8000) == 0X8000) //寄存器GPIOA->IDR的第8位为1,表示从在GPIOA.8口输入了高电平
{
SET_GPIOA = 0X80 ; //通过配置置位/清零寄存器将对应位置一
}
else
{
RESET_GPIOA = 0X80 ; //通过配置清零寄存器将对应位清零
}
}
return 1 ;
}
上一篇:STM32F10x GPIO配置 之 位绑定
下一篇:STM32F10x GPIO引脚说明
推荐阅读最新更新时间:2024-03-16 15:37
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况