自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 基于stm32f103c8t6的定时器详解(持续更新)

一、stm32f103系列定时器介绍先声明:stm32f103c8t6中没有基本定时器、只有TIM1-TIM4:分别是高级定时器和通用定时器(对照下图请自行阅读stm32f103x的datasheet)1、定时器功能:定时、输出比较、输入捕获、互补输出,其中基本定时器只有定时功能、通用定时器只没有互补输出功能、高级定时器具有所有功能。2、定时器分类:(1)基本定时器:TIM6、7(2)通用定时器:TIM2345(3)高级定时器:TIM1、83、定时器总线时钟:无特殊情况,给到定时器的内

2021-11-04 18:35:50 43665 7

原创 S5PV210开发之1.0.14------LCD显示器

目录1.LCD简介2.LCD的接口技术3.1. LCD简介LCD:液晶显示器、面板,不会主动发光,可以通过不同电信号让液晶分子进行选择性的透光,此时在液晶面板前面看到的就是各种各样不同的颜色,LCD面板的比较对象是TN IPS VA屏!LED:主动发光、背光、我们平时所说的“LED屏”,全称LED-backlit LCD,看见后面那个大大的LCD了吗?翻译成中文是LED背光液晶显示器。我们所说的LED也是指的他的背光OLED,Organic Light-Emitting Diode,中文全称

2021-09-26 00:39:45 2482

原创 S5PV210开发之1.0.13------AD转换

目录1.ADC的一些概念2.S5PV210的ADC控制器3.ADC控制器的主要寄存器4.代码编程实战1.ADC概念ADC:模数转换,cpu只能识别数字量,但是外界的电压、温度、等等都是模拟量,所以要将模拟量转换成数字量给cpu进行数据处理。AD转换器,A只能是电压、所以AD之前还需要接一个传感器、将模拟信号转换成电压信号(模拟)。量程:AD输入端的模拟电压要求有一个范围,一般是0~3.3V或0~5V或者是0~12V精度:10位AD,表示转出来的数字量有2^10个档次,即1024,每个档次

2021-09-24 09:04:45 1507

原创 S5PV210开发之1.0.12------I2C通信

