STM32学习历程(day3)

通过GPIO点灯

首先先创建工程 这步比较繁琐 可以去参考江协科技[3-2]章节

想要驱动LED灯 要先使能时钟、然后再初始化、GPIO模式、引脚、以及输出速率

可以查看RCC的头文件 能看到三个使能函数 使能AHB、APB2、APB1 ,GPIO用APB2这个函数、

通过看RCC库函数的源码能知道 第一个参数是设备,第二个参数是使能或失能

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
/*** @brief  Enables or disables the High Speed APB (APB2) peripheral clock.* @param  RCC_APB2Periph: specifies the APB2 peripheral to gates its clock.*   This parameter can be any combination of the following values:*     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,*          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,*          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,*          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,*          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,*          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,*          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11     * @param  NewState: new state of the specified peripheral clock.*   This parameter can be: ENABLE or DISABLE.* @retval None*/
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){RCC->APB2ENR |= RCC_APB2Periph;}else{RCC->APB2ENR &= ~RCC_APB2Periph;}
}

使能完时钟后,接着就是初始化GPIO 也是通过查看GPIO的头文件及源码 获取到他编写的库函数

 一般常用的就是下面这些GPIO库函数 

GPIO_DeInit 是取消初始化 将其恢复到默认值

GPIO_AFIODeInit 同上

GPIO_Init 需要创建一个结构体 然后传他的地址 这个结构体有三个变量GPIO_Pin、GPIO_Speed、GPIO_Mode

就不做过多解释了哈 一般都能见名知意 主要说下设置寄存器这几个函数

GPIO_SetBits 是将传进来这个引脚的值设为高电平

GPIO_ResetBits是将其传进来的引脚设为低电平

GPIO_WriteBit 可以通过第三个参数来决定传进来的引脚是高电平还是低电平

GPIO_Write 可以直接在第二个参数传16进制数 来达到操控寄存器的目的

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

下面就是一个流水灯的源码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);while (1){GPIO_Write(GPIOA, ~0x0001); //0000 0000 0000 0001Delay_ms(100);GPIO_Write(GPIOA, ~0x0002); //0000 0000 0000 0010Delay_ms(100);GPIO_Write(GPIOA, ~0x0004); //0000 0000 0000 0100Delay_ms(100);GPIO_Write(GPIOA, ~0x0008); //0000 0000 0000 1000Delay_ms(100);GPIO_Write(GPIOA, ~0x0010); //0000 0000 0001 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0020); //0000 0000 0010 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0040); //0000 0000 0100 0000Delay_ms(100);GPIO_Write(GPIOA, ~0x0080); //0000 0000 1000 0000Delay_ms(100);}
}

通过GPIO驱使蜂鸣器

有了之前点亮流水灯的学习 这个就是非常简单了

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
int main()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);while (1){GPIO_ResetBits(GPIOB, GPIO_Pin_12); Delay_ms(100);GPIO_SetBits(GPIOB, GPIO_Pin_12); Delay_ms(100);GPIO_ResetBits(GPIOB, GPIO_Pin_12); Delay_ms(100);GPIO_SetBits(GPIOB, GPIO_Pin_12); Delay_ms(700);}
}

总结 

这个面包板非常好用 能diy自己想要的各种电路 ,还是闹了个小乌龙 前面不知道有更小一点的短接线 我直接用了这个很长的电线 导致看起来就很丑 不过效果还是一样的。今天还是和昨天一样 在公司午休的时候小刷了一下,然后下班回家就开始组装电路,然后创建工程、开始跟着写代码 先是跟着敲了一遍,实现功能后就又自己去查找头文件 看各个函数的功能及参数 至少保证能够看懂代码 如果不做巩固的话 之后缺陷就越来越多 可能会导致没有兴趣会继续学下去。这两个工程还是很简单的哈

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

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

相关文章

Memcached跨数据中心复制:高效数据同步的艺术

标题:Memcached跨数据中心复制:高效数据同步的艺术 Memcached是一个高性能的分布式内存缓存系统,广泛用于提升大规模Web应用的性能。在多数据中心的环境中,跨数据中心的数据复制是确保数据一致性和高可用性的关键技术。本文将深入…

给我的 IM 系统加上监控两件套:【Prometheus + Grafana】

监控是一个系统必不可少的组成部分,实时,准确的监控,将会大大有助于我们排查问题。而当今微服务系统的话有一个监控组合很火那就是 Prometheus Grafana,嘿你别说 这俩兄弟配合的相当完美,Prometheus负责数据采集&…

【MySQL系列】VARCHAR 类型详解及其使用策略

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MySQL---事务管理

1.关于事务 理解和学习事务,不能只站在程序猿的角度来理解事务,而是要站在使用者(用户)的角度来理解事务。 比如支付宝转账,A转了B100块前,在程序猿的角度来看,是两条update操作,A …

ChatGPT对话:按ESC键退出Python程序

问:python,这条语句if keyboard.is_pressed(‘Esc’):会阻塞程序,等待按键吗? ChatGPT: if keyboard.is_pressed(Esc): 这条语句不会阻塞程序,它只是检查在执行这条语句时 Esc 键是否被按下。如果 Esc 键…

浅谈反射机制

1. 何为反射? 反射(Reflection)机制指的是程序在运行的时候能够获取自身的信息。具体来说,反射允许程序在运行时获取关于自己代码的各种信息。如果知道一个类的名称或者它的一个实例对象, 就能把这个类的所有方法和变…

