16-从零自己写库函数(2)外设结构体定义

2023-05-16

如何写BSRR的置位----复位的库函数:

1:在最初的时候需要先定义GPIO的结构体


#ifndef _STM32F4XX_H
#define _STM32F4XX_H
#include <stdint.h>

#define GPIOF_BASE	((unsigned int)0x40021400)
#define RCC_BASE	((unsigned int)0x40023800)	

#define GPIOF_MODER		*(unsigned int *)(GPIOF_BASE+0x00)//把这个数加(unsigned int *)强制转换成地址,之后加*转换为指针
#define GPIOF_OTYPER	*(unsigned int *)(GPIOF_BASE+0x04)
#define GPIOF_ODR		*(unsigned int *)(GPIOF_BASE+0x14)
#define RCC_AHB1ENR 	*(unsigned int *)(RCC_BASE+0x30)
//	
//typedef unsigned int uint32_t;
//typedef unsigned short int uint16_t;  //这两句在stdint.h里面有定义

//外设寄存器结构体定义
typedef struct
{
	uint32_t MODER;
	uint32_t OTYPER;
	uint32_t OSPEEDR;
	uint32_t PUPDR;
	uint32_t IDR;
	uint32_t ODR;
	uint16_t BSRRL;
	uint16_t BSRRH;
	uint32_t LCKR;
	uint32_t AFRL;
	uint32_t AFRH;
}GPIO_TypeDef;//结构体

#define   GPIOF    ((GPIO_TypeDef *)GPIOF_BASE)//结构体类型的指针,结构体指针会自动增加

#endif


//A.c
//B.c 目的是只编译一次,如果两个C文件都编译同一个头文件会报错

2:下面为头文件stm32f4xx_gpio.c的文件

#include "stm32f4xx_gpio.h"

void GPIO_SetBits(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)
{
	GPIOx ->BSRRL=GPIO_Pin;//只有写1有效,写0无效;所以只要给他赋值就能达到效果
}

