STM32F103 通过配置寄存器来控制I/O口
来源:互联网 发布:mac numbers使用视频 编辑:程序博客网 时间:2024/06/06 15:01
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_CRHGPIOA->CRL = 0x33 ; // 00---00 0011 0011 CNF0 = 00 MODE = 11//2、设置从引脚上输出的为高/低电平,即配置寄存器GPIOA_ODRGPIOA->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 = 11GPIOA->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 = 11GPIOA->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位清零) 和 位清零寄存器
/* 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 = 11GPIOA->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 = 11GPIOA->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 ;}
0 0
- STM32F103 通过配置寄存器来控制I/O口
- STM32中控制I/O口的寄存器们
- AVR I/O口寄存器说明
- MSP430F149 I/O口控制
- 存储器,I/O端口,寄存器
- I/O控制方式
- I/O 控制方式
- I/O控制方式
- I/O控制方式
- I/O控制方式
- I/O控制方式
- I/O寄存器的边际效应
- I/O寄存器的边际效应
- S3C2440之I/O寄存器和中断寄存器
- 通过文件共享来学习I/O重定向(下)——I/O重定向
- 【从零开始,从内核驱动驱动到用户空间调用】编写第一个linux驱动,通过端口访问I/O寄存器。
- 单片机I/O口配置问题
- c++ i/o控制符
- laozhu1124 android 无法生成R文件的原因剖析
- java参数传递(值传递还是参数传递)
- HDU 3371 Connect the Cities
- github上传文件
- webservice入门课程02
- STM32F103 通过配置寄存器来控制I/O口
- RDO of H264
- 学习JQuery插件zTree树结构
- 刹车
- Deformable Part Models(voc)训练样本—20140413
- 黑马程序员_java_IO流_FileWriter_FileReader_BufferedWriter_BufferedReader_IO异常
- 油门
- 维基oi 1039 数的 划分 划分dp
- leetcode LRU Cache