自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 STM32学习和实践笔记(22):PWM的介绍以及在STM32中的实现原理

以上图为例来说明,上图中ARR的值为8,也就是整个PWM的周期就是8,从上图中可以看出,OCXREF就是输出的PWM信号,在一个周期内,其高电平的宽度,取决于CCR里的值。如上图所示,数字信号的脉冲宽度与模似信号的大小成正比,这就实现了模拟信号对脉冲宽度的调制——所谓调制,就是随它的变化而变化的另一种说法而已。当CNT开始计数后,在每一个ARR的值的周期,它都不断地动态与CCR值进行比较,只要它大于CCR里的值,它就输出高电平,反之就输出低电平。这样的一个周期,是包括了PWM高电平和低电平的。

2024-04-26 16:10:52 213

原创 STM32学习和实践笔记(21):定时器中断实验

自动重装计数器装入初值,然后以CK_CNT的频率从0开始计数,当计到大于初值时,就产生事件或者溢出中断。ClockDivision是指输入滤波通道后面的那个预分频器,是对输入信号进行分频的,一般设为1。反过来,根据已知的需要定时多长时间,也可以算出需要装入的初值是多少。TCLK是外设总结时钟的两倍,也就是36M*2=72MHZ。第四步:设置定时器中断优先级,使能定时器中断通道。了解结构体成员功能后,就可以进行配置,例如。包含自动重装值,分频系数,计数方式等。第三步:设置定时器中断类型,并使能。

2024-04-25 14:39:26 363

原创 STM32学习和实践笔记(20):定时器

一共有四种时钟来源:一是内部时钟,二是外部时钟,来自外部引脚,三是内部的触发输入,一共有ITR0-ITR3共四个。4)可使用外部信号(TIMx_ETR)控制定时器,且可实现多个定时器互连(可以用1个定时器控制另外一个定时器)的同步电路。通常情况下,都是选择内部时钟作为通用定时器的时钟来源。通用定时器是在基本定时器的基础上扩展而来,增加了输入捕获与输出比较等功能。图示1区是通用计数器的时钟来源区,用来给定时器提供计数的频率。其值为1-65535.的每个通用定时器都是完全独立的,没有互相共享的任何资源。

2024-04-24 12:16:16 260

原创 STM32学习和实践笔记(19):按键控制实验(用STM32的外部中断的方式实现)

花了两小时,对照着视频的讲解,终于成功做完这个实验~~

2024-04-23 12:01:48 205

原创 STM32学习和实践笔记(18):STM32的外部中断的配置

注意,中断服务函数名字要严格按上面的来。从EXTI5到10,是合在一起的两个函数,而不是像前面的0-4那样命名。比如,EXTI0,可以分配给GPIOA0,GPIOB0...GPIOG0这7个引脚的任何一个。上图中(2)的设置IO口与中断线的映射关系,就是上面说的分配EXTI给具体的引脚。但是GPIO差不多每个端口都有16个引脚,具体是怎样分配的呢?如上图,EXTI的0-15是分配给GPIO的16个引脚。

2024-04-21 00:30:00 189

原创 STM32学习和实践笔记(17):STM32外部中断(EXTI)的整体介绍

由与门4可以知道,如果将中断屏蔽寄存器设为0,那么就可以屏蔽收到的中断信号。EXTI的每根输入线都可单独进行配置:以选择类型(中断或事件)和相应的触发方式(上升沿触发、下降沿触发或边沿触发),开发板上所使用的这个芯片STM32F103,没有最后一个以太网唤醒的中断,所以是19个EXTI。或门3,有两个输入口,只要有一个有高电平,就会输出高电平。输入线1,就是芯片外部的触发信号的输入处,对EXIT来说,通常就是GPIO的某一个引脚。如果是事件,就走1,2,3,6,7,8。如果是中断,就走1,2,3,4,5。

2024-04-20 00:15:00 328

原创 STM32学习和实践笔记(16):STM32的中断一般配置步骤

注意每一个中断服务函数的中断名,都已经在下面这个启动文件中写好了。方法就是使用库函数 NVIC_PriorityGroupConfig(),来设置中断优先级分组,misc.c。可以查看这个库函数。优先级分组具体见上一篇的内容,一共有5种可能的分组方式,通常使用标号为2的那种分组方式。这个具体内容,就是当这个中断发生后,自己希望利用这个中断具体做什么。方法就是调用这个外设的中断使能库函数来使能或者说打开它。结构体,这个结构体也是在misc.c中可找到。)编写中断服务函数内的具体内容。)设置中断优先级分组,

