串口:标准串口 异步串行全双工 通信速度由波特率决定

异步通信:通信双方不共用同一条时钟线,双方通信速度由自己决定(通信需要双方的通信速度保持一致)
串行通信:通信双方只有一条数据线
全双工通信:任意时刻,通信双方可以发送与接收数据。双线单向。
串口四要素:波特率,数据位,停止位,奇偶校验位(校验准确率很低50%以下,一般选择禁止)
标准串口的数据帧格式:
1bit起始位+5~8bit数据位+奇偶校验位+ 1~2bit的停止位
串口初始化配置:只需要围绕这串口四要素进行配置即可

发送采用普通模式,接收端采用中断服务程序。

1、代码及解析

1.开时钟USART1和GPIOA组时钟

//1.开时钟USART1和GPIOA组时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_USART1,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;                       //定义结构体变量
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;           //配置为复用推挽输出,即能开启高电平也能开启低电平
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;                 //选定管脚9
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;          //输出速度为2MHZ
GPIO_Init( GPIOA, &GPIO_InitStruct);                    //调用初始化函数

//2.初始化USART1

   USART_InitTypeDef USART_InitStruct;//波特率USART_InitStruct.USART_BaudRate = brr;   //硬件流控制             USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //禁止硬件流控//USART_Mode 指定了使能或者失能发送和接收模式USART_InitStruct.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;    //全双工通信,发送接收使能       //奇偶校验          USART_InitStruct.USART_Parity = USART_Parity_No;       //禁止奇偶校验//停止位USART_InitStruct.USART_StopBits = USART_StopBits_1;       //1个停止位USART_InitStruct.USART_WordLength = USART_WordLength_8b;        //8bit数据位USART_Init(USART1, &USART_InitStruct);




USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);                //使能接收中断
USART_ITConfig(USART1,USART_IT_IDLE, ENABLE);               //使能空闲中断  判断通信什么时候结束  NVIC_SetPriority (USART1_IRQn, NVIC_EncodePriority (7-2, 1, 2)); //将合成的优先级设置给USART1中断源
NVIC_EnableIRQ (USART1_IRQn);                 //使能NVIC控制器中断开关,这一步必须要
USART_Cmd( USART1, ENABLE);     //3.使能串口1

2、中断优先级

   使用到优先级的目的:为了区分这些事情的重要程度,即事件执行时的先后顺序。

优先级说明:就是一个数值,数值越小,优先级越高。每个中断优先级可以分为自然(固定不变的)和可控(程序员可以配置)两种。
中断自带的优先级编号称为自然优先级。可控优先级就是可以由程序员自行修改的优先级。
在CM4里面,系统会给每一个中断源都分配一个8位寄存器来存放它的优先级(抢占优先级和响应优先级)。在这8位寄存器里面,一部分用于存放抢占优先级,另一部分存放响应优先级。

理想情况下的分布情况如下:

1 Cortex-M4-NVIC 中得知抢占优先级+响应优先级最多占8位,最少3位。(一个范围,具体占几位取决于芯片生产商)

2.2、 Cortex-M4-NVIC控制器中断相关函数介绍
ARM公司提供了一套专门供NVIC操作的中断控制函数如下所示:
2.2.1、设置优先级分组

函数原型:void NVIC_SetPriorityGrouping (uint32_t PriorityGroup)
函数功能:设置优先级的分组 函数形参:分组值(0~7) 函数返回值:无 注意:整个项目中,分组形式只能是一种
(优先级分组由寄存器中的三个bit决定,重新设置分组,会改变这个寄存器的值,从而会影响到抢占和响应的范围),可以改变抢占和响应优先级。

2.2.2、合成优先级

函数原型:uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t
Pre emptPriority, uint32_t Sub priority)
函数功能:将分组&抢占优先级&响应优先级合成最终的优先级结果
函数形参:分组值(0~7);抢占优先级:(不确定,通过优先级分组+程序员自己定义);响应优先级:(不确定,通过优先级分组+程序员自己定义)
函数返回值:返回一个合成综合的优先级

2.2.3、设置中断优先级

函数原型:void NVIC_SetPriority (IRQn_Type IRQn, uint32_t priority)
函数功能:设置某一个中断的优先级 函数形参:中断的编号;中断优先级(合成的优先级) 函数返回值:无

2.2.4. 使能中断

函数原型:void NVIC_EnableIRQ (IRQn_Type IRQn) 函数功能:开启某一个中断在NVIC控制器中的开关。

3、发送端代码

//发送一个字节函数
void Usart1_Send_Byte(u8 data)//值传递
{while(USART_GetFlagStatus( USART1, USART_FLAG_TXE) == 0);//USART1->DR = data;USART_SendData(USART1,data);
}// "hello world'\0'"
//发送字符串函数
void Usart1_Send_Str(u8 *p)//址传递
{while(*p){Usart1_Send_Byte(*p);p++;      }
}

4、接收端代码