void GPIO_ResetBits(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
	{
	GPIOx ->BSRRH=GPIO_Pin;//只有写1有效,写0无效;所以只要给他赋值就能达到效果
}

 3:接下来在stm32f4xx_gpio.h的头文件里面进行声明,并且对16个IO口进行了宏定义:

#ifndef _STM32F4XX_GPIO_H
#define _STM32F4XX_GPIO_H

#include "stm32f4xx.h"
#define		GPIO_Pin_0		(uint16_t)(1<<0) 
#define		GPIO_Pin_1		(uint16_t)(1<<1) 
#define		GPIO_Pin_2		(uint16_t)(1<<2) 
#define		GPIO_Pin_3		(uint16_t)(1<<3) 
#define		GPIO_Pin_4		(uint16_t)(1<<4) 
#define		GPIO_Pin_5		(uint16_t)(1<<5) 
#define		GPIO_Pin_6		(uint16_t)(1<<6) 
#define		GPIO_Pin_7		(uint16_t)(1<<7) 
#define		GPIO_Pin_8		(uint16_t)(1<<8) 
#define		GPIO_Pin_9		(uint16_t)(1<<9) 
#define		GPIO_Pin_10		(uint16_t)(1<<10) 
#define		GPIO_Pin_11		(uint16_t)(1<<11) 
#define		GPIO_Pin_12		(uint16_t)(1<<12) 
#define		GPIO_Pin_13		(uint16_t)(1<<13) 
#define		GPIO_Pin_14		(uint16_t)(1<<14) 
#define		GPIO_Pin_15		(uint16_t)(1<<15) 
#define		GPIO_Pin_ALL		(uint16_t)(0xffff) 

void GPIO_SetBits(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin);

#endif

 4:最后在main.c文件里对GPIO端口进行置位复位控制

#include  "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
void delay(unsigned int a)
{
for( ;a>0;a--);
}

int main (void)
{
#if 0
	//第一步:开GPIOF端口时钟
	RCC->AHB1ENR |=(1<<5);

	//第二部:配置GPIO为输出
	GPIOF->MODE &=~(3<<(2*9));
	GPIOF->MODE |=(1<<(2*9));//如果在配置时之前就已经配置过11了,这时候在配置01,或的结果为11,
						//所以说有两个为控制配置功能的我们首先将两个位配置清零;
						//两个位为一组,只控制目标位
	
	//第三步:让GPI0输出0或者1,ODR寄存器或者BSRR寄存器
	GPIOF->ODR |=(1<<6);//先置1   
	GPIOF->ODR &=~(1<<6);
	while(1)
	{
		GPIOF->ODR |=(1<<9);//先置1
		delay(0xfffff);
	GPIOF->ODR &=~(1<<9);
		delay(0xfffff);
	}
	#elif 0 /*外设结构体定义*/
	//第一步:开GPIOF端口时钟
	RCC_AHB1ENR |=(1<<5);

	//第二部:配置GPIO为输出
	GPIOF->MODER &=~(3<<(2*9));
	GPIOF->MODER |=(1<<(2*9));//如果在配置时之前就已经配置过11了,这时候在配置01,或的结果为11,
						//所以说有两个为控制配置功能的我们首先将两个位配置清零;
						//两个位为一组,只控制目标位
//	
//	//第三步:让GPI0输出0或者1,ODR寄存器或者BSRR寄存器
//	GPIOF->ODR |=(1<<9);//先置1   
	GPIOF->ODR &=~(1<<9);
			delay(0xfffff);
	while(1)
	{

		delay(0xfffff);
	GPIOF->ODR &=~(1<<9);
		delay(0xfffff);
	GPIOF->ODR |=(1<<9);//先置1

	}	
		#elif 1  /*编写端口的复位和置位函数*/
	//第一步:开GPIOF端口时钟
	RCC_AHB1ENR |=(1<<5);

	//第二部:配置GPIO为输出
	GPIOF->MODER &=~(3<<(2*9));
	GPIOF->MODER |=(1<<(2*9));//如果在配置时之前就已经配置过11了,这时候在配置01,或的结果为11,
						//所以说有两个为控制配置功能的我们首先将两个位配置清零;
						//两个位为一组,只控制目标位
//	
//	//第三步:让GPI0输出0或者1,ODR寄存器或者BSRR寄存器
//	GPIOF->ODR |=(1<<9);//先置1   
	GPIOF->ODR &=~(1<<9);
			delay(0xfffff);
	while(1)
	{

		delay(0xfffff);
	GPIO_ResetBits(GPIOF,GPIO_Pin_9);
		delay(0xfffff);
	GPIO_SetBits(GPIOF,GPIO_Pin_9);//这个地方位置位,为1
	}
	#endif
	

}
void SystemInit(void)
{
		//骗过编译器不报错
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

16-从零自己写库函数(2)外设结构体定义 的相关文章

  • Ubuntu18.04安装realsense d435i SDK和ROS Wrapper以及相机标定全过程

    第一步 xff1a 安装realsense SDK 1 用源码进行安装 xff1a https github com IntelRealSense librealsense 然后将下载的源码安装包放在文件夹下面 xff0c 我把文件夹放在了
  • 基于Android的智能求职招聘APP设计与实现

  • (一)华为弹性云服务器购买与使用

    登录华为云官网 选择立即购买 选择配置并购买 根据需要进行购买 华北 北京四按需计费随机分配GPU加速型g6 4xlarge 4Ubuntu 18 04 server 64bit for GPU 40GB xff08 需要GPU的选有GPU
  • C++继承和多态核心重点知识刨析,一文必拿下

    一 继承 继承的本质是为了复用 xff0c 复用基类的数据成员和方法 封装的本质是为了对外仅仅暴露必要的使用接口 内部的具体实现细节和部分的核心接口对外是不可见的 隐藏细节 仅对外开放必要功能性接口 正是由于封装隐藏所需 所以产生了公有属性
  • DockerFile文件详细解析

    DockerFile文件详细解析 所有文章不设限 xff0c 我们相遇偶然 xff0c 相散坦然 xff0c 互不打扰 xff0c 各自安好 xff0c 向阳而生 致敬尚硅谷周阳老师 xff0c 此处内容迁移学习来自于阳哥 xff01 Do
  • Cropper的一个demo

    1 摸鱼大法第一招 Cropper Cropper 就是基于canvas做的小插件 xff0c 下面做的是一个图片裁剪 xff0c 各位看官看看就行 xff0c 有什么意见多提 A code block import Cropper fro
  • 互斥锁和信号量

    一 同步互斥概述 在多任务操作系统中 xff0c 同时运行的多个任务可能都需要访问 使用同一种资源 多个任务之间有依赖关系 xff0c 某个任务的运行依赖于另一个任务 同步和互斥就是用于解决这两个问题的 互斥 一个公共资源同一时刻只能被一个
  • shell编程、makefile学习笔记

    windows r n linux n 1 shell介绍 1 1 shell是操作系统的终端命令行 1 shell可以理解为软件系统提供给用户操作的命令行界面 xff0c 可以说它是人机交互的一种方式 2 我们可以使用shell和操作系统
  • linux系统--find命令详解以及定时查看系统文件是否被修改

    一 概述 xff1a 因为Linux下面一切皆文件 xff0c 经常需要搜索某些文件来编写 xff0c 所以对于linux来说find是一条很重要的命令 linux下面的find指令用于在目录结构中搜索文件 xff0c 并执行指定的操作 它
  • 0429 嵌入式学习笔记 (32)STL标准模板库/类的方法

    文章目录 STL 标准模板库 类的方法 STL 标准模板库 从逻辑层面看 xff0c 在STL中体现了泛型化程序设计思想 从实现层次看 xff0c 整个STL是以一种类型参数化的方式实现的 STL六大组件 1 容器 2 迭代器 3 算法 4
  • Mapreduce(Java程序编写)

    Mapreduce xff1a 分布式计算框架 开发人员要做的事情 xff1a 实现Map和Reduce函数 一般只调用HDFS的话 xff0c 不实际Yarn的工作 xff0c 调用Mapreduce时才会调用yarn 三台设备Mapre
  • 蓝桥杯嵌入式(STM32G431RBT6)入门第二天——建立自己的初始化文件|CSDN创作打卡

    接前一天 xff0c 将所有工程拷贝到建立的另外一个文件夹LED中 xff0c 在Inc文件夹中建立led h文件 xff0c 在Src文件夹中建立led c 用keil打开工程 xff0c 点击下图中的图标 xff0c 新建一个USER分
  • 如何把img格式转换成vmdk格式

    下载qemu xff0c 这里是下载好的 xff0c 也可以自行下载 链接 xff1a https pan baidu com s 1UEJupO5YyFgX8MnpywikeA 提取码 xff1a ttil 安装好后 xff0c 进入qe
  • 瀑布流插件vue-masonry

    前言 之前其实有分享过一篇纯CSS实现瀑布流的方法 https oliver blog csdn net article details 126450691 xff0c 但纯CSS实现的方案都不是比较好的方案 xff0c 总归有一些各式各样
  • 集合学习之Iterator接口

    1 Iterator接口概述 Iterator接口表示对集合进行迭代的迭代器 Iterator接口为集合而生 xff0c 专门实现集合的遍历 此接口主要有如下两个方法 xff1a hasNext 判断是否存在下一个可访问的元素 xff0c
  • 自协商技术

    摘要 xff1a 本文介绍了自协商的基本原理和工作模式 xff0c 以及自协商相关细节介绍 缩略语 xff1a FLP xff1a 快速连接脉冲 NLP xff1a 普通连接脉冲 CSMA CD xff1a 载波监听多路访问 冲突检测 PC
  • Armbian 笔记五_如何在 Armbian 上安装 xfce4 桌面

    目录 使用 armbian software 选择 Desktop 安装 xfce4 桌面 准备工作 正常开机 必须存在着一个普通用户 连接有线网络 下载安装设置 armbian software 201 是 Desktop 输入普通用户
  • 数据结构|队列

    队列 知识框图考点分析1 什么样的链表适合作为链队2 判空判满 常考小题 知识框图 队列相关知识点较为简单易懂 xff0c 不再叙述 xff08 注意 FIFO 特点 xff0c 框架遗漏 xff09 本文主要针对考点中的2 3点进行知识总
  • ST-LINK v2下载器简单使用

    ST LINK v2下载器简单使用过程 文章目录 ST LINK v2下载器简单使用过程前言1 驱动安装1 1 驱动安装常规步骤1 2 驱动失败解决方法 2 代码下载 amp 调试2 1 代码下载2 1 1 JTAG接法 xff1a 2 1
  • linux系统--help/man/info/whatis命令详解

    1 man命令的用法 man gt gt manual man是手册的缩写 man man 查看man命令的帮助 man passwd 查看passwd命令的帮助 man的级别 1 系统命令 2 系统接口 3 函数库 4 特殊文件 xff0

随机推荐

  • ESP8266 WIFI 模块和手机通信

    ESP8266 WIFI 模块通过TTL模块和手机通信 文章目录 ESP8266 WIFI 模块通过TTL模块和手机通信前言1 调试工具2 模块接线3 模块作为客户端 STA3 1 模块指令3 2 指令示例3 3 数据传输 4 模块作为服务
  • vscode安装git工具

    1 打开vscode后 xff0c 提示如图 2 点击 下载Git 3 自动跳转到git下载官网 xff0c 没跳转的直接去网页搜索也是可以进去的 4 点击下载 5 下载完之后打开安装包 xff0c 无脑下一步安装 6 重启vscode 会
  • Python入门之无参装饰器

    1 什么是装饰器 器指的是工具 装饰指的是没其他事物添加额外的东西点缀 一起的解释就是 xff1a 定义一个函数 xff0c 该函数是用来装饰其他函数添加额外的功能 2 为何要用装饰器 开放封闭原则 开放指的是扩展功能是开放的 封闭 xff
  • 数据清洗的一般方法和步骤

    在正式分析数据前 xff0c 我们通常需要先预处理一下数据 xff0c 比如筛选有效样本 xff0c 定义变量格式 xff0c 处理缺失值等 xff0c 这些操作也就是是数据清洗的过程 xff0c 目的是把数据整理成比较清洁的形式 xff0
  • 【操作系统】死锁(详细)

    文章目录 一 死锁的概念二 死锁的产生因素三 死锁的必要条件1 互斥条件2 占有和等待条件 xff08 部分分配条件 xff09 3 不剥夺条件4 循环等待条件 xff08 环路条件 xff09 四 死锁防止1 破坏互斥条件2 破坏占有和等
  • 浏览器验证码图片(缩略图)显示不出来问题解决办法

    上面是我未解决前的网页图片 xff0c 这种缩略图显示不出来很着急 尤其是验证码图片那种 xff0c 找了很多网上的方法都不管用 xff0c 最终才弄出来的 解决办法 xff1a 切换网络 我之前是用的学校的校园网 xff0c 结果如上图
  • ROS 学习笔记 坐标变换

    TF坐标变换 TF xff1a TransForm Frame xff0c 坐标变换 坐标系 xff1a ROS 中是通过坐标系统开标定物体的 xff0c 确切的将是通过右手坐标系来标定的 注 xff1a 在ROS中坐标变换最初对应的是tf
  • 51单片机之智能小车(避障、跟随、循迹)

    目录 基本概述 硬件组成 功能 关键字 模块介绍 电机模块L9110S 循迹模块 xff08 TCRT5000传感器 xff09 红外避障模块 测速模块 小车 移动小车 xff08 控制电机转动 xff0c 使小车前进 后退 左转 右转 x
  • STM32之USART

    USART USART Universal Synchronous Asynchronous Receiver Transmitter 是一个全双工通用同步 异步串行收发器 xff0c 该接口是一个高度灵活的串行通信设备 对于USART常用
  • Gvins运行结果处理,时间戳对齐并与RTK真值对比 (matalb代码)

    最近在学习Gvins xff0c 准备自己用matlab处理一下结果 以sports field数据集为例 xff0c 运行Gvins的程序后 xff0c 将Gvins的导航结果保存到CSV文件中 xff0c 得到如下图所示的数据格式 其中
  • ubuntu系统创建定时任务--crontab

    关于crontab cron是一个Linux定时执行工具 xff0c 可以在无需人工干预的情况下运行作业 在Ubuntu server 下 xff0c cron是被默认安装并启动的 通过 etc crontab文件 xff0c 可以看到以下
  • shell基本知识

    为什么学习和使用Shell编程 什么是Shell shell的起源 shell的功能 shell的分类 如何查看当前系统支持的shell xff1f 如何查看当前系统默认shell xff1f 驼峰语句 shell脚本的基本元素 shell
  • OMNeT++ & SUMO 学习记录(二) 常见错误分析

    1 仿真运行时报错 lt gt Could not connect to TraCl server error message 0 No error in module Veins TraClScenarioManagerLaunchd R
  • OMNeT++ & SUMO 学习记录(六)SUMO 路网生成及简单仿真实例

    一 SUMO 路网生成方式 1 外部导入 可以从开源地图集 openstreetmap 中下载地图生成 osm 文件 xff0c 然后通过 sumo 自带的 netconvert 程序将其转换为路网文件 net xml 2 netedit编
  • OMNeT++ & SUMO 学习记录(八)SUMO 公共交通及行人出行仿真

    一 公共交通 1 介绍 SUMO 中大多数公共交通工具使用固定的路线 xff0c 如公共汽车 有轨电车 火车等 xff0c 下面将以公交车为例 xff0c 介绍如何模拟此类交通工具的运行 xff0c 同样的规则也适用于其它公共交通工具 2
  • axios请求的封装方式

    axios请求的铺垫知识 a get请求 需要先 npm i axios 进行装包 当需要get请求数据时 axios get 34 user ID 61 12345 34 then res 61 gt console log res 也可
  • 网络基础之协议栈

    通信协议栈 OSI模型 国际标准化组织ISO在1984年提出了OSI RM xff08 Open System Interconnection Reference Model 开放式互连参考模型 xff09 其基本功能如下 xff1a 物理
  • 关系型和非关系型数据库优缺点、特点、区别、适用场景

    从各个地方学习的 xff0c 不是原创 只是笔记 笔记 笔记 数据库学习笔记 4 数据库 4 1 关系型数据库 常见的有 xff1a MySQL DB2 Oracle Microsoft SQL Server PostgreSQL Micr
  • 十分钟,看完物联网操作系统分析报告!

    一 LuatOS LuatOS 是目前物联网场景唯一能够给工程师完整过程的开发 xff0c 让工程师只聚焦业务逻辑 xff0c 不花费过多时间在工具的熟悉 xff0c 算法的研究 xff0c 调试环境的搭建 xff0c 以及代码陷阱的预防的
  • 16-从零自己写库函数(2)外设结构体定义

    如何写BSRR的置位 复位的库函数 xff1a 1 xff1a 在最初的时候需要先定义GPIO的结构体 ifndef STM32F4XX H define STM32F4XX H include lt stdint h gt define