当前位置: 首页 > news >正文

STM32 寄存器配置笔记——GPIO配置输出

一、概述

       本文主要介绍GPIO 作为输出时的寄存器配置。包括时钟配置,输出模式配置。以STM32F10xxx系列为例,配置PA8、PD2端口作为输出,输出高/低电平。

二、配置流程

        1)GPIO外设时钟

         通过查找STM32F10xxx中文参考手册得知,GPIO PORT口的时钟配置在RCC_APB2ENR寄存器的第2~6位,如下图:

使能PORTA 和 PORTD 的时钟:

RCC->APB2ENR |= 1 << 2;//enable portA clk
RCC->APB2ENR |= 1 << 5;//enable portD clk

      2) 配置GPIO模式

      PORT A的PIN 8和PORT D的PIN 2配置为通用推挽(PP)输出模式,GPIO速度配置为50MHZ。CRL寄存器配置的是PIN0~7,CRH寄存器配置的是PIN8~15。

GPIOA->CRH &= 0xFFFFFFF0;
GPIOA->CRH |= 0x3;         //GPIO PORTA PIN 8 cfg PP & output 50MHZ
GPIOD->CRL &= 0xFFFFF0FF;
GPIOD->CRL |= 0x3 << 8;    //GPIO PORTD PIN 2 cfg PP & output 50MHZ

              3)配置 IO口输出电平

              有如下几种方式:

              a)配置ODR寄存器

            

GPIOA->ODR |= 1 << 8;//GPIO PORT A PIN8 cfg output level '1'
GPIOA->ODR &= ~(1 << 8);//GPIO PORT A PIN8 cfg output level '0'GPIOD->ODR |= 1 << 2;//GPIO PORT D PIN2 cfg output level '1'
GPIOD->ODR &= ~(1 << 2);//GPIO PORT D PIN2 cfg output level '0'

              b)配置BSRR和BRR寄存器

              

              

	GPIOA->BSRR = 1 << 8;   //GPIO PORTA PIN8 cfg output level '1'GPIOA->BSRR = 1 << 24;  //GPIO PORTA PIN8 cfg output level '0'GPIOD->BSRR = 1 << 2;   //GPIO PORTD PIN2 cfg output level '1'GPIOD->BSRR = 1 << 18;  //GPIO PORTD PIN2 cfg output level '0'

             注:如果出现同时配置BR2和BS2为1即端口需要置位且需要复位,则此时置位生效,电平输出为1。

               

	GPIOA->BRR = 1 << 8;  //GPIO A PIN 8 cfg output level '0'GPIOD->BRR = 1 << 2;  //GPIO D PIN 2 cfg output level '0'

三、ODR和BSRR、BRR的区别

      ODR 可读写,相对耗时序,BSRR和BRR只能写,但不耗时序。由上可知配置PA8输出电平。

ODR寄存器,配置的时候只需配置端口8,其它bit位要保持原样。因此操作如下:

GPIOA->ODR |= 1 << 8;

读取ODR寄存器->或运算->写入

(GPIOA->ODR |= 1 << 8->GPIOA->ODR = GPIOA->ODR | (1 << 8))

而BSRR和BRR寄存器只需:

	GPIOA->BSRR = 1 << 8;GPIOA->BRR = 1 << 8;

 赋值即可,因为如下特性:

          在手册上有如下描述:

即用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。因为BSRR寄存器的操作只有一个动作赋值。

http://www.lryc.cn/news/227857.html

相关文章:

  • Spring boot 整合grpc 运用
  • C++ 模板保姆级详解——template<class T>(什么是模板?模板分哪几类?模板如何应用?)
  • uni.getLocation() 微信小程序 线上获取失败
  • Pytorch损失函数、反向传播和优化器、Sequential使用
  • css:两个行内块元素和图片垂直居中对齐
  • 从0开始python学习-34.pytest常用插件
  • 初始MySQL(二)(表的增删查改)
  • SLAM从入门到精通(SLAM落地的难点)
  • 通过内网穿透快速搭建公网可访问的Spring Boot接口调试环境
  • 职业迷茫,我该如何做好职业规划
  • 数据结构----顺序栈的操作
  • web3 React Dapp书写订单 买入/取消操作
  • C++学习---信号处理机制、中断、异步环境
  • 机器学习——奇异值分解案例(图片压缩-代码简洁版)
  • 【Go入门】面向对象
  • Asp.Net Core 中使用配置文件
  • 深入理解JVM虚拟机第二十四篇:详解JVM当中的动态链接和常量池的作用
  • QGridLayout
  • 万能在线预约小程序系统源码 适合任何行业在线预约小程序+预约到店模式 带完整的搭建教程
  • Leetcode 2935. Maximum Strong Pair XOR II
  • [直播自学]-[汇川easy320]搞起来(4)看文档 查找设备(续)
  • WebSphere Liberty 8.5.5.9 (四)
  • UE特效案例 —— 角色刀光
  • 11. EPIC定时器
  • git-bash配置代理
  • 【ElasticSearch系列-07】ES的开发场景和索引分片的设置及优化
  • JavaWeb Day09 Mybatis-基础操作02-XML映射文件动态SQL
  • CV学习基础
  • 设计模式之禅之设计模式-原型模式
  • Spring的循环依赖问题