嵌入式单片机的高级编程技巧和优化

引言

嵌入式单片机(MCU)是实现智能设备控制的核心,广泛应用于工业自动化、智能家居、医疗设备等领域。

下面将探讨STM32单片机的高级编程技巧,包括中断管理、低功耗模式和内存优化等方面,并提供具有一定难度的代码示例。

环境准备
  1. 硬件选择:STM32F4系列单片机,具有丰富的外设和较大的内存。
  2. 开发环境
    • STM32CubeIDE:集成开发环境,支持代码编写、编译和调试。
    • ST-LINK/V2:用于程序下载和调试的工具。
  3. 附加工具
    • USB转串口模块,用于调试信息输出。
    • 外部传感器,例如DHT22温湿度传感器。
高级编程技巧
中断管理

中断是嵌入式编程中不可或缺的部分,合理使用中断可以提高程序的响应速度和效率。在STM32中,嵌套向量中断控制器(NVIC)管理着所有的中断和异常。优先级分组功能可以用来微调中断优先级,实现复杂的中断管理策略。

代码示例:配置和使用外部中断
#include "stm32f4xx.h"void EXTI0_IRQHandler(void) {if (EXTI_GetITStatus(EXTI_Line0) != RESET) {// 处理中断GPIO_ToggleBits(GPIOD, GPIO_Pin_12); // 翻转LED状态EXTI_ClearITPendingBit(EXTI_Line0);  // 清除中断标志位}
}int main(void) {GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);// 配置PD0作为输入引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOD, &GPIO_InitStructure);// 连接外部中断线SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOD, EXTI_PinSource0);// 配置外部中断线0EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);// 设置NVICNVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);while (1) {// 主循环}
}
低功耗模式

在许多嵌入式应用中,降低功耗是关键要求之一。STM32提供多种低功耗模式,如睡眠模式、停止模式和待机模式。合理利用这些模式可以显著降低设备的能耗。

代码示例:进入停止模式
#include "stm32f4xx.h"void configure_to_stop_mode(void) {// 配置所有未使用的GPIO引脚为模拟模式以降低功耗GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;GPIO_Init(GPIOC, &GPIO_InitStructure);// 使能PWR时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);// 设置进入停止模式时由于外部中断唤醒系统PWR_ClearFlag(PWR_FLAG_WU);PWR_WakeUpPinCmd(ENABLE);PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}int main(void) {
// 初始化系统时钟和其他必需外设
// ...while (1) {
// 主循环中执行低功耗检查
// 如果满足进入低功耗模式的条件configure_to_stop_mode();
// 系统从低功耗模式唤醒后执行的操作
// 例如重新初始化时钟和部分外设
// ...
}
}##### 内存优化在资源受限的嵌入式环境中,有效管理和优化内存使用是提高系统性能和稳定性的关键。使用STM32的DMA(直接内存访问)功能可以在不占用CPU的情况下进行内存传输,从而优化内存使用和提高数据处理速度。###### 代码示例:使用DMA传输数据```c
#include "stm32f4xx_dma.h"
#include "stm32f4xx_adc.h"void DMA_ADC_Configuration(void) {DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;// 使能DMA和ADC时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);// DMA2 Stream0通道0配置DMA_InitStructure.DMA_Channel = DMA_Channel_0;DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC_ConvertedValue;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;DMA_InitStructure.DMA_BufferSize = 1;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;DMA_Init(DMA2_Stream0, &DMA_InitStructure);// 启用DMA流DMA_Cmd(DMA2_Stream0, ENABLE);// ADC1配置ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfConversion = 1;ADC_Init(ADC1, &ADC_InitStructure);// 启动ADCADC_Cmd(ADC1, ENABLE);ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);ADC_DMACmd(ADC1, ENABLE);// 开始ADC转换ADC_SoftwareStartConv(ADC1);
}uint16_t ADC_ConvertedValue; // 存储ADC转换后的值int main(void) {DMA_ADC_Configuration();while (1) {// 使用转换后的值进行处理// 例如实时监测和响应}
}
应用场景
  1. 实时数据采集:通过配置中断和DMA,MCU能够实时采集并处理如温度、压力等多种传感器数据。
  2. 能效管理:利用MCU的低功耗模式,为便携式设备和遥控传感网络设计省电策略。
  3. 复杂控制系统:在工业自动化中,MCU通过精确控制执行器,实现复杂的机械控制和调节。

 

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