2024-04-19 11:38:27 134

原创 STM32学习和实践笔记(15):STM32中断系统

如果如果占先式优先级相同,两个副先级虽然不同的中断,先后到达,那么先运行先到达的中断,后面的中断到来后,就算其副先级更高,也不能抢断,只能等到前面中断运行后再运行。无论是CPU正执行一个中断而来了一个新的中断,还是CPU没有执行中断而新来了两个中断,只要两个中断的占先式优先级相同,那么都不会发生中断的嵌套。甚 至就算CPU正在执行一个中断,只要新的中断的占先式优先级的数值更小,它就会先执行这个新的中断,这个就是中断的嵌套。表中的位置栏,是指在同样优先级的顺序下,优先处理哪一个中断,数值越小,优先级越高。

2024-04-18 11:58:40 517

原创 STM32学习和实践笔记(14):按键控制实验

LED1闪,不使用直接在while里延时的方式 ,而是通过一个i做中间变量的方式 ,是因为假设直接使用延时,因为想看到灯闪,延时的时间就需要较长,而在延时的时间里,CPU等于延在那空等,这个时候按动按键,按键的检测可能反应就不够快!PA0片内配置成下拉电阻,平常为低电平,当按键按下时,检测到下拉电阻上有高电平,即表示按键按下。软件方法就是在首次检测到低电平时加延时,通常延时5-10ms,让抖动先过去,然后再来检测是否仍为低电平,如果仍然是,说明确实按下。消除抖动有软件和硬件两种方法。

2024-04-17 14:49:24 276

原创 STM32学习和实践笔记(13):数码管显示实验

共阴与共阳在码表上其实就是正好取反就可以了,所以可以共用一个码表。)主函数控制(将数值段码发送到对应端口上)。共阳就是共正极,也就是正极全部接在一起。共阴就是共负极,也就是负极全部接在一起。我目前使用这款PZ6806L,使用了。)使能数码管端口时钟、初始化。数码管显示程序主要分为。

2024-04-16 11:57:40 203

原创 STM32学习和实践笔记(12):蜂鸣器实验

无源的没有内部振荡器,需要输入1.5-5KHZ的音频信号来驱动压电蜂鸣片发声。蜂鸣器主要分为两种,一种是压电式的无源蜂鸣器,一种是电磁式的有源蜂鸣器。因此STM32需要供给它1.5-5KHZ的音频信号,才能让它发声。改变供给它的方波的占空比,则可以控制蜂鸣器发出的声音大小。实验是成功的,蜂鸣器正常地以5KHZ的频率声音响了起来~有源的内部有振荡器,因此只需要供给直流电压就可以了。改变供给它的方波的的频率,可以调整蜂鸣器的音调。这款PZ6806L,是使用的无源蜂鸣器。后面可以试着用蜂鸣器来发起相应的歌声~~

2024-04-15 15:26:32 157

原创 STM32学习和实践笔记(11): Systick定时器实现LED精确定时闪烁

Systick定时器实现LED精确定时闪烁,试验成功。

2024-04-14 00:15:00 112

原创 STM32学习和实践笔记(10): Systick定时器介绍

sysTick定时器也叫SysTick滴答定时器,它是Cortex-M3内核的一个外设,被嵌入在 NVIC中。(NVIC:嵌套向量中断控制器,属于内核外设,管理着包括内核和片上所有外设的中断相关的功能)它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取。当定时器计数到0时,将从LOAD寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。

2024-04-13 00:15:00 296

原创 STM32学习和实践笔记(9): 使用位带操作实现LED闪的实验

