STM32——GPIO(2)

STM32——GPIO


宗旨:技术的学习是有限的,分享的精神是无限的。


/* GPIO_InitTypeDef结构体 */
typedef enum
{GPIO_Speed_10MHz = 1,  //枚举常量,值为 1,代表输出速率最高为 10MHzGPIO_Speed_2MHz,       //对不赋值的枚举变量,自动加 1,此常量值为 2GPIO_Speed_50MHz       //常量值为 3
} GPIOSpeed_TypeDef;typedef enum
{GPIO_Mode_AIN = 0x0, //模拟输入模式GPIO_Mode_IN_FLOATING = 0x04, //浮空输入模式GPIO_Mode_IPD = 0x28, //下拉输入模式GPIO_Mode_IPU = 0x48, //上拉输入模式GPIO_Mode_Out_OD = 0x14, //开漏输出模式GPIO_Mode_Out_PP = 0x10, //通用推挽输出模式GPIO_Mode_AF_OD = 0x1C,  //复用功能开漏输出GPIO_Mode_AF_PP = 0x18   //复用功能推挽输出
} GPIOMode_TypeDef;typedef struct
{uint16_t GPIO_Pin;              /* 指定要配置的引脚 */GPIOSpeed_TypeDef GPIO_Speed;   /* 指定GPIO引脚输出的最高频率 */GPIOMode_TypeDef GPIO_Mode;     /* 指定GPIO引脚工作状态 */
} GPIO_InitTypeDef;

/* 初始化GPIO -- GPIO_Init() */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;uint32_t tmpreg = 0x00, pinmask = 0x00;/* 断言,用于检查输入的参数是否正确 */assert_param(IS_GPIO_ALL_PERIPH(GPIOx));assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));/*---------------------------- GPIO 的模式配置 -----------------------*//*把输入参数 GPIO_Mode 的低四位暂存在 currentmode*/currentmode = ((uint32_t)GPIO_InitStruct -> GPIO_Mode) & ((uint32_t)0x0F);/*判断是否为输出模式,输出模式,可输入参数中输出模式的 bit4 位都是 1*/if ((((uint32_t)GPIO_InitStruct -> GPIO_Mode) & ((uint32_t)0x10)) != 0x00){/* 检查输入参数 */assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));/* 输出模式,所以要配置 GPIO 的速率:00(输入模式) 01(10MHz) 10(2MHz) 11 */currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;}/*----------------------------配置 GPIO 的 CRL 寄存器 ------------------------*//* 判断要配置的是否为 pin0 ~~ pin7 */if (((uint32_t)GPIO_InitStruct -> GPIO_Pin & ((uint32_t)0x00FF)) != 0x00){/*备份原 CRL 寄存器的值*/tmpreg = GPIOx->CRL;/*循环,一个循环设置一个寄存器位*/for (pinpos = 0x00; pinpos < 0x08; pinpos++){/*pos 的值为 1 左移 pinpos 位*/pos = ((uint32_t)0x01) << pinpos;/* 令 pos 与输入参数 GPIO_PIN 作位与运算,为下面的判断作准备 */currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;/*判断,若 currentpin=pos,说明 GPIO_PIN 参数中含的第 pos 个引脚需要配置*/if (currentpin == pos){/*pos 的值左移两位(乘以 4),因为寄存器中 4 个寄存器位配置一个引脚*/pos = pinpos << 2;/*以下两个句子,把控制这个引脚的 4 个寄存器位清零,其它寄存器位不变*/pinmask = ((uint32_t)0x0F) << pos;tmpreg &= ~pinmask;/* 向寄存器写入将要配置的引脚的模式 */tmpreg |= (currentmode << pos);/* 复位 GPIO 引脚的输入输出默认值*//*判断是否为下拉输入模式*/if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD){/*下拉输入模式,引脚默认置 0,对 BRR 寄存器写 1 可对引脚置 0*/GPIOx->BRR = (((uint32_t)0x01) << pinpos);}else{/*判断是否为上拉输入模式*/if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU){/*上拉输入模式,引脚默认值为 1,对 BSRR 寄存器写 1 可对引脚置 1*/GPIOx->BSRR = (((uint32_t)0x01) << pinpos);}}}}/*把前面处理后的暂存值写入到 CRL 寄存器之中*/GPIOx->CRL = tmpreg;}/*---------------------------- 以下部分是对 CRH 寄存器配置的 -------------------------当要配置的引脚为 pin8 ~~ pin15 的时候,配置 CRH 寄存器, ------------------ -----这过程和配置 CRL 寄存器类似-------------------------------------------读者可自行分析,看看自己是否了解了上述过程--^_^-----------*//* Configure the eight high port pins */if (GPIO_InitStruct->GPIO_Pin > 0x00FF){tmpreg = GPIOx->CRH;for (pinpos = 0x00; pinpos < 0x08; pinpos++){pos = (((uint32_t)0x01) << (pinpos + 0x08));/* Get the port pins position */currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);if (currentpin == pos){pos = pinpos << 2;/* Clear the corresponding high control register bits */pinmask = ((uint32_t)0x0F) << pos;tmpreg &= ~pinmask;/* Write the mode configuration in the corresponding bits */tmpreg |= (currentmode << pos);/* Reset the corresponding ODR bit */if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD){GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));}/* Set the corresponding ODR bit */if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU){GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));}}}GPIOx->CRH = tmpreg;}
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