通过本文的深入探讨和实际代码实现,可以掌握STM32单片机的高级编程技巧,有效地应对多样化的嵌入式开发挑战。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/3536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习的炼金术:转化数据为黄金的秘密

深度学习的炼金术:转化数据为黄金的秘密 1 引言 在现代深度学习的壮阔疆域中,数据是王冠上耀眼的宝石,而性能优化则是锻造这顶王冠的炼金术。这份融合了数据和算法魔力的艺术,不仅仅依赖于强大的计算资源和复杂的网络结构&#x…

【蓝桥杯省赛真题40】python摘苹果 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python摘苹果 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python摘苹果 第十三届蓝桥杯青少年组python编程省赛真题 一、题目要求 &…

【C语言】万字详讲操作符

目录 前言 一、操作符分类 二、算数操作符 三、移位操作符 四、位操作符 五、赋值操作符 六、单目操作符 6.1 逻辑反操作 6.2 负值与正值 6.3 取地址 6.4 sizeof 6.5 取反操作符 6.6 --和操作符 6.7 间接访问操作符(解引用操作符) 6.8 强…

QA | amfori QMI 审核常见问题解答

01amfori QMI 项目介绍 作为全球领先的贸易协会,amfori 致力于开放和可持续贸易。他们汇集了来自 40 多个国家的零售商、进口商、品牌和协会,目的是系统地监督和改善世界各地的供应商的工作条件。 amfori QMI 是一项针对致力于为生产现场的作业规范和质量…

level2行情+在线金融数据库

jvQuant:一站式金融量化服务平台 jvQuant作为一个领先的金融量化服务平台,为广大投资者和量化分析师提供了全面、高效、稳定的数据接入和量化分析服务。该平台涵盖了多个关键功能,包括交易接入、WebSocket行情接入、历史行情查询、在线数据库…

安装JAVA和java IDEA并汉化过程

1.安装java: 打开java的下载链接: Java Downloads | Oracle 然后选择对应的版本下载即可,我这里是windows 所以下载这个 然后正常一步步安装即可。 2.配置java环境: 在桌面右键此电脑然后点击属性——高级系统设置——环境变量——然后…

H5点击复制功能 兼容安卓、IOS

效果图 HTML代码 <div>链接&#xff1a;<span style"color: #FF8A21" click"CopyUrl" id"copyId"> https://blog.csdn.net/qq_51463650?spm1000.2115.3001.5343</span> </div>复制方法 const CopyUrl () > {let …

12.Blender 界面介绍(上)及物体基础编辑操作

设置语言 首先在菜单栏打开编辑-Preferences-界面-翻译&#xff0c;可以修改语言 这里使用的是Steam上下载的4.1版本 工具栏 左边的工具栏&#xff0c;按T就会出现&#xff0c;再按T就会隐藏 右边的工具栏是按N&#xff0c;按N显示&#xff0c;再按N隐藏 旋转画面 长按鼠…

微信小程序监听App中的globalData——全局数据监听

微信小程序监听App中的globalData——全局数据监听 定义数据定义监听方法注册监听方法修改监听的数据扩展 需求&#xff1a;微信小程序项目需要全局监听某个数据。 方法&#xff1a;在 app.ts/app.js 中定义 globalData 公共数据&#xff0c;然后定义一个监听方法 watch&…

CSS 标准流 浮动 Flex布局

目录 1. 标准流2. 浮动2.1 清除浮动 3. Flex 布局3.1 Flex 组成3.2 Flex 布局 - 主轴与侧轴对齐方式3.2.1 主轴对齐方式3.2.2 侧轴对齐方式 3.3 Flex 布局 - 修改主轴方向3.4 Flex 布局 - 弹性伸缩比3.5 Flex 布局 - 弹性盒子换行3.6 Flex 布局 - 行对齐方式 1. 标准流 标准流…

