STM32 串口发送数据、串口中断 7.19

STM32 串口发送:

全双工 异步 串行通信方式IIC:
CLK(时钟线)
DAT(数据线)同步协议:通过时钟线保证数据线是有效的
异步协议:通过寄存器接受到数据之后产生中断,从而传输数据1.波特率
2.数据帧格式 起始位(不管)数据位(数据位个数)可存在的奇偶校验位停止位
3.流控制软件流控制(发送了特定约定好的字符)硬件流控制(RX TX RTS CTS)USART的编程步骤:1.打开时钟
2.设置GPIO模式
3.USART设置
4.使能串口
5.编写接收发送函数
#ifndef __usart_H_
#define __usart_H_ #include "stm32f10x.h"                  // Device header
void usart1_init(int baud);
void usart1_send_byte(u8 ch);
u8 usart1_recv_byte(void);#endif
#include "usart.h"
#include "stm32f10x.h"                  // Device header
#include "stdio.h"void usart1_init(int baud)
{//1.打开时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);//2.设置GPIO模式//发送方不用设置很多,而接收方需要解析数据所以设置很多东西//PA9-TXGPIO_InitTypeDef GPIO_initStructure;GPIO_initStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_initStructure.GPIO_Pin = GPIO_Pin_9;GPIO_initStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_initStructure);//PA10-RXGPIO_initStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_initStructure.GPIO_Pin = GPIO_Pin_10;GPIO_Init(GPIOA,&GPIO_initStructure);//3.usart USART设置USART_InitTypeDef USART_initStructure;USART_initStructure.USART_BaudRate = baud;//波特率USART_initStructure.USART_WordLength = USART_WordLength_8b;//8位数据位USART_initStructure.USART_Parity = USART_Parity_No;//无奇偶校验位USART_initStructure.USART_StopBits = USART_StopBits_1;//1位停止位USART_initStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流USART_initStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接受和发送使能USART_Init(USART1,&USART_initStructure);//4.使能串口USART_Cmd(USART1,ENABLE);}void usart1_send_byte(u8 ch)
{USART_SendData(USART1,ch);//发送一个字节数据while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));//等待发送完成
}
u8 usart1_recv_byte(void)
{while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_RXNE));//等待数据过来return USART_ReceiveData(USART1);}int fputc(int ch,FILE* file)//重定向printf
{usart1_send_byte(ch);return ch;
}
#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "stdio.h"
void delay(int n)
{int i;while(n--)for(i=0;i<8050;i++);
}int main(void)
{usart1_init(115200);while(1){//usart1_send_byte('a');printf("ikun\r\n");delay(1000);}
}

串口中断:

USART中断的编程步骤:1.打开时钟
2.设置GPIO模式
3.USART设置
4.使能接受中断
5.配置中断优先级
6.使能串口
7.编写接收发送函数
8.编写中断处理函数
#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"                  // Device headervoid usart1_init(int baud);
void usart1_send_byte(u8 ch);
u8 usart1_recv_byte(void);#endif
#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "stdio.h"void usart1_init(int baud)
{//1.打开时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);//2.设置GPIO模式//PA9-TXGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//PA10-RXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_Init(GPIOA, &GPIO_InitStructure);//3.USART初始化USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = baud; //波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据位USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验USART_InitStructure.USART_StopBits = USART_StopBits_1;//1位停止位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//接受/发送使能USART_Init(USART1, &USART_InitStructure);//使能接收中断RXNEUSART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//配置中断优先级NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;NVIC_Init(&NVIC_InitStructure);//4.使能串口USART_Cmd(USART1, ENABLE);}//编写中断处理函数
void USART1_IRQHandler(void)
{if(SET == USART_GetITStatus(USART1, USART_IT_RXNE)){//USART_ClearITPendingBit(USART1, USART_IT_RXNE);//你想做的事//回显usart1_send_byte(usart1_recv_byte());}
}void usart1_send_byte(u8 ch)
{USART_SendData(USART1, ch);//发送一个字节数据while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_TXE));//等待发送完成
}
u8 usart1_recv_byte(void)
{while(RESET == USART_GetFlagStatus(USART1, USART_FLAG_RXNE));//等待数据过来return USART_ReceiveData(USART1);
}//重写fputc,重定向printf
int fputc(int ch, FILE* file)
{usart1_send_byte(ch);return ch;
}
#include "stm32f10x.h"                  // Device header
#include "usart.h"
#include "stdio.h"void delay(int n)
{int i;while(n--)for(i=0; i<8050; i++);
}int main()
{usart1_init(115200);while(1){//		usart1_send_byte('a');printf("ikun\r\n");delay(1000);}
}

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

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

相关文章

前端vue uni-app仿美团下拉框下拉筛选组件

在前端Web开发中&#xff0c;下拉筛选功能是一种非常常见的交互方式&#xff0c;它可以帮助用户快速选择所需的选项。本文将介绍如何利用Vue.js和uni-app框架来实现一个高效的下拉筛选功能。通过使用这两个强大的前端框架&#xff0c;我们可以轻松地创建具有响应式用户操作的下…

Sublime Text 4 激活教程(Windows+Mac)

下载安装 官网 https://www.sublimetext.com 点击跳转 2023.7.21 版本为4143 Windows激活方式 一、激活License方式 入口在菜单栏中"Help” -> “Enter License” 注意格式&#xff0c;可能会过期失效&#xff0c;失效就用方式二 Mifeng User Single User License E…

Linux底层

一. arm基础知识 基础&#xff1a;c语言 具有一定硬件基础 特点---》前后联系 arm目标&#xff1a; 看懂简单的汇编代码 会看电路图、芯片手册 学会如何用软件控制硬件思想 解决问题的办法 谈谈对嵌入式的理解&#xff1f; 以计算应用为中心&#xff0c;软硬件可裁剪的…

JVM Optimization Learning(二)

一、Run-time data areas PC ▪ Each Java Virtual Machine thread has its own pc (program counter) register. ▪ At any point, each Java Virtual Machine thread is executing the code of a single method, namely the current method for that thread. ▪ If that m…

数据库 - RDBMS

1、什么是数据库&#xff1f; 数据库是一种用于存储和管理数据的系统或软件。它是结构化数据的集合&#xff0c;以便于访问、管理和更新。数据库可用于在计算机系统中组织、存储、检索和处理大量数据。 数据库通常由一组相关的数据表组成&#xff0c;每个表都有特定的列和行&…

mybatis学习笔记之使用javassist生成类

文章目录 使用javassist动态生成类使用javassist动态生成类并实现接口实现接口中所有的方法工具类GenerateDaoProxy的编写 使用javassist动态生成类 Testpublic void testGennerateFirstClass() throws Exception{//获取类池&#xff0c;这个类池就是用来生成class的ClassPool …

Cloudreve搭建云盘系统,并实现随时访问

文章目录 1、前言2、本地网站搭建1.环境使用2.支持组件选择3.网页安装4.测试和使用5.问题解决 3、本地网页发布1.cpolar云端设置2.cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#xff0c;一时间公…

C#之委托

目录 一、简介 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;类与委托 二、声明委托 三、使用委托 &#xff08;一&#xff09;创建委托对象 &#xff08;二&#xff09;使用委托 四、简单的委托示例 五、Action[T]和Func[T]委托 六、多播委托 七、匿…

ONNX Runtime 加速深度学习(C++ 、python)详细介绍

ONNX Runtime 加速深度学习(C 、python)详细介绍 本文在 https://blog.csdn.net/u013250861/article/details/127829944 基础上进行了更改&#xff0c;感谢原作&#xff01; ONNXRuntime(Open Neural Network Exchange)是微软推出的一款针对ONNX模型格式的推理框架&#xff0c…

妙记多 Mojidoc PC端(Mac 端+windows端)Beta版本正式上线!

你们呼唤了无数次的妙记多 Mojidoc PC客户端 Beta版本正式上线啦&#xff01; 感谢300位妙友积极参与内测&#xff0c;给予了我们很多非常有效的意见和建议&#xff01;我们会根据用户反馈不断优化和修复相关功能&#xff0c;在此感谢妙友们一直以来的支持&#xff5e; PC端拥…

SkyWalking链路追踪中span全解

基本概念 在SkyWalking链路追踪中&#xff0c;Span&#xff08;跨度&#xff09;是Trace&#xff08;追踪&#xff09;的组成部分之一。Span代表一次调用或操作的单个组件&#xff0c;可以是一个方法调用、一个HTTP请求或者其他类型的操作。 每个Span都包含了一些关键的信息&am…

numpy 笔记 partition和

1 partition 对数组进行部分排序&#xff0c;返回的是数组本身的部分排序结果 1.1 使用方法 numpy.partition(a, kth, axis-1, kindintroselect, orderNone) 1.2 参数说明 a输入的数组kth分割点&#xff0c;前kth的元素会按照部分排序的顺序排列&#xff0c;而在kth之后的…

小程序 methods方法互相调用 this.onClickCancel is not a function

背景 做了一个自定义的弹出对话窗口&#xff0c;主要是自定义一些文本颜色。 问题 但是点击按钮事件&#xff1a;取消与确认&#xff0c;调用了同一个接口&#xff0c;然后想着走不同方法&#xff0c;需要调用methods其他方法。然后报错了&#xff1a; VM1081 WAService.js:…

行为型模式 - 状态模式

概述 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可能要根据其他状态来更新处理。例如&#xff0c;如果电梯门现在处于运行时状态&#xff0c;就不能进…

C语言数据在内存中的存储

目录 前言 本期内容介绍 一、数据类型的介绍 1.1类型的意义&#xff1a; 1.2C语言中是否有字符串类型&#xff1f; 1.3类型的基本归类 整型家族&#xff1a; 浮点型&#xff08;实型&#xff09;家族&#xff1a; 构造&#xff08;自定义&#xff09;类型&#xff1a;…

STM32外设系列—TB6612FNG

本文涉及到定时器和串口的知识&#xff0c;详细内容可见博主STM32速成笔记专栏。 文章目录 一、TB6612简介二、TB6612使用方法2.1 TB6612引脚连接2.2 控制逻辑2.3 电机调速 三、实战项目3.1 项目简介3.2 初始化GPIO3.3 PWM初始化3.3 电机控制程序3.4 串口接收处理函数 一、TB66…

优化transformer

使用transformer而导致的时间长&#xff0c;可能会由于self-attention计算Query和key的值才导致的时间长&#xff0c;也可能会因为feed forward中的计算导致时间长。这里我们只针对第一种情况下进行优化。 第一种情况&#xff1a;有些问题&#xff0c;我们可能不需要看整个句子…

【hadoop】使用Java API 上传下载数据

使用Java API 上传下载数据 使用Java API上传数据到HDFSHDFS数据的下载 使用Java API上传数据到HDFS Test public void test1() throws Exception {//构造一个输入流&#xff0c;代表要上传的数据InputStream input new FileInputStream("d:\\temp\\hadoop-2.7.3.tar.gz…

HTML <output> 标签

实例 执行计算然后在 <output> 元素中显示结果: <form οninput="x.value=parseInt(a.value)+parseInt(b.value)">0<input type="range" id="a" value="50">100+<input type="number" id="b&q…