嵌入式stm32
嵌入式学习
Coder_Penguin
这个作者很懒,什么都没留下…
展开
-
stm32学习之按键输入检测
1.对于按键输入的检测有两种基本的情况(假设每隔100ms检测一次):(1)一种情况是支持连续按:什么意思呢?最典型的例子就是电视机遥控器,如果你一直按他就是一直换台或者一直增大减小音量,就是说它检测到一次低电平就认为有效从而做出反应。(2)第二种情况是不支持连续按:这种情况很常见,例如电源开关,只要你按下了它就会开或者关,而不是你一直按着它开关开关。2.我们怎样实现这两种做法呢?通...原创 2020-05-03 12:08:05 · 1460 阅读 · 0 评论 -
蜂鸣器原理图
原创 2020-05-03 11:21:57 · 3924 阅读 · 1 评论 -
Keil5查看函数出现:No Browse information available
1.解决办法:选中target1,然后点击右键,选择 option for target ‘target1’ ,在弹出的对话框中选择output选项卡,看Browse information 选项有没有勾选,如果没有,请勾选,然后把你的工程rebuild 一次。...原创 2020-05-03 10:31:00 · 3606 阅读 · 1 评论 -
复用与重映射
1.复用:某些端口不仅可以做通用IO口,还可以用作某些外设的引脚。如:PA9、PA10可以用作串口的引脚。2.重映射:把某些端口的功能转移到其他端口上,如PA9、PA10通过配置重映射到PA6、PA7上。...原创 2020-05-02 22:05:51 · 624 阅读 · 0 评论 -
IO端口基本结构
原创 2020-05-02 21:45:07 · 1830 阅读 · 0 评论 -
STM32怎样知道那个IO脚兼容5V?
方法:查看数据手册(注意是数据手册而非参考手册等)的引脚描述符表(Pin definitions),如图所示:凡是带有FT标志的都是可以兼容5V的。原创 2020-04-28 21:18:02 · 1802 阅读 · 0 评论 -
数据结构之九种排序算法代码实现及相应排序的特点总结
#include "stdio.h"void InsertSort (int *a,int n){ int i,j; for (i=2;i<=n;i++) { a[0]=a[i]; for (j=i-1;a[0]<a[j];j--) a[j+1]=a[j]; a[j+1]=a[0]; }}void MidSort(int *a,int n){ i...原创 2020-04-25 13:09:00 · 704 阅读 · 0 评论 -
TMD的希尔排序
什么是TMD的希尔排序,什么是TMD的希尔排序!答:先分组后插入void ShellSort(int *a,int n){int dk;int i,j;for(dk=n/2;dk>=1;dk=dk/2){for(i=1+dk;i<=n;i++){a[0]=a[i];for(j=i-dk;j>0&&a[0]<a[j];j=j-dk){...原创 2020-04-24 19:24:45 · 150 阅读 · 0 评论 -
使用umask改变创建文件时的初始权限。
如图所示,输入umask可以查看当前系统默认的创建权限的掩码值,可以看到刚开始是0002,其中第一个数字是0代表特殊权限先不予理会。后面002代表用户满权限,属组满权限,其他用户权限减2,减2对应减去w权限,即写权限。利用umask 027进行设置权限,即用户满权限,属组权限减2,其他用户没有权限。...原创 2020-04-08 20:02:24 · 815 阅读 · 0 评论 -
有趣的小白鼠尝毒问题:二进制秒哉!
1.问题描述:假设现在一共有八瓶水,其中一瓶水是有毒的但是不知为哪一瓶,需要几只小白鼠可以试验出哪个水瓶含有有毒的水?(1)用二进制将水杯编号(组成一个8X4的矩阵):(2)将矩阵进行转置可得:(3)第一杯:只包含8号水第二杯:包含4、5、6、7号水第三杯:包含2、3、6、7号水第四杯:包含1、3、5、7号水(4)所以说现在可以让四只可怜的小白鼠分别饮下这四杯水,等待去世结果...原创 2020-04-08 19:47:27 · 2447 阅读 · 1 评论 -
AD设计使用初步:利用stm32f103实现钟表的小总结
1原创 2020-04-06 16:23:02 · 628 阅读 · 0 评论 -
#define与typedef个人见解
1.在我看来,#define进行的替换是非常机械的,就是你写了什么我就替换成什么,哪怕你不小心写错了(比如说在#define语句后面多加了;),那么你写错的部分也会被进行替换,预处理时并不会说你错了,预处理替换掉后不参与编译。2.而typedef这种替换是具有“感情”的替换,就是说会检查被替换的东西是不是意义的。一般我们用typedef时都是为了使表达的意思看起来简单且明了,简单是指用了新名字后...原创 2020-03-26 17:49:52 · 111 阅读 · 0 评论 -
vim命令学习积累及assert函数
以下命令在命令模式下输入,即按下esc后以:开始1.vim将所有行的前四个字符删除::% s/^.{4}//g2.vim全选:小写模式下输入gg,大写模式下输入VG3.vim多行删除::7,19d其中7为待删除的起始行,19为尾行,d为删除命令4.assert()函数:比较好的在程序中使用assert的地方:(1)空指针检查。例如,针对一个函数的参数进行空指针检查。你可以这样使...原创 2020-03-25 15:08:37 · 114 阅读 · 0 评论 -
#ifndef的作用
https://blog.csdn.net/haiheng/article/details/132883转载 2020-03-24 18:22:16 · 175 阅读 · 0 评论 -
Makefile通俗概述,用例子说话
先看一个最原始的Makefile文件例子:edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files...原创 2020-03-19 17:00:03 · 74 阅读 · 0 评论 -
什么是编译?什么是链接?
编译:1.一般来说,无论是C、C++,首先要把源文件编译成中间代码文件,在Windows下也就是 .obj 文件,UNIX下是 .o 文件,即 Object File。2.在编译时编译器需要的是语法的正确,函数与变量的声明的正确。只要所有的语法正确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应该对应于一个中间目标文件(O文件或是OBJ文件)。链接:1.链接主要是链接函数和全局变...原创 2020-03-19 16:32:42 · 1092 阅读 · 0 评论 -
ARM c程序优化
1.变量的数据类型的选择(32位)采用整数类型,避免移位尽量使用int类型,当使用溢出特性时可以选择char和short类型2.次数固定的循环的优化采用减计数比加计数优化3.次数不定的代码的优化用do…while循环结构提供了好的优化和代码密度,但前提是要保证循环至少有一次。4.可以使用循环展开进行代码的优化,增加循环体的代码量减少判断次数。5.指针别名:两个指针指向同一个对象,称...原创 2020-02-21 14:44:11 · 302 阅读 · 0 评论 -
嵌入式C语言编程
1.运用c的struct模拟“类”如图所示,用函数指针表示行为(成员函数),同一结构体的指针做this指针,其他的做数据(数据成员)。2.汉字处理(1)完整的字库每一个字占用32个字节,所以(94*(区号-1)+(位号-1))*32得到的就是你要找的字的起始位置,所以往后数32个字节就是该字的全部的字模信息。(2)仅适用少量汉字word字符数组用于存储所需要的汉字,value表示汉字的...原创 2020-02-21 14:19:23 · 219 阅读 · 0 评论 -
Linux挂载的通俗解释
什么是挂载1. Linux 系统中“一切皆文件”,在 Linux 看来,任何硬件设备也都是文件,它们各有自己的一套文件系统(文件目录结构)。2. 当在 Linux 系统中使用这些硬件设备时,只有将Linux本身的文件目录与硬件设备的文件目录合二为一,硬件设备才能为我们所用。合二为一的过程称为“挂载”。3.举例:(1)linux和我们想要访问的U盘分属不同的文件系统(2) 要想访问U盘...原创 2020-02-20 15:01:23 · 819 阅读 · 0 评论 -
嵌入式学习之uart通信与各种通信方式比较
1.凡是全双工的接收和发送都各有一条线凡是同步的都有时钟控制。2.原创 2020-06-05 16:13:38 · 380 阅读 · 0 评论 -
嵌入式学习之ADC(ADC_SQRx寄存器怎样理解?)
1.先来说明ADC_SQRx寄存器是干什么的?答:通俗且不严格的理解就是设定你所有的ADC通道的转换顺序优先级的。2.再来说ADC_SQRx寄存器中天的内容是什么?答:填得是转换通道的编号(0~17)。因为一共有18个通道且编号为0-173.举例子说明:(1)ADC1->SQR1& = 0<<16把0填入SQR1的第16位,即把编号0(即为通道0)填入了第16个转换的位置,从而使得通道0的转换被放在了最后。(2)ADC1->SQR3 |=1<<0把原创 2020-06-04 15:50:46 · 3023 阅读 · 1 评论 -
嵌入式学习之RTC时钟
1.RTC 模块和时钟配置系统(RCC_BDCR 寄存器)是在后备区域,即在系统复位或从待机模式唤醒后 RTC 的设置和时间维持不变。但是在系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作。所以在要设置时间之前, 先要取消备份区域(BKP)写保护。补充:(1)备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。我们一般用 BKP 来存储 RTC 的校验值或者记录一些重要的数据。执行以下操作可以使能对备份寄存器和RTC的访问:● 通过设置寄存器原创 2020-05-20 22:07:47 · 1279 阅读 · 0 评论 -
嵌入式学习之lcd模块:ILI9341
1.要明确一件事,命令与该命令要写入的寄存器的地址相同,如:往地址为2A的寄存器写入2A之后就开启了列地址的设置,后面再写入数据就是设置相应的参数。当然了怎样识别你输入的是数据还是命令呢?就是通过总线RS来控制。2....原创 2020-05-18 21:50:00 · 1854 阅读 · 0 评论 -
嵌入式学习之oled模块(SSD1306控制器)
(1)OLED显存存放格式(GDDRAM)(2)在某页的一列中D0在高位,D7位在底。2.时序:在每个时钟的上升沿写入且先写高位。3.常用命令:第一个命令为 0X81,用于设置对比度的,这个命令包含了两个字节,第一个 0X81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。第二个命令为 0XAE/0XAF。0XAE 为关闭显示命令;0XAF 为开启显示命令。第三个命令为 0X8D,该指令也包含 2 个字节,第一个为命令字,第二个为设置值,第二个字节的 B...原创 2020-05-14 20:26:36 · 1505 阅读 · 0 评论 -
嵌入式学习之通用定时器输入捕获和库函数小总结
1.按块分析输入捕获的整个过程:输入捕获的流程图:(仅以通道1为例)(1)设置滤波器:浅薄的理解:这一部分跟“去抖”有些相似其中fDTS是根据内部时钟CK_INT设置的,这两个频率是为了去设置IC1F[3:0]这四位从而改变采样频率作准备的。(假设我们是上升沿触发),例如设置这四位为0011,则采样频率f SAMPLING =f CK_INT ,N=8 。就是说以CK_INT 这个频率采集8次,如果八次都是高电平就会触发输入捕获。(2)设置捕获极性(3)设置输入捕获映射通道什么意思呢原创 2020-05-11 18:19:24 · 2073 阅读 · 0 评论 -
嵌入式学习之定时器的PWM输出
配置步骤:(1)使能定时器以及输出引脚的时钟(若用到复用则使能AFIO时钟)。(2)初始化GPIO,若没有重映射仅有复用则按照8.1.11配置就行了,若有重映射即打开重映射。例如:重映射都是固定的,比如上图你使能了TIM3的部分重映射,我们肯定是在确定要用到PB5或者PB4之后我们才去使能重映射。(3)配置要用到的定时器的时钟来源以及时基单元:注意:若我们使用内部时钟CK_INT作为时钟来源,应注意手册中的一句话:“这里的 CK_INT时钟是从APB1倍频的来的,STM32中除非APB1的时钟分原创 2020-05-09 13:54:46 · 1014 阅读 · 2 评论 -
嵌入式学习之窗口看门狗
1.从上图我们可以知道:计数器初始值到窗口上限值之间不能喂狗,只有在上限值和下限值之间喂狗可以防止复位,一旦到达0x3f立即就会产生复位,这里在计数器到达0x40时我们可以使能一个中断进行喂狗防止复位。2.为什么需要窗口看门狗:因为窗口看门狗即不能早喂狗也不能晚喂狗,是只有在我们自己设置的窗口值内喂狗才能避免程序复位。降低了因程序跑飞可能误触发喂狗程序的可能性。另外我们可以利用窗口看门狗准...原创 2020-05-07 22:48:34 · 242 阅读 · 0 评论 -
函数的递归调用与栈的图解
观察此图,除必要的准备程序,栈最下面的程序是main()函数,然后递归调用函数,每一层递归调用都会在栈中开辟新的一层:每一层中包含一个地址,这个地址是这一层函数调用完后需要返回上一层继续执行的地址;还包含这一层传过来的实参和定义的局部变量。栈的缺点:(1)容易造成栈的溢出(2)效率较低,可能会包含很所重复运算。...原创 2020-05-07 12:05:54 · 1136 阅读 · 0 评论 -
嵌入式学习之独立看门狗
1.独立看门狗的溢出时间计算:Tout=((42^prer)rlr)/40(1)prer是IWDG_PR寄存器中位2:0的十进制值所以42^prer就表示分频因子(2)40/42^prer 就表示最后的时钟频率,即1s中计时个数(3)42^prer/40就表示时钟周期,即记一个数所需时间(4)42^prer/40 * RLR 就是记RLR 寄存器中所存的数所需的时间常用的设...原创 2020-05-06 21:09:28 · 262 阅读 · 0 评论 -
嵌入式学习之外部中断
外部中断配置流程:1.打开用到的gpio的时钟2.初始化gpio3.打开afio的时钟(因为用到了外部中断)4.配置外部中断的中断源(形象的说就是将相应的gpio引脚与中断线连起来)5.中断线的配置与使能(是中断还是事件,是上升沿触发还是下降沿触发,是哪条中断线与使能)6.中断优先级的配置(包括中断优先级的分组以及优先级的配置)7.写中断服务函数(使用了PE寄存器:库函数包括EXTI...原创 2020-05-05 22:39:49 · 1191 阅读 · 0 评论 -
指针与结构体与值的修改
1.“.”用于结构体直接指定其成员进行操作“->”用于结构体类型的指针对成员进行操作。2.要想保证修改值的统一就要传指针3.printf("%d\n",b);可以看出传过来一个地址,要想对其操作使用*b的形式放在=左边做左值使用。...原创 2020-05-05 18:42:01 · 2234 阅读 · 0 评论 -
嵌入式学习之特别的中断
1.中断向量表如图所示:2.中断屏蔽寄存器(PRIMASK)这个寄存器只有一个位,置1后,将关闭所有可屏蔽中断的异常,只剩NMI和硬fault,默认值为0。3.FAULTMASK寄存器这个寄存器也只有一位,置1后,屏蔽除NMI外的所有异常(包括硬fault),默认值为04.可以看出,NMI是名副其实的不可屏蔽中断...原创 2020-05-03 19:53:54 · 145 阅读 · 0 评论 -
嵌入式学习之复用与重映射
1.先来看一下stm32f103的内置外设有哪些?2.那么什么是复用呢?就是说外设的引脚是与通用的GPIO引脚公用的,当用这些引脚作为内置外设引脚时就是复用!3.怎样配置复用:(1)打开GPIO的时钟(2)打开内置外设的时钟(3)根据 “8.1.11 外设的GPIO 配置”GPIO_Init()函数4.什么是重映射?把外设本来对应的GPIO引脚重映射(改变为)其他的引脚。为了P...原创 2020-05-03 18:49:39 · 664 阅读 · 0 评论 -
嵌入式学习之时钟系统
具体得有:http://www.51hei.com/stm32/4155.html原创 2020-05-03 16:56:01 · 471 阅读 · 0 评论 -
嵌入式学习之IO小总结
1.一直有个误区:可以看出,LED灯的IO引脚出来后接的3.3V高电压,所以当相应的引脚输出0才能形成压降从而点亮。怪不得开始的时候一直点亮相反的,我以为板子出了问题,真是拉不出屎来怨茅坑。2.对于灯的取反操作:(1)LED0=!LED0;看这句话,把宏定义里面的内容进行替换就相当于:*((vu32*)addr) = !*((vu32*)addr)左边是个地址,右边是个地址。这就很困...原创 2020-05-03 15:35:51 · 346 阅读 · 0 评论