STM32笔记——串口发送宽度为9位的数据

stm32hal库uart发送9位数数据分享 stm32hal库uart发送9位数数据 近日搞一个项目,要用到串口的mark校验数据,也就是发送9位数据,串口发送数据需要校验位为mark校验,就是校验位固定设置成1,就需要8位数据位,1位校验位,1位停止位。串口设置为以下设置。 void MX_UART7_Init(void) { huart7.Instance = UART7; huart7.Init.BaudRate = 9600; huart7.Init.WordLength = UART_WORDLENGTH_9B; //数据位 阅读详情

最近为了配置一个芯片使用到了串口发送9位数据位的情况,在此小记一下。

1. 串口硬件和参数初始化

将数据位宽度配置成:UART_WORDLENGTH_9B ,其他参数和常规配置一样。

UART_HandleTypeDef husart3;

void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(huart->Instance==USART3)
  {
 	 __HAL_RCC_GPIOC_CLK_ENABLE();//IO时钟使能
  
    GPIO_InitStruct.Pin = USARTx_Tx_GPIO_PIN|USARTx_Rx_GPIO_PIN;//PB10和PB11
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = USARTx_AFx;
    HAL_GPIO_Init(USARTx_Tx_GPIO, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin = USARTx_Rx_GPIO_PIN;
    HAL_GPIO_Init(USARTx_Rx_GPIO, &GPIO_InitStruct);
  }
}

void MX_USART3_Init(void)
{
 	 __HAL_RCC_USART3_CLK_ENABLE();//串口3时钟使能
  
    huart3.Instance = USART3;
    huart3.Init.BaudRate = USART3_BAUDRATE;
    huart3.Init.WordLength = UART_WORDLENGTH_9B;//数据位宽度改为9位
    huart3.Init.StopBits = UART_STOPBITS_1;//一位停止位
    huart3.Init.Parity = UART_PARITY_NONE;//无奇偶校验位
    huart3.Init.Mode = UART_MODE_TX_RX;
    huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart3.Init.OverSampling = UART_OVERSAMPLING_16;
    HAL_UART_Init(&huart3);
   
    HAL_UART_Receive_IT(&huart3,Usart3_TempData,1);  
	HAL_NVIC_SetPriority(USART3_IRQn, 2, 2);
    HAL_NVIC_EnableIRQ(USART3_IRQn);
}

2. 串口发送相关库函数的修改

看了下库函数,如果想要收发数据位宽度为9位的数据,貌似只能够通过阻塞模式发送,如下是阻塞模式下串口发送数据的库函数(省略部分函数,只留取了最关键的代码):

/**
  * @brief  Sends an amount of data in blocking mode. 
  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @param  pData: Pointer to data buffer
  * @param  Size: Amount of data to be sent
  * @param  Timeout: Timeout duration  
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{
      ...省略
      if(huart->Init.WordLength == UART_WORDLENGTH_9B)
      {
            ...省略
	        tmp = (uint16_t*) pData;
	        huart->Instance->DR = (*tmp & (uint16_t)0x01FF);
	        ...省略
      }
      ...省略
}

我发现这个库函数发送数据宽度为9位数据时时这样的,如果第9位数据为0的话,本质就是在停止位前添加一位数据0,如果第九位想发1的话,那就不需要这个函数了,即通过正常的8N1格式发送即可,直接用停止位当第9位就可以.

这样的话是可以实现,只是比较麻烦。比如在使用9位数据宽度配置一些传感器时需要反复的将第9位变为1或0,如果按照官方提供的这种库函数来实现的话,那就得反复将串口配置成8B或9B的模式,非常的不方便,也很不直观。所以我把这个函数做了一些简单的修改,多加了一个第9位位选择的参数。

程序如下:

/**
  * @brief  Sends an amount of data in blocking mode. 
  * @param  huart: pointer to a UART_HandleTypeDef structure that contains
  *                the configuration information for the specified UART module.
  * @param  pData: Pointer to data buffer
  * @param  Size: Amount of data to be sent
  * @param  Bit_9 : bit 9 state
  * @param  Timeout: Timeout duration  
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UART_Transmit_9B(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint8_t Bit_9, uint32_t Timeout)
{
      ...省略
      if(huart->Init.WordLength == UART_WORDLENGTH_9B)
      {
          ...省略  
          tmp = (uint16_t*) pData;
          //huart->Instance->DR = (*tmp & (uint16_t)0x01FF);之前的数据处理方式屏蔽掉
          //以下是自己添加的第九位数据位处理的相关代码
          if(Bit_9 == 1)
          {
              huart->Instance->DR = (*tmp | (uint16_t)0x0100);//将第九位置1
          }
          else
          {
              huart->Instance->DR = (*tmp & (uint16_t)0x00FF);//将第九位置0
          }
	      ...省略
      }
      ...省略
}

提示:最后就是记得在头文件中声明该函数!

STM32 串口配置 注意事项 USART_InitStructure.USART_BaudRate = 9600;  USART_InitStructure.USART_WordLength = USART_WordLength_9b;  //此处在有奇偶校验时需要9个数据位,无奇偶校验时8个数据位  USART_InitStructure.USART_StopBits = USART_StopBits_1 阅读详情

相关推荐

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

STM32的UART奇偶校验注意

STM32的UART奇偶校验注意 STM32的UART在初始化时,我们通常用到最多的就是无校验位,1停止位。但是我在项目中也遇到某些芯片通信用的需要奇校验或者偶校验,这里需要特别注意的是STM32中开启奇偶校验位,是要占用一位数据位,所以需要把数据位设置为9位。可参考以下代码。 USART_InitStructure.USART_BaudRate = baudrate; /* 波特率设置 */ USART_InitStructure.USART_WordLength = USART_WordLength_9

JacobFang的博客 6437

STM32串口DMA方式发送数据

文章目录一、DMA介绍1.概括2.DMA由来2.1程序传送方式2.2中断传送方式2.3DMA原理3.DMA具有的功能4.DMA传输方式5.DMA主要特征6.DMA处理7.DMA工作框图8.DMA工作传送过程二、串口DMA方式发送数据1.题目要求2.工程建立3.代码编写4.烧录测试五、参考 一、DMA介绍 1.概括 DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。 DMA传输将数据从一个地址空

cleveryoga的博客 1万+

野火学习笔记(13) —— USART —串口通讯

文章目录1. 串口通讯协议简介1.1 物理层1.1.1 电平标准1.1.2 RS-232 信号线1.2 协议层1.2.1 波特率1.2.2 通讯的起始和停止信号1.2.3 有效数据1.2.4 数据校验2. STM32 的 USART 简介3. USART 功能框图3.1 校验控制3.2 中断控制4. USART 初始化结构体详解5. USART1 接发通信实验5.1 硬件设计5.2 软件设计5.2.1 编程要点5.2.2 代码分析 1. 串口通讯协议简介 串口通讯 (Serial Communica

没霖好叫咩的博客 1万+

STM32 串口DMA收发(一)

STM32 串口DMA收发数据 一、STM32 DMA简介与功能说明 1、STM32F4 DMA简介 DMA(Direct memory access),即直接存储器访问。用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输的一种方式。它无需CPU参与,通过硬件方式为RAM与I/O设备提供一条直接传送数据的通道。 STM32F4有2个DMA控制器,每个DMA控制器有8个数据流...

会飞的鱼的博客 3万+

STM32 F1 串口空闲中断 + DMA实现数据发送

当你遇到通信数据量大的时候,可以使用 空闲中断 + DMA 的方案来减轻 CPU 的压力。或者在进行stm32开发时,有时会遇到这种情况:需要在设备间进行数据传输,由于stm32串口RDR和TDR寄存器都是8位有效的,我们往往需要定义传输协议(如一帧数据中,包含包含帧头、帧ID、数据帧、校验帧等若干8位数据)。我们希望可以一次收到一帧数据,并进行解码操作。利DMA+串口空闲中断可以有效完成上述任务。

戚晨夕的博客 2545

stm32L071串口 奇偶校验问题

stm32串口配置的时候正常配置为 数据位=8UART_WORDLENGTH_8B 停止位=1UART_STOPBITS_1 校验位 =无UART_PARITY_NONE 这是没有问题的,但是如果想要使用STM32的奇偶校验就需要注意一下,使用奇偶校验时必须把数据位配置 9UART_WORDLENGTH_9B,否则使用应用的时候会有问题。通常使用的串口助手工具基本上奇偶校验都是测试不出来的,如果要带奇偶校验功能,最好接个能配置奇偶校验的设备实际测试一下。 ...

u010404245的博客 1532

嵌入式作业STM32采用串口DMA方式发送数据

STM32采用串口DMA方式发送数据

cifjk_gg的博客 2102

STM32 串口采用DMA方式收发

一直都没有整理STM32 DMA应用,这篇文章算是抛砖引玉吧,欢迎拍砖。 本人QQ 330952038,欢迎交流学习什么是DMA —- Directional Memory Access, 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作我们通过以下几方面学习串口DMA: 一、如何理解D

gdjason的博客 3万+

HAL库 STM32CubeMX实现串口DMA发送接收

HAL库 STM32CubeMX实现串口DMA发送接收

Xqiubi的博客 5499

STM32_HAL库—串口通信

(一)CubeMX设置: 1. 晶振配置(72M) 2. 基础配置 ==>Mode(模式选择): Asynchronous: 异步通信 Synchronous: 同步通信 Single Wire (Half-Duplex): 单线/半双工 Multiprocessor Communication: 多处理器 支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。 ...

1万+

STM32串口DMA发送中断配置

本文以STM32F1xx的串口1为例,简单呈现下使用DMA中断连续发送的代码 串口DMA配置通常可以分为2个部分: 1.串口配置 2.DMA配置 串口配置 void UART1_Init(u32 bound){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef...

return_oops的博客 1万+

8,9位UART串口通信

适合于各种单片机的UART通信,尤其适合于M104X读写模块。对于初学者来说,是一个很好的练习机会。

STM32采用串口DMA方式实现发送数据

STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据。

m0_59066136的博客 7579

STM32之串口发送宽度为9位的数据

最近为了配置一个芯片使用到了串口发送9位数据位的情况,在此小记一下。 1. 串口硬件和参数初始化 将数据位宽度配置成:UART_WORDLENGTH_9B ,其他参数和常规配置一样。 UART_HandleTypeDef husart3; void HAL_UART_MspInit(UART_HandleTypeDef* huart) { GPIO_InitTypeDef GPIO_InitStruct; if(huart->Instance==USART3) { __HAL_RCC_GPIOC_CLK_ENABLE();//IO时钟使能 GPIO_InitStruc

串口9位数据位的通讯解析

在双机通讯中,第九位一般是奇偶校验位。 可以发9位数据,8个数据为,第九位是校验位,校验位有4个状态可设置,基校验,偶校验,总为1,总为0。

STM32 使用DMA进行串口发送和接收

DMA+USART Rx

qq18285的博客 6872

足球赛事数据API:开发者生存指南(附真实踩坑记录)

作为一个既爱看球又爱写代码的老宅男,我这些年用过的足球API比看过的比赛还多。从最初被各种API文档折磨到怀疑人生,到现在能闭着眼睛调接口,中间的血泪史够写本书了。今天就把这些经验(和教训)分享给各位同好,特别是那些正在为"老板要做个足球App"而秃头的同行们。文档清晰免费层可用响应格式规范API-Sports免费额度大方支持GraphQL有中文文档(难得!Sportmonks数据全面有Webhook支持按需付费。

Happy0970的博客 2172

STM32 F4串口空闲中断 + DMA实现数据发送

STM32F4 串口 空闲中断+DMA

qq_49765312的博客 4888

AI视频生成成本优化实战:混合架构与硬件选型

AI视频生成技术正面临效果与成本的二元博弈,其核心挑战在于高昂的推理算力消耗与黑箱服务的不确定性。从技术原理看,视频生成依赖扩散模型等深度学习架构,通过多轮迭代实现像素级合成,这导致GPU显存占用和电力消耗呈指数级增长。在工程实践中,采用混合推理架构能有效平衡成本与质量,例如云端处理关键帧配合本地渲染过渡帧,实测可降低58%支出。硬件选型方面,消费级显卡魔改与边缘计算设备为中小企业提供了可行方案,如RTX 3090显存扩容或Jetson AGX边缘部署。当前AI视频应用已渗透电商直播、新闻制作等领域,但需警

weixin_29531177的博客 276

【MATLAB代码】雷达观测目标跟踪模型|H-infinity Filter(H无穷大滤波)与EKF(扩展卡尔曼滤波)的对比。附完整代码,订阅专栏后可直接查看

对比了经典扩展卡尔曼滤波(EKF)与H∞优化的EKF(H∞-EKF)在目标跟踪中的性能。通过MATLAB仿真实验,结果显示:在存在模型误差和测量噪声的情况下,H∞-EKF相比经典EKF在位置误差上降低

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 237
上一篇: STM32笔记——软件复位相关知识小记
下一篇: 【Qt】QTimer的简单使用
讨厌水的鱼
博客等级 码龄9年 1922粉丝 52原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值