LED灯、蜂鸣器、继电器的控制

news/2024/9/19 4:44:34 标签: 单片机, 嵌入式硬件, MCU, LED

LED灯的控制

  • 该专栏所有文章都默认使用STM32F103ZET6开发板

目录

LED灯的控制

一、简单的LED灯控制

1、初始化函数

led灯

2、应用函数

2、蜂鸣器

3、继电器


一、简单的LED灯控制

编程框架:初始化函数和应用函数

1、初始化函数

  • 初始化函数一般包括:时钟 IO 外设 中断 其他(用哪个写哪个)

!!时钟的作用:
时钟是由电路产生的具有周期性的脉冲信号,相当于单片机的心脏,要想使用单片机的外设必须开启相应的时钟,驱动外设的本质是操作寄存器,而寄存器是由D触发器构成,而触发器需要时钟才能改写值,所以要想操作寄存器必须开启对应外设的时钟。

为什么要有时钟树?
STM32时钟系统主要的目的就是给相对独立的外设模块提供时钟,主要也是为了降低整个芯片的功耗,所有外设时钟默认都是关闭状态当我们使用某个外设就要开启这个外设的时钟,不同外设需要的时钟频率不同,没必要所有外设都用高速时钟造成浪费,而且有些外设也接受不了这么高的频率,这也是为什么STM32有四个时钟源的原因,就是兼容不同速度的外设,STM32的四个时钟源分别为:HSE、 LSE、HSI、LSI

其中HSE时钟,即高速的外部时钟 

alt text

HSI时钟,即高速的内部时钟 

alt text

led灯
  • 先在API文件夹中添加led.c和led.h文件

.h文件需要配置 

alt text

 

alt text

 

alt text


alt text

  • 配置时钟

-- 先看原理图看控制的对应引脚 

alt text

使能:打开 // 复位:清0/关闭

-- 1.找时钟(数据手册看在哪个线上) 

alt text

-- 2.打开时钟(然后去参考手册中找对应寄存器看怎么打开)

alt text

-- 3、配置IO的模式,这里led用推挽输出

alt text

 //先将端口配置低寄存器8,9,10,11位清0(P113)

GPIOE->CRL &= ~(0xf<<8);

//将端口配置低寄存器8,9,10,11位配置为输出,推挽输出

GPIOE->CRL |= (0x3<<8);

四种输出模式: 推挽输出:直接把逻辑值输出成高低电平;
开漏输出:只能输出低电平,输出为1时是高阻态(未知状态,电路上电压由电路来决定);经常应用在总线,需要增加上拉电阻配合使用;具有读取的功能;
复用推挽:
复用开漏:

--

2、应用函数

//端口输出数据寄存器 

alt text

void led1_on(void)
{
	//端口输出数据寄存器
	GPIOE->ODR &= ~(0x1<<2);
}
void led1_off(void)
{
	GPIOE->ODR |= (0x1<<2);
}

2、蜂鸣器

#include "buzzer.h"

void buzzer_init(void)
{
	//时钟:1.找时钟(数据手册看在哪个线上)
	//2.打开时钟	(然后去参考手册中找对应寄存器看怎么打开)
	RCC->APB2ENR |= (0x1<<4);
	
	
	
	//IO:配置模式	推挽
	GPIOC->CRL &= ~(0xf<<0);//将端口配置低寄存器8,9,10,11位清0(P113)
	GPIOC->CRL |= (0x3<<0);//将端口配置低寄存器8,9,10,11位配置为输出,推挽输出

}

void buzzer_on(void)
{
	//端口输出数据寄存器
	GPIOC->ODR |= (0x1<<0);
}

void buzzer_off(void)
{
	//端口输出数据寄存器
	GPIOC->ODR &= ~(0x1<<0);
}

3、继电器

#include "relay.h"

void relay_init(void)
{
	//时钟:1.找时钟(数据手册看在哪个线上)
	//2.打开时钟	(然后去参考手册中找对应寄存器看怎么打开)
	RCC->APB2ENR |= (0x1<<2);
	
	
	
	//IO:配置模式	推挽
	GPIOA->CRH &= ~(0xf<<12);//将端口配置低寄存器8,9,10,11位清0(P113)
	GPIOA->CRH |= (0x3<<12);//将端口配置低寄存器8,9,10,11位配置为输出,推挽输出

}

void relay_on(void)
{
	//端口输出数据寄存器
	GPIOA->ODR &= ~(0x1<<11);
}

void relay_off(void)
{
	//端口输出数据寄存器
	GPIOA->ODR |= (0x1<<11);
}


http://www.niftyadmin.cn/n/5664984.html

相关文章

如何 吧一个 一维数组 切分成相同等分,一维数组作为lstm的输入(三维数据)的数据预处理 collate_fn的应用

要将一个一维数组切分成相同等分&#xff0c;你可以使用 Python 的内置功能或者 NumPy 库&#xff08;如果你处理的是数值数据&#xff09;。以下是几种不同的方法&#xff1a; 方法3 pad_sequence 结合dataloader 应该是最佳方案 ### 方法 1: 使用 Python 的内置切片功能 如果…

TypeScript入门 (二)控制语句

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文主要讲解TypeScript中控制语句的部分&#xff1b;希望通过我的知识点总结&#xff0c;能够帮助你更好地…

笔记整理—内核!启动!—kernel部分(8)动态编译链接库与BSP文件

linux的C语言程序是用编译的&#xff0c;但是如果要在开发板上运行的话就不能使用默认的ubuntu提供的gcc编译器&#xff0c;而是使用arm-linux版本的一类的编译器。我们可以用file xx去查看一个程序的架构。 &#xff08;arm架构&#xff09; &#xff08;intel的80386架构&…

Fiddler抓包工具实战

文章目录 &#x1f7e2; Fiddler入门到精通&#x1f449;主要功能&#x1f449;使用场景 &#x1f7e2; 一、Fiddler抓包和F12抓包对比&#x1f7e2; 二、Fiddler的核心功能&#x1f7e2; 三、Fiddler的工作原理&#x1f7e2; 四、Fiddler功能配置使用&#x1f449;规则设置&am…

FastAPI--如何自定义Docs UI,包括多个APP、静态资源、元数据等

如何mount 一个FastAPI Application? “Mounting” means adding a completely “independent” application in a specific path, that then takes care of handling everything under that path, with the path operations declared in that sub-application. 示例代码 主…

「已解决」KeyError: ‘getpwuid(): uid not found: 1004‘

#问题描述 docker中&#xff0c;调用pwd.getpwuid()出现报错&#xff1a; Traceback (most recent call last):...File "/root/miniconda3/envs/octo/lib/python3.10/site-packages/etils/epath/backend.py", line 235, in statowner pwd.getpwuid(st.st_uid).pw_n…

在 Java 中,super关键字和this关键字的区别

在 Java 中&#xff0c;super关键字和this关键字的区别如下&#xff1a; 一、指代对象不同 this&#xff1a; 代表当前对象的引用。即正在调用成员方法或构造方法的那个对象实例。例如&#xff0c;在一个类的方法中&#xff0c;this可以用来引用当前对象的成员变量和方法。 su…

Day99 代码随想录打卡|动态规划篇--- 01背包问题

题目&#xff08;卡玛网T46&#xff09;&#xff1a; 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&am…