(这个地方与前面的描述有不一致,前面这个bit只有0-7这三8个值,但是这里可以从0-15,但根据公式,只要基地址不变,那么算过来的相应的地址也会是正确的,这个n在公式里,就起到每多一个位,就偏移4个地址的作用。所以,当我输入PAout(1) =1时,根据上面所说的第三行的作用,那我通过对位带别名区对应地址的操作,而更改到了ODR寄存器里数据的某一bit位,从而实现了对某一个具体的pin的输入输出的直接操作!再由前面的公式,就算出对应的位带别名区的地址,并对该地址的值进行操作。

2024-04-12 00:15:00 461

原创 STM32学习和实践笔记(8): 理解位带区和位带别名区

控制PortC上的那些引脚的寄存器,他们的址址是从0x4001 1000一路排到0x4001 13FF,一共有1024个地址(也就是1K),其中,最开始的4个地址,就分配给了。这样,当我在位带别名区根据某个32位的起始地址对其操作时,我就可以直接将其全部清0或全部置1,这样做,就相当于对位带区的某1位进行操作。0x40000001,那么同样根据上述公式,也能得到正确的地址,计算的结果,就是在基地址基础上增加了32位的偏移而已。那么对应的这32位,也只有两种情况,要不就是全为0,要不就是全为1。

2024-04-11 11:27:00 681 1

原创 STM32学习和实践笔记(7):改变系统时钟的实验

代码中的延时函数,其实就是CPU什么都不做而根据传进来的数值来计数。比如上面写的6000000,那就是根据时钟来计数600000.所以当系统时钟频率改变时,同样的延时参数,完成计数的时间就会明显不同,体现到LED上闪灭的速度就不一样了。以上的代码,可以说是完全理解了,配置不同的时钟没有任何问题。今天完成了这个改变系统时钟的实验。

2024-04-10 00:15:00 173

原创 STM32学习和实践笔记(6):自己进行时钟配置的思路

void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振。

2024-04-09 15:20:41 775

原创 STM32学习和实践笔记(5):时钟树

系统时钟初始化,就是选定时钟源以及配置好各时钟路线的的分频参数。最终让右边这些时钟输出都有相应的确定频率的时钟输出。目前是使用的外部8M经过PLL的9倍,变成72M的SYSCLK系统时钟。外部低速时钟是:32.768KHz的LSI OSC。LS表示高速low speed. I表示内部的internal。外部高速时钟是:4-16MHZ的HSE OSC。HS表示高速high speed. E表示外部的external。外部时钟高低速各一个,内部时钟高低速各一个。内部低速时钟是:40Hz LSI RC.

2024-04-08 17:22:31 307

原创 STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (e)

这是使用 assert_param()函数来检查传进来的GPIOx是否在IS_GPIO_ALL_PERIPH这个宏定义范围之内。其中的->相当于GPIO_InitStruct.GPIO_Mode,就是取出这个结构体中的该成员变量的值的意思。很明显,就是根据收到的端口以及端口的引脚,输入输出模式以及工作速度,配置好相应的寄存器,没必要仔细看了。这个函数的功能是:按照在GPIO结初始化结构体的里的参数,来初始化GPIO。也就是检查传进来的参数是否有效。也就是传来进的只能是这里定义的这些。

2024-04-07 00:15:00 262

原创 Java 学习和实践笔记(51):二分法查找(折半检索)

第三步,如果该数等于这个中间数,那就找到了,返回位置索引。二分法查找(折半检索)又叫binary search.如果该数大于这个中间数,那么再对右边的数进行对半查找。如果该小于这个中间数,那么再对左边的数进行对半查找。第二步,将该数与排序后的数据集的中间一个数进行比较。重复第三步,直到找到为止。第一步,对数据实现排序。

2024-04-06 00:00:00 283

原创 2024年3月月终总结

3)Java学习和STM32的学习,每天一篇笔记博文,每天看csdn.net上的技术文章以及复习自己的笔记,没有中断。4)每天坚持听经闻法至少15分钟,以及在《证量的世界》公众号上发文一篇。《方剂学 邓中甲主讲 成都中医药大学 82集》看到了第21集。听净界法师的《大乘起信论》讲解,听到第28集了。一转眼三月份又过去了,写一下例行总结回顾下。5)坚持经常打乒乓球,每次打约50分钟左右。1)英语学习继续进行,日课一天都没有中断。6)自3月7日起,每天坚持盘腿打坐5分钟。2)中医学习每天15分钟,没有中断。

2024-04-05 00:15:00 191

原创 STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (d)

