怎么看待今年出现了很多非专业但是需要干嵌入式或单片机工程的人

2022-05-12     大方老师单片机

原标题:怎么看待今年出现了很多非专业但是需要干嵌入式或单片机工程的人

怎么看待今年出现了很多非专业但是需要干嵌入式或单片机工程的人

///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免费的,私信我就可以~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比///

0.绪论

对于经过系统培训的开发.单片机SoC的驱动开,不管是使用各种库还是直接上寄存,都不成问.

可很多非专业但是需要干嵌入式或单片机工程的,比如机,车辆工,,或是其他的一些专.有时候这些学生需要搞比,做项,不可避免的要用到一些单片(由于种种原,现在几乎都会首STM32).但是缺乏系统训练的学生往往无法看懂寄存器版本的例,或是别人的开源项.自己写的话更是不知道如何开.或者编译完成后总是出现莫名的问.这给大家带来了极大的困.

同时互联网上大部分教程都是转载来转载,各种差异和版本都.很多人即使看过了也是一头雾.所以应一个同学要,大概写一下寄存器的一些操.

本教程将会使"学生用户体量庞"STM32F1xx系列的单片机作为例.但是不必担.所有的寄存器操作都是共通.并不会有本质的差.希望你能快速阅读完并且理解,然后查阅自己需要的资.不管是什么东西,这种方式都是通用.

嵌入式软件开发具有一个比较庞大的知识体.限于作者的时间和水,本文不可能讲太多东西.但是如果你只是因为不会寄存器开发而陷入瓶,那么本文将会有较大帮助(毕竟这个是写文章的目).

理解本文需要一些基,大概包: c/c++,一些数,计算机基础知.大多数理工类专业都会有相关的课程.如果确实存疑可以即时搜.

让我们先记住开发的正确方: 摘抄借,修改糅,以实现功能为目,以别人的代码为基.

只要不涉及什么知识产权的,这样做是完全没有问题.毕竟不需要把很多基础性的东西写来写.所以请大胆的找开源项,尽可能在基础上,而不是从零开.不废话,开始正.

1.:,进制换算

数制也称计数,是用一组固定的符号和统一的规则来表示数值的方法。任何一个数制都包含两个基本要素:基数和位. [1]任何一个数字都能这样表示

计算机常2.就是只10的数.1一般认为是高电平表true,逻辑真, 0一般是低电, false,逻辑假.

:在任意进制,不一定所有的有理数都可以使用有限位数的小数形式表.

比如十进制下0.1就是二进制的无限不循环小.上面那个例子也.

著名 IEEE754 float浮点数标准导致bug:在很多语言, 0.1+0.20.3

就是因0.1是二进制无限循环小数的原.但是存储器位宽不能是无穷.所以产生舍入误.

在浏览器中按F12进入开发者模,JavaScript下的浮点数精bug

所以在很多项目,为了实现当两个值相等时触发什么函,往往不会直接写相,而是两者的差值小于多少时即生效

floata,b;........if(a==b){

//这种写法不建议}........if(abs(a-b)0.00001){

//一般这么写}

二进制与/十六进制的转换

刚才那个方法就可以直接.还有其他算法这里不.先让我贴一个表:

BIN

DEC

HEX

0000

0

0

0001

1

1

0010

2

2

0011

3

3

0100

4

4

0101

5

5

0110

6

6

0111

7

7

1000

8

8

1001

9

9

1010

10

A

1011

11

B

1100

12

C

1101

13

D

1110

14

E

1111

15

F

BIN是二进, DEC是十进, HEX是十六进.都是英语简.

十六进制和二进制可以直接换.方法是每四位二进制看作一个十六进制

比如

0110 1101 1011 1001

6 D B 9

转换表背过的话读代码快.因为一般情况,为了让一行代码看的不至于太,人们会用十六进制代表二进.尤其是对于拥32cortex-M3内核STM32F1系列单片,一次写一个三十二位数属实太冗.

c/c++,默认写的数字都是十进.二进制应该0b,0b00101100,而十六进制0x,0x3C.

//一般这么写GPIOB->CRL&=0x00440000;//这么写就不太美观了GPIOB->CRL&=0b00000000010001000000000000000000;

数学差不多.开始正.

2. c/c++语言基础

a+b; //加法

a-b; //减法

a*b; //乘法

a/b; //,所有计算需要注意整()和浮点()的运算区.如有疑问自行搜索

a%b; //.就是小学学的余. 14÷4=3 ... 2 14mod4=2, 14/4=3. float(14)/4=3.5f

a</.a看为二进制,整个向左移b. 00000110< 00011000.当溢出的时候会发生什么?

a>>b; //.和上面一样的功.

a&b; //按位求(AND), 11010010

// & 01010011

// ------------

// 01010010

a|b; //按位取(OR)

~a; //按位取(NOT)

!a; //逻辑(注意和上面的区)

c+=a; //相当 c=c+a;其他算符同.

重点看左右移和位操(,,).

3.我们配寄存(register)到底是在配置什么

,你的最终目的都是使用单片机GPIO(general pin input & output)/输出一个高电平还是低电.不管是诸I2C, SPI的通,还是按键读,亮灯报,说到底都是高低电平的控制或探.

ADC输入的是模(Analog),但是会被转化为数(Digital),一样是高低电.这里暂且不谈

,,或者一些功能的使能及配置一样是通过寄存器.原理相.毕竟芯片集成电路也是电,而且是数字电.暂时不深.

,为了让某一Pin输出电,或者使能一个通,我们可以01.

但是代码终归是代,不是魔.为了使需求生,单片机将每一个需要控制的,赋予一个地址.在电路层面上实现相关的功能绑.用户只需通过给这个地址去写一个,就相当于控制了需要控制的东西.易于计,我们32位处理器最大可以寻4GB的内存空.

库函数和寄存器可以混着用?

当然可.本身使用库函数的项目里可以直接引入寄存器的代.因为库函数本身也用到了寄存.但是寄存器要使用库函,需要先将库函数导入到工程才(编译链makefile文件).当然都可以混着.

7.这些没问题,但是那OD开漏输,推挽输,浮空输,上拉输,都是什么意......

文章来源: https://twgreatdaily.com/zh-hans/7760f81fd84e6689cd21d9e33e68965a.html