串口通信(STM32演示实现)

news/2024/5/8 12:50:36/文章来源:https://blog.csdn.net/qq_52479948/article/details/129706463

目录

一、串行通信的概念

二、寄存器

2.1控制寄存器USART_CR1

 2.2控制寄存器USART_CR2​编辑

 2.3串口寄存器USART_BRR

2.4 USART_ISR

2.5USART_TDR

2.6USART_RDR​编辑

三、实现串口数据的收发


一、串行通信的概念

u通信,最少要有两个对象,一个收,一个发
u同步通信:

     一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信

u异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同布 

u串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。
u并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行

u 单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机
u 半双工:可以收,可以发,但是不能同时收发, 比如对讲机
u 全双工:可以在同一时刻既接收,又发送。 手机

n 通用同步异步收发器(USART)灵活地与外部设备进行全双工数据通信,满足外部设备对工业标准NRZ异步串行数据格式的要求。USART通过小数波特率发生器提供了多种波特率。它支持同步单向通信和半双工单线通信;还支持LIN(局域互联网络),智能卡协议与IrDA(红外数据协会)SIR ENDEC规范,以及调制解调操作(CTS/RTS)。而且,它还支持多处理器通信。
n USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此USART和一般单片机UART使用方式是一样的,都使用异步模式。

 

 STM32F051内置多达两个通用同步 / 异步收发器( USART1 USART2 ),通信速度可达 6 Mbit / s

 

              0     1      0      1      0      0      0      0     0     0             

TXD 串口输出0x05波形图、低位先发送:                                                                  

l 在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,既每秒传送的二进制位数,其单位为bps(bits per second)。它是衡量串行数据速度快慢的重要指标。

l 国际上规定一个标准的波特率系列: 110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……

例如:115200bps、指每秒传送115200位。通信双方必须设置同样的同学速率才能正常通信

l 注意:实际的数据没这么多,还包括起始位,结束位,校验位   

二、寄存器

2.1控制寄存器USART_CR1

 2.2控制寄存器USART_CR2

 2.3串口寄存器USART_BRR

2.4 USART_ISR

2.5USART_TDR

2.6USART_RDR

三、实现串口数据的收发

 这是F051的电路图

注意:如果无法识别串口,清装好ch340串口驱动

左侧可以直接选

void  Uart_Putchar(uint8_t ch)
{while(!(USART1->ISR &(1<<7)));   //等待发送寄存器空USART1->TDR = ch;                        //发送字符
}void Uart_Putstring(uint8_t  *str)	
{while(*str != '\0'){Uart_Putchar(*str);		str++;}
}uint8_t Uart_Getchar(void)
{while(!(USART1->ISR & (1<<5)));  //等待收到一个字符的数据return  USART1->RDR;                   //返回收到的字符
}

Stm32f0xx_hal_uart.c  文件中

串口的发送函数

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

串口的接收函数

HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

 printf函数调用的是c库中的fputc函数。因此我们如果重新写了fputc函数,就可以改变printf函数的功能,可以向串口打印输出。int fputc(int ch,FILE *f){	while((USART1->ISR&(1<<7)) == 0);	USART1->TDR=(uint8_t)ch;return ch;} 
/********************************************************************************* File Name          : main.c* Description        : Main program body******************************************************************************** This notice applies to any and all portions of this file* that are not between comment pairs USER CODE BEGIN and* USER CODE END. Other portions of this file, whether * inserted by the user or by software development tools* are owned by their respective copyright owners.** COPYRIGHT(c) 2017 STMicroelectronics** Redistribution and use in source and binary forms, with or without modification,* are permitted provided that the following conditions are met:*   1. Redistributions of source code must retain the above copyright notice,*      this list of conditions and the following disclaimer.*   2. Redistributions in binary form must reproduce the above copyright notice,*      this list of conditions and the following disclaimer in the documentation*      and/or other materials provided with the distribution.*   3. Neither the name of STMicroelectronics nor the names of its contributors*      may be used to endorse or promote products derived from this software*      without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"
#include "usart.h"
#include "gpio.h"/* USER CODE BEGIN Includes */
#include <string.h>
/* USER CODE END Includes *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*//* USER CODE END PFP *//* USER CODE BEGIN 0 */int fputc(int ch, FILE *f)
{while( !(USART1->ISR & (1<<7)));  //等待TDR为空USART1->TDR = ch;
}/* USER CODE END 0 */int main(void)
{/* USER CODE BEGIN 1 */uint8_t ch[20] = {0};/* USER CODE END 1 *//* MCU Configuration----------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *///HAL_UART_Transmit(&huart1, "this is uart test\n", strlen("this is uart test\n"), 100);printf("this is printf test\n");
/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){//  ch = Uart_Getchar();	  //  Uart_Putchar(ch);HAL_UART_Receive(&huart1, ch, 19 , 100);HAL_UART_Transmit(&huart1, ch, strlen(ch), 100);memset(ch,0,20);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}/** System Clock Configuration
*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct;RCC_ClkInitTypeDef RCC_ClkInitStruct;RCC_PeriphCLKInitTypeDef PeriphClkInit;/**Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = 16;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}/**Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}/**Configure the Systick interrupt time */HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);/**Configure the Systick */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);/* SysTick_IRQn interrupt configuration */HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @param  None* @retval None*/
void _Error_Handler(char * file, int line)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */while(1) {}/* USER CODE END Error_Handler_Debug */ 
}#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t* file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */}#endif/*** @}*/ /*** @}
*/ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

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

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