react之错误边界

错误边界实质是指什么 实际上是组件 错误边界捕获什么时候的错误 在渲染阶段的错误 错误边界捕获的是谁的错误 捕获的是子组件的错误 错误边界不能捕获什么错误 1、不能捕获异步代码 2、不能捕获事件处理函数 3、不能捕获服务端渲染 4、不能捕获自身抛出的错误 错误…

百度amis vue3引入减少包提体积

不用amis的包 , 在index.html引入代码如下,要在main上面 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><link rel"icon" href"/favicon.ico" media"print"/><meta http…

【贪心 堆 优先队列】502. IPO

本文涉及知识点 贪心 堆 优先队列 LeetCode502. IPO 假设 力扣&#xff08;LeetCode&#xff09;即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司&#xff0c;力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限&#xff0c;它只能在 IPO 之前完成最多 k…

ORB-SLAM3源码分析(案例分析)

一、ORB-SLAM3简介 ORB-SLAM3 (Oriented FAST and Rotated BRIEF SLAM 3) 是一种视觉SLAM&#xff08;Simultaneous Localization and Mapping&#xff0c;同时定位与地图构建&#xff09;系统&#xff0c;用于机器人和计算机视觉领域。它是ORB-SLAM系列的第三个版本&#xff…

非参数检测2——定义

定义&#xff1a;若研究二判定问题&#xff08;即判断有无信号&#xff09;的检测问题&#xff0c; 检测器的虚警概率可以由对输入数据统计特性提出微弱假设确定假设中不包含输入噪声的统计特性 则称该检测器为非参数检测器。 设计目标 在未知或时变环境下&#xff0c;有最…

【自动驾驶仿真在做什么——初学者总结(陆续补充)】

文章目录 基础概念自动驾驶级别再稍提一下ODD是什么&#xff1f; 自动驾驶仿真分类软件在环仿真硬件仿真 仿真究竟难在哪&#xff1f;关于lidar和radar区别一些名词解释 最近也是学习自动驾驶仿真相关知识&#xff0c;习惯去总结一下&#xff0c;方便自己回顾和总结&#xff0c…

响应式ref()和reactive()

文章目录 ref()reactive()ref对比reactivetoRefs与toRef ref() 作用&#xff1a;定义响应式变量。 语法&#xff1a;let xxxref(初始值)。 返回值&#xff1a;一个RefImpl的实例对象&#xff0c;简称ref对象或ref&#xff0c;ref对象的value属性是响应式的 注意点&#xff1…

【多媒体】富客户端应用程序GUI框架 JavaFX 2.0 简介

JavaFX 最初是由 Oracle 推出的一个用于开发富客户端应用程序的框架&#xff0c;它提供了丰富的用户界面控件、布局容器、3D图形绘制、媒体播放和动画等功能&#xff0c;旨在取代较旧的 Swing 框架。JavaFX 于 2007 年推出&#xff0c;2011 年 10 月发布了2.0 版本。JavaFX 2.0…

进度记录工具

说明 对过程进度进行记录&#xff0c;采用“进度管理器进度处理器进度记录器”结构、对象池技术和单例等设计&#xff0c;计时器间隔动态更新&#xff0c;时间间隔预测算法采用单指数平滑预测&#xff08;有数据清洗&#xff09;。一个进度管理器管理多个进度处理器&#xff0c…

强强联合 | 人大金仓携手中国一汽引领国产数据库行业新浪潮

在国产化政策的推动下&#xff0c;人大金仓携手中国一汽联合开发更贴近汽车产业特定需求的数据库功能和组件。从2023年2月至今&#xff0c;人大金仓已累计部署690套数据库&#xff0c;适配应用系统170个&#xff0c;支撑中国一汽20多个核心系统和重要系统。目前&#xff0c;中国…

Eureka服务实例的健康检查机制:确保微服务架构的稳定性

引言 在微服务架构中&#xff0c;服务实例的健康状态对于整个系统的稳定性至关重要。Eureka作为Netflix开源的服务发现框架&#xff0c;提供了一套机制来对服务实例进行健康检查。本文将详细探讨Eureka中的服务实例健康检查机制&#xff0c;包括其工作原理、实现方式以及如何配…

Okhttp hostnameVerifier详解

hostnameVerifier 方法简介核心原理参考资料 方法简介 本篇博文以Okhttp 4.6.0来解析hostnameVerfier的作用&#xff0c;顾名思义&#xff0c;该方法的主要作用就是鉴定hostnname的合法性。Okhttp在初始化的时候我们可以自己配置hostnameVerfier&#xff1a; new OkHttpClien…

计算机网络——数据链路层(以太网)

目录 局域网的数据链路层 局域网可按照网络拓扑分类 局域网与共享信道 以太网的两个主要标准 适配器与mac地址 适配器的组成与运作 MAC地址 MAC地址的详细介绍 局域网的mac地址格式 mac地址的发送顺序 单播、多播&#xff0c;广播mac地址 mac帧 如何取用…

YOLOX算法实现血细胞检测

原文:YOLOX算法实现血细胞检测 - 知乎 (zhihu.com) 目标检测一直是计算机视觉中比较热门的研究领域。本文将使用一个非常酷且有用的数据集来实现YOLOX算法,这些数据集具有潜在的真实应用场景。 问题陈述 数据来源于医疗相关数据集,目的是解决血细胞检测问题。任务是通过显微…