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

stm32学习-流水灯

接线

注意:LED灯长一点的引脚是正极。

配置GPIO

1.使用RCC开启GPIO时钟

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);
作用:外设时钟控制(根据外设连接的总线选择要开启的时钟)

这里我用的是PA0到PA7的引脚,根据上图可以看出应该使用RCC_APB2PeriphClockCmd去开启GPIOA外设。

RCC_AHBPeriph/RCC_APB2Periph/RCC_APB1Periph:选择外设

NewState:使能/使能

2.使用GPIO_Init初始化GPIO

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
作用:用结构体的参数初始化GPIO。

用法:先定义一个结构体变量,再给变量赋值,最后调用这个函数即可(这个函数就会自动读取结构体的值,然后自动把外设的各个参数配置好)。

3.使用输出或输入的函数控制GPIO口(本篇我们讲到的是GPIO输出部分)

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

作用:可以对16个端口进行写入操作

例题:LED流水灯

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选中所有引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);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);}
}

Delay.c

#include "stm32f10x.h"/*** @brief  微秒级延时* @param  xus 延时时长,范围:0~233015* @retval 无*/
void Delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus;				//设置定时器重装值SysTick->VAL = 0x00;					//清空当前计数值SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器while(!(SysTick->CTRL & 0x00010000));	//等待计数到0SysTick->CTRL = 0x00000004;				//关闭定时器
}/*** @brief  毫秒级延时* @param  xms 延时时长,范围:0~4294967295* @retval 无*/
void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}/*** @brief  秒级延时* @param  xs 延时时长,范围:0~4294967295* @retval 无*/
void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
} 

Delay.h

#ifndef __DELAY_H
#define __DELAY_Hvoid Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);#endif

下面补充一下GPIO其他比较重要的库函数部分。

GPIO其他重要库函数

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
作用:复位所有的GPIO外设。

void GPIO_AFIODeInit(void);
作用:复位所有AFIO外设。

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);
作用:GPIO的读取函数(GPIO的输入函数)

输入部分我们下一篇会写到。

代码有什么疑问可以评论区里提问哦!

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

相关文章:

  • GIGE 协议摘录
  • 服务器的远程桌面无法连接,服务器远程桌面无法连接问题处理教程
  • 【机器学习300问】105、计算机视觉(CV)领域有哪些子任务?
  • 安卓手机APP开发__超宽带(UWB)通信
  • 儿童股骨干骨折用儿童悬吊如何进行康复
  • vscode plantuml插件安装使用(windows)
  • Linux内核编译流程3.10
  • OSPF多区域组网实验(华为)
  • 解密MySQL二进制日志:深度探究mysqlbinlog工具
  • 妙解设计模式之策略模式
  • Linux DHCP server 配置
  • 深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
  • 新疆 | 金石商砼效率革命背后的逻辑
  • Dinky MySQLCDC 整库同步到 Doris
  • 基于Qt的网上购物系统的设计与实现
  • 设计软件有哪些?建模和造型工具篇(4),渲染100邀请码1a12
  • Java基础:面向对象(二)
  • 【汽车之家注册/登录安全分析报告】
  • cocos 通过 electron 打包成 exe 文件,实现通信问题
  • python中pow是什么意思
  • Go语言数据库框架 — Gorm
  • Python库之PyQuery的高级用法深度解析
  • 「架构」单元测试及运用
  • C# 数组/集合排序
  • HDRnet
  • 【ArcGISPro】3.1.5下载和安装教程
  • 理解多线程看这一篇就够了
  • 解释“this”的工作原理,原型继承如何工作,以及如何实现手写JS继承。还包括Array对象自带的方法列举,以及如何使用闭包。
  • 汇智知了堂实力展示:四川农业大学Python爬虫实训圆满结束
  • 2024下半年软考报名人数较去年减少,仅52.77万