嵌入式入门笔记_基于比亚迪企业芯片

一、原理图部分

基本名词:

GPIO:general peripheral input output 标准输入输出

上拉电阻:对于输入引脚,可以用它来确定状态 NPN

一个高电压会导通,另一个则会阻塞

嵌入式入门笔记_基于比亚迪企业芯片_第1张图片

 be电流和ce的电流变化是相同的,也就是be电流越大,ce电流越大,电压变化又是相反的,b点电压越高,c点电压越低,用于中断引脚:1.有输入功能  2.可以中断cpu

学习步骤:

a.看原理图:该芯片和外接的芯片引脚对接即可

b.弄清楚接口的协议:数据怎么传输?各引脚怎么配合?

设置时序: 该芯片发出的各个信号,要让外接的芯片能反应得过来

c.1看该芯片手册弄清楚能设置哪些参数,这些参数的含义(以CLK为单位)

c.2看外设芯片手册,弄清楚这些参数的取值范围(以秒为单位)

c.3根据c.1, c. 2计算该芯片的寄存器取值 访问基地址 中断号 设置控制器

嵌入式入门笔记_基于比亚迪企业芯片_第2张图片

 芯片实物参考

二、芯片手册

        首先弄清楚产品的基本原理如比亚迪某触摸IC部分内容介绍:

电容原理当用户触摸电容屏时,由于人体电场,用户手指和工作面形成一个耦合电容,因为工作面上接有高频信号,于是手指吸收走一个很小的电流,这个电流分别从屏的四个角上的电极中流出,且理论上流经四个电极的电流与手指头到四角的距离成比例,控制器通过对四个电流比例的精密计算,得出位置。

        遇到一些缩写名词记录自己的名词库,如下所示:

BJT双极结型晶体管允许小电流调节大电流,而FET场效应晶体管允许小电压调节大电流

Printed circuit board 印制电路板​​​​​​​

PWM: Pulse Width Modulation 波的占空比越大时,所对应的直流电压与PWM波的幅值越接近;反之与0V越接近

SNR S=触摸信号平均值-基准信号平均值 R=最佳峰值噪声-最差峰值噪声  最佳大于等于5:1

Radio Frequency 电磁频率 防止干扰其他电子、电气设备正常工作

Mil长度单位

GPIOB General Purpose Input/Output Port B,意为通用输入/输出口B

SNS Self-capacitance Sensing 通过测量电容值的变化来检测触摸事件,从而实现触摸感应功能

VD Voltage Detection电压检测。如果电源电压低于一定的阈值,单片机可以通过VD引脚输出低电平或者产生复位信号,以保证系统的稳定性和可靠性

VSS  Voltage Source Sink,即电压源汇。在电路设计中,VSS通常表示电路中的接地引脚或接地连接点。在单片机中,VSS通常用于连接电源的负极或地极。

SDA I2C总线中的数据线,Serial Data LineSDA 用于双向的数据通信,可以传输数据、地址、控制信息等。SDA线上的数据是串行传输的,每个数据位都需要在SCL时钟脉冲的边沿进行传输。同时,SDA线还具有开漏(open-drain)输出特性,这意味着总线上的设备只能将线上的电平拉低,而不能将电平拉高。因此,在I2C总线中需要使用上拉电阻将SDA线拉高,以确保总线上的设备能够正常通信。

UART通常用于点对点通信,如将数据从一台计算机发送到另一台计算机或其他设备。UART的数据传输速率较高,可以达到几十Mbps甚至更高,因此适用于需要高速数据传输的场合。

I2C总线通常用于多设备之间的通信,如连接多个传感器或器件进行数据采集和控制。I2C总线的数据传输速率较低,但可以同时传输多个设备的数据,因此适用于需要同时访问多个设备的场合。此外,I2C总线还具有寻址和命令传输等功能,可以实现比较复杂的通信和控制操作。

XTAL外部晶体振荡器

电源控制寄存器 (波特率选择寄存器) PCON

