【9】、STM32F767——————>串口通信

  1. 简述:STM32芯片具有多个USART外设用于串口通讯,它是Universal SynchronousAsynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换,还有种UART外设Universal Asynchronous
    Receiver and Transmitter,没有同步功能,只有异步通信; USART支持使用DMA; 
    1. 串行通信的分类:
      1. 全双工:同一时刻,两个设备可以同时收发数据(双向车道)
      2. 半双工:两个设备可以收发数据,但不能在同一时刻进行(比如一次只能过一辆车的双向车道)
      3. 单工:单方向通信,一个为发,另个为收(单向车道)
    2. 数据同步方式分类:
      1. 同步数据
      2. 异步数据:
      3. 区别:有没有时钟线; 有:同步; 无:异步; 
    3. 传输速率:
      1. 通讯性能的重要参数
      2. 比特率(Bitrate),即每秒钟传输的二进制位数,单位:比特每秒(bit/s);
      3. 波特率(Baudrate),表示 每秒钟传输了多少个码元; 码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元; 
      4. 注意:比特率=波特率 * 单个调制状态对应的二进制位数; 因为UART是按一个个二进制位发送数据的,所以在此情况下:比特率=波特率; 
      5. 切记:数值相同,意义不同; 
    4. 字长:(最低有效位在前)
      1. 7位(个别USART支持7位模式)
      2. 8位
      3. 9位
    5. 奇偶校验位:
      1.  
    6. 可配置的停止位
      1. 1个停止位(默认值)
      2. 2位停止位(正常USART模式、单线模式、调制解调器模式)
      3. 1.5个停止位(智能卡模式)
      4. 0.5个停止位(智能卡模式下接收数据时使用)
  2. 串口结构框图:
  3. 软件初始化流程:
    1. 功能初始化(波特率、字长、校验、硬件流、模式)
    2. 重写HAL_UART_MspInit()函数,引脚初始化
    3. 打开GPIO、串口时钟
    4. 选择串口时钟源;默认为PCLK2(RCC 专用时钟配置寄存器 (DCKCFGR))
      1. 默认的PCLK2时钟源,频率:108Mhz;(串口1,不同串口最大时钟频率不同,如无特殊要求按默认时钟源选择即可)
      2. SYSCLK时钟源,频率:216Mhz;
  4. 例程:
    1. 功能初始化
      u8 aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲
      UART_HandleTypeDef UART1_Handler; //UART句柄
      
      //初始化IO 串口1 
      //bound:波特率
      void uart_init(u32 bound)
      {	
      	//UART 初始化设置
      	UART1_Handler.Instance=USART1;					    //USART1
      	UART1_Handler.Init.BaudRate=bound;				    //波特率
      	UART1_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
      	UART1_Handler.Init.StopBits=UART_STOPBITS_1;	    //一个停止位
      	UART1_Handler.Init.Parity=UART_PARITY_NONE;		    //无奇偶校验位
      	UART1_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
      	UART1_Handler.Init.Mode=UART_MODE_TX_RX;		    //收发模式
      	HAL_UART_Init(&UART1_Handler);					    //HAL_UART_Init()会使能UART1
      	
      	HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);
          //该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量 
      }

       

    2. 引脚初始化
      //UART底层初始化,时钟使能,引脚配置,中断配置
      //此函数会被HAL_UART_Init()调用
      //huart:串口句柄
      
      void HAL_UART_MspInit(UART_HandleTypeDef *huart)
      {
          //GPIO端口设置
      	GPIO_InitTypeDef GPIO_Initure;
      	
      	if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化
      	{
      		__HAL_RCC_GPIOA_CLK_ENABLE();			//使能GPIOA时钟
      		__HAL_RCC_USART1_CLK_ENABLE();			//使能USART1时钟
      	
      		GPIO_Initure.Pin=GPIO_PIN_9;			//PA9
      		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
      		GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
      		GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速
      		GPIO_Initure.Alternate=GPIO_AF7_USART1;	//复用为USART1
      		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA9
      
      		GPIO_Initure.Pin=GPIO_PIN_10;			//PA10
      		HAL_GPIO_Init(GPIOA,&GPIO_Initure);	   	//初始化PA10
              
      #if EN_USART1_RX
      		HAL_NVIC_EnableIRQ(USART1_IRQn);				//使能USART1中断通道
      		HAL_NVIC_SetPriority(USART1_IRQn,3,3);			//抢占优先级3,子优先级3
      #endif	
      	}
      }

       

    3. 中断服务函数
      //串口1中断服务程序
      void USART1_IRQHandler(void)                	
      { 
      	u8 Res;
      	if((__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)!=RESET))  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
      	{
              HAL_UART_Receive(&UART1_Handler,&Res,1,1000); 
      		if((USART_RX_STA&0x8000)==0)//接收未完成
      		{
      			if(USART_RX_STA&0x4000)//接收到了0x0d
      			{
      				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
      				else USART_RX_STA|=0x8000;	//接收完成了 
      			}
      			else //还没收到0X0D
      			{	
      				if(Res==0x0d)USART_RX_STA|=0x4000;
      				else
      				{
      					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
      					USART_RX_STA++;
      					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
      				}		 
      			}
      		}   		 
      	}
      	HAL_UART_IRQHandler(&UART1_Handler);	
      } 

       

  5. 总结
    1. 串口时钟源的选择
    2. HAL库中断程序较繁琐
    3. 串口波特率不用计算,需要多少波特率直接写多少; 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值