一个是GPIO的端口,这里选择是C端口,即GPIOC(也就是LED_PORT),另一个就是前面那个已给三个成员都赋值了的结构体GPIO_InitStructure。因为main.c中有#include "led.h",所以,编译器知道要到led.c中去执行LED_Init();这个函数有两个形参,这两个都是结构体指针变量,它们对应的值,都是地址。于是,编译器知道,这是一个结构体并且知道它里面的成员上面的三个。这个函数输入两个参数(实参,实际值,这里传过来的是地址)时,编译器先到"led.h"中查找这个。

2024-04-04 00:00:00 756

原创 STM32学习和实践笔记(4):分析和理解GPIO_InitTypeDef GPIO_InitStructure (c)

最后的一行的:#define IS_GPIO_SPEED(SPEED) (((SPEED) == GPIO_Speed_10MHz) || ((SPEED) == GPIO_Speed_2MHz) || \。与前面结构体类型的声明方式的定义一样,就是这样做了之后,可以直接使用GPIOSpeed_TypeDef作为这个类型的变量声明。这个枚举类型在这里起到的作用就是,如果使用它声明了某个变量,比如这里的GPIO_Speed变量,那么的它的取值只能在这个枚举类型里面已经写好的这3种,才是合法的。

2024-04-03 00:00:00 466

原创 STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (b)(含memory mapping图)

时,其实就是将对应的该引脚的寄存器地址给了GPIO_InitStructure.GPIO_Pin,这就表示,选中了GPIO_Pin_0来操作!一共有2的32次方个地址。比如,如果我需要选中GPIOC的第一个引脚并对其输入输出模式进行配置,那么,我需要做的就是找到控制GPIOC的第一个引脚寄存器的地址,然后对这个地址内的数值进行修改,也就达到了目的。所以,如果想操作某一个寄存器来控制某个引脚或者别的功能,先一步就是找到该寄存器的地址,然后就操作这个地址内的数据,这个地址内的数据变化了,相应的功能也就实现了。

2024-04-02 12:24:09 502

原创 STM32学习和实践笔记(4): 分析和理解GPIO_InitTypeDef GPIO_InitStructure (a)

它到底是一个什么样的类型?但是通过 type struct{}GPIO_InitTypeDef的方式,将这个结构体类型起了一个别名GPIO_InitTypeDef,这样定义之后,就可以直接使用GPIO_InitTypeDef作为这个结构体类型的声明。其实就是将对应的该引脚的寄存器地址给了GPIO_InitStructure.GPIO_Pin,这就表示,选中了GPIO_Pin_0来操作!GPIO_Pin则是像int a的a一样的变量名称,通过这个名字我们可以了解到,这个变量表示的是GPIO_Pin的引脚。

2024-04-01 14:45:49 1403

原创 Java 学习和实践笔记(51):基本的冒泡排序算法和优化的冒泡排序算法

基本的冒泡排序算法很简单,假定有10个数需要排序,那么就需要跑10轮,在每一轮里,都依次进相邻的两个数比较,如果右边的数比左边的数小,那么就将两个数交换位置,否则就不交换。这样比较的效果,就是每一轮,依次将最大、次大、次次大的数放到了右边,效果就像冒泡一样,所以叫冒泡排序。优化的冒泡排序算法,是增加一个判断条件,即如果在一轮排序后,发现没有发生过一次交换,那么下一轮就不再进行了,在上图中,也就是进行到第7轮时,就可以发现在第7轮,没有发生过一次相邻的数据交换,因此,就在这这一轮结束排序。

2024-03-31 00:00:00 329

原创 Java 学习和实践笔记(50):使用Comparable 接口确定对象根据什么属性来排序

例如,同样都是人,可以根据人的身高排序,可以根据人的年龄排序。因此,当对多个人进行排序时,就要事先确定好根据人的什么属性来排序。多个对象进行排序时,需要根据对象的什么属性来排序。使Comparable 接口,就是用来做这个的。

2024-03-30 00:15:00 307

原创 STM32学习和实践笔记(3): 使用库函数点亮LED后的学习总结

二,使用库函数来编程相当方便高效,要学会查找对应库函数的声明和定义并阅读了解之。具体方法就是在对应不明白处右键,go to definition是跳到该函数的定义处,也就是这个函数的c源文件处。而go to reference 则是跳到这个函数的声明处,也就是声明这个函数的h文件处。这样在修改和移值时,只需要修改头文件这一处地方就可以了,其余所有使用到的地方就会全部更改。4)为了方便程序和修改和移植,要习惯性地将可能变动的引脚通过宏声明定义在头文件处。

