STM正点mini-跑马灯

一.库函数版

1.硬件连接

GPIO的输出方式:推挽输出

IO口输出为高电平时,P-MOS置高,输出为1,LED对应引脚处为高电平,而二极管正0极被电阻拉高,两端都为高电平,LED灭

IO输出为低电平同理

2.GPIO库函数说明

操作IO口必须引入源文件和头文件

(1)初始化函数

1.简要

初始化模式

同时也控制BRR上下拉,最终控制ODR寄存器

2.初始化函数(详细说明)

第一个参数作用:选择是哪一个IO口(GPIOA~GPIOG)

GPIO_TypeDef* GPIOx

对应的结构体类型

第二个参数作用:对参数进行初始化

GPIO_InitTypeDef* GPIO_InitStruct

GPIO_Pin指定要配置的GPIO引脚。该参数可以是@ref GPIO_pins_define的任意值

typedef struct
{uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.This parameter can be any value of @ref GPIO_pins_define */GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.This parameter can be a value of @ref GPIOSpeed_TypeDef */GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.This parameter can be a value of @ref GPIOMode_TypeDef */
}GPIO_InitTypeDef;
3.示例

进行宏定义
#define GPIO_Pin_0                 ((uint16_t)0x0001)  /*!< Pin 0 selected */
#define GPIO_Pin_1                 ((uint16_t)0x0002)  /*!< Pin 1 selected */
#define GPIO_Pin_2                 ((uint16_t)0x0004)  /*!< Pin 2 selected */
#define GPIO_Pin_3                 ((uint16_t)0x0008)  /*!< Pin 3 selected */
#define GPIO_Pin_4                 ((uint16_t)0x0010)  /*!< Pin 4 selected */
#define GPIO_Pin_5                 ((uint16_t)0x0020)  /*!< Pin 5 selected */
#define GPIO_Pin_6                 ((uint16_t)0x0040)  /*!< Pin 6 selected */
#define GPIO_Pin_7                 ((uint16_t)0x0080)  /*!< Pin 7 selected */
#define GPIO_Pin_8                 ((uint16_t)0x0100)  /*!< Pin 8 selected */
#define GPIO_Pin_9                 ((uint16_t)0x0200)  /*!< Pin 9 selected */
#define GPIO_Pin_10                ((uint16_t)0x0400)  /*!< Pin 10 selected */
#define GPIO_Pin_11                ((uint16_t)0x0800)  /*!< Pin 11 selected */
#define GPIO_Pin_12                ((uint16_t)0x1000)  /*!< Pin 12 selected */
#define GPIO_Pin_13                ((uint16_t)0x2000)  /*!< Pin 13 selected */
#define GPIO_Pin_14                ((uint16_t)0x4000)  /*!< Pin 14 selected */
#define GPIO_Pin_15                ((uint16_t)0x8000)  /*!< Pin 15 selected */
#define GPIO_Pin_All               ((uint16_t)0xFFFF)  /*!< All pins selected */
定义了枚举类型
typedef enum
{ GPIO_Speed_10MHz = 1,GPIO_Speed_2MHz, GPIO_Speed_50MHz
}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;

(2)其余函数

问题:查看函数定义时报错

解决:

之后就可以成功转到定义了

------------------------------------------

3.代码实现

操作IO口之前,必须使能对应的时钟位

第一个参数

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;}
}

第二个参数

#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE(不使能)) || ((STATE) == ENABLE(使能)))

(1)创建HAREWARE文件,led.c,led.h

注:为避免重复调用头文件,通过预编译的方式,判断是否已经定义了一个唯一的标识符(所以这个标识符的命名是不重要的)

头文件要对MDK添加路径

注:

(2)led文件编写

h

#ifndef __LED_H_
#define  __LED_H_
void LED_Init(void);#endif

 c

//#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能GPIOB时钟GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/*初始化PA_8*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_8);//PA_8输出高电平GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/*初始化PD_2*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);GPIO_SetBits(GPIOD,GPIO_Pin_2);//PD_2输出高电平
}

(3)main文件编写

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
int main()
{delay_init();LED_Init();while(1){GPIO_SetBits(GPIOA,GPIO_Pin_8);GPIO_SetBits(GPIOD,GPIO_Pin_2);delay_ms(300);GPIO_ResetBits(GPIOA,GPIO_Pin_8);GPIO_ResetBits(GPIOD,GPIO_Pin_2);delay_ms(300);}}

二.寄存器版

1.硬件连接

看库函数版,过程一样

2.代码实现

过程

GPIO都是挂载在APB2总线下

