LV.23 D2 开发环境搭建及平台介绍 学习笔记

一、Keil MDK-ARM简介及安装

        Keil MDK,也称MDK-ARM,Realview MDK (Microcontroller Development Kit)等。目前Keil MDK 由三家国内代理商提供技术支持和相关服务。  

        MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。

        MDK-ARM有四个可用版本,分别是MDK-Lite、MDK-Basic、MDK-Standard、  MDK-Professional。所有版本均提供一个完善的C / C++开发环境,其中MDK-Professional还包含大量的中间库。

Keil MDK-ARM功能特点

        完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件。

        行业领先的ARM C/C++编译工具链

        确定的Keil RTX ,小封装实时操作系统(带源码)

        μVision5 IDE集成开发环境,调试器和仿真环境

        TCP/IP网络套件提供多种的协议和各种应用

        为带图形用户接口的嵌入式系统提供了完善的GUI库支持

        ULINKpro可实时分析运行中的应用程序,且能记录Cortex-M指令的每一次执行

        大量的项目例程帮助你快速熟悉MDK-ARM强大的内置特征

        符合CMSIS (Cortex微控制器软件接口标准)

Keil MDK-ARM获取

https://www.keil.com/demo/eval/arm.htm#/DOWNLOAD

Keil MDK-ARM安装

        安装MDK-523.exe  这keil5软件的安装包,不要有中文路径  

        安装Keil.STM32F0XX_DFP.1.4.0.pack  这是STM32F0设备安装包  

        运行KEIL_Lic(1).exe 破解keil (以管理员权限运行keil破解)

        注:keil安装过程可参考  DAY1-ARM体系结构概述\实验手册\WIFI-COTEXM0实验手册 第三章 开发环境搭建

 安装 ST_LINK 烧写工具

        ST_LINK 是 STM32 芯片的仿真器,这里介绍烧写工具的安装,通过这个软件操作ST_LINK 将.hex 文件烧写到芯片上。此软件用于为 M0 烧写 bootloader 文件。我们在 keil中编译好的代码可以使用它们本身进行下载。

        软件路径:DAY2-STM32开发环境搭建\安装软件包\ST-Link驱动及工具\STM32 ST-LINK Utility_v3.1.0  

        注:ST_lINK安装过程可参考  DAY1-ARM体系结构概述\实验手册\WIFI-COTEXM0实验手册 3.6节

 

二、STM32CubeMX简介及安装

STM32CubeMX简介

        直观的选择STM32微控制器  

        微控制器图形化配置

                自动处理引脚冲突

                动态设置确定的时钟树

                可以动态确定参数设置的外围和中间件模式和初始化

                功耗预测  

        C代码工程生成器覆盖了STM32微控制器初始化编译软件,如IAR,KEIL,GCC可以独立使用,作为Eclipse插件使用

TM32CubeMX获取

        官网地址: http://www.st.com/en/development-tools/stm32cubemx.html

 STM32CubeMX安装

 

        安装JAVA运行环境,JavaSetup8u151.exe  

        解压stm32cubemx.zip,安装SetupSTM32CubeMX-4.22.0.exe,最好不要有中文路径

        解压stm32cube_fw_f0_v180.zip到STM32CubeMX的安装路径中  

        注:安装过程可参考  DAY1-ARM体系结构概述\实验手册\WIFI-COTEXM0实验手册 第三章 开发环境搭建 

 STM32CubeMX——创建工程

 

点击New Project创建工程 

 

把工程名称和路径选择好

 

然后点击ok ,然后开始生成对应的工程源代码,导出一个Keil5的工程。

 击Open Project后,就会调用Keil5来打开这个工程。

我们用CubeMX和Keil5联合对STM32进行开发,CubeMX主要是前期的配置过程。

三、STM32储存器映射 

3.1 Cortex-M0存储器映射

        注:被控单元的FLASH,RAM和AHB到APB的桥(即片上外设),这些功能部件共同排列在一个 4GB 的地址空间内。我们在编程的时候,可以通过他们的地址找到他们,然后来操作他们

存储器本身没有地址,给存储器分配地址的过程叫存储器映射 

3.2 STM32F0存储器映射

STM32F05x 存储器映像和外设寄存器编址

 在中文参考手册的2.2中可以找到

3.3 寄存器的访问方式

以GPIOA寄存器组为例、如何读写ODR寄存器?

        以知GPIOA的起始地址为0x48000000

        各寄存器的偏移地址如下:

        MODER;             /*Address offset: 0x00 */

        OTYPER;             /*Address offset: 0x04 */

        OSPEEDR;          /*Address offset: 0x08 */

        PUPDR;              /*Address offset: 0x0C */

        IDR;                   /*Address offset: 0x10 */

        ODR;                 /*Address offset: 0x14 */

        BSRR;               /*Address offset: 0x18 */

        LCKR;               /*Address offset: 0x1C */

