作者:王犀牛
链接:https://www.zhihu.com/question/26562480/answer/33433568
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.单片机从并不认识C语言和汇编,单片机本身只和可执行文件联系,单片机上面运行的程序都是可执行文件。而为了生成可执行文件,我们用计算机以及特定的开发工具,利用C语言等能够方便使用的语言,根据具体的需求(最简单的比如点亮二极管,在lcd上显示字符,跑马灯等)编写代码,然后用开发工具编译链接写好的C文件最终生成可执行文件,最后将可执行文件下载到单片机上运行。

作者:日章
链接:https://www.zhihu.com/question/26562480/answer/33335198
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.C语言源程序----->C编译器----->汇编代码----->汇编器----->机器代码
所谓的单片机C语言的意思是拿C语言来编写单片机程序,没有什么C语言控制单片机这回说法。具体过程是:C语言源程序通过特定的C编译器编译为针对某种单片机的汇编代码,再由汇编器将汇编代码汇编为单片机可执行的机器代码,然后下载到单片机的存储器运行。当前一般的集成开发环境(如Keil C)可以一次搞定生成机器代码。
需要补充一点的是,单片机也是一种计算机,不要以为只有在PC机上才可以用C语言编程,C语言可以用作为任何计算机的编程语言,当然包括单片机,但有一个条件就是,你必需要有针对某种架构的计算机的C编译器。目前来讲,C语言的编译器种类非常多,有用于各种单片机以及微处理器架构的编译器版本,所以可以用C来做为单片机的编程语言。不同的是,你用TC或者VC编译得到的是X86(如Intel,AMD)的目标代码,只能在PC机上运行,而如果用单片机C编译器(比如Keil C)编译的代码是单片机代码,只能在特定的单片机上运行。目前C/C++是最流行的单片机/微处理器编程语言。

作者:Clarence
链接:https://zhuanlan.zhihu.com/p/31828293
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3.单片机是一个大黑盒子,里面的原理很深奥很复杂,但是幸运的是,设计单片机的人,给我们提出了寄存器的概念,这样我们就不需要理解复杂的电路原理,就可以完成特定的功能操作了!

例如,选择GPIO口为输出还是输入,其切换电路可以抽象成这样

当P0SEL寄存器的BIT0的数值为1的时候,P0.0口硬件与一大片输出相关电路相连,也就是说此时P0.0口是处于输出功能状态下,反之BIT0为数值0 则与一大片输入相关电路相连。其底层的原理大概是利用三极管开关特性完成的吧!无论如何我们配置寄存器,就完成了开关的操作,选择了怎样的电路与我的P0.0口连接!

最底层的操作就是配置P0OUT这个寄存器,单片机编程所有对硬件的操作都是对寄存器的操作,我们无需对底层硬件有太多深奥的理解,就可以完成操作!

作者思考:

分工的时代,如果认真深入的去了解学习单片机最底层的硬件原理的话,那会消耗大量的时间和精力,成为一名优秀的软件开发工程师的话,对底层硬件有一定的理解就好,更多精力花费在对代码数据结构,算法的优化,例如对P0OUT这个寄存器,何时写他,怎么写他,写多少比较合适,这都是需要考虑的事情,还有就是延时的时间是否过长,用定时器延时比较好,还是用阻塞延时比较好?

作者:honglin chen
链接:https://www.zhihu.com/question/23138740/answer/30490761
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

4.其实说到底,单片机技术重点是应用,也就是你能用它设计一个系统解决实际需求,不需要特别去纠结内部原理,知道有那么回事儿就行了,设计芯片的人员除外!单片机学习要多做实验,在做实验前把设计流程做好,画出程序的结构图。硬件自己搭,程序自己写,多学习别人设计思想。学会一种单片机其它种类单片机就是熟悉软件平台和看看数据手册和设计例子就能上手,做东西主要是上层设计和思路,动手前要有一幅蓝图。

作者:秦旋
链接:https://www.zhihu.com/question/46280969/answer/100714720
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

5.单片机比喻成机器,寄存器就是机器上的按钮。控制不了里面的具体行为,但是可以用按钮控制。按钮怎么设置当然是硬件定的了。类似于软件封的库和API之间的关系吧。

fpga,可编程逻辑门阵列,指的就是烧写在其上的“程序”是可修改的。

两者联系起来,用fpga做一个module,内部实现了一些寄存器来控制module的行为。寄存器可通过MPI接口被CPU访问。CPU就可以通过寄存器控制module。

作者未知

来源:https://wenku.baidu.com/view/ade82cc4050876323112126c?ivk_sa=1023194j

微机系统的实现就是靠CPU与控制器的配合、控制器和外设的配合来实现的。其中CPU对控制器进行控制的方法最主要的方法就是寄存器编程,通过查询DATASHEET可以看到片内的寄存器每一位的作用。可以想象这些位肯定对应着某些功能电路的“片选端”或者“功能选择端”,SOC的芯片架构决定了面向片上寄存器赋值方式的编程方法,通过片上外设接口,进一步可以实现时序描述方式的片外设备驱动编程。寄存器编程体现在51单片机和ARM内核单片机上是两种不同的形式,在51单片机中,因为是8位的,所以寄存器也都是8位的,外设的功能也相对简单,所以直接对寄存器编程。而ARM内核的微控制器一般为32位的,寄存器也是32位,这样直接对寄存器编程时十分复杂的,所以就产生了最底层的驱动函数,把要实现的功能对应的寄存器配置封装成函数,在主程序中直接调用,进行寄存器的间接编程。

