首页 > 其他分享 >HNU-嵌入式系统-实验三(下)_应用案例

HNU-嵌入式系统-实验三(下)_应用案例

时间:2024-12-01 14:31:29浏览次数:9  
标签:DMA 函数 数码管 串口 嵌入式 案例 HNU ADC 导航键

在前述学习实践基础(HNU-嵌入式系统-实验三(上)_基础内容)上,利用“STM32 开发板”,设计并实现一个具备 AD、DMA、串口通信等功能的应用案例。
工程文件已上传至github,自取

1.功能介绍:

(1)STM32板子上有两种工作模式:

1) 流水灯模式,Led灯以流水形式进行亮灭
2) 数码管显示模式,可以在数码管上显示数字内容

(2)ADC导航键(按键)功能:

1) Key1键按下进行串口通信向电脑发送tips(功能介绍说明)
2) Key2键按下进行串口通信向电脑发送当前的工作状态及信息
3) Key3键(与导航键是同一个GPIO)按下切换工作模式
4) 处于数码管显示模式时,导航键向上拨动数码管显示内容加一

(3)电脑向STM32发送指令

1) 在流水灯模式下,电脑可以进行串口通信发送指令来改变流水灯的速度和方向
而DMA功能用在了串口通信的实现上

2.具体实现:

(流水灯的功能在第一部分已经实现)

(1)流水灯模式

流水灯有两个特性:方向和速度
方向有两个:Led0Led7和Led7Led0
速度这里设置了两种:快(间隔20ms)和慢(间隔1s)
因此需要定义两个全局变量dir和speed分别表示方向和速度
在这里插入图片描述

那么实现就好办了,只需要将流水灯的实现代码放到Func_1s()和Func_20ms()函数里,再加上if的逻辑判断就行,代码大概如下(分别对应Func_20ms和Func_1s):
在这里插入图片描述

(2)数码管显示

首先在STM32cubeMX中配置决定数码管显示哪一位的三个:SEL0~2
在这里插入图片描述

定义一个全局变量dispalyAllDigit存放数码管显示的内容,以及数字0~9对应的数码管显示数组,再用一个函数封装一下等等,代码如下:
在这里插入图片描述

要使人不能分辨动态数码管显示,在1ms函数里对3-8译码器的SEL0~2的值“循环”:
在这里插入图片描述

其中,全局变量LED_SEL_Flag是标志着目前处于什么工作模式,只有在数码管显示模式下才会执行这段代码。

(3)串行通信&DMA

(DMA 是直接内存访问(Direct Memory Access),用于在外设(如 UART)和内存之间直接传输数据,完全绕过 CPU)
串口通信是常见的功能,常用的方法有三种:阻塞式、中断 和 DMA。
1)第一种阻塞式串口通信下,在发送或接收数据时,CPU 会等待操作完成后才继续执行下一步代码。所以不适合
2)而中断和DMA的串口通信代码逻辑上其实差不多,只是调用的函数名不同,使用硬件中断机制,发送或接收数据时,CPU 不需要等待,任务完成后硬件会触发中断,进入对应的中断服务函数进行处理。
中断式通信会让 CPU 处理每个字节的发送或接收,适合中小数据量或需要逐字节处理的场景。DMA通信让硬件负责整个数据块的传输,CPU 只处理完成中断,适合大数据量、高性能的场景。
所以对于我这“小”功能用不用DMA就可以了,但为了用到DMA就用的DMA串口通信进制实现的
首先在STM32cubeMX配置串口通信USART1和DMA:
选择异步Asynchronous:
在这里插入图片描述

添加两个DMA通道RX和TX:
在这里插入图片描述

打开中断:
在这里插入图片描述

直接生成代码后可以发现在stm32f1xx_it.c中多出来三个函数:
在这里插入图片描述

函数里面都有一个对于的中断处理函数,右键有个选项可以找到其定义。也可以直接去对应的文件里找到所有得hal函数

在这里插入图片描述

这里我用的是接收不定长的数据函数:
在这里插入图片描述

相应的回调函数是:
在这里插入图片描述

1)现在实现让电脑进行串口通信发送指令改变流水灯模式下的方向和速度,那么我需要HAL_UARTEx_ReceiveToIdle_DMA 接收数据,在回调函数中实现对流水的逻辑操作,为了让板子时刻接收电脑发送的数据,在回调函数最后要重新用 HAL_UARTEx_ReceiveToIdle_DMA 接收数据,代码如下:
在这里插入图片描述

为什么最后一行要用:
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
用HAL_UARTEx_ReceiveToIdle_DMA()时,在接收的最大值的一半时也会调用该回调函数,所以用它可以禁用半传输中断。
注意:当时用这行禁用半传输中断代码时hdma_usart1_rx会报错。
解决办法:在usart.h里加上代码“extern DMA_HandleTypeDef hdma_usart1_rx;”

(4)ADC导航键

首先,在STM32cubeMX中配置ADC,在原理图中找到导航键键是用的ADC引脚接口是IN10,并打开中断使能。
在这里插入图片描述

生成代码后,在相应ADC模块文件里可以找到相关HAL函数:
在这里插入图片描述

我用到的HAL函数是:
1)开启 ADC 转换并启用中断模式
HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
2)在轮询模式或中断模式下,获取当前转换结果(12 位或更低分辨率)
HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
3)ADC中断回调函数
HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
不过在这之前,我们还需知道ADC采样到的不同导航键的电压值。我们可以自己采样不同导航键对于的12位电压值并用串口通信在串口助手上发给电脑,不过得到的是ascll码形式,要进行相应转换,看看它们哪些位数是确定不变且互不相同的!以下是我采集到的不同导航键对应的12位值:
在这里插入图片描述

