一、串口半双工

  • stm32的串口支持全双工使用,即数据可双向同时传递,特点是有Rx和Tx两根数据线。这很好,可以满足大部分需要的
  • 有些特殊场合,我们需要使用半双工,比如驱动某些数字舵机。这时数据也是双向传递,但是同一时刻只允许一个方向的数据进行传递。这种情况下只用到Tx这一根数据线。stm32的串口也支持半双工
  • 数据手册中对串口的半双工功能有以下描述:
  • 注意:
    1. 开启半双工后Rx引脚不在使用
    2. Tx引脚应配置为开漏拉高
    3. USART1~USART6都支持半双工
    4. 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复用为USART1GPIO_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;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;      //子优先级3NVIC_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);//设置系统中断优先级分组2delay_init(168);              //延时初始化 LED_Init();             USART1_Half_Configuration();    //串口1配置为半双工USART2_Half_Configuration(); //串口2配置为半双工sendOnly(USART2);                //USART2只写readOnly(USART1);             //USART1只读USART_SendData(USART2,1);     //USART2先发给USART1while(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平台测试通过

stm32 USART串口半双工功能测试相关推荐

  1. STM32—USART串口发送+接收

    STM32-USART串口发送+接收 本文来自于<STM32--江科大>的笔记整理. 文章目录 STM32-USART串口发送+接收 10.3 串口发送 串口调试助手 10.3.1 数据模 ...

  2. 浅谈STM32 USART串口中断配置函数USART_ITConfig()的编程思路

    void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) 函数参数列表中,USAR ...

  3. stm32 usart 单线半双工串口 DMA发送 最后一个字节发不出来问题

    最近遇到一个小问题,感觉很有意思便记下来分享一下 ,顺便也为日后类似的问题提供点思路: 使用stm32串口发送数据 ,串口是单线半双工模式,要求数据发送前串口变成发送模式,发送完后立即变回接收模式,发 ...

  4. STM32 USART串口通讯初试【查询方式】

    目录 1 USART介绍 1.1 串口的基本概念 1.2 串口的工作方式 1.3 USART介绍 2 STM32CubeMX及Keil的使用 2.1 stm32cubeMX创建项目 2.2 修改代码 ...

  5. STM32 USART串口DMA 接收和发送的源码详解!

    硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...

  6. STM32——USART串口

    文章目录 一.通信接口 二.串口通信 三.硬件电路 四.电平标准 五.串口参数及时序 六.STM32的USART外设简介 七.USART框图 八.USART基本结构 九.数据帧 十.起始位侦测和采样位 ...

  7. STM32:USART串口外设(内含:1.USART简介+2.USART基本结构+3.数据帧+4.起始位侦测+5.数据采样+6.波特率发生器)

    1.USART简介 USART是同步收发器,UART是异步收发器(主要). 停止位长度:可参考串口时序的终止端与起始端的长度. 同步模式:就是有CLK模式. 智能卡(刷卡),IrDA(红外发光管+红外 ...

  8. 蓝桥杯 stm32 USART 串口发送数据

    文章代码使用 HAL 库. 文章目录 前言 一.串口原理图 二.CubeMX 创建工程. 三.串口发送函数: 四.串口助手 配置: 五.详细代码: 注意:连续发送数据 六.printf 重定向问题 代 ...

  9. STM32 USART—串口通信

    目录 一.串口通信协议物理层电平标准: 1.RS232标准: 2.USB转串口通讯(常用) 3.原生的串口到串口 二.串口通信协议软件层: 三.串口功能框图 1.引脚 2.数据寄存器USART_DR ...

最新文章

  1. 报名即将截止,中国移动“梧桐杯”大数据应用创新大赛,寻找大数据敢想者!...
  2. Codeforces Round #181 (Div. 2) C. Beautiful Numbers 排列组合 暴力
  3. 实战并发编程 - 10Guarded Suspension模式在BlockingQueue源码中应用
  4. 柱底反力求和lisp软件_AutoLISP详细讲解
  5. Nacos源码服务发现
  6. 10、使用ws调用Rest api
  7. 正则表达式常用符号所代表的含义
  8. Meteor——以NodeJS为基础环境,MongoDB为数据环境的全栈开发平台!
  9. 测试工程师---笔试面试题
  10. C#对象序列化与反序列化
  11. 时光邮局互助排单匹配系统软件开发
  12. ARM各内核系列整型运算能力对比---DMIPS / MHz
  13. 苹果logo_“林芝苹果”LOGO图形标识公开评选
  14. android 摄像头黑屏,5+app 安卓调用摄像头黑屏 苹果可以
  15. 2021年美容师(初级)报名考试及美容师(初级)最新解析
  16. 海马汽车经销商管理系统技术解析(七)投诉处理
  17. 【定量分析、量化金融与统计学】R语言方差分析的outliers陷阱
  18. 使用 patchrom 移植 MIUI
  19. MultiMC的离线模式启动
  20. 关于数据治理的读书笔记 - 什么是组织机制?

热门文章

  1. 开源开放通用赋能 英特尔助力2020 EdgeX中国挑战赛创新方案落地
  2. “云”上交通,“翼”路畅行
  3. mysql alter database_MySQL修改数据库:ALTER DATABASE用法简介
  4. 最简单最有用的英文口语
  5. element 时间选择器,设置周与周的区间
  6. 戴尔计算机和台式机区别吗,戴尔的台式机怎么样?戴尔的台式机有什么优缺点...
  7. 自己动手写CPU——第一篇
  8. python基于Django的汽车俱乐部管理系统vue
  9. IP地址虚拟网络与虚拟机网络配置
  10. 手机访问本地局域网内服务器网站