当前位置: 首页 > news >正文

初识STM32:寄存器编程 × 库函数编程 × 开发环境

STM32的编程模型

假如使用C语言的方式写了一段程序,这段程序首先会被烧录到芯片当中(Flash存储器中),Flash存储器中的程序会逐条的进入CPU里面去执行。

CPU相当于人的一个大脑,虽然能执行运算和执行指令,但不能去做一些具体的任务(比如大脑想看到某样东西,它需要眼睛;想要说话,就需要嘴巴)。对于CPU同理,想要完成某个具体的功能,就需要借助CPU周围的一些模块(模块负责执行一些具体的任务)。

故程序的目的就是控制CPU周围的模块,去执行一些具体的功能。


寄存器和寄存器编程

寄存器:由若干个比特位组成,读写这些比特位可以控制这些模块。CPU通过控制寄存器,来操控这些模块,从而来实现具体功能。

想对芯片周围的这些模块进行编程(使用模块),就需要操作模块的寄存器组,直接去读写操作寄存器的代码,为寄存器编程

假设CPU周围有一个模块,叫做GPIO,可以管理芯片周围的16个引脚。其模块内部有寄存器组,包含两个寄存器:输入寄存器(IDR)和输出寄存器(ODR),均有16个比特位,对应GPIO所管理的16个引脚。则可对其进行寄存器编程

int main()
{GPIO->ODR = 0xFFFF; //所以引脚输出高电平GPIO->ODR = 0x0000; //所有引脚输出低电平GPIO->ODR |= 0x01;  //1号引脚输出高电平GPIO->ODR &= ~0x01; //1号引脚输出低电平
}

这种寄存器的编程方式比较繁琐。


库函数编程

将操作寄存器的代码包装成一条条函数,在实际编程中,直接调用这些包装好的函数来控制寄存器。

标准库:由ST官方提供的库,对寄存器的简单封装。

如下所示,为库函数编程:

void GPIO_Init(...);
void GPIO_Write(...);
void GPIO_WriteBit(...);
void GPIO_SetBits(...);
void GPIO_ResetBits(...);int main()
{GPIO_Write(...,0xFFFF); //所以引脚输出高电平GPIO_Write(...,0x0000); //所以引脚输出低电平GPIO_WriteBit(...,1,1); //1号引脚输出高电平GPIO_WriteBit(...,1,0); //1号引脚输出低电平
}

安装DFP

即安装器件支持包,因为现在的ARM的芯片型号非常多,升级换代速度也快,新型号的芯片也是不断推出,而Keil5软件不能出一款芯片就升级一下软件,而且同时支持所有型号的芯片。

Keil5之后,芯片的器件支持包就被独立出来了,开发哪种芯片安装对应支持包就行了。若没有安装支持包,在新建工程时,是不会出现相应的器件型号。


 安装ARMCC编译器

虽然Keil5是集成开发环境,具备编译器的功能。但我们的标准库是一个比较古老的库,对于新版的Keil5软件来说,不支持标准库的编译,需要安装一个旧版的编译器,即ARMCC编译器,来让我们的标准库能够在Keil5软件上跑起来。

可在软件中查看是否安装ARMCC:


安装STLINK驱动

由ST公司设计的一种硬件的调试器,负责将我们的电脑与嵌入式硬件连接起来,调试器在中间负责通信,这样我们可以通过电脑去控制单片机运行,从而查看程序是否达标或存在BUG。

安装驱动一般流程:

先将STLINK插在电脑上,然后在设备管理器中可以看到STLINK在"其他设备"的列表上。如果其图标带有感叹号,就说明电脑上目前没有安装STLINK驱动(反之则已经安装过STLINK驱动)。

STLINK驱动如下所示:

 安装成功后,可在"通用串行总线设备"里看到STM32 STLINK。


 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ubuntu下aarch64-linux-gnu(交叉编译) gdb/gdbserver
  • 如何从数码相机恢复已删除的照片
  • Python开发—— 列表的高级操作与应用
  • spring监听事件
  • Obsidian 文档编辑器
  • R 绘图 - 饼图
  • 【ROS2】中级-编写动作服务器和客户端(Python)
  • 从零手写实现 nginx-26-rewrite url 重写
  • javafx基础知识
  • 【RAG KG】GraphRAG开源:查询聚焦摘要的图RAG方法
  • 打卡第7天-----哈希表
  • Istio实战教程:Service Mesh部署与流量管理
  • AutoMQ 与蚂蚁数科达成战略合作
  • 机器学习——随机森林
  • WEB安全-文件上传漏洞
  • 【剑指offer】让抽象问题具体化
  • Django 博客开发教程 16 - 统计文章阅读量
  • download使用浅析
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 基本功--面试宝典
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • MySQL几个简单SQL的优化
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React Transition Group -- Transition 组件
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 给新手的新浪微博 SDK 集成教程【一】
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 延迟脚本的方式
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # linux 中使用 visudo 命令,怎么保存退出?
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (145)光线追踪距离场柔和阴影
  • (2)STL算法之元素计数
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • .dwp和.webpart的区别
  • .equals()到底是什么意思?
  • .mysql secret在哪_MySQL如何使用索引
  • .NET DataGridView数据绑定说明
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .Net组件程序设计之线程、并发管理(一)
  • 。Net下Windows服务程序开发疑惑
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • [240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能
  • [AIGC] Redis基础命令集详细介绍
  • [Android]Tool-Systrace