所以只有高4位是可以区分导航键的!
为了将导航键对应功能函数单独定义实现,进行函数封装。
用了flag进行标记,防止长按一直执行对应功能。
在这里插入图片描述

getNavigationKey函数确定是哪一个导航键,在ADC回调函数中调用Func_NavigationKey函数
在这里插入图片描述
在这里插入图片描述

然后可以分别在对应的功能函数写代码,非常清晰,这里我只用到导航键向上拨动和Key3键:
在这里插入图片描述

(5)按键Key1和Key2

首先,在STM32cubeMX中配置外部中断:
在这里插入图片描述

由于Key1和Key2的回调函数都是同一个,所以要用if分别处理对应功能
HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
Key1键按下进行串口通信向电脑发送tips(功能介绍说明)
Key2键按下进行串口通信向电脑发送当前的工作状态及信息
在这里插入图片描述

(tips内容太长,截不下了)

3.功能展示:

(1)首先是流水灯模式下(状态是Led0Led7,速度慢)
在这里插入图片描述

(2)按下key1发送tips:
在这里插入图片描述

(3)按下key1查看当前状态信息:
在这里插入图片描述

(4)电脑发送指令(比如0f):
在这里插入图片描述
在这里插入图片描述

(5)按下Key3切换工作模式
在这里插入图片描述

(6)数码管模式下,向上拨动导航键,使数码管内容加一
在这里插入图片描述

(7)再按下key2发送当前状态信息:
在这里插入图片描述

(8)发送指令格式不对时或在数码管模式下发送时:

在这里插入图片描述
这里推荐一个b站up主(keysking)讲解的STM32的教程:
【STM32入门教程】应该是全B站最好的STM32教程了
主要是这个up主有动画展示,讲的是真的好,听一遍就懂了!

标签:DMA,函数,数码管,串口,嵌入式,案例,HNU,ADC,导航键
From: https://blog.csdn.net/k2024_1013/article/details/144016220

相关文章

  • 嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供
    引言:本文你能实际的了解到实战量产产品中电源架构设计的要求和过程,并且从实际实践出发搞懂电源架构系统,你也可以模仿此架构抄板到你自己的项目,并结合硬件篇之前的项目以及理论形成正真的三路电源输入设计与开发板电源架构块供读者学习以及运用到实际产品中。回归PCB设计的本质......
  • 【docker】Dockerfile指令讲解,与企业案例应用
    Dockerfile简介Dockerfile是一个文本文件,包含了构建Docker镜像所需的所有命令。通过执行dockerbuild命令,Docker会按照Dockerfile中的指令一步步构建出镜像。Dockerfile基本结构一个简单的Dockerfile可能包含以下内容:FROMubuntu:20.04LABELmaintainer="y......
  • 48. Web前端网页案例——【王者荣耀游戏主题网页( 6页)】 大学生期末大作业 html5+css3+
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐♬♬♬​​​​​​​欢迎光临我的CSDN!这里是Web前端网页案例大集汇,有各行各业的前端网页案例,每天会持续更......
  • 嵌入式硬件实战提升篇(二)PCB高速板设计 FPGA核心板带DDR3 PCB设计DDR全面解析
    引言:设计一款高速板,供读者学习,FPGA核心板,带一颗DDR3内存,FPGA型号:XC6SLX16-2FTG256C。随着嵌入式硬件技术的快速发展,高速板设计逐渐成为嵌入式系统设计中的核心技术之一。高速板的设计要求技术人员具备信号完整性、电源完整性及高频布线的综合能力,特别是在FPGA与高速存储器(如DD......
  • vue基础之2:搭建vue开发环境、Hello小案例
    欢迎来到“雪碧聊技术”CSDN博客!在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目......
  • 如何使用git fetch与git pull,在团队协作中二者有什么区别,具体案例分析并深入理解
    gitfetch与gitpullgitpull和gitfetch都是用于从远程仓库获取更新的命令,但它们的功能和使用场景有所不同。理解这两个命令的区别以及如何有效地在团队协作中使用它们,对于提高工作效率和减少合并冲突至关重要。gitfetch作用:gitfetch会从远程仓库下载所有新的数......
  • 2025寒假第三十一届全国高校嵌入式与AI大模型高级师资培训通知
    ......
  • 【嵌入式C语言】常用关键字及运算符操作
    常用关键字及运算符操作关键字杂项sizeofreturn数据类型charint进制表示long、shortunsigned,signedfloat、doublevoid自定义数据类型structunionenumtypedef逻辑结构类型修饰符【重点】掌握C语言的常用关键字及其应用场景,使用技巧掌握位运算的典型操作掌握常用......
  • 嵌入式开发之C语言学习笔记day12
    动态内存分配1.常用函数2.malloc函数的细节点2.1malloc创建空间的单位是字节2.2malloc返回的是void类型的指针,没有步长的概念,也无法获取空间中的数据,需要强转2.3malloc返回的不仅仅是首地址,没有总大小,最好定义一个变量记录总大小2.4malloc申请的空间不会自动消失,如果......
  • 信息资源管理文字题之“结合案例分析信息资源规划包含的内容”
    一、案例:2001年,山东海化集团有限公司启动信息资源规划项目,聘请大连圣达计算机发展有限公司共同参与项目开发。通过海化业务人员和圣达系统分析人员的紧密合作,最终完成了《山东海化集团有限公司信息资源规划方案》,为海化集团实现信息化建设跨越式发展奠定了基础要求:结合案例分析本......