语音处理入门——语音的声学处理

语音的声学处理通常称为特征提取或者信号分析&#xff0c;特征是表示语音信号的一个时间片的矢量。常见的特征类型有LPC&#xff08;线性预测编码&#xff09;特征和PLP&#xff08;感知线性预测编码&#xff09;&#xff0c;该特征称为声谱特征&#xff0c;使用形成波形的不同…

BootStrap 用法

1 下载bootstrap组件 2 在jsp页面中加入bootstrap <link rel"stylesheet" type"text/css" href"css/bootstrap.min.css "> <script type"text/javascript" srcjs/bootstrap.min.js></script> <script type&qu…

正则表达式基础知识

一个正则表达式就是由普通字符&#xff08;例如字符 a 到 z&#xff09;以及特殊字符&#xff08;称为元字符&#xff09;组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板&#xff0c;将某个字符模式与所搜索的字符串进行匹配。如…

基础呀基础,用二极管防止反接,你学会了吗?

使用新的电源&#xff0c;第一次给设备供电时&#xff0c;要特别注意电源的正负极性标注。比如电源适配器&#xff0c;铭牌上面有标注插头的极性。这个符号说明插头的里面是正极&#xff0c;外面是负极&#xff0c;即“内正外负”。但是也有反过来的&#xff0c;下面这款是“内…

李宏毅的可解释模型——三个任务

1、问题 观看了李宏毅老师的机器学习进化课程之可解释的机器学习&#xff0c;课程中对主要是针对黑盒模型进行白盒模型转化的技巧和方法进行了简单介绍&#xff0c;详细细节可以参考《Interpretable Machine Learning》。像一些线性模型、树形模型是可解释的ML model&#xff…

柔性数组和环形队列之间的故事

之前的文章&#xff0c;讲解了柔性数组&#xff0c;有很多人留言&#xff0c;提到一些问题。刚好&#xff0c;之前发关于环形队列的文章有些问题&#xff0c;这次刚好拿出来一起说一下&#xff0c;并用柔性数组实现一个环形队列。柔性数组的上一篇文章环形队列C语言实现文章1、…

NodeJs实现下载Excel文件

nodejs作为一门新的语言&#xff0c;报表功能也不是十分完善。 (1).js-xlsx : 目前 Github 上 star 数量最多的处理 Excel 的库&#xff0c;支持解析多种格式表格XLSX / XLSM / XLSB / XLS / CSV&#xff0c;解析采用纯js实现&#xff0c;写入需要依赖nodejs或者FileSaver .js实…

晚上不睡觉,搞的一个例子《JS实现动画》

照着例子做了一个程序&#xff0c;感觉很爽点击查看 转载于:https://www.cnblogs.com/guanggan123/archive/2008/07/10/1240322.html

STM32——时钟系统

STM32——时钟系统 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、时钟树 普通的MCU&#xff0c;一般只要配置好GPIO 的寄存器&#xff0c;就可以使用了。STM32为了实现低功耗&#xff0c;设计了非常复杂的时钟系统&#xff0c;必须开启外设时钟才…

