IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 串口发送字符控制灯亮灭 -> 正文阅读

[嵌入式]串口发送字符控制灯亮灭

通信方式

在这里插入图片描述
通讯方式

a)单工 :只能固定方为发送 一方为接收  并且是固定方向
b)半双工 :两边都可 做发送或者接收  但是只能是某个时间段
C):全双工 :两个都可做发送或者接收  任何时间段都可进行通信

数据同步方式 @数据同步方式 类似
在这里插入图片描述

RX :接收端 TX :发送端
特点:
1 数据传送是以数据块传送的(多个字符组成的数据块流)
2 因为每一次传输的数据块中包含的数据较多,所以在接收时钟和发送时钟要严格同步 通常要用同步时钟 
3 发送和接收是时刻相同 

数据异步方式

没有时钟的约束 就让通讯双方的发送和接收不同步,
导致了接收一方根本不知道发送一方什么时候发送数据了, 
也不知道你发来的一串字符是不是有效的 。

同步和异步的区别

1 异步通信没有时钟的约束,同步通信双方的时钟是连在一起的
2 异步通信数据每个时段传输是字符(一个字节)传输的
3 异步通信效率低 同步效率高
4 异步字节传输间隔是随意的 同步通信的字节传输没有间隔

所以说 他们最根本区别在于 同步自带有时钟 异步没有时钟

串口配置简介

串口的基本设置 :就是波特率设置  波特率 其实就是 单片机和串口约定好的频率 
就像手机之间的蓝牙连接一样 双方都会有一个约定的密码  配置之后就可以通信了
只要你开串口时钟 设置对应 io模式 数据位长度 检验位 等等信息就行了

硬件展示

在这里插入图片描述
在这里插入图片描述

软件设计

1)keil配置
在这里插入图片描述
生成 hex 文件 因为还是用串口下载器

2)软件下载
在这里插入图片描述

这里注意一个地方
在这里插入图片描述如果拔到 boot0的1 还是不行 就按一下 boot1 底下的复位键

代码

用到的结构体成员变量

 typedef struct
{
  uint32_t USART_BaudRate; //波特率设置                             
  uint16_t USART_WordLength; //字长                                              
  uint16_t USART_StopBits; //停止位                                             
  uint16_t USART_Parity; //校验位                                                                                     
  uint16_t USART_Mode;//通讯模式               
  uint16_t USART_HardwareFlowControl;//硬件流                                              
} USART_InitTypeDef;

usart1.c

 #include "stm32f10x.h"
#include "usart.h"

u8 temp;
void usart_init(void)
 {
	 GPIO_InitTypeDef  GPIO_InitStruct;
	 USART_InitTypeDef  USART_InitStruct;
	 NVIC_InitTypeDef  NVIC_InitStruct;
	//rcc
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); 
	//gpio
	GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF_PP;//tx 推挽输出
	GPIO_InitStruct.GPIO_Pin =GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Mode =GPIO_Mode_IN_FLOATING;//rx 浮空输入
	GPIO_InitStruct.GPIO_Pin =GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	//usart
	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_StopBits =USART_StopBits_1;//停止位随意选择
	USART_InitStruct.USART_Parity =USART_Parity_No;//8位字长 不需要校验位
	USART_InitStruct.USART_WordLength =USART_WordLength_8b;//8位字长
	USART_Init(USART1, &USART_InitStruct);
	USART_Cmd(USART1,ENABLE);//串口使能
	//line
	USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);//更新接收中断
	//nvic
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级组
	NVIC_InitStruct.NVIC_IRQChannel =USART1_IRQn;//对应的串口1 优先级
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority =0;//父优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority =3;//子优先级
	NVIC_InitStruct.NVIC_IRQChannelCmd =ENABLE;//使能
	NVIC_Init(&NVIC_InitStruct);  //初始化
 }

接收函数原型和路径
在这里插入图片描述

1 我们 在 uasart.h 必须包含 #include<stdio.h>

配置
在这里插入图片描述

这个是包含对应的固件库路径的 如果不勾选 32 就找不到他在哪里

rx.c 函数

  int fgetc(FILE *stream)//μ¥???ú?óê? oˉêy
  {
  
   while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);//等待接收完成
    return (int) USART_ReceiveData(USART1);//如果接收完成 就返回接收数据
  }

uasart 中断函数+main.c

#include "stm32f10x.h"
#include "main.h"
#include "usart.h"
#include "led.h"

extern u8 temp;  

void  main(void)
   {
     usart_init();
	 led_init();
     while(2022);
  }

	
 void USART1_IRQHandler(void)
 {
	  
	  if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
	  {
		  temp=USART_ReceiveData(USART1);//把接收到数据存到一个变量
			if(temp=='1')//串口发送  1
		 {
		  GPIO_ResetBits(GPIOC,GPIO_Pin_13);//灯亮
		 }	
		 
		 if(temp=='0')//串口发送 0 
		 {
		  GPIO_SetBits(GPIOC,GPIO_Pin_13);//灯灭
		 }
 }
 		  USART_ClearITPendingBit(USART1,USART_IT_RXNE);//每次清除中断标志位 

} 
 

好了
大家加油加油

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:45:46  更:2022-02-22 20:47:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:27:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码