相关文章

提高曝光率:外贸网站如何充分利用谷歌优化赢得客户

自从我从事外贸行业以来&#xff0c;谷歌优化一直是我关注的重点。 作为一个外贸从业者&#xff0c;我深知提高网站在谷歌搜索引擎中的排名对企业的重要性。 那么&#xff0c;如何利用谷歌优化来提高外贸网站的曝光率&#xff0c;从而赢得更多客户呢&#xff1f; 以下是我在…

I2C和SPI总线以及通信

通讯属性 概括 Serial/parallel 串行/并行Synchronous/asynchronous 同步/异步Point-to-point / bus 点对点 总线Half-duplex/full-duplex 半双工/全双工Master-slave/ equal partners 主从/对等single-ending / differential 单端/差分 点对点和总线 点对点通讯 只有两个通…

【UE】使用初学者内容包创建简单的地形材质

效果步骤新建一个材质打开该材质&#xff0c;创建一个“layerblend”节点创建3个数组元素设置图层命名、混合类型和预览权重使用初学者内容包中的“T_Rock_Basalt_D”纹理、“T_Ground_Gravel_D”纹理和“T_Ground_Grass_D”纹理使用“Terrain_Mat”材质创建一个地形可以用雕刻…

PMP项目管理证书的含金量高吗?

PMP 项目管理证书的含金量一直是大家非常关心的一个问题&#xff0c;其实没必要纠结含金量&#xff0c;想从事项目管理岗位的&#xff0c;考就对了。 先给大家上个目录&#xff0c;再来细细说明 一、PMP带来的好处&#xff08;含金量&#xff09;二、PMP适合什么人考三、PMP 考…

CCS v6 导入工程调试仿真烧写程序教程

点击CCS图标&#xff0c;选择要放置的workplace 1.然后配置仿真器参数&#xff1a;View>Target Configurations 然后开始配置仿真器参数&#xff0c;大家可以根据自己的器件&#xff1a; 选择好之后&#xff0c;点击save 2.导入新的工程 然后就可以看到工程已经导入成功了&a…

掌握CentOS7环境下的Docker使用(八)阿里云镜像仓库实战、harbor仓库搭建与实战、本地镜像容器的载入载出

文章目录镜像仓库简介公共镜像仓库私有镜像仓库阿里云镜像仓库的搭建与使用创建仓库登录将镜像推送到Registry从Registry中拉取镜像harbor仓库搭建与使用搭建harbor仓库配置与使用harbor仓库本地镜像容器的载入与载出保存镜像保存容器可能出现的问题输入正确的密码登录不进去阿…

人员玩手机离岗识别检测系统 yolov5

人员玩手机离岗识别检测系统根通过pythonyolov5网络模型识别算法技术&#xff0c;人员玩手机离岗识别检测算法可以对画面中人员睡岗离岗、玩手机打电话、脱岗睡岗情况进行全天候不间断进行识别检测报警提醒。Python是一种由Guido van Rossum开发的通用编程语言&#xff0c;它很…

Spring核心概念

Spring核心概念1 介绍1.1 为什么要学?1.2 学什么?1.3 怎么学?2 Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线2.3 Spring核心概念2.3.1 目前项目中的问题2.3.2 IOC、IOC容器、Bean、DI2.3.3 核…

Open Inventor 2023.1RC 将更大变化

体积可视化 具有单一分辨率的体积渲染 使用单一分辨率渲染卷更容易&#xff0c;因为卷可视化现在可以根据当前设置和硬件配置自动计算出最佳分辨率。使用单一分辨率可防止在默认模式下可能可见的不良伪影。 下图突出显示了单一分辨率的优势。在左图中&#xff0c;在 2 种分辨…

