上位机图像处理和嵌入式模块部署(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

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

Linux部署中的文件大小写问题的解决方案

《Linux部署中的文件大小写问题的解决方案》在本地开发环境(Windows/macOS)一切正常,但部署到Linux服务器后出现模块加载错误,核心原因是Linux文件系统严格区分大小写,所以本文给大... 目录问题背景解决方案配置要求问题背景在本地开发环境(Windows/MACOS)一切正常,但部署到

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(