首页 > 其他分享 >【单片机/嵌入式】【梁山派】学习日志05:库函数点灯

【单片机/嵌入式】【梁山派】学习日志05:库函数点灯

时间:2022-11-04 19:59:21浏览次数:76  
标签:输出 05 配置 单片机 参数 GPIOD GPIO gpio 库函数

库函数点灯

一、配置流程

(1)开启GPIO的端口时钟

(2)配置GPIO的模式

(3)配置GPIO的输出

对LED2接的PD7进行配置。

在使用库函数之前,我们需要了解到,GD32官方帮我们做好了这一套库函数,很详细,很全面。我们使用的时候只需要到对应的函数中去查找即可。

1.1开启GPIO的端口时钟

GD32的所有外设资源时钟默认都是关闭的,在配置外设之前需要先开启对应的时钟。

既然要开启时钟,那我们就要去关于时钟的库函数里去查找,打开gd32f4xx_rcu.h头文件,里面有很详细的关于时钟的函数的声明,到里面去查找我们需要的即可。查找一般可根据函数名去定义它的功能。我们要去开启GPIOD时钟,就需要去使用开启时钟的函数,经过查找发现 void rcu_periph_clock_enable(rcu_periph_enum periph);  这个函数正是我们需要的,这个函数有一个参数,里面是一个枚举变量,我们打开这个枚举变量,可以看到里面定义了很多时钟,有GPIO时钟,DMA时钟,定时器时钟等,如图所示。这里只截取一部分。

 

由此可知,这个函数的一个参数就是要使能的时钟,我们要使用的时钟是GPIOD,可以看到对应的时钟定义就是RCU_GPIOD。开启GPIOD时钟转换为代码就是 rcu_periph_clock_enable(RCU_GPIOD); 

1.2配置GPIO模式

GPIO的模式配置可分为两步,第一步就是通过调用库函数将GPIO配置为输入功能,输出功能,复用功能还是模拟功能。第二步就是通过调用库函数配置GPIO的上下拉模式或者浮空。

要点亮LED灯,只需要往PD7引脚输出一个高电平,可见我们是配置为输出模式,又因为一般输出模式我们都配置为浮空模式,输入模式我们才需要考虑上拉还是下拉,根据默认电平状态进行判断。所以需要配置GPIO为输出模式,浮空模式。

这配置的是关于GPIO的操作,要到gd32f4xx_gpio.h去查找对应的函数。经过查找,发现  void gpio_mode_set(uint32_t gpio_periph, uint32_t mode, uint32_t pull_up_down, uint32_t pin);  这个函数满足我们的功能,它有四个参数,第一个参数是配置的端口;第二个参数是配置的模式;第三个参数是上下拉选择;第四个参数是要配置的引脚。

 

 

 

 

由上图可知,要配置PD7为输出模式,浮空模式,只需要传入对应的参数即可。转换为代码为 gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7); 

1.3配置GPIO的输出

配置GPIO的输出也分为两步,第一步配置输出模式是推挽输出还是开漏输出,第二步配置GPIO输出的速度。这配置的也是关于GPIO的操作,要到gd32f4xx_gpio.h去查找对应的函数。

经过查找,发现 void gpio_output_options_set(uint32_t gpio_periph, uint8_t otype, uint32_t speed, uint32_t pin); 这个函数满足我们的功能。它有四个参数,第一个参数是配置的端口;第二个参数是输出的类型;第三个参数是GPIO的速度;第四个参数是要配置的引脚。

 

由上图可知,要配置PD7为推挽输出,速度为50MHZ,只需要传入对应的参数即可。转换为代码为 gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); 

二、配置LED输出高电平

如何让PD7输出高电平呢?通过查阅库函数,这里为大家总结了几种操作的方式。

2.1 gpio_bit_set

这个函数是位设置函数,可以直接设置任意一个管脚输出高电平。

函数原型为: void gpio_bit_set(uint32_t gpio_periph, uint32_t pin); 

有两个参数,第一个参数就是要配置的端口,第二个参数就是要设置的引脚。

配置PD7引脚转化代码为: gpio_bit_set(GPIOD,GPIO_PIN_7); 

2.2 gpio_bit_write

这个函数是往某一位写入一个值,可以直接设置任意一个管脚输出高电平或者低电平。

函数原型为: void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value); 

有三个参数,第一个参数就是要配置的端口,第二个参数就是要设置的引脚,第三个参数就是要设置的值。

配置PD7引脚输出高电平转化代码为: gpio_bit_write(GPIOD,GPIO_PIN_7,1); 

配置PD7引脚输出低电平转化代码为: gpio_bit_write(GPIOD,GPIO_PIN_7,0); 

