STM32———USART串口控制LED灯亮灭

news2024/12/23 5:56:03

1.硬件设计流程

2.程序设计流程

1.串口初始化时钟使能:RCC_APBxPeriphClockCmd();
  GPIO初始化时钟使能:RCC_AHBxPeriphClockCmd();
2.GPIO端口模式配置:GPIO_Init();
3.串口参数初始化:USART_Init();
4.串口使能:USART_Cmd();
5.重定向printf与scanf函数;
6.LED初始化:LED_Init();

初始化USART串口函数:

#include "Usart.h"


void Usart_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef  USART_InitStruct;
	 //打开串口GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	//将USARTTx的GPIO配置为推挽复用模式
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;    //推挽复用模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed =  GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	 // 将 USART Rx 的 GPIO 配置为浮空输入模式
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //浮空输入模式
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed =  GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStruct.USART_BaudRate = 115200;
	// 配置硬件流控制
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	 // 配置工作模式,收发一起
	USART_InitStruct.USART_Mode =  USART_Mode_Rx | USART_Mode_Tx;
	 // 配置校验位
	USART_InitStruct.USART_Parity = USART_Parity_No;
	 // 配置停止位
	USART_InitStruct.USART_StopBits = USART_StopBits_1;
	// 配置 针数据字长
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	 // 完成串口的初始化配置
	USART_Init(USART1,&USART_InitStruct);
	
	// 使能串口
	USART_Cmd(USART1,ENABLE);
}

重定向c库函数printf到串口,重定向后可使用printf函数:

在进行重定向函数编写时首先需要完成如下两个操作:

(1)在MDK5界面中点击“Options For Target”图标,将“USE MicroLIB”打上勾勾。

(2)在定义文件中需要包含 #include “stdio.h” 头文件。

int fputc(int ch , FILE *f)
{
	USART_SendData(USART1,(uint8_t) ch );
																
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
																//USART_FLAG_TXE:发送数据寄存器中的数据有没有被取走
	return (ch);
}

重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数:

int fgetc(FILE *f)
{
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
																//USART_FLAG_TXE:发送数据寄存器中的数据有没有被取走
	return (int)USART_ReceiveData(USART1);
}

重定向

就是指重新定义C库函数。对于printf()函数而言,printf只是一个宏定义,实际上调用的是fputc()函数,为了能够使用printf()函数直接向串口发送数据,需要重定向fputc()函数。同理,重定向scanf()函数也是这个意思。

FILE *f是单片机函数重定向的固定用法,因为C语言和单片机对fputc(),fgetc()函数的定义是不同的,在C中,标准的参数为int xxx , FILE *x,如果没有FILE *x 这个指针变量,则无法实现重定向,因此这是一个固定用法。
在定义函数时,FILE *x 这个指针变量必须有,但是函数主体中可以不使用。

 

2. 初始化LED

#include "Led.h"


void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);  //开启时钟
	
	GPIO_InitTypeDef  GPIO_InitStruct;				//定义GPIO结构体
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; 			//选用引脚5
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOE,&GPIO_InitStruct);
	
	GPIO_SetBits(GPIOE,GPIO_Pin_5);   //上电默认熄灭
	
}


void LED_ON()
{
	
	GPIO_ResetBits(GPIOE,GPIO_Pin_5);   //灯亮
}

void LED_OFF()
{
	
	GPIO_SetBits(GPIOE,GPIO_Pin_5);     //灯灭
}

3. 主函数

#include "stm32f10x.h"                  // Device header
#include "Usart.h"
#include "Led.h"
#include "Delay.h"

static void Show_Message(void);  //函数声明

int main(void)
{
	char ch = 0;
	
	/* 初始化 USART 配置模式为 115200 8-N-1,中断接收 */
	LED_Init();
	Usart_Init();
	Show_Message();
	
	while(1)	
	{	
		ch = getchar();
		if( ch != '\0')
		{
			Delay_ms(100);
			printf("接收到字符:%c\n",ch);			
		}
		switch(ch)
			{
		
			case '1': 
				LED_ON();
				break;		
			case '2':
				LED_OFF();
				break;
			default:
			Delay_ms (500);
			Show_Message();
				break;	
		
			}
	}

}

static void Show_Message(void)															//定义全局函数
{

	printf("\n 串口通讯控制实验: \n");
	printf("指令 -----------  LED亮灭\n");
	printf("  1  -----------   LED1  ON \n");
	printf("  2  -----------   LED1  OFF \n");
}

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

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

相关文章

如何在React项目中引用less

安装less npm install less less-loader --save-dev暴露 webpack 文件 利用 npx create-react-app 搭建的 React 项目,默认隐藏 webpack 配置文件,引入 less 需要修改 webpack 配置文件,因此我们需要执行命令暴露 webpack 配置文件。 请先将…

SRM系统采购功能