#define RCC                 ((RCC_TypeDef *) RCC_BASE)
typedef struct
{__IO uint32_t CR;__IO uint32_t CFGR;__IO uint32_t CIR;__IO uint32_t APB2RSTR;__IO uint32_t APB1RSTR;__IO uint32_t AHBENR;__IO uint32_t APB2ENR;__IO uint32_t APB1ENR;__IO uint32_t BDCR;__IO uint32_t CSR;#ifdef STM32F10X_CL  __IO uint32_t AHBRSTR;__IO uint32_t CFGR2;
#endif /* STM32F10X_CL */ #if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)   uint32_t RESERVED0;__IO uint32_t CFGR2;
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ 
} RCC_TypeDef;

注: 要写成int main()

(1)led.c编写

#include "stm32f10x.h"
void LED_Init(void)
{RCC->APB2ENR|=(1<<2);//使能A/*使能时钟*/RCC->APB2ENR|=(1<<5);//使能DGPIOA->CRH|=0x00000003;/*设置推挽输出模式*/GPIOD->CRL|=0x00000300;
}

(2)main文件的编写

配置ODR寄存器

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"int main()
{delay_init();LED_Init();delay_ms(100);while(1){GPIOA->ODR=1<<8;GPIOD->ODR=1<<2;delay_ms(500);GPIOA->ODR=~(1<<8);GPIOD->ODR=~(1<<2);delay_ms(500);}}

配置BRR与BSRR寄存器、

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"int main()
{delay_init();LED_Init();delay_ms(100);while(1){GPIOA->BSRR=1<<8;GPIOD->BSRR=1<<2;delay_ms(500);GPIOA->BRR=(1<<8);GPIOD->BRR=(1<<2);delay_ms(500);}}

三.位操作

1.位操作基本原理

 

2.硬件连接

看库函数版,过程一样

3.代码实现

(1)led.c文件编写

下面的是库函数版,也可以写成寄存器版

//#include "led.h"
#include "stm32f10x.h"
void LED_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOB时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);//使能GPIOB时钟GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/*初始化PA_8*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_8);//PA_8输出高电平GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;/*初始化PD_2*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);GPIO_SetBits(GPIOD,GPIO_Pin_2);//PD_2输出高电平
}

 (2)main文件编写

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "sys.h"int main()
{LED_Init();delay_init();while(1){PAout(8)=1;PDout(2)=1;delay_ms(500);PAout(8)=0;PDout(2)=0;		delay_ms(500);}	
}

注:

由于在delay.h文件中已经引用了sys.h所以可以不用在main文件声明sys.h 

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

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

相关文章

深度学习-循环神经网络-RNN实现股价预测-LSTM自动生成文本

序列模型(Sequence Model) 基于文本内容及其前后信息进行预测 基于目标不同时刻状态进行预测 基于数据历史信息进行预测 序列模型:输入或者输出中包含有序列数据的模型 突出数据的前后序列关系 两大特点: 输入(输出)元素之间是具有顺序关系。不同的顺序,得到的结果应…

java servlet勤工助学家教管系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java servlet 勤工助学家教管系统是一套完善的java web信息管理系统 serlvetdaobean mvc 模式开发 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myecli…

Flutter中实现中国省份地图