深度学习:GPT1、GPT2

深度学习&#xff1a;GPT1、GPT2、GPT3的原理与模型代码解读GPT-1IntroductionFramework自监督学习微调ExperimentGPT-2IntroductionApproachConclusionGPT-3GPT-1 Introduction GPT-1&#xff08;Generative Pre-training Transformer-1&#xff09;是由OpenAI于2018年发布的…

Python读取,预处理DICOM文件方式

需要的库 ●Simpleitk 安装命令&#xff1a; conda install -c simpleitk simpleitk使用&#xff1a; import SimpleITK as sitk●pydicom&#xff08;不推荐&#xff0c;可能有些文件打不开&#xff09; 安装命令&#xff1a; conda install -c conda-forge pydicom●PIL …

linux系统添加审计用户并进行权限控制

审计账号只用于审计功能&#xff0c;其权限可在普通账号基础上进行修改.创建审计用户 sjyhuseradd sjyh为审计用户设置登录密码passwd sjyh会有如下提示&#xff0c;按照提示依次修改即可:更改用户 sjyh 的密码 。 新的 密码&#xff1a; 重新输入新的 密码&#xff1a; 重新输…

平庸的恐惧,就业的烦恼——致互联网人进退两难的35岁

最近阿道看到了一些黑色幽默的新闻。 事情是这样的&#xff0c;某媒体发文抨击职场的“35岁”歧视&#xff0c;但后来被扒出&#xff0c;该媒体所属的机构在发布招聘信息时&#xff0c;却明确地标注了受聘者的年龄界限。 这一通操作属实把大家看傻了&#xff0c;后来阿道又在…

AVL树大讲堂

1.基础概念介绍 首先在前面我们介绍了二叉搜索树&#xff0c;但是如果当存储的数据接近有序或者恰巧有序的时候&#xff0c;二叉搜索树将逐渐退化为单支树&#xff0c;导致搜索效率降低&#xff0c;因此我们的avl树便为了解决这一问题而诞生了。 基础性质&#xff1a;当向二叉…

Tone Mapping中luma滤波(降噪)对噪声放大的定性分析

Tone Mapping中luma滤波对噪声放大的定性分析 在tone mapping过程中&#xff0c;通常经过统计之后得到一条mapping曲线&#xff0c;记这条曲线为f(x)f(x)f(x)&#xff0c;mapping过程中&#xff0c;对于给定的点&#xff0c;假定其亮度为xxx&#xff0c;映射后为f(x)f(x)f(x)&…

虚拟机设置桥接模式:静态IP

一、下载virtual box并安装系统 链接&#xff1a;https://www.virtualbox.org/ 安装并配置Ubuntu桌面版&#xff1a;https://blog.csdn.net/Zhichao_Zhang/article/details/127142410?spm1001.2014.3001.5506 安装并配置CentOS7&#xff1a;https://blog.csdn.net/csp7321711…

【学习笔记】《Writing Science》14-21

文章目录14 Energizing Writing 充满活力的写作14.1. ACTIVE VERSUS PASSIVE VOICE 主动语态和被动语态14.1.1. Controlling Perspective 控制视角14.1.2. Hiding the Actor 隐藏演员14.2. FUZZY VERBS 模糊动词14.2.1. Fuzzy Hypotheses 模糊假设14.3. NOMINALIZATIONS 名词化…

自动化测试学习(七)-正则表达式,你真的会用吗?

目录 一、正则表达式在python中如何使用 二、用正则表达式匹配更多模式 三、常用字符分类的缩写代码 总结 所谓正则表达式&#xff08;regex&#xff09;&#xff0c;就是一种模式匹配&#xff0c;学会用正则匹配&#xff0c;就可以达到事半功倍的效果。 一、正则表达式在…

本地资源检测|单规则多阈值设置功能上线

作为一款可以全面自动检测项目静态工程内各项资源、代码和设置的UWA服务&#xff0c;本地资源检测能够帮助项目组制定合理的资源与代码标准&#xff0c;及时发现潜在的性能问题和异常错误&#xff0c;建立有效的开发规范意识。 此次3.1.0版本更新&#xff0c;在优化和完善现有…

Rcpp包运行C++代码

提高 R 脚本性能的最简单、最快捷的方法是更改脚本的问题部分并用 C 重写它们。Rcpp包提供了 R 和 C 之间的接口。1. cppFunction()转换简单的C函数### 1. cppFunction()转换简单的C函数 library(Rcpp) cppFunction(codeint fibonacci(const int x){if(x < 2) return x;if(x…