如何访问寄存器——第一种方式

对地址进行宏定义

#define     GPIOA_BASE        ( (unsigned int ) 0x48000000 )

#define     GPIOA_ODR         ( GPIOA_BASE  +  0x14 )

读操作

val  = *(unsigned int *) GPIOA_ODR  ;

写操作

*(unsigned int *)  GPIOA_ODR = val  ;  

改进

#define     GPIOA_ODR    ( *(unsigned int *) ( GPIOA_BASE  +  0x14 ))

val  = GPIOA_ODR  ;    //读

GPIOA_ODR = val  ;     //写

如何访问外设寄存器——第二种方式

         用结构体封装寄存器

        用上面的方法去定义地址,还是稍显繁琐、根据我们每一类外设对应的寄存器组地址都是连续增长的特点,我们引入 C 语言中的结构体语法对寄存器进行封装、 

typedef struct {

        uint32_t        MODER;             /*Address offset: 0x00 */

        uint32_t        OTYPER;     /*Address offset: 0x04 */

        uint32_t        OSPEEDR;     /*Address offset: 0x08 */

        uint32_t        PUPDR;         /*Address offset: 0x0C */

        uint32_t        IDR;         /*Address offset: 0x10 */

        uint32_t        ODR;         /*Address offset: 0x14 */

        uint32_t        BSRR;         /*Address offset: 0x18 */

        uint32_t        LCKR;         /*Address offset: 0x1C */

} GPIO_TypeDef;

#define     GPIOA_BASE        ( (unsigned int ) 0x48000000 )

#define     GPIOA     ((GPIO_TypeDef *) GPIOA_BASE) 

注:我们访问GPIOA的控制寄存器组时、直接使用宏定义好 GPIO_TypeDef 类型的指针,而且指针指向 GPIOA端口的首地址,这样我们直接用宏GPIOA访问改外设的任意一个寄存器

GPIOA->MODER     =  0x20 ;

GPIOA->OSPEEDR  =  0x16 ;

四、STM32启动文件分析 

STM32F0启动模式

 

        注:Cortex-M0 的程序映像通常是从地址 0x00000000 开始的、系统复位后,处理器首先读取向量表中的前两个字(8 个字节),第一个字存入 MSP,第二个字为复位向量,它表示程序执行的起始地址(复位处理)

 

        根据启动模式的不同,用户闪存、系统闪存和SRAM都 可以映射到0x0的低端地址;      

        我们的板子boot0直接接地,因此启动区域为flash启动

C语言程序内存排布

 

注:        

        栈的作用是用于局部变量,函数调用,函数形参等的开销        

        堆主要用来动态内存的分配 

启动文件startup_stm32f051.s分析 (下方课件中)

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于requests框架实现接口自动化测试项目实战

requests库是一个常用的用于http请求的模块,它使用python语言编写,在当下python系列的接口自动化中应用广泛,本文将带领大家深入学习这个库,Python环境的安装就不在这里赘述了,我们直接开干。 01、requests的安装 wi…

深夜突发! OpenAI震撼发布了SORA文生视频模型,对职场人的影响可能跟你想的不一样

深夜突发! OpenAI震撼发布了SORA文生视频模型,对职场人的影响可能跟你想的不一样。 马上就要节后返工了,顾问老师也早已回到了温暖的广州。与一位同城的学员相聚在老广州的一个茶楼中,喝起了下午茶。面对各式的广式茶点,在淡淡的茶…

C++并发编程 -3.同步并发操作

本文介绍如何使用条件变量控制并发的同步操作、C 并发三剑客,函数式编程 一.条件变量 1.概念 C条件变量(condition variable)是一种多线程编程中常用的同步机制,用于线程间的通信和协调。它允许一个或多个线程等待某个条件的发生…

迷失在前端框架中的初级开发者,总觉得大厦要从二层开始建

知乎有人提问:现在是框架主导前端时代,还有必要学习Html,CSS和JavaScript吗?我看很愕然,框架可以节省力气,难道都可以替代前端基础了吗? 一、起因 因为贝格前端工场的主营业务就是前端开发&…

【中英双语】OpenAI Sora文本转视频模型的技术分析!全新的AI视频叙事时代即将到来!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

Shellcode免杀对抗(C/C++)

Shellcode C/C免杀,绕过360安全卫士、火绒安全、Defender C/C基于cs/msf的上线 首先是测试一下shellcode上线,主要是俩种方法 测试环境 攻击机:kali2023 靶机:win10 msf方法 首先是启动msf msfconsole 然后msf生成一个sh…

【C语言】linux内核tcp/ip协议代码

