上位机图像处理和嵌入式模块部署(f103 mcu的最小软件系统)

本文主要是介绍上位机图像处理和嵌入式模块部署(f103 mcu的最小软件系统),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        我们都知道mcu电路有最小系统。一个最小硬件系统里面包含了mcu、晶振、复位、输入和输出。其实不光硬件如此,软件也有一个最小系统。而且,不管是哪个厂家的soc,这种软件的编写都是有套路的,有一部分代码是和arm相关的,有一部分代码是mcu厂家相关的,最后剩下来的main函数和业务函数才是我们自己需要编写的。所以,大家在学习的时候,按照这个顺序去用好mcu厂家提供好的sdk就好了。

1、整体学习

        这是一个比较简单的项目结构。里面startup_stm32f103xe.s包含了系统上电时执行的第一条指令。在进入到main.c里面的main函数之前,会先调用system_stm32f1xx.c里面的SystemInit函数。

        在main函数当中,会继续调用bsp_led.c里面的LED_GPIO_Config函数,最终会实现led交替闪烁的功能。中间如果有中断的部分需要处理,直接在stm32f1xx_it.c找到入口实现就好了。

        至于STM32F1xx_HAL_Driver目录里面的内容,一般都是mcu厂家提供的。以前这部分叫标准库开发,现在叫hal库开发。本质上,都是为了让使用者聚焦于业务,忽略mcu芯片之间的差异。bsp_led中LED_GPIO_Config函数,也会调用这个目录下面的相关文件。

2、初始复位

        上电后,一般mcu就会调到Reset_Handler这个位置,

; Reset handler
Reset_Handler   PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0               LDR     R0, =__mainBX      R0ENDP     

3、SystemInit函数

        SystemInit函数位于stm32f1xx.c里面,有兴趣的同学可以阅读下相关的内容。没有兴趣直接skip过去,也不是不可以。

void SystemInit (void)
{
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)#ifdef DATA_IN_ExtSRAMSystemInit_ExtMemCtl(); #endif /* DATA_IN_ExtSRAM */
#endif /* Configure the Vector Table location -------------------------------------*/
#if defined(USER_VECT_TAB_ADDRESS)SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#endif /* USER_VECT_TAB_ADDRESS */
}

4、main函数

        main函数自然处于main.c当中,大家可以去main.c文件查找,

int main(void)
{SystemClock_Config();LED_GPIO_Config();while (1){LED1( ON );			 HAL_Delay(1000);LED1( OFF );		  HAL_Delay(1000);}
}

        代码中第一个函数是配置时钟的,第二个函数是配置GPIO的,最后就是LED灯的亮和灭。

5、LED_GPIO_Config函数

        这里比较值得一说的,其实是LED_GPIO_Config函数。因为mcu里面很多的pin都是复用的,比如说哪些pin设置成gpio,哪些pin设置成输入,哪些设置成输出,这些都是需要自己设置的。当然调用的子函数,肯定来自于mcu厂家提供的sdk,因为寄存器的设计和功能的布局,只有他们自己最为清楚。

void LED_GPIO_Config(void)
{		GPIO_InitTypeDef  GPIO_InitStruct;LED1_GPIO_CLK_ENABLE();GPIO_InitStruct.Pin = LED1_PIN;	GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;  GPIO_InitStruct.Pull  = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStruct);		LED_RGBOFF;
}

        比如说,这里的HAL_GPIO_Init函数肯定就是mcu厂家提供的,我们可以跟进去一下,发现位于stm32f1xx_hal_gpio.c,这和我们之前的猜想是一致的。

6、注

        说来有点惭愧,我们买的开发板是那种最便宜的stm32f103核心板,小于10块 RMB的那种。参考借鉴的代码都是来自于野火。核心板上面比较简洁,唯一的led输出就是pc13,所以如果要用野火的程序驱动这个小核心板的话,需要改一下pin的名称,即从原来的pb5修改为pc13,

#define LED1_PIN                  GPIO_PIN_13                
#define LED1_GPIO_PORT            GPIOC                     
#define LED1_GPIO_CLK_ENABLE()   __HAL_RCC_GPIOC_CLK_ENABLE()

        此外,由于我们使用了Hal_Delay这个函数,所以时钟中断里面,一定要添加这个处理。并且,这个中断是调用SystemClock_Config之后才生效的,

void SysTick_Handler(void)
{HAL_IncTick();
}

这篇关于上位机图像处理和嵌入式模块部署(f103 mcu的最小软件系统)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

Python AST 模块实战演示

《PythonAST模块实战演示》Python的ast模块提供了一种处理Python代码的强大工具,通过解析代码生成抽象语法树(AST),可以进行代码分析、修改和生成,接下来通过本文给大家介绍Py... 目录 什么是抽象语法树(AST)️ ast 模块的核心用法1. 解析代码生成 AST2. 查看 AST

MongoDB搭建过程及单机版部署方法

《MongoDB搭建过程及单机版部署方法》MongoDB是一个灵活、高性能的NoSQL数据库,特别适合快速开发和大规模分布式系统,本文给大家介绍MongoDB搭建过程及单机版部署方法,感兴趣的朋友跟随... 目录前言1️⃣ 核心特点1、文档存储2、无模式(Schema-less)3、高性能4、水平扩展(Sh

Docker + Redis 部署集群的实现步骤

《Docker+Redis部署集群的实现步骤》本文详细介绍了在三台服务器上部署高可用Redis集群的完整流程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、环境准备1. 服务器规划(3 台服务器)2. 防火墙配置(三台服务器均执行)3. 安装 docke

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Python sys模块的使用及说明

《Pythonsys模块的使用及说明》Pythonsys模块是核心工具,用于解释器交互与运行时控制,涵盖命令行参数处理、路径修改、强制退出、I/O重定向、系统信息获取等功能,适用于脚本开发与调试,需... 目录python sys 模块详解常用功能与代码示例获取命令行参数修改模块搜索路径强制退出程序标准输入

Python pickle模块的使用指南

《Pythonpickle模块的使用指南》Pythonpickle模块用于对象序列化与反序列化,支持dump/load方法及自定义类,需注意安全风险,建议在受控环境中使用,适用于模型持久化、缓存及跨... 目录python pickle 模块详解基本序列化与反序列化直接序列化为字节流自定义对象的序列化安全注