互电容感应技术 MI (Mutual Inductance) 使用两个电容,一个为发送电极、一个为接收电极,TX引脚提供数字电压,并测量RX引脚上所接收到的电荷,在RX电极上接收到的电荷与两个电极间的互电容成正比,当TX和RX电极间放置手指时,互电容降低,因此RX电极上接收到的电荷也会降低。由此通过检测RX电极上的电荷检测触摸/无触摸状态。

        寄生电容在电子电路中,本来没有在那个地方设计电容,但由于布线之间总是有互容,互容就好像是寄生在布线之间的一样,所以叫寄生电容,又称杂散电容。寄生电容一般是指电感,电阻,芯片引脚等在高频情况下表现出来的电容特性。实际明显,而在高频情况下,等效值会增大,不能忽略。

        分布电容存在于由两个存在电压差而又相互绝缘的导体间,由啡电容形态形成的种分布参数。因此在任何电路中,任何两个存在压差的绝缘导体之间都会形成分布电容,只是分布电容大小问题。在高频率时,它对电路的影响不可以忽略,因此-般在高频电路和精密仪器中尤其要注意采取措施,从而降低分布电容影响.分布电容强调的是均匀性。寄生跟强调的是意外性,指不是专门设计成电容,却有着电容作用的效应,比如三极管极间电容。单点说,两条平行走线之间会产生分布电容,元器件间在高频下表现出来的容性叫寄生电容。

三、浅谈嵌入式

        以下我会对嵌入式软件开发一些常用的功能例如IF语句中先后顺序流水线如何安排,汇编语言是否该学习以及C语言的一些内存分配进行一些简介,个人理解可能不够专业单元希望对嵌入式学习有一点点引导。

对于流水线来说,将大概率执行的代码放在前面有助于提高执行效率

作为嵌入式底层、驱动开发者,掌握一门汇编语言是很有必要的。以ARM汇编语言为例,一方面,我们可以以汇编语言为媒 介,深入学习ARM体系架构和CPU内部的工作原理;另一方面,我们也可以以汇编语言为工具,通过反汇编,深入理解C高级语言。任何编译型的高级语言,最终都会被编译器翻译成对应的汇编指令(二进制指令),通过汇编语言来分析C语言的底层实现,可以加深我们对C语言的理解,如函数调用、参数传递、中断处理、堆栈管理等。我们将可执行文件通过反编译生成汇编代码进行分析,就可以很直观地看到高级语言的这些过程在底层到底是怎么实现的。

C分配内存 :定义了一个8K字节的数组buf[8*1024] 编译器对局部变量有两种存储方法,对于简单数据类型的变量(比如 int, char , short或者指针变量等)编译器会首先尽可能地采用CPU内部的通用寄存器来表示,因为寄存器的访问速度远远高于外部存储器的访问速度﹔第二种方式是对于那些没有办法用寄存器表示的变量或者数组结构体等变量采用当前的堆栈空间来存储。对于这段代码数组buf[]显然是需要存放在堆栈中的,然而8K字节的空间对于大多数系统而言是很容易将堆栈空间耗尽的,因此在局部数组中开设大数组是需要仔细评估的,程序员必须非常清楚自己的堆栈空间是否够用。如果算法必须采用大数组,可以采用static char buf[8 * 1024]”的方法来定义,虽然这同时会带来程序不可重入的问题。

嵌入式入门笔记_基于比亚迪企业芯片_第3张图片

  malloc()库函数的返回值是一个指向void类型的指针,因此好的编程风格应该是在将这个返回值赋给其他类型的指针变量前进行显式的强制类型转换。所以比较合适的写法应该是“p=(char * ) malloc(1024),molloc申请到的指针 与 free要释放的指针保持一致,优化后代码如下​​​​​​​

#include
int main() {
    int* p;
    p = (int*)malloc(100 * 1024);
    p++;    //改变了 p 的首地址;
    free(p);//free 没有得到 malloc时 分配给p的首地址,程序崩溃 free(p-1)
    return 0;
}