由于参数bit_value是枚举变量,所以如果用1和0作为参数,则会得到如下警告(虽然经过实测,最后小灯依然正常闪烁):

所以可以将以上两行代码改为:

gpio_bit_write(GPIOD,GPIO_PIN_7,SET); // SET即1

gpio_bit_write(GPIOD,GPIO_PIN_7,RESET); // RESET即0 

2.3gpio_port_write

这个函数是往整个端口写值,可以间接设置任意一个管脚输出高电平或者是低电平,但是这样操作其中一位是不太好的,其它的引脚状态可能会被改变。函数原型位: void gpio_port_write(uint32_t gpio_periph, uint16_t data); 有两个参数,第一个参数就是要配置的端口;第二个参数是要向端口置入的16位二进制数。

配置PD7引脚输出高电平转化代码为: gpio_port_write(GPIOD,0x80); // 0x80=0000 0000 1000 0000 

配置PD7引脚输出低电平转化代码为: gpio_port_write(GPIOD,0x00); 

为什么在给寄存器(端口)进行配置时,常常是进行位操作而不直接赋值呢?

【来源】https://blog.csdn.net/wu_junwu/article/details/10878093

因为我们在对寄存器进行配置时也不一定对其所有的位都需要配置,比如我们对32位的ARM单片机的某个寄存器进行位配置时,我们往往是对32位中的某几位进行配置,其他的位我们并不需要配置,我们希望它保持原来的初始状态(保持初始状态的好处是:当我们在下一次需要对它进行配置时,我们就不用去判断这些位的初始状态是什么)。

我们如果对其进行直接赋值,我们还需要考虑其他不需要配置位的初始值到底是0还是1后才能对该寄存器赋值,但是如果我们利用位操作,那么我们完全不需要考虑那些不用配置的位,只需要考虑需要配置的位是0还是1。这样使得寄存器的位配置更加简单高效。

 

标签:输出,05,配置,单片机,参数,GPIOD,GPIO,gpio,库函数
From: https://www.cnblogs.com/steven913/p/16858931.html

相关文章

  • 【单片机/嵌入式】【梁山派】学习日志04:寄存器点灯
    一、寄存器点亮LED1.1配置流程一般我们使用GPIO的端口,都需要有以下几个步骤。(1)开启GPIO的端口时钟(2)配置GPIO的模式(3)配置GPIO的输出从LED介绍那一章节我们了解到LED1......
  • 【AcWing-Linux】05. Git
    Git一、Git简介Git是一个分布式版本控制工具,通常对于软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件,Git仓库分为两种:本地仓库:开发人员自己电脑......
  • 【单片机/嵌入式】【梁山派】学习日志03:寄存器和库函数介绍
    寄存器和库函数介绍资料下载:https://www.gd32mcu.com/cn/download/5?kw=GD32F4https://www.gd32mcu.com/cn/download/6?kw=GD32F4(1)下载GD32F4xx用户手册 (2)下载GD32F......
  • [架构之路-59]:目标系统 - 平台软件 - 基础中间件 - POSIX(可移植操作系统接口)与标准库
    目录​​第1章 POSIX(可移植操作系统接口)概述​​​​1.1什么是POSIX​​​​1.2 发布者-IEEE​​​​1.3标准的下载位置​​​​1.4标准的起源​​​​1.5 谁遵守这个......
  • SQL库函数
    一、字符串函数 1.删除字符、添加字符 trim(str) :去掉两侧空格 ltrim(str) :去掉左侧空格 rtrim(str) :去掉右侧空格 trim( 位置, ......
  • SQL库函数
     一、字符串函数 1.删除字符、添加字符 trim(str) :去掉两侧空格 ltrim(str) :去掉左侧空格 rtrim(str) :去掉右侧空格 trim(位置,'去掉谁......
  • 05-分布式计算框架
    目录​​一,MapReduce​​​​1,简介​​​​2,原理​​​​2.1基本概念​​​​2.2程序执行过程​​​​2.3作业运行模式​​​​二,Spark​​​​1,简介​​​​1.1背景​......
  • Contest 2050 and Codeforces Round #718 (Div. 1 + Div. 2) D
    D.ExplorerSpace我们考虑一个性质就是他最多就是找到一条k/2的最短路径然后回来这样是肯定是包含最优解的这个观察第二个样例我们将其改变一下要是我们一半的长度......
  • 【单片机/嵌入式】【梁山派】学习日志02:工程模板创建
    工程模板创建一、新建工程目录1.1包含文件(1)Project:存放工程文件,编译文件等。(2)Firmware:存放ARM内核文件,标准外设库文件等。(3)Hardware:存放开发板的硬件驱动文件。(4)App......
  • HDU 2050折线分割平面(递推)
    折线分割平面TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):36479    AcceptedSubmission(s):244......