一、linux内核tcp/ip协议源码有哪些? Linux内核中实现TCP/IP协议栈的源代码主要位于内核源码树的net/ipv4和net/ipv6目录下,针对IPv4和IPv6协议。不单是TCP/IP协议,还包含了UDP以及其他相关的网络层协议实现。 这里是一些与TCP/IP协议栈相关…

云计算基础-存储虚拟化(深信服aSAN分布式存储)

什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘,实现服务器存储资源的统一整合、管理及调度,最终向上层提供NFS、ISCSI存储接口,供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

对账中心系统架构设计与实现的实践总结

随着数字化时代的到来,越来越多的企业开始使用对账中心系统来管理其财务交易。对于一个成功的对账中心系统,其架构设计和实现非常关键。本文将探讨对账中心系统架构设计与实现的重要性、关键原则和实施过程中需要考虑的要点,帮助企业构建强大…

模型训练 —— AI算法初识

一、背景 AI算法中模型训练的主要目的是为了让机器学习算法从给定的标注数据中学习规律、特征和模式,并通过调整模型内部参数,使模型能够对未见过的数据进行准确预测或决策。具体来说: 1. **拟合数据**:模型通过训练来识别输入数…

【Spring篇】 项目加盐加密处理

目录 1. MD5 加密算法 2. 加盐加密流程 3. Spring Security 实现加盐加密 1. 添加 Spring Security 框架 2. 关闭 Spring Security 认证 3.实现加盐加密 1. MD5 加密算法 MD5 是 Message Digest Algorithm 的缩写,译为信息摘要算法,它是 Java …

QGIS004:【08图层工具箱】-导出到电子表格、提取图层范围

摘要:QGIS图层工具箱常用工具有导出到电子表格、提取图层范围等选项,本文介绍各选项的基本操作。 实验数据: 链接:https://pan.baidu.com/s/1ZK4_ShrQ5BsbyWfJ6fVW4A?pwdpiap 提取码:piap 一、导出到电子表格 工具…

【Web】CTFSHOW java刷题记录(全)

目录 web279 web280 web281 web282 web283 web284 web285 web286 web287 web288 ​web289 web290 web291 web292 web293 web294 web295 web296 web297 web298 web299 web300 web279 题目提示 url里告诉我们是S2-001 直接进行一个exp的搜 S2-001漏洞分析…

文件夹删不掉,显示在另一个文件中打开怎么办

问题: 一、想要删掉这个文件夹,却因为文件夹中的文件打开了删不掉,这里我因为做的测试,所以是知道打开了什么 二、一般情况下文件比较多时,是不知道打开了什么的,长这个样子 解决: 一、打开任…

JAVA面试题并发篇

1. 线程状态 要求 掌握 Java 线程六种状态 掌握 Java 线程状态转换 能理解五种状态与六种状态两种说法的区别 六种状态及转换 分别是 新建 当一个线程对象被创建,但还未调用 start 方法时处于新建状态 此时未与操作系统底层线程关联 可运行 调用了 start 方法…

初识数据库:探索数据的世界

初识数据库:探索数据的世界 1. 什么是数据库?2. 数据库的类型2.1 关系型数据库(RDBMS)2.2 非关系型数据库(NoSQL) 3. 为什么使用数据库?4. 如何选择合适的数据库?5. 结语 在信息技术…

【TC3xx芯片】TC3xx芯片SMU模块详解

目录 前言 正文 1.SMU功能概述 1.1 SMU架构 1.2 SMU_core 1.3 SMU_stdby 2. SMU功能详述 2.1 SMU_core 2.1.1 Reset类型 2.1.2 接口(Interfaces)概述 2.1.2.1 SMU_core到SCU的接口 2.1.2.2 SMU_core到IR的接口 2.1.2.3 SMU_core到Ports(Err…

Python绘制折线图、散点图...Pyplot库功能使用示例大全

matplotlib.pyplot库功能使用示例,Python绘制折线图、散点图... 1、简单折线图示例2、设置中文字符,解决乱码问题3、添加标记格式4、添加y值标记5、添加图例6、设置字体大小7、设置坐标轴起点数值8、绘制多条折线9、散点图基础示例 matplotlib.pyplot库是…

解析工信部印发的《工业控制系统网络安全防护指南》

文章目录 前言工业控制系统网络安全防护指南一、安全管理(一)资产管理(二)配置管理(三)供应链安全(四)宣传教育 二、技术防护(一)主机与终端安全(…

tf.linspace时出现Could not find valid device for node.

背景: 在使用tensorflow2.x的时候,当使用tf.linspace的时候会出现如下的报错: import os os.environ[TF_CPP_MIN_LOG_LEVEL] 2import tensorflow as tf from tensorflow import keras import numpy as npdef out():# x tf.constant(np.arange(12).re…