STM32F103串口收发
串口:标准串口 异步串行全双工 通信速度由波特率决定
异步通信:通信双方不共用同一条时钟线,双方通信速度由自己决定(通信需要双方的通信速度保持一致)
串行通信:通信双方只有一条数据线
全双工通信:任意时刻,通信双方可以发送与接收数据。双线单向。
串口四要素:波特率,数据位,停止位,奇偶校验位(校验准确率很低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串口收发相关推荐
- STM32f407与STM32F103 串口采用DMA收发数据配置方法的异同
最近有个项目需要用到STM32F407ZET6这款芯片,其中有一个串口收发数据的应用.因为之前有用过STMF32F103ZET6通过DMA收发数据的方案,所以我打算移植之前的代码实现这个功能,STM3 ...
- 基于Atmega8单片机的串口收发程序
Atmega8出厂默认的内部时钟频率是1Mhz,做串口收发时波特率最高设置为4800,设置为9600会乱码,提高时钟频率才能将波特率提高. #include <avr/io.h> #inc ...
- 搭建串口收发与存储双口RAM简易应用系统
搭建串口收发与存储双口RAM简易应用系统 为了实现通过串口发送数据到 FPGA 中, FPGA 接收到数据后将数据存储在双口 ram 的 一段连续空间中,当需要时,按下按键 S0,则 FPGA 将 R ...
- MTK:UART串口收发数据
MTK之UART串口收发数据 转:https://blog.csdn.net/ivy_reny/article/details/51192110 寄存器 UARTn_RBR: Rx Buffer Re ...
- qt 串口粘包_用Qt 5写一个串口收发桌面工具
今天用Qt写了一个串口收发工具,记录下整个流程. 1.项目工程布局 2.ui文件布局 3.widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include # ...
- GD32F4xx串口收发,DMA+空闲中断
GD32F4xx系列的串口收发DMA+空闲中断基础配置:(这里主要是以DMA+空闲中断为例) 原理就不赘述了,网上资料很多,这里直接进行配置和测试. 1,首先添加GD32F4xx的dma外设库函数文件 ...
- FPGA串口收发(四):接收数据并转发,间隔时间发送
FPGA串口收发(四):接收数据并转发,间隔时间发送 // Description: 串口收发:串口接收数据,内部生成数据,串口间隔特定时间发送数据 // 串口接收数据:串行信号线 1101_1000 ...
- 【嵌入式】——串口实验——实现芯片串口收发数据,按键中断串口发送数据,串口接收数据中断来控制LED亮/灭
实验目的: 实现芯片串口收发数据,按键中断串口发送数据:按下按键,向串口发送数据,并通过虚拟终端显示出来: 串口接收数据中断来控制LED亮/灭:通过串口助手向MCU发送数据,"A" ...
- QT5系列教程二---基于qcustomplot的QT5 GUI串口收发绘图软件实现
QT5系列教程二---基于qcustomplot的QT5 GUI串口收发绘图软件实现 结构 UI部分 代码部分 step1:实现串口数据接受 串口接受数据格式 在`.pro`文件中添加`serialp ...
最新文章
- 通知 | 2020年度“RONG”奖学金入围答辩名单公布
- python中用来占位的语句是_python占位语句
- faster rcnn结构
- 迷你linux设备,ComputeLab发布MintBox迷你PC:专为Linux系统玩家打造
- Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲
- 使用RequestHandlerRetryAdvice重试Web服务操作
- 创建一个java项目
- nodejs连接池连接mysql
- 腾讯广告算法大赛 | 萌新粉丝投稿讲述数据竞赛小白观赛心得
- python叮当猫代码_详细介绍一个利用html+css实现叮当猫的实例代码
- redis源码剖析(4):基础数据结构skiplist
- Linux系统编程 -- 多线程间同步和互斥
- emblog博客打开显示 数据库密码错误,请返回主页的解决办法!
- jmeter.results.shanhe.me.xsl
- Oozie-4.1.0-cdh5.5.2 安装部署使用
- 教养,就是要让别人舒服
- 淘宝群发软件哪款比较好?
- 宋宝华Linux培训笔记-Linux进程管理
- 升级ESX SERVER
- Windows程序开机自启动