STM32自学☞串口发送+接收

一、相关函数说明:

 USART_ClockInit()和USART_ClockStructInit(); 用来配置同步时钟输出

 USART_DMACmd(); 开启USART到DMA的触发通道

 USART_SendData(); 发送数据

 USART_ReceiveData(); 接收数据

二、程序代码

serial.c文件

 #include "stm32f10x.h"

#include "stm32f10x_usart.h"

#include "serial.h"

#include "stdio.h"

#include <stdarg.h>

uint8_t serial_RxData;

uint8_t serival_RxFlag;

/*初始化函数*/

void serial_Init(void)

{

/*

 初始化步骤:

 1.开启GPIO和USART时钟

 2.初始化GPIO,把TX配置为复用输出,RX配置为输入

 3.初始化并配置USART 

 4.如果只需要发送的功能,就直接开启USART

 5.如果需要接受数据,还需要配置中断(即在开启USART之前添加ITConfig和NVIC的代码)

 */

 //开启时钟

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

 //初始化配置GPIO

 GPIO_InitTypeDef GPIO_InitStruct;

 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;

 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;

 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

 GPIO_Init(GPIOA,&GPIO_InitStruct);

 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;

 GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;

 GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;

 GPIO_Init(GPIOA,&GPIO_InitStruct);

 //初始化配置USART

 USART_InitTypeDef USART_InitStruct;

 USART_InitStruct.USART_BaudRate=9600; //波特率

 USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制

 USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //发送与接受模式

 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_ITConfig(USART1,USART_IT_RXNE,ENABLE);

 //配置NVIC

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

 NVIC_InitTypeDef NVIC_InitStruct;

 NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn; //中断通道

 NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;  

 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;

 NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;

 NVIC_Init(&NVIC_InitStruct);

 //开启USART

 USART_Cmd(USART1,ENABLE);

}

/*发送数据函数(发送一个字节)*/

void serial_SendByte(uint8_t Byte)

{

 USART_SendData(USART1,Byte);

 while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

}

/*发送数据函数(发送一个数组)*/

void serial_SendArray(uint8_t *Array,uint16_t Length)

{

 uint16_t i;

 for(i=0;i<Length;i++)

 {

  serial_SendByte(Array[i]);

 }

}

/*发送数据函数(发送一个字符串)*/

void serial_SendString(char *String)

{

 uint8_t i;

 for(i=0;String[i]!='\0';i++)

 {

  serial_SendByte(String[i]);

 }

}

/*发送数据函数(发送一个数字)*/

uint32_t serial_Pow(uint32_t X,uint32_t Y)

{

 uint32_t Result=1;

 while(Y--)

 {

  Result*=X;

 }

 return Result;

}

void serial_SendNumber(uint32_t Number, uint8_t Length)

{

 uint8_t i;

 for(i=0;i<Length;i++)

 {

  serial_SendByte(Number/serial_Pow(10,Length-i-1)%10+'0');

 }

}

/*重写Fputc函数*/

int fputc(int ch,FILE *f)

{

 serial_SendByte(ch);

 return ch;

}

/*封装*/

void serial_Printf(char *format,...)

{

 char String[100];

 va_list arg;

 va_start(arg,format);

 vsprintf(String,format,arg);

 va_end(arg);

 serial_SendString(String);

}

/*读后清除标志位函数*/

uint8_t serial_GetRxFlag(void)

{

 if(serival_RxFlag==1)

 {

  serival_RxFlag=0;

  return 1;

 }

 return 0;

/*读后清除数据函数*/

uint8_t serial_GetRxData(void)

{

 return serial_RxData;

}

 

void USART1_IRQHandler(void)

{

 if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)

 {

  serial_RxData=USART_ReceiveData(USART1);

  serival_RxFlag=1;

  USART_ClearITPendingBit(USART1,USART_IT_RXNE);

 }

}

serial.h文件

#ifndef _SERIAL_H

#define _SERIAL_H

#include "stdint.h"

#include <stdio.h>

void serial_Init(void);

void serial_SendByte(uint8_t Byte);

void serial_SendArray(uint8_t *Array,uint16_t Length);

void serial_SendString(char *String);

void serial_SendNumber(uint32_t Number, uint8_t Length);

void serial_Printf(char *format,...);