目录什么是I2CI2C的通信时序I2C的寄存器解析什么是G-SensorI2C总线的通信流程1.什么是I2C物理接口:SCL + SDA(1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。(2)SDA(serial data): 数据线,通信数据都通过SDA线传输。原理图:通信特征:(1)串行通信(2)同步(3)非差分(对应电平信号)(4)低速率主要用途:SoC和周边外设之间的通信(典型的如EEPROM、电容触摸

2021-09-19 11:41:44 1850

原创 S5PV210开发之1.0.10------SD卡启动详解

目录1.外存设备2.SD卡启动详解3.SD卡启动实战一、外存设备1 :Flash:NandFlash、NorFlash(1)NAND Flash一般地址线和数据线共用;而NOR Flash闪存数据线和地址线分开。(2)大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。2 :SD卡、MMC卡、MicroSD、TF卡(1)MMC在SD卡之前(2)MicroSD = TF卡3 :iNand、MoviNand、eSSD4 :SSD(

2021-08-21 21:34:23 433

原创 S5PV210开发之1.0.9------定时器

目录1.PWM定时器2.看门狗定时器3.RTC定时器一、PWM定时器(1)S5PV210有5个PWM定时器。其中0、1、2、3各自对应一个外部GPIO,可以通过这些对应的GPIO产生PWM波形信号并输出;timer4没有对应的外部GPIO(因此不是为了生成PWM波形而是为了产生内部定时器中断而生的)(2)S5PV210的5个PWM定时器的时钟源为PCLK_PSYS,timer0和timer1共同使用一个预分频器、timer2、3、4共同使用一个预分频器;每个timer有一个专用的独立的分频器;

2021-08-21 15:47:35 644

原创 S5PV210开发之1.0.8------中断系统

S5PV210中断+按键//中断大致过程1.中断前的保护现场操作2.进入中断执行isr程序3.退出isr,返回现场1.初始化中断控制器1.异常向量表关联相应中断函数#define exception_irq (exception_vector_table_base + 0x18)#define exception_fiq (exception_vector_table_base + 0x1C)#define r_exception_irq (*(volatile unsigned

2021-08-16 13:59:38 231

原创 S5PV210开发1.0.7之-----串口通信

目录1.串口通信基本概念2.2.S5PV210的串口通信—数据手册3.串口通信编程实战4.代码演示1.串口通信基本概念1.同步、异步2.电平信号、差分信号电平为一条信号线参考GND的电压差差分为两条信号线的电压差3.并行接口、串行接口并行可以一次性发8位串行一次性发2位更常见的是:异步、串行、差分,USB和网络通信。4.RS232电平和TTL电平1.两者都为电平信号2.RS232电平受干扰能力好,一般与外界相连3.TTL常用与Soc之间5.波特率(bandrate)串口

2021-07-27 15:50:24 378

原创 S5PV210开发1.0.6------时钟系统

目录1 .Soc时钟系统简介2 .S5PV210的时钟系统简介 + 时钟域详解3 .框图详解4 .关键性寄存器5. PLL设置方法6.汇编代码演示7.C代码演示1. Soc时钟系统简介1.什么是时钟?同步工作系统的同步节拍Soc内不同器件的时钟不一样2.时钟的来源分类外部直接输入时钟信号,SoC有个引脚用来输入外部时钟信号,用的很少。外部晶振+内部时钟发生器产生时钟,大部分低频单片机都是这么工作的。外部晶振+内部时钟发生器+内部PLL倍频+内部div分频器分频各种时钟S5PV

2021-07-23 21:50:53 169

原创 S5PV210开发1.0.5----重定位relocate与SDRAM

目录1.5.1.关看门狗1.5.2.设置栈、调用C语言1.5.3.开iCache1.5.4.重定位及其代码实战1.用汇编关看门狗1.1 什么是看门狗?watch dog timer,定时器,Soc的内部外设,看门狗可相当于闹钟,系统在闹钟响铃前必须把闹钟时间往后调,否则会响铃(不希望响铃,响铃会复位),往后调就不会响铃,系统正常工作时,具备自动将时间往后调这种能力。系统非正常,不会调时间,则响铃,看门狗把系统自动复位。1.2 物理特性、原理图、数据手册1.Soc内部外设2.无原理图,外部

2021-07-20 23:07:38 343 1

原创 S5PV210开发1.0.4------点亮led灯

1.USB下载.bin文件2.SD卡下载.bin文件3.安装交叉编译工具链4.简述Makefile5.mkv210_image.c+Makefile6.一步步点亮LED1_硬件工作原理及原理图查阅1.4.9.一步步点亮LED2_数据手册查阅及相关寄存器浏览1.4.10.一步步点亮LED3_从零开始手写汇编点亮LED1.4.11.一步步点亮LED4_使用位运算实现复杂点亮要求1.4.12.一步步点亮LED5_汇编编写延时函数并实现LED闪烁效果1.4.13.一步步点亮LED6_再难一点的流

2021-07-17 22:57:59 587 2

原创 C语言-----预处理、宏定义

由源码到可执行程序的过程(1)源码.c->(编译)->elf可执行程序(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序(3)源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序(4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程

2021-03-23 18:43:17 256

原创 计算机存储系统——大小端模式

大小端模式介绍在计算机内存/硬盘/Nnad中。因为存储系统是32位的,但是数据仍然是按照字节为单位的。于是乎一个32位的二进制在内存中存储时有2种分布方式:高字节对应高地址(大端模式)高字节对应低地址(小端模式)解析:0x12345678,其中12相对34相对56相对78为高字节0x00000001相对0x00000000为高地址判断机器大小端的两种方式:第一种:共用体union myunion { int a; char b;};void little_endian(voi

2021-03-22 17:15:31 911

原创 共用体union

标题(1)共用体union和结构体struct在类型定义、变量定义、使用方法上很相似。(2)共用体和结构体的不同:结构体类似于一个包裹,结构体中的成员彼此是独立存在的,分布在内存的不同单元中,他们只是被打包成一个整体叫做结构体而已;共用体中的各个成员其实是一体的,彼此不独立,他们使用同一个内存单元。可以理解为:有时候是这个元素,有时候是那个元素。更准确的说法是同一个内存空间有多种解释方式。(3)共用体union就是对同一块内存中存储的二进制的不同的理解方式。(4)在有些书中把union翻译成联合(联

2021-03-22 16:45:22 178

原创 结构体对齐

结构体对齐的规则1.n字节对齐,32位默认n为4,64位默认n位8,(n是结构体内长度最大的数据类型的长度(字节数),)2.每个变量的对齐规则都是自己的数据类型长度大小3.总长度是字节对齐数的整数倍struct s1{ int a; // 4 char b; // 1+1 ,补1个 short c; // 2 };typedef struct s2{ // 1字节对齐 8字节对齐 int a; // 4 4 struct

2021-03-21 12:56:01 154

原创 字符串、字符数组、sizeof、strlen

(1)字符串1.1 C语言没有原生字符串类型(1)很多高级语言像java、C#等就有字符串类型,有个String来表示字符串,用法和int这些很像,可以String s1 = “linux”;来定义字符串类型的变量。(2)C语言没有String类型,C语言中的字符串是通过字符指针来间接实现的。1.2 C语言使用指针来管理字符串(1)C语言中定义字符串方法:char *p = “linux”,其实就是定义了一个字符指针,p占了8个字节,linux占了6个字节,1.3、C语言中字符串的本质:指针指向

2021-03-17 20:18:26 334

原创 二重指针、二维数组、二维数组和指针的运算

(1)二重指针(1)本质上来说,二重指针和一重指针的本质都是指针变量,指针变量的本质就是变量。(2)一重指针变量和二重指针变量本身都占8字节内存空间(64位)二重指针的简单应用: int a = 10; int *p = NULL; int **p1 = NULL; p = &a; p1 = &p; printf("*p=%d\n",*p); printf("**p1 = %d\n",**p1);二重指针和指针数组结合#include <stdio.h

2021-03-14 00:36:05 475

原创 指针数组和数组指针、函数指针以及typedef的用法

指针数组和数组指针概念:(1)指针数组:指针数组是一个数组,数组元素是指针。(2)数组指针的实质是一个指针,这个指针指向的是一个数组。表达式:int *p[5] //等效于int *(p[5]),这两个都是指针数组int (*p)[5] //指针被括起来,是数组指针关于优先级:[] . ->这三个优先级比较高函数指针概念:函数指针也是一个指针,指针就是指针变量(32位电脑占4个字节,64位电脑占8个字节)表达式:假设:void func(void){ prin

2021-03-13 17:53:53 796

原创 指针与函数传参---以及参数中的输入型参数与输出型参数

普通变量作为函数形参(1)形参额外申请内存,实参传过来的是值,函数执行结束之后,形参的内存会自动释放。数组作为函数形参(1)函数名作为形参传参时,实际传递不是整个数组,而是数组的首元素的首地址,所以在子函数内部,传进来的数组名就等于是一个指向数组首元素首地址的指针。所以sizeof得到的是4.(2)在子函数内传参得到的数组首元素首地址,和外面得到的数组首元素首地址的值是相同的。很多人把这种特性叫做“传址调用”(3)数组作为函数形参时,[ ]里的数字是可有可无的,因为数组名做形参传递的实际只是个指针

2021-03-09 16:00:57 1389

原创 运算符sizeof、指针长度、数组形参

sizeof(1)sizeof是C语言的一个运算符(不是函数)(2)sizeof的作用是用来返回()里面的变量或者数据类型占用的内存字节数。(2)为什么需要sizeof?主要是因为在不同平台下各种数据类型所占的内存字节数不尽相同(譬如int在32位系统中为4字节,在16位系统中为2字节···)。所以程序中需要使用sizeof来判断当前变量/数据类型在当前环境下占几个字节。sizeof(数组名)计算数组长度(字节为单位)char str[] = "hello"; printf("sizeof(

2021-03-09 15:49:23 6604

原创 指针与强制类型转换(int short char float double)

变量的数据类型的含义(1)所有的类型的数据存储在内存中,都是按照二进制格式存储的。所以内存中只知道有0和1,不知道是int的、还是float的还是其他类型。(2)int、char、short等属于整型,他们的存储方式(数转换成二进制往内存中放的方式)是相同的,只是内存格子大小不同(所以这几种整形就彼此叫二进制兼容格式);而float和double的存储方式彼此不同,和整型更不同。(3)用int类型的方式定义a,a在内存中以int类型的存储方式,要用%d的解析方式解析,存储方式和解析方式要对应。* 按

2021-03-09 15:20:21 8176

原创 数组-----指针(1)

数组中几个关键符号aa[0]&a&a[0]前提是 int a[10]1.a就是数组名。a做右值表示数组首元素(数组的第0个元素,也就是a[0])的首地址(首地址就是起始地址,就是4个字节中最开始第一个字节的地址)。a做右值等同于&a[0];(2)a[0]表示数组的首元素,也就是数组的第0个元素。做左值时表示数组第0个元素对应的内存空间(连续4字节);做右值时表示数组第0个元素的值(也就是数组第0个元素对应的内存空间中存储的那个数)(3)&a就是数组名a取地址,

2021-03-09 11:37:42 604

原创 用宏定义来完成位运算

直接上代码:第一题:用宏定义将32位数x的第n位(右边起算,也就是bit0算第1位)置位#include <stdio.h>#define SET_BIT_N(x,n) (x|(1U<<(n-1)))int main(){ unsigned int a = 0x0; unsigned int b = SET_BIT_N(a,3); printf("0x%x\n",b); //成功为:0x4,运行结果为0x4 return 0;}第二题:用宏定

2021-03-06 15:05:31 1071

原创 位运算实战演练

//demo1:给定一个整型数a,设置a的bit3,保证其他位不变 unsigned int a = 0xf00; a |= (0x1<<3); printf("0x%x\n",a); ```c //demo2:给定一个整形数a,设置a的bit3~bit7,保持其他位不变。 unsigned int a = 0xf00; a |= (0x1f<<3); printf("0x%x\n",a); //成功为0xff8 //demo3:给定一个整型数a,.

2021-03-06 14:59:57 139

原创 内存管理之 栈和堆

什么是栈栈是一种数据结构,C语言中使用栈来保存局部变量。栈是被发明出来管理内存的。栈管理内存的特点先进后出 FILO first in last out 栈先进先出 FIFO first in first out 队列栈的特点是入口即出口,只有一个口,另一个口是堵死的。所以先进去的必须后出来。队列的特点是入口和出口都有,必须从入口进去,从出口出来,所以先进去的必须先出来,否则就堵住后面的。栈的应用举例:局部变量C语言中的局部变量是用栈来实现的。我们在C中定义一个局部变量时(i

2021-03-02 11:42:03 449

原创 C语言如何操作内存

C语言对内存地址的封装譬如在C语言中 int a; a = 5; a += 4; // a == 9;结合内存来解析C语言语句的本质:int a; // 编译器帮我们申请了1个int类型的内存格子(长度是4字节,地址是确定的,但是只有编译器知道,我们是不知道的,也不需要知道。),并且把符号a和这个格子绑定。a = 5; // 编译器发现我们要给a赋值,就会把这个值5丢到符号a绑定的那个内存格子中。a += 4; // 编译器发现我们要给a加值,a += 4 等效于 a = a + 4;编译器会先

2021-03-02 11:32:19 611

转载 内存编址和寻址、内存对齐

内存编址方法内存在逻辑上就是一个一个的格子,这些格子可以用来装东西(里面装的东西就是内存中存储的数),每个格子有一个编号,这个编号就是内存地址,这个内存地址(一个数字)和这个格子的空间(实质是一个空间)是一一对应且永久绑定的。这就是内存的编址方法。在程序运行时,计算机中CPU实际只认识内存地址,而不关心这个地址所代表的空间在哪里,怎么分布这些实体问题。因为硬件设计保证了按照这个地址就一定能找到这个格子,所以说内存单元的2个概念:地址和空间是内存单元的两个方面。内存编址是以字节为单位的我随便给一个数字

2021-03-02 11:24:14 671

原创 位、字节、半字、字的概念和内存位宽

什么是内存从硬件角度:内存实际上是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理还可以把内存分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,后来的DDR1、DDR2·····、LPDDR)从逻辑角度:内存是这样一种东西,它可以随机访问(随机访问的意思是只要给一个地址,就可以访问这个内存地址)、并且可以读写(当然了逻辑上也可以限制其为只读或者只写);内存在编程中天然是用来存放变量的(就是因为有了内存,所以C语言才能定义变量,C语言中的一个变量实际就对应内存中的一个单元)。内存的

2021-03-02 11:18:58 2220

原创 程序运行为什么需要内存

计算机程序运行的目的计算机为什么需要编程?编程已经编了很多年,已经写了很多程序,为什么还需要另外写程序?计算机有这个新的程序到底为了什么?程序的目的是为了去运行,程序运行是为了得到一定的结果。计算机就是用来计算的,所有的计算机程序其实都是在做计算。计算就是在计算数据。所以计算机程序中很重要的部分就是数据。计算机程序 = 代码 + 数据计算机程序运行完得到一个结果,就是说:代码 + 数据 (经过运行后) = 结果从宏观上来理解,代码就是动作,就是加工数据的动作;数据就是数字,就是被代码所加工的东西。

2021-03-02 11:15:11 1233

原创 带wiringPi库的交叉编译如何进行

我写的另外两篇博文里面有介绍到交叉编译概述和交叉编译工具链的安装,现在我们来看带wiringPi库的交叉编译如何进行。正常我们先要交叉编译wiringPi库,编译出的库适合树莓派,这时候交叉编译可执行程序的时候,链接库的格式也是正确的。(下载的wiringpi库不好,只能X86)通过-I -L来指定因为链接的库的格式不对,是宿主机(X86)的平台,出现以下错误arm-linux-gnueabihf-gcc demo2.c -I /home/CLC/lessonPI/WiringPi/wiring

2021-02-25 21:34:03 348

原创 交叉编译工具链的安装

步骤一:登录树莓派官网https://github.com/raspberrypi/步骤二:从共享文件夹拷贝到工作目录cp /mnt/hgfs/share/tools-master.zip .步骤三:解压unzip tools-master.zip cd /home/CLC/lessonPI/tools-master/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin步骤四:配置环境变量用到的指令:echo $PAT

2021-02-25 17:01:58 132

原创 交叉编译概述

什么是交叉编译交叉编译:是在一个平台上生成另一个平台上的可执行代码。例如:我们在windows上面编写C51代码,并编译成可执行代码,如xx.hex,是在c51上面运行,不是在windows上面运行。再例如:我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如a.out,是在树莓派上面运行,不是在ubuntu,linux上面运行C51、stm32交叉编译的发生在keil(集成环境上面)为什么要交叉编译1.因为目的平台上的资源贫乏,无法运行我们所需要编译器,比如C512.树莓派是不是就

2021-02-25 16:27:00 135

原创 串口通信协议概述——针对面试

串口通信串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。重要参数1.数据位2.停止位3.奇偶校验位4.波特率其中,数据位、停止位、奇偶校验位又是数据格式,数据格式可理解为语言的类型,波特率可理解为说话的语速,在进行传输之前,双方一定要使用同一波特率。通信方式1.单工模式:数据传输是单向的,通信双方中,一方固定为发送端,一方则固定为接收端,一根传输线就够了。2.双工模式:双工分为半双工和全双工。2.1半双工:通信双方既可以

2021-02-22 14:51:33 2114 1

原创 树莓派简单的外设开发——继电器、超声波测距

继电器部分代码继电器连接太简单了,一个VCC,一个GND,一个GPIO即可,就不具体赘述了,下面直接上代码:#include <wiringPi.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#define SWITCH_INT4 26 //GPIO.26#define SWITCH_INT3 27 //GPIO.27#define SWITCH_INT2 28 //GPI

2021-02-22 14:16:00 171

原创 树莓派外设开发——基于wiringPi库

安装先查看树莓派上是否已经有了wiringPi的库,树莓派刷机的时候已经刷进SD卡里面了,用下面的指令查看wiringPi库版本gpio -v树莓派引脚这张图非常经典,对于初学者只需要了解以下几个足以:1.TXD、RXD->T是发送,R是接收,用于串口通信2.GPIO->I/O口,通用输入、输出3. 0V,3.3V,5V不用多说了吧,GND就是0V4. 树莓派3的GPIO分为的三种编码方式:物理引脚BOARD编码,BCM编码,以及 wiringPi 编码wiringPi库

2021-02-21 19:15:15 212

原创 树莓派开发笔记------基础配置

1.树莓派刷机拿到一块树莓派,第一件事应该是刷机。用到的刷机工具在这个网盘链接:https://pan.baidu.com/s/1S8P6vShFuSMDnt8vUF62nA提取码:yrp32.树莓派登录方法1:用HDMI视频线 连接到显示器(不推荐)方法2:串口登录默认情况,树莓派的串口和蓝牙连接。所以想办法断开蓝牙连接,把串口用来数据通信。步骤1:在windows端访问树莓派的SD卡,打开SD卡根目录的"config.txt"文件,将以下内容添加在最后并且保存(解除了蓝牙对树莓派串口的占用

2021-02-21 13:40:08 131

原创 标准C库之文件编程

标准C库的文件编程这一块代码和Linux库的文件编程特别像,看下面几个示例就能懂了因为是标准C库,所以头文件直接是include<stdio.h>函数原型fopen:FILE *fopen(const char *pathname, const char *mode);size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);size_t fread(void *ptr, size_t size.

2021-02-20 18:44:46 91

原创 一张表 搞定open和fopen

总所周知:fopen 是在open 的基础上扩展出来的函数。fopenopenISO标准C库,可移植性强Linux中所提供的函数,可移植性弱返回指针返回文件描述符与fread、fwrite、fclose搭配使用与read、write、close搭配使用用于正式文件用于Linux设备文件,管道文件存在缓冲无缓冲关于访问速度:如果不是随机访问文件,则fopen比open 访问速度快;如果随机访问文件,则open比fopen访问速度快。...

2021-02-20 18:17:02 211

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除