嵌入式系统开发入门

article/2025/11/9 20:02:25

嵌入式系统开发

快捷键

alt + / 	:	代码提示
ctrl + 鼠标左:	  查看代码实现
alt + ←		:   返回跳转前的代码

项目1-Hello world

1、创建STM32项目

image-20210521111403510

2、选择型号

image-20210521111814227

3、配置项目名称

image-20210521111917682

4、项目初始化概览

image-20210521112239462

5、根据需求,查看文档引脚说明

打开提供的:MB1296D-01.PDF,次出是控制LED灯,因此找到LED等引脚相关信息。

image-20210521112451511

6、到CUBE IDE配置对应的模式

分别配置PA5、PB5、PB6、PB7的模式为输出,高电平有效等。

image-20210521112807059

image-20210521113002755

7、保存修改

image-20210521113238272

保存会提示弹出一些对话框,都选择Yes

image-20210521113318872

8、创建完成

查看对应的文件结构,其中CMSIS是ARM等定义的HAL,硬件抽象层。

image-20210521113955299

查看main.c

image-20210521114501936

9、修改代码,实现针脚输出高电平

image-20210521114725107

10、重新编译

image-20210521115125341

编译,看是否报错

11、调试

image-20210521115510995

确定

image-20210521115534097

查看断点

image-20210521115621195

12、修改代码使得蓝灯、绿灯闪,红灯常亮。

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_RTC_Init();MX_SPI1_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){// write pin led HAL_GPIO_WritePin(LD2_RED_GPIO_Port, LD2_RED_Pin, GPIO_PIN_RESET);// flash blue ledHAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin);// flash green ledHAL_GPIO_TogglePin(LD_GREEN_GPIO_Port, LD_GREEN_Pin);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

13、查看结果

image-20210521121125979

注意:调试接口接入的位置

项目2-按钮实现闪灯

需求:板上有两个按钮,一蓝和一黑。黑色是重置,而蓝色是给用户自定义的。接下实现按钮控制LED灯的亮与灭。

stm32

1、观察电路图

stm32_button

发现需要将PB2口设置为输入悬空

2、CUBE IDE设置对应GPIO口的模式

image-20210526172502742

3、编码读取按钮状态

int main(void)
{
// ... 省略while (1){// GPIO_PIN_RESET 低电平// GPIO_PIN_SET 高电平// Anti-Hunting (Remember)if (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET) {HAL_Delay(15);if (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin);HAL_GPIO_TogglePin(LD_GREEN_GPIO_Port, LD_GREEN_Pin);// Release inspectionwhile (HAL_GPIO_ReadPin(B2_BUTTON_GPIO_Port, B2_BUTTON_Pin) == GPIO_PIN_RESET);}}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

需要注意的是:

  • 抖动消除:代码中采用双if加延时,抖动消除。消抖是为了避免在按键按下或是抬起时电平剧烈抖动带来的影响。

  • 松手检测:代码中的while用来实现松手检测。一般传统的松手检测都是用一个while死循环等待松手的

4、小总结

  • 实现按钮控制LED灯的时候,主要注意按钮状态的读取。
  • 在对按钮状态读取的时候,需要注意「抖动消除」和「松手检测」来线程按下按钮的机械特性。

项目3-按钮控制(中断方式)

需求:用中断方式,控制灯的闪烁快慢。

此处有两个疑问,一是中断处理函数在哪里;二是如果控制灯闪烁的快慢。

1、设置按钮的输入输出方式为中断模式

image-20210528110053818

2、其中GPIO mode 的介绍如下

由于按钮电路按下的时候是触发下降沿,因此我们需要设置为下降沿中断触发。

3、NVIC

image-20210528110326610

设置NVIC中断为运行,PB2对应EXTI2

4、中断通道

image-20210528111223866

5、进入函数内部

image-20210528111647177

6、重写函数(此函数会在中断发送的时候执行)

image-20210528111840294

总结4/5/6三步就是

  • stm32l0xx_it.c中的EXTI2_3_IRQHandler是用于处理EXTI2和EXTI3的中断请求
  • 在本项目中调用了HAL_GPIO_EXTI_IRQHandler函数对指定引脚中断进行处理
  • HAL_GPIO_EXTI_IRQHandler内部会先判断该引脚中断是否可用,可用就继续执行HAL_GPIO_EXTI_Callback,真正的中断处理函数
  • 在stm32l0xx_it.c中的HAL_GPIO_EXTI_Callback是weak修饰,说明可用被重写
  • 这里直接把这部分函数搬到main.c的用户自定义区域,重写即可

7、总结:只需要将函数HAL_GPIO_EXTI_Callback复制到main函数中,重写即可

// 全局变量
int flag=0;// 主函数
int main(void)
{while (1){HAL_GPIO_TogglePin(LD3_BLUE_GPIO_Port, LD3_BLUE_Pin);if (flag == 0) {HAL_Delay(150);} else {HAL_Delay(500);}}
}// 中断处理函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{// 简单将flag反转flag = !flag;
}

项目4-按钮控制串口通信(中断方式)

需求:按钮按下,同串口通信给PC发送Hello

1、设置串口通信信息

image-20210602181125121

2、编码

在中断回调函数调用串口发送函数

// 全局函数
uint8_t aTxbuf[] = {'h','e','l','l','o'};// 主函数
int main(void) {// ... 无需修改逻辑
}// 中断回调处理函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {// 串口写,5个字符HAL_UART_Transmit(&huart2, aTxbuf, 5, 1000);flag = !flag;
}