自己的总结:

1.单片机里面跑的是机器代码。我们写的C语言代码通过以下路径转化为机器代码(C语言源程序----->C编译器----->汇编代码----->汇编器----->机器代码),然后将机器代码烧写进单片机的ROM中,接下来就是微机原理中讲的那一套程序执行过程。

2.寄存器编程的理解:寄存器编程也可以理解成一种封装,将寄存器抽象成很多个开关,这些开关分别对应不同的功能区电路(外设、存储区等),通过设置寄存器就可以控制这些电路工作,至于这中间的具体实现过程,是芯片设计人员要做的事情,单片机使用者前期不需要知道。说到这里,想起了我的专业就是集成电路设计与集成系统(芯片设计),读书时没有好好学习,汗颜啊…

3.固件库又是更高一层的封装,它把对寄存器的使用封装成函数的形式,编程时直接操作函数,而不用对寄存器的位进行操作(其实说到底也是对寄存器操作,只是这些步骤由库函数内部实现,也就是封装起来了)。

记录学习(转载) STM32---程序如何在内部运行寄存器编程的理解相关推荐

  1. STM32---程序如何在内部运行寄存器编程的理解

    作者:王犀牛 链接:https://www.zhihu.com/question/26562480/answer/33433568 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  2. Keil用ST-LINK下载STM32程序后不自动运行

    Keil版本是MDK533,Debugger是ST-LINK,MCU是STM32L151RCT6. 下载程序后,MCU不会自动运行程序,必须要在调试模式下运行,而且MCU重新上电后程序也不运行.在调试 ...

  3. 程序在计算机内部是如何运行的

    首先 程序 是存储在计算机的硬盘里面的 要想 程序在计算机内部运行起来 就要把它从硬盘里面调用出来  必须经过内存的运输  CPU好比车间 硬盘好比仓库 内存好比道路 沟通起cpu与硬盘的数据 在CP ...

  4. 单片机入门学习五 STM32单片机学习二 跑马灯程序衍生出的stm32编程基础

    上篇文章 单片机入门学习四 STM32单片机学习一 跑马灯程序和创建工程 仅介绍了入门程序及其编译运行过程,下面开始对stm32的一些基础知识做一个记录. 1.stm32f103zet6(上篇问题3 ...

  5. VC++的学习(基于VS2008)——windows程序内部运行机制

    昨天和今天都在学习windows程序的内部运行机制,再次学习这一章,我明显感到条理清晰了,原来这一章是讲我们所用的电脑,这样一个windows平台下程序运行的内部机制的.windows应用程序下最重要 ...

  6. [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source …...

    [Python学习]PycURL简单学习 - limodou的学习记录 - limodou是一个程序员,他关心的焦点是Python, DocBook, Open Source - [Python学习] ...

  7. Windows网络编程案例教程-董相志 学习记录 第一个网络程序hostent

    <Windows网络编程案例教程>-董相志 学习记录 第一个网络程序hostent 第一章 网络编程概述 1.3.5第一个网络程序--hostent 对主机的名称和地址解析 WinSock ...

  8. 【学习记录】野火stm32学习记录(一)GPIO

    观看的视频:野火-视频链接  https://www.bilibili.com/video/BV18X4y1M763 什么是GPIO? GPIO是通用输入输出端口的简称,简单来说就是STM32可控制的 ...

  9. [电离层建模学习笔记]开源程序M_GIM学习记录

    [电离层建模学习笔记]开源程序M_GIM学习记录 文章目录 [电离层建模学习笔记]开源程序M_GIM学习记录 1. 程序相关信息 2. 程序学习记录 2.1 采用的数据说明 2.2 程序运行前 2.3 ...

最新文章

  1. 特斯拉Autopilot事故频发,真正意义上自动驾驶还要多久问世?
  2. c语言关键字_C语言初学者必须掌握的关键字!
  3. jQuery css-dom
  4. 分布式实时计算—实时数据质量如何保障?
  5. PostMessage和sendMessage传递问题
  6. redis客户端连接数量_实战解析无所不知的Redis拓展应用——Info,进阶学习,无所不能...
  7. 设计模式:接口隔离原则
  8. oracle获取今天凌晨的时间_oracle查询日期语句有哪些?
  9. 8音度dsp调音教程_8音度汽车调音软件
  10. 离散数学集合论与数理逻辑基本概念
  11. Word技能-更改 Normal 模板 (Normal.dotm)
  12. 老师用计算机教我们画画拼音,《ang eng ing ong》教案
  13. 计算机应用基础南丁格尔,关于单元基础训练的习题
  14. 工作感悟_of_RS
  15. 【重装系统】Ubuntu系统重装为windows10
  16. ​Au入门系列之二:波形编辑
  17. 解决this._data.$$state...“Error: [vuex] do not mutate vuex store state outside mutation handlers.“ 报错
  18. `CSS filter` 有哪些神奇用途
  19. 一法通则百法通 佳能照片打印机连供改造
  20. linux磁盘分区方法 重新分区方法 新建分区方法

热门文章

  1. RestClient操作文档四
  2. sys_stat_statements 扩展使用介绍
  3. Golang 常见面试题目解析
  4. Windows平台使用Bazel编译TensorFlow详细流程
  5. 2022杭电多校(一)
  6. 什么是堆、栈以及区别
  7. 面试题——js垃圾回收机制和引起内存泄漏的操作
  8. Python爬虫实战-详细讲解爬取安居客房价数据
  9. 干货|小白如何在两个月入门数学建模
  10. DotNetCore调用Https