-
2020-11-06 10:17:31
单线半双方模式通过设置USART_CR3寄存器的HDSEL位选择。在这个模式里,下面的位必须
保持清零状态:
● USART_CR2寄存器的LINEN和CLKEN位
● USART_CR3寄存器的SCEN和IREN位
USART可以配置成遵循单线半双工协议。在单线半双工模式下,TX和RX引脚在芯片内部互
连。使用控制位”HALF DUPLEX SEL”(USART_CR3中的HDSEL位)选择半双工和全双工通信。
当HDSEL为’1’时
● RX不再被使用
● 当没有数据传输时,TX总是被释放。因此,它在空闲状态的或接收状态时表现为一个标准
I/O口。这就意味该I/O在不被USART驱动时,必须配置成悬空输入(或开漏的输出高)。
除此以外,通信与正常USART模式类似。由软件来管理线上的冲突(例如通过使用一个中央仲裁
器)。特别的是,发送从不会被硬件所阻碍。当TE位被设置时,只要数据一写到数据寄存器上,
发送就继续。[文章转载自STM32参考手册]
更多相关内容 -
stm8模拟串口收发(半双工)
2016-09-28 17:00:26stm8模拟串口收发(半双工) -
ESP32与STM32半双工SPI通信(含握手协议)(esp_idf_v4.0.1).zip
2021-06-11 18:09:08ESP32与STM32的SPI半双工通信,含握手协议,esp-idf版本v4.0.1(利用VSCODE,内含bin二进制文件)包含STM32CUBEMX工程模板,STM32版本为F446 -
stm32uart单线半双工通信
2020-11-05 13:19:50stm32uart单线半双工通信 在使用数字舵机时,所用到的通信方式为uart通信,但舵机只有三根接线,出去vcc和gnd,只有一条通信线,也就是说要实现双向通信,只能使用单线半双工模式,本人在利用stm32标准库配置uart... -
单线半双工通信简单例程(STM32与电脑通信)
2021-01-20 11:05:54单线半双工通信的官方资料 单线半双方模式通过设置USART_CR3寄存器的HDSEL位选择。在这个模式里,下面的位必须保持清零状态: ● USART_CR2寄存器的LINEN和CLKEN位 ● USART_CR3寄存器的SCEN和IREN位 USART可以配置... -
STM8 UART 半双工串口通信
2011-09-06 08:01:19STM8 串口通信模板 要实现的功能需要自己添加 -
单线半双工STM32+电脑.zip
2020-04-04 15:01:51一个简单的单线半双工例程,使用标准库,使用正点原子STM32F103ZET6。按KEY0向电脑发送"TEST"字符串,收到电脑的数据LED1会亮。需要使用CH340模块。 -
stm32使用1个IO口模拟串口半双工通讯.rar
2020-06-08 14:24:27使用proteus8.9仿真实现两个stm32通过GPIO PA9实现单个GPIO实现串口的半双工收发,重新编译两个工程代码,仿真里面如果有连接PA10的话把PA10去掉。一个stm32发送按键再另一个stm32上面显示按键次数,另一个发送rtc... -
17、STM8S通用同步异步收发器(UART)
2021-10-20 19:04:41文章目录1、概述2、串口主要特点3、UART功能描述4、UART主要...STM8 的 UART 提供范围的波特率选择,并且支持多处理 器通讯。UART 也支持LIN(局部互联网)协议版本 1.3,2.0,和 2.1 以及在主模式 下的 J2602。 UART11、概述
STM8S 微控制器家族的通用同步异步收发器(UART1,UART2 或者 UART3) 提供了一种灵活的方法与使用工业标准 NRZ 异步串行数据格式的外部设备之间 进行全双工数据交换。STM8 的 UART 提供范围的波特率选择,并且支持多处理 器通讯。UART 也支持LIN(局部互联网)协议版本 1.3,2.0,和 2.1 以及在主模式 下的 J2602。
UART1 和 UART2 具有以下扩展特征:
1、UART2 和 UART3 支持 LIN 从模式。
2、UART1 和 UART2 支持同步单向通讯,也支持智能卡协议和 IrDA 规范。 UART1 支持半双工单线通讯。关于每个STM8 微控制器型型号中的可用UART 配置信息,请查阅数据手册。
-
【嵌入式开发】STM8S103F3P6单线半双工串口通信
2018-04-05 21:45:45最近突然接手一个项目... 首先翻了下StrongerHuang的例程,没有,看来还是只能自己来了,在这也对StrongerHuang表示感谢,找到datasheet,这里直接可以看到STM8支持单线半双工,还有别的方法,后面再说。 既...最近突然接手一个项目,很基础的一些单片机操作就可以完成,唯一值得说道的就是受限于任务要求,需要采用单线通信方式。拿到这个要求的时候有点懵,之前倒是从来没有用过单线的串口通信。
首先翻了下StrongerHuang的例程,没有,看来还是只能自己来了,在这也对StrongerHuang表示感谢,找到datasheet,这里直接可以看到STM8支持单线半双工,还有别的方法,后面再说。
既然有这样的功能,那么再找找Reference manual看,所有的信息如下:
可以看到讲得很简单,主要就是控制寄存器的配置和引脚的设置。按照这个搞了一天都没有弄出来。问题主要出在哪呢(直接马后炮)?
- 引脚使用。上面提到了单线半双工使用的是Tx脚,Rx脚是不用的。因为我这里主要是为了和上位机通信,另一端使用的是CH340做的模块,而无法将其设置为单线半双工模式,所以一定记得在发送和接收时切换CH340这端的Tx和Rx,比如做一个单刀双掷开关在切换时直接拨。
- 引脚配置。最后是在看了官方固件库之后完成的,这里有句话很有意思,Apart from this, the communications are similar to what is done in normal UART mode. 所以官方固件库的做法就是先按照正常配置,然后最后来个HDSEL的设置就OK了。而不要先去做别的配置(好吧,不求甚解了,按照官方配置通信没有问题之后没有去深究为什么)。
最后,Talk is cheap, show you my code.
//直接基于StrongerHuang的例程修改的,只展示最关键的部分 void UART_Initializes(void) { UART1_Init((uint32_t)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); /* Enable UART1 Half Duplex Mode*/ UART1_HalfDuplexCmd(ENABLE); }
最后的这个半双工使能是这样的(STM8S的官方库里面有这个文件,路径是下面这个)
STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_HalfDuplex
void UART1_HalfDuplexCmd(FunctionalState NewState) { assert_param(IS_FUNCTIONALSTATE_OK(NewState)); if (NewState != DISABLE) { UART1->CR5 |= UART1_CR5_HDSEL; /**< UART1 Half Duplex Enable */ } else { UART1->CR5 &= (uint8_t)~UART1_CR5_HDSEL; /**< UART1 Half Duplex Disable */ } }
实际上就是对HDSEL进行了操作。其他的配置和串口的使用都跟普通的串口一样。不过如果是真实的半双工对半双工的话,就像手册里面说的,请设计好仲裁机构,注意通信的顺利完成。
现在说说别的方式,最后并没有采用这个方案,因为设计硬件的人设计好了电路。那他是怎么设计的呢?就是直接把普通的串口利用两个光电隔离接在了一起,搜索了一下,这倒是很常见。
-
STM32F103串口单线半双工通信_可用于Dynamixel舵机
2019-07-24 11:23:27基于STM32F103串口2的单线半双工收发,内嵌Dynamixel新版通信协议(protoco 2.0),代码简单好用。 -
stm32 USART串口半双工功能测试
2019-10-29 01:05:34一、串口半双工 stm32的串口支持全双工使用,即数据可双向同时传递,特点是有Rx和Tx两根数据线。...stm32的串口也支持半双工 数据手册中对串口的半双工功能有以下描述: 注意: 开启半双工后Rx引脚不在使用 ...一、串口半双工
- stm32的串口支持全双工使用,即数据可双向同时传递,特点是有Rx和Tx两根数据线。这很好,可以满足大部分需要的
- 有些特殊场合,我们需要使用半双工,比如驱动某些数字舵机。这时数据也是双向传递,但是同一时刻只允许一个方向的数据进行传递。这种情况下只用到Tx这一根数据线。stm32的串口也支持半双工
- 数据手册中对串口的半双工功能有以下描述:
- 注意:
- 开启半双工后Rx引脚不在使用
- Tx引脚应配置为开漏拉高
- USART1~USART6都支持半双工
- TE为1时是发送使能,注意这个不会被硬件封锁。换句话说只要TE为1,串口就一直处于发送状态不能接受。查看手册CR1寄存器部分:
可以看出:我们可以通过操作TE和RE位,配置串口处于仅发送或仅接受的状态
二、示例代码
1. 串口配置:
配置和普通的没啥区别,不同处在于Rx不用配了;Tx配为开漏拉高;使用库函数
void USART_HalfDuplexCmd
操作HDSEL位使能或失能半双工模式void USART1_Half_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1 GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //开漏上拉 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //USART_InitStructure.USART_Mode = USART_Mode_Rx ; USART_Init(USART1,&USART_InitStructure); USART_HalfDuplexCmd(USART1, ENABLE); //注意这个,启动半双工模式 USART_Cmd(USART1,ENABLE); USART_ClearFlag(USART1, USART_FLAG_TC); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 }
2. 串口模式切换
操作串口CR1寄存器的TE位和RE位即可,不妨使用宏的形式
#define readOnly(x) x->CR1 |= 4; x->CR1 &= 0xFFFFFFF7; //串口x配置为只读,CR1->RE=1, CR1->TE=0 #define sendOnly(x) x->CR1 |= 8; x->CR1 &= 0xFFFFFFFB; //串口x配置为只写,CR1->RE=0, CR1->TE=1
3. 一个简单的应用示例
- USART1和USART2配置为半双工,从USART2发给USART1数据1开始,收到后将数据加一发给对方。
- 连线:PA9 - PD5
- debug观察res1和res2交替递增
以下展示部分示例代码:
//主函数部分 int main(void) { u16 times=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(168); //延时初始化 LED_Init(); USART1_Half_Configuration(); //串口1配置为半双工 USART2_Half_Configuration(); //串口2配置为半双工 sendOnly(USART2); //USART2只写 readOnly(USART1); //USART1只读 USART_SendData(USART2,1); //USART2先发给USART1 while(1) { times++; if(times%30==0)LED0=!LED0; //闪烁LED,提示系统正在运行. delay_ms(10); } } //接收中断服务函数部分,完成数据互相发送 u8 Res1; //debug观察 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { Res1 = USART_ReceiveData(USART1); readOnly(USART2); sendOnly(USART1); USART_SendData(USART1,Res1+1); //USART1发给USART2 } } u8 Res2; //debug观察 void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { Res2 = USART_ReceiveData(USART2); readOnly(USART1); sendOnly(USART2); USART_SendData(USART2,Res2+1); //USART2发给USART1 } }
- 可以在github下载完整源码:完整源码,此程序在正点原子stm32f407平台测试通过
-
stm32f103单线半双工uart通信程序
2020-11-05 13:10:22在使用数字舵机时,所用到的通信方式为uart通信,但舵机只有三根接线,出去vcc和gnd,只有一条通信线,也就是说要实现双向通信,只能使用单线半双工模式,本人在利用stm32标准库配置uart串口时,发现标准库配置较为... -
stm32对讲机
2018-10-25 17:35:39stm32对讲机使用speex语音压缩算法 nrf24l01进行无线传输 -
STM32 uart 单线半双工模式(cube版本)
2018-09-30 17:04:07STM32 uart 单线半双工模式(cube版本) 1.引言 在某些场合下需要进行三线制串口通信(信号线只有一根),这就要求进行单线半双工的模式进行通信。在这种情况进行数据协议传输的过程中,信号端需要来回切换输入输出... -
串口的单线半双工模式(stm32f10x系列)
2018-12-28 10:48:45正好手头上有块stm32的板子,看了看stm32的Usart,竟然发现支持的是单线半双工。232里面毕竟4根线,支持半双工也是各自独立地物理信道(大胆猜测,回头回顾一下以前草草使用的双线485,看看它的半双工)。第一次注意... -
【STM8】串口数据一直卡在读中断
2021-03-04 09:04:57STM8 UART1 开启了读中断,初始化代码如下: // 配置串口参数为:波特率115200,8位数据位,1位停止位,无校验,禁止同步传输,允许接收发送 UART1_Init((u32)115200, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, ... -
stm32---RS485半双工通信
2019-08-13 15:01:00典型的串口通信标准有 RS232 和 RS485,RS232 是全双工点对点的通信,而 RS485 是半双工通信(2 线制),可以一点对多点进行组网,而且 RS485 是用缆 线两端的电压差值来表示传递信号,这与 RS232 电气特性大不一样... -
STM32—串口通信
2021-01-19 18:28:59它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。... -
STM32F4单线半双工串口配置
2014-08-30 23:21:55下面是STM32F4的半双工串口配置方法,与普通串口配置方法有些许的不同,这里只需要使用TXD那根线就可以了。关键之处在于需要调用库函数USART_HalfDuplexCmd()。此外串口引脚需要配置成开漏模式。 void UART4_Ha -
stm32 usart 单线半双工串口 DMA发送 最后一个字节发不出来问题
2019-09-18 15:08:57使用stm32串口发送数据 ,串口是单线半双工模式,要求数据发送前串口变成发送模式,发送完后立即变回接收模式,发送操作使用DMA来发送,程序开了串口中断和DMA中断,串口中断主要是用于接收与解析数据,DMA中断是想... -
STM8 模拟串口程序
2016-09-28 16:03:57本程序使用IO口线模拟串口的接收(半双工模式),下面是程序的设计思路: 1、接收 默认串口的数据格式为 一位起始位+8位数据位+停止位,由于起始位为低电平,停止位为高电平。因此,RX线要使能外部中断,中断方式为... -
单线半双工通信.zip
2020-04-04 14:33:26单线实现两块STM32通信,作为个人笔记的附带内容,涉及知识面窄。用正点原子STM32精英版与最小系统板通信,通信协议模拟AX12数字舵机的通信规则。 -
ESP32与STM32的SPI半双工通信与握手协议讲解(附代码)
2021-06-11 17:17:54(以半双工,STM32做master为例)如何握手呢?ESP32-IDF例程中的代码如下: //Called after a transaction is queued and ready for pickup by master. We use this to set the handshake line high. void my_post_... -
STM8S_004_UART基本收发数据
2017-05-05 22:47:06STM8 的 UART 提供宽范围的波特率选择,并且支持多处理器通讯。 主要特性 : Ø 全双工的,异步通信 Ø 高精度波特率发生器系统:发送和接收共用的可编程波特率,最高达 2.5Mbits/s Ø 可编程数据字长度 (8... -
【RoboMaster】最好理解的UART和USART解说!【STM32】
2021-01-06 07:09:59同步博客地址:从STM32开始的RoboMaster生活:进阶篇 III [UART & USART] 项目&教程仓库:-STM32-RoboMaster- 1.0 什么是UART和USART?有什么区别嘛? 1.1 UART定义 Universal Asynchronous Receiver/Transmitter:... -
STM32 基础系列教程 10 - 单线串口(半双工)
2019-04-03 10:30:46前言 在工程应用中,很多时间...基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: ... -
STM32 CAN通信理解(是半双工还是全双工?)
2021-08-21 11:28:28STM32F4 CAN通信 CAN 是控制器局域网络 (Controller Area Network) 的简称,它是由研发和生产汽车电子产品著称的德国 BOSCH 公司开发的,并最终成为国际标准(ISO11519),是国际上应用最广泛的现场总线之一。 1、... -
基于STM32F030F4_多串口(原创)
2021-03-08 09:00:12该工程使用STM32F030F4P6主控芯片,可实现2个模拟串口和1个芯片自身物理串口的应用。 全双工模拟串口 接收需要使用1个EXTI引脚中断,1个有DMA通道的TIM;发送需要1个独立TIM。 半双工模拟串口 接收需要使用1个EXTI... -
STM8S103系列IO口模拟串口通信(实现真正串口)
2019-04-17 20:56:51STM8s103f3p3单片机只有一个串口,有时候在实际项目中,我们需要用到多个串口来实现项目要求,此时,我们可以通过IO口来模拟串口通信,在实现项目需求的同时,还大大降低了成本。 实验原理 默认串口空闲状态为高电平...