• STM32L4单片机基础——使用USART发送和接收数据(DMA模式)


    1. 准备工作

    硬件准备

     开发板
    首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接。

     

    2.生成MDK工程

    选择芯片型号

    打开STM32CubeMX,打开MCU选择器:

     搜索并选中芯片STM32L431RCT6:

    配置时钟源

    • 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
    • 如果使用默认内部时钟(HSI),这一步可以略过;

    这里我都使用外部时钟:

    配置串口

    小熊派开发板板载ST-Link并且虚拟了一个串口,原理图如下:

     这里我将开关拨到AT-MCU模式,使PC的串口与USART1之间连接。

    接下来开始配置USART1

    USART DMA配置

    知识小卡片 —— DMA

    DMA 全称 Direct Memory Access(直接存储器访问), 是STM32的一个外设,它的特点在于:

    在不占用CPU的情况下将数据从存储器直接搬运到外设,或者从外设直接搬运到存储器,当然也可以从存储器直接搬运到存储器。

    比如在需要串口发送大量数据的时候,CPU只需要发起DMA传输请求,然后就可以去做别的事情了,DMA会将数据传输到串口发送,DMA传输完之后会触发中断,CPU如果有需要,可以对该中断进行处理,这样一来CPU的效率是不是大大提高了?

    在STM32L431RCT6中有 2 个 DMA 外设:DMA1 和 DMA2,每个DMA外设有 7 个通道,每个通道都是独立的,配置DMA的时候有几个关键点:

    • 数据从哪里来?
    • 数据到哪里去?
    • 有多少数据?

    知识小卡片结束啦~对STM32的DMA外设有没有了解呢?

    接下来我们配置DMA,将存储器(SRAM)中的数据直接搬运到串口外设去发送:

    配置时钟树

    STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:

    生成工程设置

    代码生成设置

    最后设置生成独立的初始化文件:

    生成代码

    点击GENERATE CODE即可生成MDK-V5工程:

    3. 在MDK中编写、编译、下载用户代码

    定义发送数据区域

    1 /* Private user code ---------------------------------------------------------*/
    2 /* USER CODE BEGIN 0 */
    3 uint8_t dat[] = "Hello, I am Mculover666.
    ";
    4 /* USER CODE END 0 */

    在main函数中发起DMA传输

     1 int main(void)
     2 {
     3   HAL_Init();
     4 
     5   SystemClock_Config();
     6 
     7   MX_GPIO_Init();
     8   MX_USART1_UART_Init();
     9 
    10   /* USER CODE BEGIN 2 */
    11   HAL_UART_Transmit_DMA(&huart1, (uint8_t*)dat, sizeof(dat));
    12   /* USER CODE END 2 */
    13 
    14   while (1)
    15   {
    16   }
    17 }
    View Code

    实验现象

    编译下载运行后,实验现象如下:

    4. 使用DMA接收串口数据

    说明

    • 使用HAL库的时候不能同时使用DMA发送和接收数据,会出错。
    • 所有的步骤和发送时一样,这里我只给出需要修改的部分。

    修改串口DMA配置

    添加串口接收缓冲区

    1 /* Private user code ---------------------------------------------------------*/
    2 /* USER CODE BEGIN 0 */
    3 uint8_t dat[] = "Hello, I am Mculover666.
    ";
    4 uint8_t recv_buf[13] = {0};        //串口接收缓冲区
    5 /* USER CODE END 0 */

    修改main函数

     1 int main(void)
     2 {
     3   HAL_Init();
     4 
     5   SystemClock_Config();
     6 
     7   MX_GPIO_Init();
     8   MX_DMA_Init();
     9   MX_USART1_UART_Init();
    10 
    11   /* USER CODE BEGIN 2 */
    12   HAL_UART_Transmit(&huart1, (uint8_t*)dat, sizeof(dat), 0xFFFF);
    13   HAL_UART_Receive_DMA(&huart1, recv_buf, 13);  //使能DMA接收
    14   /* USER CODE END 2 */
    15 
    16   while (1)
    17   {
    18   }
    19 }
    View Code

    添加串口接收中断回调函数

    1 /* USER CODE BEGIN 4 */
    2 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
    3 { 
    4     //将接收到的数据再发送
    5     HAL_UART_Transmit(&huart1,recv_buf,13, 0xFFFF);
    6 }
    7 /* USER CODE END 4 */

    编译代码

    点击如图所示的按钮编译工程

     编译成功

    设置下载器

    点击如图所示按钮打开设置页面

     进行下载设置,选择“ST-Link Debugger”,并点击“Settings”。

     在“Flash Download”菜单下勾选“Reset and Run”选项,已达到烧录程序后单片机自动复位并运行程序的目的。

    下载运行

    点击"LOAD"按钮即可烧录代码到单片机中。

     烧录成功

    实验现象

     至此,我们已经学会了如何配置USART使用DMA模式发送数据和接收数据,下一节将讨论实现printf()函数的多种方法。

  • 相关阅读:
    跨站攻击与文件上传漏洞
    时光变奏曲
    概率论知识总结(1)——集合、概率和计数
    电磁学知识点提要
    解析几何
    数据库与信息系统经典例题
    复变函数知识总结——复变函数作业解答与问题注释
    复变函数知识总结(4)——共形映射
    复变函数知识总结(3)——亚纯函数与对数函数
    复变函数知识总结(2)——Cauchy理论
  • 原文地址:https://www.cnblogs.com/YuchuanHuaying/p/12545781.html
Copyright © 2020-2023  润新知