//接收一个字节函数
void Usart1_Rev_Byte(void)
{u8 data ;while(USART_GetFlagStatus( USART1, USART_FLAG_RXNE) == 0);//data = USART1->DR;data = USART_ReceiveData(USART1);while(USART_GetFlagStatus( USART1, USART_FLAG_TXE) == 0);//USART1->DR = data;USART_SendData(USART1,data);
}
//接收一串字符
u8 buff[50];
u8 rev_ok;
int k;/*
1.中断服务函数不可以有返回值,也不可以有形参
2.中断服务函数名名字已经固定好,不可以由程序员自己更改
3.中断服务函数,不需要声明,也不需要调用,它的本质和main函数一样,其工作原理是和main函数抢CPU的使用权
4.在cmsis中的.s函数中
*/
void USART1_IRQHandler(void)
{static u8 i = 0;if( USART_GetITStatus(USART1, USART_IT_RXNE) )    //接收中断{USART_ClearFlag(USART1,USART_FLAG_RXNE);         //清除接收中断标志位buff[i] = USART_ReceiveData(USART1);i++;}if( USART_GetITStatus(USART1, USART_IT_IDLE) )   //空闲中断{if(USART1->DR)                                        //读DR寄存器  清空闲标志位{;}buff[i] = '\0';           //字符串以字符'\0'结尾k=i;i = 0;                                                //数组下标清零rev_ok = 1;                                            //表示一次通信结束}
}

5、printf在串口助手中的应用

主:需要引入#include "stdio.h"函数库

#pragma import(__use_no_semihosting_swi) //取消半主机状态struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;int fputc(int ch, FILE *f) {while((USART1->SR &(0X01<<7))==0);USART1->DR=ch;return (ch);
}
int ferror(FILE *f) {/* Your implementation of ferror */return EOF;
}void _ttywrch(int ch) {while((USART1->SR &(0X01<<7))==0);USART1->DR=ch;
}void _sys_exit(int return_code) {label:  goto label;  /* endless loop */
}

代码仓库

https://gitee.com/bigtiger_king/stm32f103_usart

STM32F103串口收发相关推荐

  1. STM32f407与STM32F103 串口采用DMA收发数据配置方法的异同

    最近有个项目需要用到STM32F407ZET6这款芯片,其中有一个串口收发数据的应用.因为之前有用过STMF32F103ZET6通过DMA收发数据的方案,所以我打算移植之前的代码实现这个功能,STM3 ...

  2. 基于Atmega8单片机的串口收发程序

    Atmega8出厂默认的内部时钟频率是1Mhz,做串口收发时波特率最高设置为4800,设置为9600会乱码,提高时钟频率才能将波特率提高. #include <avr/io.h> #inc ...

  3. 搭建串口收发与存储双口RAM简易应用系统

    搭建串口收发与存储双口RAM简易应用系统 为了实现通过串口发送数据到 FPGA 中, FPGA 接收到数据后将数据存储在双口 ram 的 一段连续空间中,当需要时,按下按键 S0,则 FPGA 将 R ...

  4. MTK:UART串口收发数据

    MTK之UART串口收发数据 转:https://blog.csdn.net/ivy_reny/article/details/51192110 寄存器 UARTn_RBR: Rx Buffer Re ...

  5. qt 串口粘包_用Qt 5写一个串口收发桌面工具

    今天用Qt写了一个串口收发工具,记录下整个流程. 1.项目工程布局 2.ui文件布局 3.widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include # ...

  6. GD32F4xx串口收发,DMA+空闲中断

    GD32F4xx系列的串口收发DMA+空闲中断基础配置:(这里主要是以DMA+空闲中断为例) 原理就不赘述了,网上资料很多,这里直接进行配置和测试. 1,首先添加GD32F4xx的dma外设库函数文件 ...

  7. FPGA串口收发(四):接收数据并转发,间隔时间发送

    FPGA串口收发(四):接收数据并转发,间隔时间发送 // Description: 串口收发:串口接收数据,内部生成数据,串口间隔特定时间发送数据 // 串口接收数据:串行信号线 1101_1000 ...

  8. 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭

    实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...

  9. QT5系列教程二---基于qcustomplot的QT5 GUI串口收发绘图软件实现

    QT5系列教程二---基于qcustomplot的QT5 GUI串口收发绘图软件实现 结构 UI部分 代码部分 step1:实现串口数据接受 串口接受数据格式 在`.pro`文件中添加`serialp ...

最新文章

  1. 通知 | 2020年度“RONG”奖学金入围答辩名单公布
  2. python中用来占位的语句是_python占位语句
  3. faster rcnn结构
  4. 迷你linux设备,ComputeLab发布MintBox迷你PC:专为Linux系统玩家打造
  5. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
  6. 使用RequestHandlerRetryAdvice重试Web服务操作
  7. 创建一个java项目
  8. nodejs连接池连接mysql
  9. 腾讯广告算法大赛 | 萌新粉丝投稿讲述数据竞赛小白观赛心得
  10. python叮当猫代码_详细介绍一个利用html+css实现叮当猫的实例代码
  11. redis源码剖析(4):基础数据结构skiplist
  12. Linux系统编程 -- 多线程间同步和互斥
  13. emblog博客打开显示 数据库密码错误,请返回主页的解决办法!
  14. jmeter.results.shanhe.me.xsl
  15. Oozie-4.1.0-cdh5.5.2 安装部署使用
  16. 教养,就是要让别人舒服
  17. 淘宝群发软件哪款比较好?
  18. 宋宝华Linux培训笔记-Linux进程管理
  19. 升级ESX SERVER
  20. Windows程序开机自启动

热门文章

  1. 苹果手机如何降级系统
  2. java 把文件打包成zip_java 文件流的处理 文件打包成zip
  3. 启动修复黑屏服务器,使用光标修复Windows 10黑屏
  4. (二)Netty之IO模型
  5. 平安性格测试题及答案_性格趣味小测试题 有趣的心理测试题大全及答案
  6. 使用LDA模型对新的文档进行分类
  7. 重点做EUR/USD、EUR/JPY、GBP/USD。
  8. Java知识系统回顾整理01基础04操作符02关系操作符
  9. SpringCloud系列十三:Feign对继承、压缩、日志的支持以及构造多参数请求
  10. 趣拼图最后完成及总结