C中没有动态数组的概念﹐数组在存储器中的位置(也就是地址)和容量在编译时就已经确定了,并且在程序运行过程中不再发生改变。编译器将数组的名字作为一个符号并将该符号与数组实际存放在内存中的地址对应起来。因此在C语言中数组名就是数组的首地址,这个首地址已经在编译的时候确定,不能再改变了。所以“buf= buf十1024;”这个语句是有语法错误的,编译器会报错。只能对指针进行易位操作,数组通过堆栈实现,数组是常量,指针是变量可以进行运算

嵌入式入门笔记_基于比亚迪企业芯片_第4张图片

 

该图表示释放pwnd占用内存,在绝大数情况下pwnd=pwnd-》slbiling是通过的,因为系统释放并不是立马删除只是对该指针指向的内存的区域做了标记处理,但遇到中断情况时系统可能对这块分配的动态区域进行修改造成严重的内存泄露 正确方法是另用一个指针指向要释放的区域一个存储单元都有两个属性:一是存储器里面存放的内容(代码,数据,存储单元的地址也称指针);二是存储器的地址。

介绍了一些泛泛而谈的东西接下来从实际代码深入了解一下代码的运行过程

#include 
typedef unsigned char BYTE;
int main()
{
    unsigned int num,*p;
    p=#
    num=0;
    *(BYTE *) p=0x12;
    if(num==0x12){
        printf("litte");    
    }else{
        printf("big");  
    }
}
/*
这段程序的输出结果是 "litte"。
在这个程序中,首先定义了一个 unsigned int 类型的变量 num 和一个指向它的指针变量 p。然后,将 num 的值赋值为 0,也就是说,num 的二进制表示中各个位上的值都是 0。
之后,通过将指针 p 强制转换为一个指向 unsigned char 类型的指针,再将该指针所指向的字节的值赋值为 0xff,即将 num 的最低字节赋值为 0xff,其他字节的值不变。
由于占用内存高低位的存储方式不同,因此在 x86 架构的计算机中,一个多字节变量的存储方式可能是小端存储或大端存储。在小端存储(arm均为)中,低字节存储在变量的低地址中,高字节存储在变量的高地址中;而在大端存储中,高字节存储在变量的低地址中,低字节存储在变量的高地址中
在这个程序中,可以推断出计算机采用的是小端存储方式,因为我们修改的是指针 p 所指向的最低字节,而该字节的地址与整个变量的地址相同。因此,修改了最低字节的值之后,整个变量 num 的值也会相应地变为 0xff。
最后,进行判断,由于 num 的值为 0xff,因此输出的结果是 "big"。如果计算机采用的是大端存储方式,那么修改指针 p 所指向的最低字节的值后,会改变的是 num 变量的最高字节,而不是最低字节。因此,num 变量的值会变成 0xff000000,这是一个比较大的数,而不是 0xff。
因此,程序输出的结果应该是 "small"。

四、单片机

嵌入式入门笔记_基于比亚迪企业芯片_第5张图片

 

        嵌入式的学习无非是单片机的各个功能模块,以上是单片机硬件功能总况。接下来我会介绍几个部分功能。

例如中断:相同中断优先级情况下按照默认优先级,CPU根据中断服务程序(ISR)来确定中断的种类,ISR 只能被优先级更高的中断申请中断,如正在执行返回指令.正在访问IPIE寄存器 。正在进行的中断服务程序只能被优先级高的中断请求中断,中断级(高级和低级)优先于默认优先级。

嵌入式入门笔记_基于比亚迪企业芯片_第6张图片

 嵌入式入门笔记_基于比亚迪企业芯片_第7张图片

byd BF7112芯片手册中断部分介绍

 嵌入式入门笔记_基于比亚迪企业芯片_第8张图片

stc89c51 中断部分介绍

 嵌入式入门笔记_基于比亚迪企业芯片_第9张图片

 stc89c51芯片手册通用寄存器组

UART串口 【单片机基础】89C52单片机串口通信_小途的博客-CSDN博客嵌入式入门笔记_基于比亚迪企业芯片_第10张图片

 串口发送数据时,TI(发送中断标志位还是0),第一句作用检验数据,while语句循环等待数据发送完毕后才将中断标志位置1,最后软件清0(系统不会自动置0)

嵌入式入门笔记_基于比亚迪企业芯片_第11张图片

各种传输协议对比 

串口通信需要配置的寄存器 一个是发送缓冲寄存器SBUF,另一个是接收缓冲寄存器SBUF,以实现全双工通信方式 逻辑上SUBF只有一个实际上物理结构俩.

 串行控制寄存器

​​​​​​​对应依次为串口工作方式,多机通信控制位,串行允许控制位,校验位,停止位,发送中断,接受中断

时序图 交叉处意味允许数据变化,如IO可以读出写入,其中时钟低电平时信号线上才允许数据变化,一般阴影处表示未定义状态

嵌入式入门笔记_基于比亚迪企业芯片_第12张图片

 嵌入式入门笔记_基于比亚迪企业芯片_第13张图片

 EEPROM

嵌入式入门笔记_基于比亚迪企业芯片_第14张图片

 五、学习计划

        三个要求:发挥优势 集中学习 及时沟通

例如嵌入式软件开发的学习计划:

电子软件设计人员岗位职责  

visio 软件操作

Altium Designer 软件操作 

SMT 间生产流程   

EMC测试标准与设订  

单片机原理与程序设计

底层驱动程序编写

MISRA-C设计规范 

了解CIMMI认证

各种测试软件及方法的运用 

测试用例的编写

Keil 或同类软件编程  

Visual C++编程 

LabView 编程

数据结构及常用算法

软件设计模式与软件工程

软件需求说明书的编写

软件详组设计说明书的编写

执行过程日志:

2023.1.29 软件测试书籍 了解了软件测试综述即背景过程和实质 前三章

2023.1.30 了解了单片机大致概念 对一些专业名词查阅理解 参考手册阅读30页 Arm cortex-A R M分别应用程序系列 实时控制系列 微控制器系列针对应用场景还会细分 MCU集成了片上外围器件;MPU不带外围器件,根据手册查看相应命名规则,该图代表MCU 微控制器(MCU)集成CPU、RAM、ROM、I/0、 中断系统、定时器等各种外设资源俗称单片机 微处理器MPU类似CPU

2023.1.31 参考手册阅读到48页 学习51单片机 补充了C语言知识 了解LED灯光点亮 2023.1.32 习得简单电路图 了解数码管显示原理

2023.2.1 阅读书籍电子电器必知必会至14页 真的难高中物理都没学好基本电路图都看不懂 接着学习51单片机,内容模块化编程

2023.2.2 书籍电子电器必知必会放弃 手册暂时放弃 原因根本看不懂 对新手难以接受 2023.2.3 51单片机学习 定时器工作原理 了解中断系统工作 Java毕设配置

2023.2.4-2023.2.15 出差 2023.2.16 学习电路分析

2023.2.17-18 期末考试复习

2023.2.19-2023.3.12 车间实习

2023.3.13-2023.3.15 初步涉猎capsence入门

2023.3.16 学习如何看原理图

2023.3.17 MISRA手册10页

2023.3.20-以后 未来主要任务MISRA 嵌入式C语言 以及芯片开发手册 详细计划表上传内网 以后总结周报使用

​​​​​​​六、行业标准

        企业有很多执行标准简单介绍一下MISRA标准

        MISRA (The Motor Industry Software Reliability Association),中文名称为汽车工业软件可靠性联会,是英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商。其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件。MISRA C则是由MISRA提出的针对嵌入式C语言开发标准,目的是提高嵌入式系统的安全性、可读性和可移植性。

标准的C环境即使存在违反语法或约束的情况,也可以翻译程序并生成可执行文件

许多用于嵌入式目标的编译器提供附加的关键字,

用对象所在内存区域的属性限定对象类型,例如:

•__zpage -对象可以使用短指令访问

•__near -指向对象的指针可以保存为16位

•__far -指向对象的指针可以保存为24位

不应出现不明确或关键的不明确行为,任何产生未定义或未指定行为的程序可能不会以预期的方式运行,使程序不可移植,影响计算的结果,难以检测,如C中不可能创建非const限定的指针指向用const限定类型声明的对象。

项目不应包含无法访问的代码会造成资源浪费:占用了目标机器内存中的空间;可能会导致编译器在围绕无法访问的代码传输控制时选择更长、更慢的跳转指令;在循环中,它可能会阻止整个循环驻留在指令缓存中

这句代码是用来将变量 x 转换为 16 位无符号整数类型,并将其声明为 volatile 类型,使得编译器在对变量进行读写时不会进行优化。具体来说,代码的含义如下:

( *( volatile uint16_t * ) &x )

&x 取变量 x 的地址,得到一个指向 x 的指针。

(volatile uint16_t *) 将指针强制转换为指向 volatile uint16_t 类型的指针,即指向一个 16 位无符号整数类型的 volatile 变量。

*(volatile uint16_t *) 取指针指向的内容,即取 x 的值,由于指针类型是 volatile uint16_t 类型,因此取出来的值也会被认为是 volatile 类型。

最终,代码的结果是一个 16 位无符号整数类型的 volatile 变量,可以对其进行读写操作,而编译器不会进行优化,确保对变量的读写操作不会被省略或重排。

使用 volatile 类型的原因是,当变量 x 被声明为 volatile 类型时,编译器会在对变量进行读写时直接访问内存,而不会将变量的值缓存到寄存器中。这样可以确保对变量的读写操作能够及时地反映到内存中,避免因为编译器优化而导致的读写不一致问题。

死代码包括未使用的变量、未使用的函数、无法到达的代码等,如下图

 嵌入式入门笔记_基于比亚迪企业芯片_第15张图片

 项目不应包含未使用的宏声明

嵌入式入门笔记_基于比亚迪企业芯片_第16张图片

 

这段代码是在介绍如何使用 typedef 来定义结构体类型。其中,record_t 是结构体的标签(tag),可以用来给结构体起一个名字。但是,在定义 record1_t 类型时,使用了 record_t 标签,这是不规范的写法。相比之下,定义 record2_t 类型时省略了标签,更加规范。因此,我们应该遵循规范,尽量不使用结构体标签来定义结构体类型,而是直接定义匿名结构体类型。

字符序列/*和d// \不应在注释中使用

表示不应该过长,以下超过31个字符无法编译engine_exhaust_gas_temperature_raw

typedef名称应是唯一的标识符

定义具有外部链接的对象或功能的标识符应是唯一的

// File1.c

int x = 5;

// File2.c

int x = 10;

将这两个对象的标识符更改为 x_file1 和 x_file2,它们是唯一的,不会导致链接错误。在 main.c 中,我们使用 extern 关键字来声明这两个对象,以便在链接时能够找到它们的定义。

“u”或“u”后缀x应应用于以无符号类型表示的所有整数常量小写字符“l”不得用于文字后缀x

除非对象的类型是“指向常量限定字符的指针”,否则不应将字符串L分配给对象const char *name2 ( void ) { return ( "MISRA" );

应明确规定类型

对象或函数的所有声明都应使用相同的名称和类型限定符

当定义具有外部链接的对象或函数时,应可见兼容声明

 很佩服您能看到这个其实很多企业标准如同上面一样又臭又长我们要做的也就是从中记录一下自己没在意的地方,实际开发并不用束手束脚但基本准则也是要遵守的,对于软件测试、维护、开发都是不可分割的一部分,第一次写这种博客比较杂乱还请谅解,暂时写到这了,若有疑问评论区留言。

你可能感兴趣的:(单片机,嵌入式硬件,软件工程,c++,笔记)