STM32学习笔记(二)串口使用方法

 

硬件:STM32F103RCT6     开发软件:Keil uVision5.1    固件库:STM32Cube_FW_F1_V1.3.0


一 函数简介
      STM32串口的头文件有两个,一个是stm32f1xx_hal_uart.h,另一具是stm32f1xx_hal_usart.h,usart为同步串口,uart为异步串口,具体有什么区别请自行百度。一般情况下,用uart就可以了。
首先介绍一个用到的几个函数。
HAL_UART_Init(&UartHandle)
这个函数是初始化串口的,入口参数是一个结构体,包含波特率、停止位等参数值。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
这个函数是接收中断设置函数,第一个参数为串口结构体,第二个参数是缓冲区是unsigned char 数组,最后一个参数是接收到几个数据后产生中断。串口有数据时,会自动存储到缓冲区,类似于DMA,但这是不是DMA,和DMA有什么区别,目前我还不知道,当收到的数据达到设置的个数时,就会产生中断,我一般设置成1,这样不会漏收数据。

stm32.jpg

二 程序示例


1、 串口初使化

void uart1_init()
{ 
  static GPIO_InitTypeDef  GPIO_InitStruct;  
  /*********************设置串口1使用的引脚*******************/ 
  __HAL_RCC_GPIOA_CLK_ENABLE();    //GPIO时钟使能
  GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;   
  GPIO_InitStruct.Pull  = GPIO_PULLUP;   
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;  
  GPIO_InitStruct.Pin = UART1_TX_PIN; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  
  GPIO_InitStruct.Pin = UART1_RX_PIN; 
  GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;  //接收引脚设置为输入 
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  
  
  /*********************设置串口一的参数*****************/ 
  __HAL_RCC_USART1_CLK_ENABLE();          //usart1时钟使能
  UartHandle.Instance = USART1;  
  UartHandle.Init.BaudRate   = 115200;  
  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;     // 8位数据位  
  UartHandle.Init.StopBits   = UART_STOPBITS_1;        //一位停止位  
  UartHandle.Init.Parity     = UART_PARITY_NONE;       //无校验  
  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;    //不使用硬件流控  
  UartHandle.Init.Mode       = UART_MODE_TX_RX;        //收发模式   
  if (HAL_UART_Init(&UartHandle) != HAL_OK)  
     {    
      /* Initialization Error */    
      while(1);  //这里要放错误的代码,方便调试。  
     }   
   /* *******设置串口中断优先级******** */  
  HAL_NVIC_SetPriority(USART1_IRQn, 0, 1);  
  HAL_NVIC_EnableIRQ(USART1_IRQn);
}

 

2、 main函数

int main(void)
{
pRxBuffer=aRxBuffer;
  HAL_Init();
 
  /* Configure the system clock to 72 MHz */
  SystemClock_Config();
 
 uart1_init();  //调用串口初始化函数
 
 if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)RxChar, 1) != HAL_OK)               //开启接收中断
  {
    while(1);
  }
printf("\n\rSTM32 USART:%d \n",1);                       //串口初使化成功,就可以打印调试信息了
  while (1);
}


3、 中断回调函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{ 
 *pRxBuffer=RxChar[0];                //把数据读到数组里面
 pRxBuffer++;
  if(HAL_UART_Receive_IT(UartHandle, (uint8_t *)RxChar, 1) != HAL_OK)              //重新设置中断
  {
    while(1);
  }
 
}

后记:网上说的用IDLE中断来接收长度不一样的数据包,但我一直都没有实现,大家可以留言探讨。

 

0 条评论

目前没有人发表评论

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。