STM32
直播中

一瞅一个准

12年用户 835经验值
私信 关注
[问答]

求大佬分享STM32L051使用HAL库操作实例

求大佬分享STM32L051使用HAL库操作实例

回帖(1)

彭丞峥

2021-11-26 15:43:59
   一、STM32CubeMX配置(本文使用的STM32CubeMX版本为5.6.0)

  思路:使用中断控制方式,当串口接收到数据时,再将接收到的数据发送出去
  1.MCU选型

  本例程使用的为STM32L051C8T6型号
  2.使能时钟

  
  

  

  3.时钟配置

  
  

  

  4.设置GPIO口(本例使用的为串口1,板载自带USB转串口芯片)

  
  

  


  

  

  5.串口配置

  ①模式配置

  

  


  ②串口参数配置

  
  

  

  ③开启串口中断

  因为程序使用的是中断处理,所以还需要打开NVIC Settings页面,使能中断

  

  

  ④串口引脚配置

  
  

  

  6.配置STM32CubeMX生成工程文件

  
  

  


  

  

  7.点击GENERATE CODE生成工程文件

  二、KEIL程序

  1.串口相关函数说明:

  


  • 串口发送/接收函数                 HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制
                    HAL_UART_Receive();串口轮询模式接收,使用超时管理机制
                    HAL_UART_Transmit_IT();串口中断模式发送
                    HAL_UART_Receive_IT();串口中断模式接收
                    HAL_UART_Transmit_DMA();串口DMA模式发送
                    HAL_UART_Transmit_DMA();串口DMA模式接收
  • 串口中断函数
                    HAL_UART_TxHalfCpltCallback();一半数据发送完成时调用
                    HAL_UART_TxCpltCallback();数据完全发送完成后调用
                    HAL_UART_RxHalfCpltCallback();一半数据接收完成时调用
                    HAL_UART_RxCpltCallback();数据完全接受完成后调用
                    HAL_UART_ErrorCallback();传输出现错误时调用


2.程序编写
1.在main.c文件中定义2个数组,用于发送及存放数据内容;


/* USER CODE BEGIN Includes */
uint8_t aTxBuffer[]="rn*********串口发送数据*********rn";
uint8_t aRxBuffer[1];                // 用来接收串口1发送的数据
/* USER CODE END Includes */
2.由于要使用printf,所以需要重定义,USART.C文件中;


#include "stdio.h"   //这个一定不能忘

#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
        x = x;
}

//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->ISR&0X40)==0);//循环发送,直到发送完毕   
    USART1->TDR = (uint8_t) ch;      
        return ch;
}
#endif

3.重新编写串口接收回调函数



void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
{
        if(huart->Instance == USART1)        // 判断是由哪个串口触发的中断
        {
                HAL_UART_Transmit(&huart1,aRxBuffer,1,100);        // 接收到数据马上使用串口1发送出去
                HAL_UART_Receive_IT(&huart1,aRxBuffer,1);                // 重新使能串口1接收中断
        }
}
4.main.c函数添加如下;


int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Transmit_IT(&huart1 ,aTxBuffer,sizeof(aTxBuffer)); //sizeof()可读取目标数组长度
        HAL_UART_Receive_IT(&huart1,aRxBuffer,1);
        printf("rnSTM32L051C8T6 开发板串口实验rn");
        printf("rn请输入数据rn");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
                HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);  //LED1
                HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


2.编译文件,下载。即可实现串口收发状态(开发板串口拨码开关不要忘了打开(* ̄︶ ̄))
  
  

  

  源工程文件代码下载:https://download.csdn.net/download/cheng_nnan/12330928
举报

更多回帖

发帖
×
20
完善资料,
赚取积分