2024-03-29 00:15:00 199

原创 Java 学习和实践笔记(49):用javabean和一维数组的方式来存储表格数据

还是存储下面这个表格的数据,但使用另一种方法来做。

2024-03-28 00:00:00 238

原创 Java 学习和实践笔记(48):怎样用二维数组来存储表格数据?

怎样用数组的方式,来存储下面这个表格的数据?

2024-03-27 15:04:54 182

原创 Java 学习和实践笔记(47):二组数组的定义和内存分析

【代码】Java 学习和实践笔记(47):二组数组的定义和内存分析。

2024-03-26 00:15:00 93

原创 Java 学习和实践笔记(46):Arrays类的常用操作(数组的输出、排序、查找和填充)

Arrays类包含了:排序、查找、填充、打印内容等常见的数组操作。使用前先要导入这个类。本节主要讲的是一个单独专用于数组 操作的类——java.util.Arrays.上一节数组的遍历和复制,使用的是系统自带的方法。

2024-03-25 15:16:40 89

原创 Java 学习和实践笔记(45):数组的遍历,复制,

System.arraycopy(源数组,源数组起始位置,目标数组,目标数起始位置,要复制的元素数量)数组的复制,就是使用下面这个系统自带方法来进行。

2024-03-24 00:30:00 174

原创 Java 学习和实践笔记(44):数组的声明定义和使用以及初始化

【代码】Java 学习和实践笔记(44):一维数组的声明、定义和使用。

2024-03-23 00:15:00 264

原创 Java 学习和实践笔记(43):数组的四个基本特点和学习任务

其中,数组中的每一个数据称为一个元素。元素可以通过一个索引(下标)来访问它们。一,数组的长度是确定的:数组一旦被创建,它的大小就是不可以改变的了。四,数组变量属于引用类型,数组也是对象,数组中的元素相当于对象的。二,其元素的类型必须是相同类型,不允许出现混合类型。三,数组类型可以是任何数据类型,包括基本类型和。数组,在Java里,也是一个对象。

2024-03-22 00:00:00 228

原创 Java 学习和实践笔记(42):内部类(inner class)

对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后会出现Outer.class和Outer$Inner.class两个类的字节码文件。所以内部类是相对独立的一种存在,其成员变量/方法名可以和外部类的相同。1)内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直。2)内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。不能访问内部类的内部属性。内部类只是一个编译时概念,

2024-03-21 00:00:00 424

原创 Java 学习和实践笔记(41):API 文档以及String类的常用方法

JDK 8用到的全部类的文档在这里下载:Java Development Kit 8 文档 | Oracle 中国

2024-03-20 00:00:00 247

原创 Java 学习和实践笔记(40):String类详解

如果打一个比喻,就类似object总类,就相当于我的电脑,然后下面的各个包,就相当于电脑的文件夹,实际的类就相当于文件夹里的文件。然后在这个总类下面,有系统自带的子类,以及用户自定义的子类。这些子类通过放在不同的包内,方便组织、管理和使用。可以说整个Java语言,就是关于类的定义、类的结构以及类的实现(对象)的描述。首先它是属于java.lang这个package(文件夹)内的一个类(文件),其次,它本身又通过import,引用了别的包里的类,定义自己。如下的String类,就展现了这个结构。

2024-03-19 00:00:00 300

原创 Java 学习和实践笔记(39):接口的多继承

前面学过,普通的类,只支持单继承,不支持多继承。但是接口却可以支持多继承。在上图中,销售经理可以同时继承管理人员和销售人员的特性。

2024-03-18 14:58:27 180

原创 Java 学习和实践笔记(38):接口中的静态方法

如果子类中定义了相同名字的静态方法,那就是完全不同的方法了,直接从属于子类,可以通过子类名直接调用。这与方法重写是完全不同的,不要搞混了。JAVA8以后,我们也可以在接口中直接定义静态方法的实现——以前是不行的。这个静态方法直接从属于接口(接口也是类,一种特殊的类),

2024-03-17 00:00:00 197

空空如也

空空如也

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

TA关注的人

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