uint8_t serial_GetRxFlag(void);

uint8_t serial_GetRxData(void);

#endif

main.c文件

#include "stm32f10x.h"

#include "delay.h"

#include "OLED.h"

#include "serial.h"

uint8_t RxData;

int main (void)

 //初始化

 OLED_Init();

 serial_Init();

 OLED_ShowString(1,1,"RxData:");

 while(1)

 {

  if(serial_GetRxFlag()==1)

  {

   RxData=serial_GetRxData();

   serial_SendByte(RxData);

   OLED_ShowHexNum(1,8,RxData,2);

  }

 }

}

 

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

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

相关文章

文件底层的深入理解之文件输入输出重定向

目录 一、文件fd的分配规则 二、对输出重定向现象的理解 三、输出输入重定向的简单实现 1、输出重定向 2、输入重定向 一、文件fd的分配规则 最小的没有被使用的数组下标&#xff0c;会被分配给最新打开的文件。 二、对输出重定向现象的理解 正如上面这段代码所示&#xff0…

C语言实现日本某地发生了一件谋杀案

题目 猜凶手 题目内容&#xff1a; 日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&…

从零开始学习Netty - 学习笔记 -Netty入门【半包,黏包】

Netty进阶 1.黏包半包 1.1.黏包 服务端代码 public class HelloWorldServer {private static final Logger logger LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());public static void main(String[] args) {NioEventLoopGroup bossGroup new NioEventL…

Ubuntu上Jenkins自动化部署Gitee上VUE项目

文章目录 1.安装NodeJS插件2.配置全局工具配置-NodeJS环境变量3.新建自由风格的软件项目任务4.配置General配置丢弃旧的构建配置参数化构建过程 5.配置源码管理6.构建触发器7.设置构建环境8.配置构建步骤9.配置构建后操作10测试构建 前文链接&#xff1a; Ubuntu上Jenkins自动…

java常用应用程序编程接口(API)——Instant,DateTimeFormatter,Period,Duration概述

前言&#xff1a; 整理下学习心得。打好基础&#xff0c;daydayup&#xff01; Instant Instant是时间线上的某个时刻/时间戳&#xff0c;通过获取Instant的对象可以拿到此刻的时间&#xff0c;该时间由两部分组成&#xff1a;1&#xff0c;从1970年1月1日00:00:00开始走到此刻…

前端开发 VSCode 插件推荐

1、Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code VS Code 的中文&#xff08;简体&#xff09;语言包&#xff0c;此中文&#xff08;简体&#xff09;语言包为 VS Code 提供本地化界面。 下载地址&#xff1a;Chinese (Simplified) (简体中文) La…

D*算法超详解 (D星算法 / Dynamic A*算法/ Dstar算法)(死循环解决--跟其他资料不一样奥)

所需先验知识&#xff08;没有先验知识可能会有大碍&#xff0c;了解的话会对D*的理解有帮助&#xff09;&#xff1a;A*算法/ Dijkstra算法 何为D*算法 Dijkstra算法是无启发的寻找图中两节点的最短连接路径的算法&#xff0c;A*算法则是在Dijkstra算法的基础上加入了启发函数…

[JavaWeb玩耍日记]HTML+CSS+JS快速使用

目录 一.标签 二.指定css 三.css选择器 四.超链接 五.视频与排版 六.布局测试 七.布局居中 八.表格 九.表单 十.表单项 十一.JS引入与输出 十二.JS变量&#xff0c;循环&#xff0c;函数 十三.Array与字符串方法 十四.自定义对象与JSON 十五.BOM对象 十六.获取…

Network LSA 结构简述

Network LSA主要用于描述一个区域内的网络拓扑结构&#xff0c;包括网络中的路由器和连接到这些路由器的网络。它记录了每个路由器的邻居关系、连接状态以及连接的度量值&#xff08;如带宽、延迟等&#xff09;&#xff0c;以便计算最短路径和构建路由表。display ospf lsdb n…

网关kong记录接口处理请求和响应插件 tcp-log-with-body的安装

tcp-log-with-body 介绍 Kong的tcp-log-with-body插件是一个高效的工具&#xff0c;它能够转发Kong处理的请求和响应。这个插件非常适用于需要详细记录API请求和响应信息的情景&#xff0c;尤其是在调试和排查问题时。 软件环境说明 kong version 2.1.4 - 2.8.3 [可用亲测]C…

二、数据结构——单链表,双链表,栈,队列,单调栈,单调队列,KMP,Trie,并查集,堆,哈希表等内容。

对于链表来说&#xff0c;由于new操作时间太长&#xff0c;因此&#xff0c;算法题中一般使用静态链表。 1.单链表 采用数组实现单链表&#xff0c;可以直接开两个数据&#xff0c;一个数组存放数值&#xff0c;另外一个数据存放下一个元素&#xff08;指针&#xff09;。 示…

JavaScript“基本语法”笔记(自学第一天)!

一、JavaScript的用途和应用领域 JavaScript的应用领域非常广泛&#xff0c;主要包括以下几个方面&#xff1a; 网页交互性: JavaScript最初是为了增强网页的交互性而开发的&#xff0c;它可以控制网页的行为、样式和内容&#xff0c;使用户能够与网页进行实时交互&#xff0c…

一个教材上的CMS网站源码在Linux服务器上登录时验证码正常,但在windows下不能正常显示

一个教材上的CMS网站源码在Linux服务器上登录时验证码正常&#xff0c;但在windows下不能正常显示。 在linux服务器上能正常显示。显示界面如下所示&#xff1a;

蜻蜓FM语音下载(mediadown)

一、介绍 蜻蜓FM语音下载&#xff08;mediadown&#xff09;&#xff0c;能够帮助你下载蜻蜓FM音频节目。如果你是蜻蜓FM会员&#xff0c;它还能帮你下载会员节目。 二、下载地址 本站下载&#xff1a;蜻蜓FM语音下载&#xff08;mediadown&#xff09; 百度网盘下载&#…

Web 应用防火墙(WAF):功能、应用场景和未来发展方向

Web 应用防火墙&#xff08;WAF&#xff09;是一种用于保护 Web 应用程序免受各种网络攻击的安全工具。WAF 可以检测并阻止对 Web 应用程序的恶意攻击&#xff0c;如SQL 注入、跨站脚本&#xff08;XSS&#xff09;和跨站请求伪造&#xff08;CSRF&#xff09;等。它通过检查 H…

【Redis 主从复制】

文章目录 1 :peach:环境配置:peach:1.1 :apple:三种配置方式:apple:1.2 :apple:验证:apple:1.3 :apple:断开复制和切主:apple:1.4 :apple:安全性:apple:1.5 :apple:只读:apple:1.6 :apple:传输延迟:apple: 2 :peach:拓扑结构:peach:2.1 :apple:⼀主⼀从结构:apple:2.2 :apple:⼀…

【MetaGPT】配置教程

MetaGPT配置教程&#xff08;使用智谱AI的GLM-4&#xff09; 文章目录 MetaGPT配置教程&#xff08;使用智谱AI的GLM-4&#xff09;零、为什么要学MetaGPT一、配置环境二、克隆代码仓库三、设置智谱AI配置四、 示例demo&#xff08;狼羊对决&#xff09;五、参考链接 零、为什么…

大数据技术(一)

大数据技术概述 大数据技术层面及其功能 数据采集与预处理 利用ETL(extract-transform-load)工具将分布的、异构数据源中的数据&#xff0c;如关系数据、平面数据文件等&#xff0c;抽取到临时中间层后进行清洗、转换、集成&#xff0c;最后加载到数据仓库或数据集市中&…

C语言什么是循环嵌套?

一、问题 分⽀结构是可以进⾏嵌套的&#xff0c;循环结构同样也⽀持嵌套&#xff0c;那什么是循环嵌套呢&#xff1f; 二、解答 ⼀个循环体内⼜包含另⼀个完整的循环结构&#xff0c;就称之为循环嵌套。内嵌的循环中还可以嵌套循环&#xff0c;这就是多层循环&#xff0c;也叫…

类与对象详解 C++ (1)

1.struct和class 与C语言不同的是&#xff0c;C中struct和class可以定义成员变量和成员函数。更偏好用class。 2.类的定义 格式如下&#xff1a; class 为 定义类的 关键字&#xff0c; ClassName 为类的名字&#xff0c; {} 中为类的主体&#xff0c;注意 类定义结束时后面…