效果展示(这里只展示局部&#xff0c;完全展示违规)&#xff1a; 可以点击省份改变颜色&#xff0c;更多功能可以自行拓展。 注&#xff1a;非完整中国地图&#xff01;&#xff01;&#xff01; 本文用于记录在Flutter项目中安卓端实现中国地图&#xff0c;因为实现过程是通过…

代码随想录算法训练营第31天 | 贪心算法理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和

贪心算法理论基础 选取每一阶段的局部最优&#xff0c;堆叠成全局最优。遇到求最优解问题时&#xff0c;可以先手动模拟一下&#xff0c;将问题分解&#xff0c;举例分析小问题的局部最优是否能达到全部最优&#xff0c;能的话就可以试一下贪心算法。贪心算法的题没有固定的套…

个体诊所电子处方系统设计,社区门诊处方开单管理系统软件教程

个体诊所电子处方系统设计&#xff0c;社区门诊处方开单管理系统软件教程 一、前言 以下软件程序操作教程以 佳易王诊所电子处方管理系统软件V17.3为例说明 如图&#xff0c;在基本信息设置里&#xff0c;可以设置处方配方模板&#xff0c;这样在开电子处方的时候可以一键导入…

MYSQL表的约束详解!

文章目录 前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据…

【服务器】关于lspci指令查看网卡数量的小坑

准备用lspci指令查看服务器上有多少个网卡&#xff0c;但是由于对lspci的输出结果不了解&#xff0c;导致得到了错误的结果&#xff0c;折腾了好几周 T_T 一、什么是lspci指令&#xff1f;如何使用&#xff1f; 1、lspci指令用来查看当前系统连接的所有PCI/PCIe设备 2、使用…

单元测试——题目十二

目录 题目要求: 定义类 测试类 题目要求: 根据下列流程图编写程序实现相应处理,执行j=10*x-y返回文字“j1=:”和计算值,执行j=(x-y)*(10⁵%7)返回文字“j2=:”和计算值,执行j=y*log(x+10)返回文字“j3=:”和计算值。 编写程序代码,使用JUnit框架编写测试类对编写的…

Android读写文件,适配Q以上

Android Q升级了文件系统&#xff0c;访问文件不仅仅是说动态权限了&#xff0c;有各种限制。权限什么的就不赘述了&#xff0c;下面介绍一下在10以上的系统中访问文件。 首先是打开文件管理器 /*** 打开文件管理器 存储卡和外接U盘都可以访问*/public void openFileManager()…

太阳能 LED 恒流电源 升降压原理图 AP9193 大功率升压恒流IC

特别 宽输入电压范围&#xff1a;3.6V~100V 高效率&#xff1a;可高达 95% 工作频率&#xff1a;1MHz CS 限流保护电压&#xff1a;250mV FB 电流采样电压&#xff1a;250mV 芯片供电欠压保护&#xff1a;2.5V 关断时间可调 外置频率补偿脚 应用领域 LED 灯杯 电池供…

203.移除链表元素(力扣LeetCode)

文章目录 203.移除链表元素题目描述原链表删除元素虚拟头节点 203.移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head …

Navicat 16 for MySQL:打造高效数据库开发管理工具

随着数据的快速增长和复杂性的提升&#xff0c;数据库成为了现代应用开发中不可或缺的一部分。而在MySQL数据库领域&#xff0c;Navicat 16 for MySQL作为一款强大的数据库开发管理工具&#xff0c;正受到越来越多开发者的青睐。 Navicat 16 for MySQL拥有丰富的功能和直观的界…

Pygame之纯Python实现你好2024效果

Pygame之纯Python实现你好2024效果 前言&#xff1a; 对于某些指JavaScript与前端实现为Python实现你好2024效果的营销号实在看不下去了。无底线营销&#xff0c;还要私信拿源码&#xff0c;hhh 于是就有了以下代码&#xff1a; 运行前安装pygame pip install pygame运行效果…

鸿蒙系统的APP开发

鸿蒙系统&#xff08;HarmonyOS&#xff09;是由华为公司开发的一款分布式操作系统。它被设计用于在各种设备上实现无缝的、统一的用户体验&#xff0c;包括智能手机、平板电脑、智能电视、智能穿戴等设备。鸿蒙系统的核心理念是支持多终端协同工作&#xff0c;使应用能够更灵活…

Vulnhub-dc5

靶场下载 https://download.vulnhub.com/dc/DC-5.zip 信息收集 # nmap -sn 192.168.1.0/24 -oN live.port Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-21 20:56 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00057s latency). MAC Address:…

『建议收藏』OpenAI官方出的Prompt提示词教程中文版来了!

一些结论 六大策略: 写清晰的指令 提供参考文本 将复杂任务分解为更简单的子任务 给模型时间“思考” 使用外部工具 系统性测试变化 提高结果质量的六大策略 写清晰的指令 这些模型无法读懂你的想法。如果输出过长&#xff0c;要求简短回复&#xff1b;如果输出过于简单…

STM32(更新中)

目录 1 时钟&#xff08;心跳&#xff09; 1.1 CubeMX基本配置 1.2 外设在时钟上的分配原理 1.3 时钟树 2 寄存器&#xff08;地址&#xff09; 3 GPIO 3.1 GPIO实物 3.2 GPIO两种结构&#xff08;推挽/开漏&#xff09; 3.3 LED 3.4 CUBEMX 3.5 常用函数 …

Redis常见数据类型[上]

目录 前言&#xff1a; 基本全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 数据结构和内部编码 内部编码&#xff1a; 单线程架构 引出单线程模型&#xff1a; 为什么单线程还这么快&#xff1f; String字符串 字符串数据类型&#xff1a; 常见命令&#xff1a; S…

计算机网络-编制与调制(基带信号 基带传输 宽度信号 宽度传输 编码 调制 )

文章目录 基带信号与宽带信号编码与调制数字数据编码为数字信号数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号小结 基带信号与宽带信号 信道上传输的信号除了可以分为数字信号和模拟信号&#xff0c;也可以分为基带信号和宽带信号&#xff0c;只是分类…

文心一言 VS 讯飞星火 VS chatgpt (188)-- 算法导论14.1 5题

五、用go语言&#xff0c;给定 n 个元素的顺序统计树中的一个元素 x 和一个自然数 i &#xff0c;如何在O(lgn)的时间内确定工在该树线性序中的第 i 个后继&#xff1f; 文心一言&#xff0c;代码正常运行&#xff1a; 在顺序统计树&#xff08;也称为平衡二叉搜索树&#xf…