3、使用串口调试助手读取数据

此处需要注意:波特率,奇偶校验,数据位需要与Cube IDE中配置的保存一致。

下载只需要百度「XCOM串口助手」即可

image-20210602181723330


http://chatgpt.dhexx.cn/article/0p9rI3TE.shtml

相关文章

嵌入式入门应该学什么?先从学习单片机开始!

可能很多人不知道嵌入式,不知道单片机。 但是我说最近几年的流行的应用大家就了解了。 1.无人机 2.共享单车 3.丰巢快递柜 4.充电桩 5.智能家居 这些产品内部都是通过嵌入式技术实现的,而大多数用的都是单片机。 那嵌入式和单片机的区别是什么&…

【嵌入式入门篇】嵌入式0基础沉浸式刷题篇1

嵌入式-入门沉浸式刷题篇 前言Q1:嵌入式牛牛宏大小Q2:嵌入式宏空间坐标数量Q3:嵌入式牛牛疑惑的变量Q4:嵌入式关键字constQ5:嵌入式机器的大小端Q6:嵌入式不用排序找数字Q7:嵌入式结构体对齐Q8&…

嵌入式入门应该先学习STM32还是先学习51

今天在粉丝群里一位嵌入式初学者问了一个这样的问题:学嵌入式应该先学什么?(文末有粉丝福利) 后面各位大佬也是对该问题发表了自己的观点,大多数人都认为应该先学51,因为51单片机直接对寄存器操作&#xf…

再说嵌入式入门

我之前写过几篇嵌入式入门的文章 不过我的读者还是觉得不够过瘾,我觉得还是要着重说一下嵌入式软件应该重点学习什么,guoqing收假最后一天写文。 精通C语言 精通C语言 精通C语言 C语言对于嵌入式软件来说就是他的命脉,不懂C语言的人根本就…

嵌入式开发入门基础篇

今天在逛CSDN的时候发现一篇嵌入式开发基础篇,看完感觉写的非常好,特拿过来跟大家分享一下。原篇地址:https://blog.csdn.net/qq_61672347/article/details/126760788。 文章目录 前言一、STM32的数据类型二、C语言中常用的关键字1、const关键…

嵌入式开发(一):嵌入式开发新手入门

系列文章: 嵌入式开发(一):嵌入式开发新手入门 嵌入式开发(二):开发板配置(自用) 嵌入式开发(三):海思Hi3559a交叉编译live555嵌入式…

嵌入式入门基础知识

文章目录 前言嵌入式基本知识ARM的理解ARM是一家公司一类芯片或产品的统称一项技术的名称,即采用RISC处理器体系架构ARM和intel的区分ARM和STM32的关系 处理器的基本概念MCUMPUDSPFPGA总结 ARM开发MCU开发和MPU开发的区别开源硬件 Arduino 和 Raspberry Pi总结 总结…

宽度学习系统BLS推广到在线学习的论文阅读记录

