自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

C~Tian

嵌入式软/硬件

  • 博客(21)
  • 收藏
  • 关注

原创 STM32-IIC通信(基于AT24C02的软件IIC通信)

IIC是什么?IIC是一种通信是一种由 PHILIPS 公司开发的两线式串行总线。IIC是用来传输数据的,也是一种通信协议。IIC的特点:IIC总线简单而有效,占用的PCB(印制电路板)空间很小,芯片引脚数量少,设计成本低。IIC总线支持多主控(Multi-Mastering)模式,任何能够进行发送和接收的设备都可以成为主设备。主控能够控制数据的传输和时钟频率,在任意时刻只能有一个主控。高速 IIC 总线一般可达 400kbps 以上。IIC的通信时序:I2C 总线在传送数据过程中共有三种类型信

2020-10-29 21:02:40 1219

原创 STM32的命名规则(如何根据芯片内部资源去选择一款合适的单片机)

STM32系列单片机的命名规则:大学里常常遇到不知道怎么选单片机的情况,选择大了,造成资源浪费;选择小了,只能在后期更换单片机。这些问题困扰我挺久了,现在我选单片机一般从两个方面考虑:一、以外围器件为参考,二、从芯片的内存资源考虑。比如:需要用几个IO口;外围器件用到什么通信方式,需要几个UART、几个ADC;如果外围器件需要单片机内存情况,如果加外围的储存器件是否能解决;这一款单片机资料是否多,容易查找问题……芯片选型需要对芯片硬件资源及软件编程都有较深的理解,需要有一定的项目经历才能更好更精确地

2020-10-24 09:50:15 524

原创 实现电路阻抗匹配的两个方法

具有电阻、电感和电容的电路里,对交流电所起的阻碍作用叫做阻抗。阻抗匹配原则:高频、射频、高速电路必做,低频电路可不做。阻抗常用Z表示:阻抗由电阻、感抗和容抗三者组成。阻抗单位为欧姆,常用Z表示,是一个复数Z= R+i( ωL–1/(ωC))。具体说来阻抗可分为两个部分,电阻(实部)和电抗(虚部)。其中电抗又包括容抗和感抗,由电容引起的电流阻碍称为容抗,由电感引起的电流阻碍称为感抗。阻抗匹配的重要性信号或广泛电能在传输过程中,为实现信号的无反射传输或最大功率传输,要求电路连接实现阻抗匹配。阻抗匹

2020-10-20 11:16:20 9785 3

原创 电容(3)——晶振电路的电容选择

晶振分为:有源晶振和无源晶振有源晶振不需要匹配电容起振便可直接工作,直接上电即可;无源晶振需要匹配电容才能工作起振。晶振电容选择:晶振电路属于单片机心脏,精度非常重要,所以需要选择高Q值的元器件(Q值高电路选择性好)。1、 选择NPO/COG材质的电容(外观看起来是白色的)2、 尽量选择小封装的电容(封装小的器件寄生参数小)晶振的匹配电容是指晶振正常震荡所需要的电容,外接的两个电容是为了使晶振两端的等效电容等于或接近于负载电容(晶振的负载电容是已知的,在出厂时已经定下来了,一般是几十Pf)。在应

2020-10-19 08:58:05 14040

原创 UCOSIII(3)——实现任务切换的多种方式

uCOS里面触发任务切换是通过触发PendSv异常,然后在PendSv异常服务函数里面实现的。在运行中实现任务切换的函数有两个:1、任务级任务切换 2、中断级任务切换任务级任务切换:OSCtxSw LDR R0, =NVIC_INT_CTRL ;把 NVIC_INT_CTRL寄存器值加载到R0 ; Trigger the PendSV exception (causes context switch) LDR R1, =NVIC_PENDSVSET ;触发P

2020-10-18 22:08:58 1396

原创 UCOSIII(2)——CPU_SR_Save与CPU_SR_Restore临界段代码的实现

临界段代码,也称作临界域,是一段不可分割的代码。我们都知道在进入中断函数或者异常的时候代码会被打断而进入中断服务函数。而有些代码是不允许被打断的,比如:一些外围器件的的初始化(LCD)、任务函数的创建等等。所以在 uCOS 中包含了很多临界段代 码来保护临界段。那么临界段函数是怎么操作的?简单啊——关中断关异常。临界端代码实现的汇编函数:CPU_SR_Save ;通过 MRS 指令将特殊寄存器 PRIMASK 寄存器的值读取到通用寄存器 R0。 MRS R0, PRIMA

2020-10-17 23:12:11 1468 1

