IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 串口通讯学习 -> 正文阅读

[嵌入式]串口通讯学习

1.物理层

1.1电平标准

通常有TTL和RS232电平标准

在这里插入图片描述

2.协议层

2.1数据包

通常由起始位、8位数据位、校验位、停止位,一共11位。

2.2波特率

我们经常使用的是Uart也就是异步通讯,因为没有时钟线连接,所以需要约定好单位时间内发送的数据量。
通常使用9600、115200

3.实现目标:单片机串口收发

3.0串口配置

这里使用串口5,即UART5

void uart5_init(u32 bps)
{
				
	
        NVIC_InitTypeDef 	NVIC_InitStruct;
        USART_InitTypeDef USART_InitStructure;
        GPIO_InitTypeDef 	GPIO_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE);
				
	//复用为UART5
				GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_5);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource2, GPIO_AF_5);
	
	//UART5端口配置
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
        
        

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

        NVIC_InitStruct.NVIC_IRQChannel = UART5_IRQn;
        NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStruct.NVIC_IRQChannelSubPriority = 4;
        NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStruct);

        USART_InitStructure.USART_BaudRate = bps;
        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_Init(UART5, &USART_InitStructure);
				
				
        //USART_DeInit(UART5);
        /*	使能串口接收中断	*/
        
        
//        UART5->CR1 |= 0x10;
       // USART_ClearFlag (UART5,USART_FLAG_TC|USART_FLAG_IDLE);

        USART_Cmd(UART5, ENABLE);
				
}

初始化配置,多使用几遍就会熟悉,大家不要害怕。

3.1串口发送

3.1.1串口发送单字符

//发送单字符
//因为一个汉字就占用一个字节,也就是8位数据,所以使用uint8_t
void Usart_SendByte(USART_TypeDef *pUSARTx,uint8_t dat)
{
	USART_SendData(pUSARTx,dat);
	//若数据未传输到移位寄存器,即数据未传输完成
	while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)!=SET);
}

代码分析

在STM32F30xx_usart.h标准库函数中定义USART_SendData()

发送数据,即对DR寄存器进行写操作


/**
  * @brief  Transmits single data through the USARTx peripheral.
  * @param  USARTx: Select the USART peripheral. This parameter can be one of the 
  *         following values: USART1 or USART2 or USART3 or UART4 or UART5.
  * @param  Data: the data to transmit.
  * @retval None
  */
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data)); 

  /* Transmit Data */
  USARTx->TDR = (Data & (uint16_t)0x01FF);
}

通过数据寄存器DR进行发送数据,寄存器大小[31:0],规定数据位[8:0],一共9位,所以当对TDR进行写操作时
USARTx->TDR = (Data & (uint16_t)0x01FF);
在这里插入图片描述
数据寄存器是包含了TDR(发送)和RDR(接收)两个寄存器,
当我们对DR(数据寄存器)写操作就是发送,读操作就是接收

接收数据,即对DR寄存器进行读操作

/**
  * @brief  Returns the most recent received data by the USARTx peripheral.
  * @param  USARTx: Select the USART peripheral. This parameter can be one of the 
  *         following values: USART1 or USART2 or USART3 or UART4 or UART5.
  * @retval The received data.
  */
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));

  /* Receive Data */
  return (uint16_t)(USARTx->RDR & (uint16_t)0x01FF);
}

while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE)!=SET);

在STM32F30xx_usart.h标准库函数中定义USART_GetFlagStatus()

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint32_t USART_FLAG)
{
  FlagStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_FLAG(USART_FLAG));
  
  if ((USARTx->ISR & USART_FLAG) != (uint16_t)RESET)
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}

在这里插入图片描述在这里插入图片描述
单字符发送完成时,即数据已经从TDR寄存器传输到移位寄存器时,USART_TXE标志位置1,USART_GetFlagStatus函数返回SET。

3.1.2 串口发送字符串



//发送字符串
//写法1
void Usart_SendByte1(USART_TypeDef *pUSARTx, char *str)
{
	uint8_t i=0;
	do{
		Usart_SendBit(pUSARTx,*(str+i));
		i++;
	}while(*(str+i)!='\0');
}
//写法2
void Usart_SendByte2(USART_TypeDef *pUSARTx,uint8_t *str)
{
	uint8_t i=0;
	do{
		Usart_SendBit(pUSARTx,str[i]);
		i++;
	}while(str[i]!=0);
}

上面的两种写法说明了一点,char字符串在存储方式类似于字符数组,因为他们都具有可以单独取出一串中的其中一个。

字符串使用指针自增访问每一个子串。
字符数组通过数组位号访问每一个字符。

main.c

int main(void)
{
	 SystemCoreClockUpdate();
	 SysTickInit();
	 uart5_init(115200);
	 uint8_t test[] = "这是字符串写法2的输出\r\n";
	 Usart_SendByte1(UART5,"这是字符串写法1的输出\r\n");
	 Usart_SendByte2(UART5,test);
	 while()
	 {
	 }
}

发送结果

在这里插入图片描述

3.2串口接收

前面配置串口的时候已经使能了串口接收中断,通过
USART_ITConfig(USART_TypeDef* USARTx, uint32_t USART_IT, FunctionalState NewState)

三个参数,串口号,串口中断类型,开启或关闭

使用例

USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);//开启串口5接收中断

通过UART5句柄函数,当发生接收中断时,将数据使用USART_SendData()函数返还到串口5TDR寄存器发送出去。

void UART5_IRQHandler(void)
{
	//因为recei函数返回2个字节大小,所以使用uint16_t
	uint16_t temp;
	//发生接收中断
	if(USART_GetFlagStatus(UART5,USART_IT_RXNE)!=RESET)
	{
		//接收到的数据,赋值给temp临时变量
		temp = USART_ReceiveData(UART5);
		USART_SendData(UART5,temp);
	}
}

接收函数USART_ReceiveData()和发送函数USART_SendData()的详情前面已经贴出来了,任然感觉不清楚可以返回前面再看看。

接收结果
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:44:32  更:2021-09-24 10:45:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:56:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码