使用selenium时出现element click intercepted报错的解决办法

win10&#xff0c;python3.8.10。 selenium版本如下&#xff08;用pip38 show selenium查看&#xff09;&#xff1a; 在定位中&#xff0c;定位了一个按钮&#xff08;特点&#xff1a;button下还有span然后才是文本&#xff09;&#xff0c;代码如下&#xff1a; from sele…

ubuntu22.04 CH340/CH34x 驱动安装

CH34x驱动地址&#xff1a;CH341SER_LINUX.ZIP - 南京沁恒微电子股份有限公司 1、卸载旧驱动&#xff08;如果存在&#xff09; sudo rmmod ch341.ko 2、解压进入 driver 目录 unzip CH341SER_LINUX.ZIP cd CH341SER_LINUX/driver 3、编译 make 可能错误&#xff1a; make[1]…

51单片机中断和定时的结合应用

#include <reg52.h>unsigned int cnt 0;sbit led P1^1;// 初始化定时器 void TimerSetup(){TMOD 0x01; // 定时器的第1个模式TH0 0xB8; // 定时器的初始值-高位TL0 0x00; // 定时器的初始值-低位TR0 1; //启动定时器cnt 0;EA 1; // 开启总中断ET0 1; // 时间中断…

4月26日 阶段性学习汇报

1.毕业设计与毕业论文 毕业设计已经弄完&#xff0c;加入了KNN算法&#xff0c;实现了基于四种常见病的判断&#xff0c;毕业论文写完&#xff0c;格式还需要调整&#xff0c;下周一发给指导老师初稿。目前在弄答辩ppt&#xff08;25%&#xff09;。25号26号两天都在参加校运会…

Python升级打怪(5)

链式调用:用一个函数的返回值作为另外一个函数参数 嵌套调用:一个函数在另一个函数定义里面&#xff0c;而调用该定义函数既可以使用在其里面的函数 在Pycharm中调试器的左下角能够看到函数之间的"调用栈" 调用栈里面描述了当前这个代码的函数之间&#xff0c;调用…

AI生图美学在淘宝的实践应用

本文介绍了如何制定和应用美学标准来评估和改善人工智能生成的图像质量&#xff0c;特别是在电商领域的应用&#xff0c;主要分为制定美学标准、训练美学模型、应用美学模型、升级淘宝风格模型四个步骤。 美学的定义与分析 图像质量标准&#xff1a;现代设计框架下&#xff0c;…

git 分支重命名 使用IDEA进行操作

当前项目下分支下执行 git push origin -d 旧分支名称 git push origin 新分支名称 tips: 本地分支重命名。如果分支尚未推送到远程&#xff0c;可以使用命令“git branch -m 旧名称 新名称”来重命名本地分支。 远程分支重命名。首先&#xff0c;重命名本地分支&#xff08;与…

C++ 内存管理

目录 一、new 二、delete 一、new 动态申请空间 //动态申请 1 个 int 类型的空间 int* p1 new int;//动态申请 1 个 int 类型的空间并初始化为 0 int* p2 new int(0);//动态申请 10 个 int 类型的空间 int* p3 new int[2]; 二、delete 释放空间 //释放 p1 delete p1;/…

黑马-设计模式-笔记(未完)

一、基础 UML类图 可见性&#xff1a; public- private#protected 表示方式&#xff1a;属性&#xff1a;可见性 名称:类型[默认值]方法&#xff1a;可见性 名称(参数)[:返回类型] 关系&#xff1a;关联关系&#xff1a;实线&#xff0c;引用关系&#xff0c;类属性里有另一个…

Pycharm/Dataspell中使用jupyter导入ros humble包

配置ros humble对应python包路径文件 首先在~/.local/lib/python3.10/site-packages目录下新建一个.pth文件&#xff0c;如下图所示。 将对应的ros humble的python包的路径配置在上述文件中&#xff0c;一行放置一个路径&#xff0c;对应的路径如下图所示。 完成上述操作后…