(mcu) 嵌入式基础简单入门(程序架构分析)

2024-08-27 09:52

本文主要是介绍(mcu) 嵌入式基础简单入门(程序架构分析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 💽前言
  • 💽软件框架
    • 📀工具环境
    • 📀模板工程
    • 📀编译后
    • 📀Code
    • 📀典例举例
  • 💽Keil 使用notes
  • ⭐END
    • 🌟关注我

💽前言

本文为一份简单入门笔记,以 stm32 单片机为例。

**声明:**由于笔者不是专业人员,仅作为入门初学者,因此本文避免不了的有专业性错误,请自行甄别。

完全以一位纯应用型软件工程师的角度进行学习和思考。

嵌入式软件还是遵循软件的本质:基于下层的支持为上层提供应用服务。

只是我们目前互联网上的大多数软件是基于操作系统或者虚拟机或解释器等等基础。

而单片机是直接操作硬件,是直接基于硬件提供的功能。

💽软件框架

**声明:**本文以软件架构分析为核心。

📀工具环境

关键和工具不是本文重点。

基于 STM32CubeMX 图形化配置硬件。

使用 Keil 进行软件开发。

📀模板工程

使用 CubeMX 生成的框架架构

工程名:20240824

  • .ioc & .mxproject
    • CubeMX 工程文件
  • Core
    • 硬件信息生成的代码框架
    • 特别注意 system_stm32f4xx.c 在 Keil 中是显示在 Drivers 文件夹中
  • Drivers
    • 具体对应硬件的驱动代码
      • CMSIS
        - 基于硬件芯片原厂架构的文件(基于芯片的最底层)
        - STM32 xxx
        - 基于 CMSIS 的二次开发
        - 一般属于暴露给用户开发的接口
  • MDK-ARM
    • .uvprojx & .uvoptx
      • 对用 Keil 的工程文件
    • startup_stm32f407xx .s
      • 默认配置的汇编文件
C:.
│  .mxproject
│  20240824.ioc
│  
├─Core
│  ├─Inc
│  │      gpio.h
│  │      main.h
│  │      stm32f4xx_hal_conf.h
│  │      stm32f4xx_it.h
│  │      
│  └─Src
│          gpio.c
│          main.c
│          stm32f4xx_hal_msp.c
│          stm32f4xx_it.c
│          system_stm32f4xx.c
│          
├─Drivers
│  ├─CMSIS
│  │  ├─Core
│  │  ├─Core_A
│  │  ├─DAP
│  │  ├─Device
│  │  ├─Documentation
│  │  ├─DSP
│  │  ├─Include
│  │  ├─NN
│  │  ├─RTOS
│  │  └─RTOS2
│  │       LICENSE.txt
│  └─STM32F4xx_HAL_Driver
│              
└─MDK-ARM20240824.uvoptx20240824.uvprojxstartup_stm32f407xx.s

📀编译后

在编译后会在 MDK-ARM 文件夹下生成编译的中间文件:

其中 20240824 是项目名。其中同名文件夹下的是最核心的中间文件,其中包含可烧文件

C:.
│  20240824.uvguix.windows
│  20240824.uvoptx
│  20240824.uvprojx
│  startup_stm32f407xx.lst
│  startup_stm32f407xx.s
│
├─20240824
│
├─DebugConfig
│
└─RTE

可烧入文件

  • axf:包含数据,地址,代码,debug调试等信息,可以用下载器直接烧到板子上

  • hex:包含数据,地址信息

  • bin:包含数据(最终都是转到bin)

因此一般文件大小为 .bin < .hex < .axf

在这里插入图片描述

📀Code

注意:由于是使用 CubeMX 生成的,因此可能后续会有硬件的修改,因此 CubeMX 会在代码中注入注释表示。

即在下面形式的代码区间内编写代码才不会被下次重新生成框架代码所移除。

/* USER CODE BEGIN Includes */
// 自己的代码
/* USER CODE END Includes */

但由于本文是初学的学习笔记,因此本篇文章中展示的内容无视该规则。

main

下面是 main 的主题逻辑,核心就是 初始化-服务轮询 架构。

int main(void) {/*** Reset of all peripherals, Initializes the Flash interface and the Systick.* 重置所有外设,初始化Flash接口和系统棒。* =========================================================================* hal是stm32的三种不同应用库的一种**/HAL_Init();/*** Configure the system clock* 配置系统时钟* ==========================* 系统(硬件)总体(所有)的时钟* 相关的配置和初始化,相当于一个总开关* 保证芯片是正常能跑起来的*/SystemClock_Config();/*** Initialize all configured peripherals* 初始化所有配置的外设* =====================================* 在 CubeMX 中进行配置的外设专门的定制化初始化* 如:定时器,串口等*/MX_GPIO_Init();MX_TIM1_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 *//*** 业务代码* 一般为业务的初始化*/myservice_init();/*** 执行 while(1) 轮询* 一般为业务的状态机*/while (1) {myservice_state();}
}

中断

stm32f4xx_it.c/h 文件中,是中断处理的函数,如下面的形式:

#ifndef __STM32F4xx_IT_H
#define __STM32F4xx_IT_H#ifdef __cplusplus
extern "C" {
#endifvoid NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
void USART2_IRQHandler(void);#ifdef __cplusplus
}
#endif#endif /* __STM32F4xx_IT_H */

MDK-ARM/startup_stm32f407xx.s 文件中可看到映射,也就是说这些是框架直接帮我们做了,不用我们考虑链接的问题。

__Vectors       DCD     __initial_sp               ; Top of StackDCD     Reset_Handler              ; Reset HandlerDCD     NMI_Handler                ; NMI HandlerDCD     HardFault_Handler          ; Hard Fault HandlerDCD     MemManage_Handler          ; MPU Fault HandlerDCD     BusFault_Handler           ; Bus Fault HandlerDCD     UsageFault_Handler         ; Usage Fault HandlerDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     0                          ; ReservedDCD     SVC_Handler                ; SVCall HandlerDCD     DebugMon_Handler           ; Debug Monitor HandlerDCD     0                          ; ReservedDCD     PendSV_Handler             ; PendSV HandlerDCD     SysTick_Handler            ; SysTick Handler

📀典例举例

通过 MX_GPIO_Init() 了解嵌入式的本质,就是配置硬件操作。

void MX_GPIO_Init(void) {GPIO_InitTypeDef GPIO_InitStruct = {0};/*** GPIO Ports Clock Enable* GPIO端口时钟使能* ======================* 开了C H A 三个组的时钟* 仅是启动open,还没用* 如果没开,即使下面初始化成功了,硬件还是没反应*/__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOH_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*** Configure GPIO pin Output Level* 配置GPIO引脚输出电平* ================================* GPIOC           引脚*组*的地址(C组)* GPIO_PIN_14     引脚号* GPIO_PIN_RESET  表示低电平*/HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_RESET);/*** Configure GPIO pin : PC14* 配置GPIO引脚:PC14* =========================* 配置这个引脚的基本参数*/GPIO_InitStruct.Pin   = GPIO_PIN_14;GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull  = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}

然后具体的业务操作,一个典型的应用就是:

  • myservice_init(); 对串口的buffer进行初始化,

  • myservice_state(); 对缓冲区进行状态机的处理。

这段数据业务逻辑,不做具体展示了。一般来说串口接受数据就是靠上文中介绍的中断函数。(当然也有办法不通过中断操作)

💽Keil 使用notes

添加头文件路径

默认配置下是无头文件相关的内容的

在这里插入图片描述

添加头文件

在这里插入图片描述

字符集设置

在这里插入图片描述

添加一个组

这个组是只针对工程,而不是外部的具体文件和文件夹(不会自动识别)

在这里插入图片描述

配置烧写器

在这里插入图片描述




⭐END

🌟关注我

关注我,学习更多C/C++,算法,计算机知识

B站:

👨‍💻主页:天赐细莲 bilibili

这篇关于(mcu) 嵌入式基础简单入门(程序架构分析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111331

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu2289(简单二分)

虽说是简单二分,但是我还是wa死了  题意:已知圆台的体积,求高度 首先要知道圆台体积怎么求:设上下底的半径分别为r1,r2,高为h,V = PI*(r1*r1+r1*r2+r2*r2)*h/3 然后以h进行二分 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#includ

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]