原创 UCOSIII(1)——SVC与PenSV实现任务切换

本文基于STM32F407ZGT6——————————————SVC异常:SVC(系统服务调用,亦简称系统调用)用于产生系统函数的调用请求。SVC 异常是必须立即得到响应的应用程序执行 SVC 时都是希望所需的请求立即得到响应。在 UCOS 中并未使用 SVC 这个功能,了解一下即可。在 UCOS 中并未使用 SVC 这个功能,了解一下即可。在 UCOS 中并未使用 SVC 这个功能,了解一下即可。PendSv异常:由于SVC异常是必须立即得到响应的(若因优先级不比当前正处理的高,或是

2020-10-17 21:57:42 965

原创 STM32-滴答定时器(SysTick)用作延时函数的时基

本文基于STM32F407ZGT6—————————————滴答定时器(SysTick)的作用:1、作为操作系统时基2、作为精确延时函数时基(delay函数)滴答定时器是一个 24 位的倒计数定时器,当计到 0 时,将从 RELOAD 寄存器中自动重装载定时器初值,只要不把它在 SysTick 控制寄存器以及状态寄存器中的使能位清零,就将永久不息。Cortex‐M3/4 在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。编号为 1-15 的对应系统异常,大于等于 16

2020-10-14 20:13:15 1492

原创 C语言练习(7)——static关键字在函数中作用及它所修饰的变量在STM32中储存的位置

static关键字,在我们平常写代码的时候经常用到,特别是在做一些嵌入式编程时时常用到。static关键字修饰的对象:1、变量,2、函数static关键字的作用:1、在函数体修饰变量时,一个被声明为的static静态变量在这一函数被调用过程中维持其值不变。在下一次调用时,这个值还是维持上次调用结束时的值。2、在模块内(但在函数体外)修饰变量时,一个被声明为的static静态变量可以被模块内所用函数访问,但不能被模块外其它函数访问。准确地说static关键字在模块内的作用域是从定义之处开始,到文件结

2020-10-10 16:51:22 675

原创 PADS(4)——PADS Logic原理图设计技巧

用PADS设计原理图时,为了美观和保证连线之间的电气连接。在画元器件引脚以及绘制原理图时统一把设计栅格和显示栅格设置为100。(快捷键:G100、GD100)一、复制元器件:右键——>选择元器件——>选中元器件——>按住Ctrl(不放手)——>按住鼠标左键往外拖当出现复制元件时可松开鼠标左键,点击鼠标左键便可放置二、添加总线1、点击图标2、按照格式输入总线名字3、添加连线(快捷键F2)4、先连第一根线5、鼠标右键——>选择连线——>选中连线—

2020-10-08 19:45:46 5489

原创 PCB布局&布线(4)——PCB过孔设计

PCB过孔:它由孔、孔周围的焊盘区和 power层隔离区组成,通常可以分为盲孔、埋孔和通孔三类。对于一般的PCB,考虑到加工成本,设计过孔居多。本文主要讲解过孔。一、孔的分类:通孔:贯穿整个PCB板,孔的两面都能看见盲孔:连接表层和内层,即孔的其中一面是连接底层或者顶层的,孔的一面可以看见埋孔:连接内层的孔,四层板及以上才有,孔的两面都看不到二、过孔的寄生参数:1、过孔的寄生电容 :计算公式:注意:图中的D1,D2与图一的过孔示意图无关。减少过孔寄生电容的办法:1、减少板厚——采

2020-10-07 19:05:17 6394 2

原创 分享一个嘉立创封装库(内含AD和PADS两种格式)

一直以来做封装都是令我头疼的问题,偶然发现嘉立创的封装库,真的非常好用,而且封装做得非常漂亮。这个封装做得非常好,我也打过几款板子出来,手工焊接起来也非常好!真的是非常好的一个封装库!!!封装库里面包含了AD、Protel99和PADS三种格式的封装。链接:https://pan.baidu.com/s/1yM-KUv9NJGz_9HtYN3oHWA 提取码:ct66复制这段内容后打开百度网盘手机App,操作更方便哦...

2020-10-06 10:44:49 13125 1

原创 C语言练习(6)——在不引用其他变量时交换两个值

上次有一个非常牛掰的师兄考我一个问题:如何在不引用其他变量的情况下,去交换两个值?刚开始我有点蒙圈:一般我的做法是引入一个变量,直接交换即可:#include <stdio.h>int main(){ int i=4,j=7; int x; //引用变量X x=i; i=j; j=x; printf(" i=%d \n j=%d",i,j); getch();//窗口保留函数,调试使用 return 0;}如果要用两个值去交换,那么肯定

2020-10-05 10:38:35 290

原创 C语言练习(5)——数组和指针访问形式

有时候我们经常会把指针和数组混淆,其实数组就是数组,指针就是指针,他们之间没什么关系。那么我们为什么会混淆呢?我混淆的原因是:1、数组和指针都是传址方式进行访问2、数组可以用指针或者下标方式对数组进行访问3、指针可以用指针方式或下标方式对指针进行访问总的来说就是:数组和指针都是用传址方式进行访问,而且访问方式在表达形式上相同。直接上题目...

2020-10-04 23:58:50 276

原创 C语言练习(3)——语句x=x&(x-1)的真实意义

今天遇到一个非常有意思的题目题目如下:#include <stdio.h>int func(int x){ int countx=0; while(x) { countx++; x=x&(x-1); } return countx;}int main(){ int i = func(12345); printf("i=%d",i); getch();//窗口保留函数,调试使用 return

2020-10-04 18:59:14 2253

原创 C语言练习(4)——指针传址

指针的传址经常把我弄晕,今天遇到一道比较有意思的题目可以加深一下对指针传址的了解。一般我们设置指针都习惯用*p表示,我们把 p 称为指针变量,p 里存储的内存地址处的内存称为 p 所指向的内存。指针变量 p 里存储的任何数据都将被当作地址来处理。题目:{ #include <stdio.h> int main() int a=7,b=8,*p,*q,*r; p=&a; q=&b; r=p; p=q; q=r; printf(" *p=%d\n *q=

2020-10-04 15:47:19 198

原创 C语言练习(2)——内存对齐

缺省情况下,编译器默认将结构体、栈中的成员数据进行内存对齐。编译器将未对齐的成员向后移,将每一个都成员对齐到自然边界上,从而也导致了整个结构的尺寸变大。我们经常会接触到结构体,合理的设置结构体成员能做到节约内存的目的。例子1:#include <stdio.h>struct test1{ char a; short b; char c; int i;};struct test2{ char a; char c; short b; int i;};int

2020-10-04 11:34:43 281

原创 C语言练习(1)——函数的重载

函数重载问题#include <stdio.h>int fun(int x[], int k){ if(k==0) return (x[0]); return x[0]+fun(x+1, k-1);}int main(){ int x[ ]={1,2,3,4,5}; printf("输出结果:%d\n", fun(x,3)); getch();//窗口保留函数,调试使用}我们看一下程序运行的结果:这里要涉及的知识点:1、数组作为函数形参传递的是

2020-10-03 22:39:05 335

原创 STM32-时钟启动的两个寄存器(RCC_CFGR)(PLL_CFGR)的配置

本文基于STM32F407ZGT6—————————————STM32可以使用三种不同的时钟源来驱动系统时钟 (SYSCLK):● HSI 振荡器时钟● HSE 振荡器时钟● 主 PLL (PLL) 时钟器件具有以下两个次级时钟源:● 32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用于停机/待机模式下的自动唤醒。● 32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK)下图是STM32库函数中系

2020-10-03 16:01:26 12918 1

原创 从库函数看STM32时钟启动过程

本文基于ST32F407ZGT6编写——————————————时钟系统是单片机的心脏,单片机初始化的第一步就是时钟系统的初始化。本文是基于STM32的库函数对时钟系统启动过程进行分析。启动过程需要了解到的几个汇编语言:IMPORT ,定义表示这是一个外部变量的标号,表示不是在本程序定义的EXPORT ,表示本程序里面用到的变量提供给其他模块调用的。这两个关键字自是告诉编译器变量的来源,相当于C语言里的声明(与extern的作用差不多)LDR 和 STR ——字和无符号字节加载/存储指

2020-10-03 10:06:21 1348

转载 STM32中编译工具链的编译宏选择(__CC_ARM、__ICCARM__、__GNUC__、__TASKING__)

在看库函数的时候,我常常看到这样一个语句#if defined ( __CC_ARM )但是我又找不到定义在哪里,网上一查原来这是编译工具链的宏选择。以下博文写得很透彻原文链接:https://www.cnblogs.com/dylancao/p/12306746.htmlSTM32中ARM系列编译工具链的编译宏选择(__CC_ARM、ICCARM、GNUC、TASKING)一 前言在STM32编译中关系到一个选择何种编译宏的问题。这里就梳理一下吧。二 正文1 在 core_cm4.h

2020-10-02 17:14:06 6990 4

空空如也

空空如也

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

TA关注的人

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