BELS: A BROAD ENSEMBLE LEARNING SYSTEM FOR DATA STREAM CLASSIFICATION 摘要:这篇文章主要是将BLS推广到适用于在线学习的邻域,提出了其如何进行适合在线学习的增量更新,以及面对概念漂移的适应 所提出的算法BELS 稀疏特征映射的更新 …

超越EfficientNet!MutualNet:一种自适应相互学习网络宽度和分辨率的网络

点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 【导读】今天给大家介绍一篇 ECCV 2020 Oral论文 ,该论文强调了同时考虑网络宽度和输入分辨率对有效网络设计的重要性。…

【AI不惑境】网络的宽度如何影响深度学习模型的性能?

大家好,这是专栏《AI不惑境》的第三篇文章,讲述模型宽度与模型性能的关系。 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考。如果说学习是一个从模仿,到追随,到创造的过程&#xff0c…

CSS:宽高自适应详解

宽度自适应的应用 1.属性:width 2.属性值:px/% 3.宽度自适应的特点 - HTML,BODY表示浏览器,默认是块级元素,宽度是100% - 当块级元素不设置宽度或者设置100%的时候,宽度会沾满全屏(通栏效果) - 子级是块级元素,不设置宽度的时候会和父级等…

陈俊龙:从深度强化学习到宽度强化学习—结构,算法,机遇及挑战

来源:AI科技评论 摘要:如何赋予机器自主学习的能力,一直是人工智能领域的研究热点。 强化学习与宽度学习 如何赋予机器自主学习的能力,一直是人工智能领域的研究热点。在越来越多的复杂现实场景任务中,需要利用深度学习…

网络的宽度对深度学习模型的性能影响

目录 1 为什么需要足够的宽度 2,经典网络的第一层的宽度 3,宽度对模型性能的影响 4 如何更加有效地利用宽度 4.1 提高每一层通道的利用率 4.2 用其他通道的信息来补偿 5 经典网络模型宽度设计方法 5.1 采用多分支网络结构设计 1)ResN…

深度学习笔记(七):网络宽度(卷积核个数)的一些想法

文章目录 一、前言二、网络深度的意义三、宽度的意义四、 网络宽度设计4.1 网络宽度的下限在哪?4.2 网络宽度对模型性能的影响4.3 网络宽度和深度谁更加重要? 五、如何加有效地利用宽度?5.1 提高每一层通道的利用率5.2 用其他通道的信息来补偿…

宽度 深度学习 特点对比

宽度 & 深度学习 特点对比 推荐系统模型介绍实验过程与实验结果实验总结 为了提高神经网络的性能,是应该增加宽度呢?还是应该增加深度呢?增加宽度和增加深度各有什么样的效果呢? 本文对论文《Wide & Deep Learning for Re…

为什么是“深度”学习而不是宽度?

为什么是深度而不是宽度? 先说说我个人的理解,如下图所示,圆圈表示神经元,有两种方式。第一种,只有一层神经层,有8个神经元;第二种方式,有两层神经层,分别有2个和4个神经…

宽度学习系统:一种不需要深度结构的高效增量学习系统

宽度学习系统:一种不需要深度结构的高效增量学习系统 本文是对陈俊龙教授团队“Broad Learning System: An Effective and Efficient Incremental Learning System Without the Need for Deep Architecture”的中文综述,原文将在IEEE Transactions on Neu…

网络的宽度如何影响深度学习模型的性能?

大家好,这是专栏《AI不惑境》的第三篇文章,讲述模型宽度与模型性能的关系。 进入到不惑境界,就是向高手迈进的开始了,在这个境界需要自己独立思考。如果说学习是一个从模仿,到追随,到创造的过程&#xff0…

宽度学习代码的一些问题

最近在拜读陈院士的宽度学习论文,受益匪浅,在此先感谢陈院士团队的开源代码! 在复现代码的过程中,发现了一些小问题,在此记录,方便自己日后翻阅。 此博客仅代表个人观点,姑且算作个人读书笔记…

DeepLearning | Broad Learning System 宽度学习系统 : 高效增量式浅层神经网络

Broad Learning System (BLS,宽度学习系统)是澳门大学的陈俊龙教授在2017年TNNLS上基于随机向量函数链接神经网络(RVFLNN)和单层前馈神经网络(SLFN)提出的一种单层增量式神经网络。这个模型相比于传统的深层网络模型,它在保证一定精度的同时,…