SRM系统采购是企业为了优化供应链管理而采购的一种信息系统。它旨在帮助企业与供应商之间建立良好的合作关系,提供全面的供应商管理功能,以实现采购的效率和效益最大化。 首先,SRM系统采购在企业供应链管理中具有重要的意义。供应链是企业与供…

2023最新版本 FreeRTOS教程 -1-标准库移植FreeRTOS

源码下载 官网下载驱动 点击直达 源码剪裁 剪裁之后的图片,找我免费获取 添加进MDK 配置滴答定时器 全部工程获取 查看下方头像

pycharm使用ssh连接远程jupyter

1. 安装jupyter pip install jupyter2. 生成jupyter_notebook_config.py文件 jupyter notebook --generate-config3. 设置命令参数 jupyter notebook --no-browser --allow-root --port 8900配置Jupyter服务器 将上面的代码复制到命令行实参中:

[NISACTF 2022]is secret RC4加密执行SSTI

这里结合了加密 记录一下 首先获取 啥都没得 扫一下目录 都看看 后面发现 http://node5.anna.nssctf.cn:28378/secret 这个页面 Tell me 是不是就是传参 我们get传递一个看看 http://node5.anna.nssctf.cn:28378/secret?secret{{49}} 发生报错 出现了 框架 这…

企业内部外网向内网传输文件如何实现高效安全?

随着信息技术的发展,企业内部外网隔离已成为一种常见的网络安全措施,旨在防止外部攻击者入侵内部网络,保护企业的核心数据和业务系统。然而,企业内外网隔离也带来了一些问题,其中之一就是如何实现内外网之间的文件传输…

数据库查询语句字段不匹配不报错,删除语句字段不匹配报错?

使用了很多的mybatisplus导致了遇到mybatis有点忘记了。工作遇到了这样的一个错误: Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column userId in where clause at sun.reflect.NativeConstructorAccessorImpl.newInstance0(…

大模型该被知道的技术实现-面向垂直领域

一个高度清晰的思维导图截图奉上(下载:需3积分) 内容截图

【HDFS】Client写三副本数据pipeline恢复的一些总结

一、前言&闲聊 我们知道,HDFS客户端在写三副本的情况下,会建立一个pipeline,然后client不断地把数据发送到pipeline里的第一个datanode,然后第一个datanode再顺着pipeline往下游datanode传递数据。写pipeline的过程模型图如下所示: 这里HDFS有个优化,如果pipeline里…

MySQL系列-架构体系、日志、事务

MySQL架构 server 层 :层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现&am…

okcc呼叫系统运行模式及特点

okcc呼叫中心外呼系统是系统供应商打造的一款专为营销类坐席提供外呼功能的软件,也就是常见的外呼系统,操作简单功能比较单一。 okcc呼叫中心外呼系统是一种SaaS租用模式的外呼系统,成本比较低,运营商部署在公有云服务器上&#x…

跨境电商卖家必备:自养号测评的显著优势与多重功能解析!

自养号测评,对于跨境电商卖家而言,是一种至关重要的运营手段。通过这种方式,卖家能够迅速增加产品销量、评论数量,提升在平台中的排名,进而促进产品的流量转化和订单增长。与传统机刷方式不同,自养号测评采…

②【MySQL表操作】 数据库表的创建、查询、修改、删除

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ ②【表操作】 数据库表的创建、查询、修改、删…

Inspeckage,动态分析安卓 APP 的 Xposed 模块

前提 我在不久前写过《 APP 接口拦截与参数破解》的博文;最近爬取APP数据时又用到了相关技术,故在此详细描述一下 Inspeckage 的功能。(环境准备本文不再赘述) 功能 在电脑上访问 http://127.0.0.1:8008 就可以看到 inspeckage…

win11系统自带便利签

步骤如下: 在搜索框输入 便笺 2. 打开及用。

实现基于 Azure DevOps 的数据库 CI/CD 最佳实践

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节,也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中,像处理代码那样处理数据库变更呢? DORA 调研报告 DORA(DevOps Research &am…

图纸管理制度《七》

1、目的: 明确技术图样与文件的签署、更改及标准化等内容,对技术图样与文件进行有效的控制。技术文化是公司的核心秘密,是公司能够持续发展并在市场上保持强势竞争力的有力保障,公司的技术文件属于公司所有,公司的每一…

C++:关联式容器set的介绍

1、set的介绍 set是按照一定次序存储元素的容器 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。 在内部&#…

xmind2testcase使用与二次开发

xmind2testcase安装、简单二次开发与使用说明: 添加xmind文件备份 重构生成CSV文件 preview预览页面数据显示重构 一、安装 1.xmind2testcase安装 pip install xmind2testcase 2.启动服务 进入默认位置:C:\Users\dell\AppData\Roaming\Python\Py…

医院能耗管控平台,医院节能降耗的有效利器

随着人们对医院舒适度要求的不断提升,医院采用新技术及信息化建设等手段来提升服务,导致能源使用效率高,医院能耗管控平台可以帮助医院在运行的基础上,促进医院节能降耗等工作。 医院目前存在的问题 1、医院人口密度大、用能系统…