目标检测发展路程(一)——Two stage

目标检测是计算机视觉领域中非常重要的一个研究方向&#xff0c;它是将图像或者视频中目标与其他不感兴趣的部分进行区分&#xff0c;判断是否存在目标&#xff0c;确定目标位置&#xff0c;识别目标种类的任务&#xff0c;即定位分类。传统的目标检测模型有VJ.Det[1,2],HOG.De…

都2021年了,c/c++开发竟然还能继续吃香??

年后就迎来了金三银四&#xff0c;你准备好2021年的跳槽涨薪计划了吗&#xff1f;今天我就来给大家分享&#xff0c;c/c作为老牌开发常青树&#xff0c;还能与java/python/go较较劲的岗位和技术在哪里&#xff01;同时&#xff0c;给大家整理了2021年系统全面技术学习资料。文末…

String.getBytes(Unicode)的疑问 以及 SHIFT-JIS编码范围

String.getBytes(charsetName),这个方法很多人都用过&#xff0c;可是有没有试过temp.getBytes("Unicode");这样的用法&#xff0c;它的返回值很奇怪&#xff0c;第1和第2个字节是-1或-2,比如下面的代码&#xff0c;你能想象出它的结果吗&#xff1f; String t…

Linux Crontab 安装使用详细说明

yum -y install vixie-cron yum -y install crontabs 说明&#xff1a;vixie-cron 软件包是 cron 的主程序&#xff1b;crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。 二、配置 cron 是 linux 的内置服务&#xff0c;但它不自动起来&#xff0…

STM32——流水灯

STM32——流水灯 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 stm32f10x_conf.h&#xff1a;打开stm32f10x_gpio.h和stm32f10x_rcc.h&#xff1b; stm32f10x_gpio.c 和 stm32f10x_rcc.c加入工程模板中&#xff0c;只说重点。 【stm32f10x_rcc.c用…

目标检测模型——One stage(YOLO v5的模型解析及应用)

1. 简介 目标检测分为Two stage和One stage,只使用一个网络同时产生候选区域并预测出物体的类别和位置&#xff0c;所以它们通常被叫做单阶段检测算法&#xff08;One stage&#xff09;。本篇文章只讲One stage模型&#xff0c;常见的模型有YOLO&#xff0c;SSD。 目标检测发…

腾讯回应QQ读取用户浏览器历史记录

腾讯QQ官方认证账号在知乎回应“QQ扫描读取所有浏览器的历史记录”表示&#xff0c;PC QQ存在读取浏览器历史用以判断用户登录安全风险的情况&#xff0c;读取的数据用于在PC QQ的本地客户端中判断是否恶意登录。所有相关数据不会上传至云端&#xff0c;不会储存&#xff0c;也…

【NOIP 模拟赛】 道路

题目描述在二维坐标平面里有 N 个整数点,信息班某一巨佬要访问这 N 个点。刚开始巨佬在点(0,0)处。 每一步,巨佬可以走到上、下、左、右四个点。即假设巨佬当前所在点的坐标是(x,y),那么它下一步可以移动到(x,y1), (x,y-1), (x1,y),(x-1,y)之一。巨佬目标是找到一个移动序列,满…

MySQL实用命令

windows 启动和关闭Myql服务 “net start mysql”就启动mysql服务了&#xff0c;停止mysql服务“net stop mysql”&#xff08;注意&#xff0c;这里是输入的MySQL服务的名字。如果你的MySQL服务的名字是DB或其它名字&#xff0c;你应该输入“net start DB”或其它名&#xff0…

OCR系列——总体概述

最近参加了百度Paddle的动手学OCR课程&#xff0c;特此做一个学习总结。 1. 简介 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是计算机视觉重要方向&#xff0c;传统的OCR一般面向扫描文档类对象&#xff0c;现在的OCR是指场景文字识…

STM32——系统滴答定时器

STM32——系统滴答定时器 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、SysTick【内核中】 【风格&#xff1a;先描述一下库对寄存器的封装&#xff0c;再举例实现某些功能】 SysTick定时器被捆绑在NVIC中&#xff0c;用于产生SysTick异常&#…