C++记忆恢复集要之一:C++基础
C++基础
1. 经典头
12#include<iostream> //预编译using namespace std;
iostream是C++用于管理输入和输出的头文件,包含了在控制台、文件中输入输出的类和函数。
std是C++定义的一个命名空间,cin、cout都在此命名空间中管理,两种输出方式:
1 声明命名空间:using namespace std;
2 域解析符号: std::cout<<“hello
world”<<endl;
2. 面向对象编程语言的三要素:
封装:把客观事物封装成抽象的类,而且仅让可信的类或者对象进行操作;将成员函数和成员变量封装在内部,根据需要设置访问权限。通过成员函数管理内部状态。如C语言结构体内不能定义函数,而C++可以。
继承:一个类可以继承另一个类的成员函数和成员变量,复用性大大增加。
多态:也即一个接口,多种方法;程序在运行时才决定调用的函数,是面向对象的核心概念。分为静态多态(函数重载、运算符重载)和动态多态(虚函数、纯虚函数、虚析构函数、纯虚析构函数);
3. ...
引入Aplayer后图片无法正常显示
作为一款轻便的H5音乐播放器,Aplayer插件提供了很好的界面和效果,比普通的HTML播放器更加方便美观。根据官方文档完成代码框架搭建后却发现背景图片莫名不显示了。。。原来一直调试时背景图片依靠浏览器缓存所以在本地服务器运行没有消失,等真正推送在无缓存页面打开才原形毕露。检查了本地的配置没有发现什么问题,而检查服务器时发现网页渲染CSS文件首行莫名多了:
1<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src= ...
外部引用JavaScript解决背景图片闪屏
记录一些优化的方案,给相同问题的小伙伴参考一下。最近利用外部css文件实现了背景切换的目的,然而发现了一个小问题。每次清除缓存打开网站,需要重新加载图片,图片和图片切换之间会出现大概零点几秒的白屏。视觉上就像闪屏,等待所有图片加载完成再进行循环切换则没有该问题,猜测是网络环境影响。但尝试了不同网络、将图片压缩至500KB还是无法解决,最后完善了一下切换逻辑,效果感觉还行。
1234567891011121314#web_bg { /*background-image:初始图片路径; //可有可无,效果无太大影响*/ animation: gradientFade 60s infinite; /*一次切换时间设置 */}/*如果要增删背景图片务必修改.css文件和.js文件*/@keyframes gradientFade { 0%, 100% {background-image:图片路径1;} 25% { background-image: 图片路径2;} 50% & ...
stm32标准库开发(六):ADC模数转换
ADC转换原理:逐次逼近型ADC
stm32的ADC转换电路是一种逐次逼近型的ADC,采用二分法估测模拟电压。原理图:
以上是一个八位的逐次逼近型ADC逻辑图,输入通道有8个,通过地址锁存器打开对应的通道使模拟电压进入比较器。这里的DAC具有参考电压ref,一般也是取供电电压VCC,0——VCC也是输入电压的范围,起始时逐次逼近(SAR)寄存器最高位为1,其余为0。
DAC根据SAR寄存器产生电压,例如初始最高位为1,其余为0,即是VCC/2,如果输入模拟电压大于参考电压,则高位置1,将第二位置1,仍然高于置1、反之置0,以此类推,SAR为8位,经过8次比较即得出该模拟电压的数字编码。
stm32的ADC逻辑设计
stm32使用的SAR是12位的,意味着其电压分辨率是4096,输出结果0——4095,输入电压范围0——3.3V,最多18个输入通道,其中16个是外部引脚输入,2个是内部信号源,分别来自内部校准电压Vrefint和温度传感器。
这里的规则组、注入组是为了同时接收多通道ADC,无需重复接收ADC请求,只要将ADC引脚需求提交,系统会按顺序转换各个通道的模拟 ...
MCU通信协议(三):UART协议
USART和UART
UART(Universal Asynchronous
Receiver/Transmitter)是通用异步接收/发送器,即串口通信。
USART在UART的基础上加上同步电路(Synchronous),是目前单片机最常用的串口电路设计,允许输出同步时钟实现通信(但不能接收,不能被同步驱动,即只可作主机)。但是最常用的串口模式还是采样异步通信的方法,即UART,只有特殊场合才会使用同步电路。
UART通信特点
异步全双工的通信方式:只需要TX、RX两根数据线进行通信,双方约定波特率进行发送和接收,无需时钟线。可以弃用其中一条线转换成半双工通信。
点对点的通信协议:没有SPI、I2C、CAN从机挂载机制,仅点对点。
通信格式简单:起始位+数据位+奇偶校验位(Optional)+停止位,数据位(8/9)、停止位位数(0.5/1/1.5/2)可选,最常见是8位数据位、无奇偶校验、1位停止位。
传输距离有限、通信速率较低:常用9600bps波特率,传输距离几十米,波特率越高,传输距离越短。
电平标准
适应长线串口传输,提出几种不同电平标准,甚至 ...
stm32标准库开发(四):TIM输出比较
输出比较
输出比较(Output
Compare,OC)是通用、高级定时器的一个功能,主要作用是产生高低电平输出,即PWM(Pulse
width modulation,脉冲脉宽调制)波。
依赖于三个寄存器,前两个是前文提到的自动重载预装寄存器和计数器CNT,现在多了一种称为捕获/比较寄存器(Capture
Compare
Register,CCR)。根据CNT和CCR的大小关系,决定输出电平的高低。CCR本身也是影子寄存器。
除了常规的PWM波,还有其他几种工作模式:下表简单认为有效电平为高电平、无效电平为低电平:
最常用的是PWM模式1:假设向上计数时,0——CCR输出高电平,CCR——重载值输出低电平,实现了灵活的占空比。
PWM模式2是PWM模式1的反相;
其余几种模式在特殊场合有用,匹配时电平反转可以输出50%占空比的PWM波形等。
几组公式: 前面用过的分频公式:其中Freq是最终输出频率,CK_PSC是原始时钟(内部、外部),PSC和ARR为分频、重载值。
占空比也容易理解:
比较少见的是分辨率,PWM的分辨率衡量了每提高计数1, ...
stm32标准库开发(三):TIM定时中断
参考江科大的讲解,记录了TIM通用定时器的常用功能,包括定时器中断,以及后面文章的输入捕获测量频率、输出比较实现PWM波、编码器测速等。
TIM定时器
TIM(Timer)是单片机最常用的片内外设之一,能够完成很多复杂任务,stm32系列的定时器资源分为高级定时器、通用定时器、基本定时器,最常用的是通用寄存器,高级定时器会在三相电机驱动用得较多:
其中STM32F103C8T6定时器资源包含TIM1、TIM2、TIM3、TIM4,即一个高级定时器+三个通用定时器。
基本定时器
基本定时器的任务主要是产生定时中断、主模式触发DAC:
基本定时器结构包含RCC内部时钟(c8t6主频72M),触发控制器(只能选择内部时钟、主模式DAC),以及时基单元。
时基单元包括预分频器PSC、自动重载寄存器、CNT计数器,PSC是一个16位寄存器,对内部72M时钟进行分频,最大65536分频。自动重载寄存器存储了计数的目标值,计数器从0开始向上向重载值计数,一旦达到重载值,就会产生定时器中断并且清零计数值重新计数,产生的中断既可以通向NVIC触发CPU中断处理,也可以作为事件中断连 ...
stm32标准库开发(二):EXTI外部中断
概述
EXTI(External
Interrupt,外部中断)是stm32用于处理外部信号的重要模块,中断允许CPU暂停执行当前程序,转而去执行中断程序,处理完了继续返回主程序执行,中断的机制提高了CPU执行任务的灵活度,许多常见的任务离不开外部中断的支持,它通过引脚外部电平触发中断,例如按键触发中断、热敏/光敏电阻的感应控制电路、红外对射管计数、旋转编码器计数等,以下记录了EXTI标准库的相关配置。
中断向量表
stm32f10x系列芯片提供了68个可屏蔽中断通道,也即68个中断源,其中13个是内核的中断,用于处理内核的异常,在裸机开发中很少使用;其他常用的包括EXTI中断,定时器中断(定时任务)、DMA中断(通知转运数据)、串口、SPI、I2C、其他功能性中断(如看门狗中断、电压检测)等,说明几乎所有外设都能享用主控的中断资源。
因为硬件上的限制,stm32f10x通过固定的编址以存储中断程序位置,中断向量表是中断的一个重要数据结构,记录了中断服务和中断程序地址的映射关系,部分如下:
在裸机开发中通常不必关心地址值,但对操作系统和内核而言,这是重要的。
NVIC ...