STM32定时器篇——通用定时器的使用(定时中断,PWM输出) 从上图可以看见,总线APB1(最大只能到36MHz)给通用定时器提供时钟,但不代表通用定时器的时钟频率为36MHz,因为通用定时器不直接由APB1提供,而是会先经过一个倍频器。见上图APB1预分频系数为1则倍频系数为1,则频率不变,否则频率乘二。而对APB1的预分频在启动文件就已经配置好了(system_stm32f10x.c中的SystemInit()函数),分频系数为2,故定时器时钟为72MHz。PWM应用于在具有惯性的系统中,可以通过一系列脉冲的宽度进行调制来等效地获得所需要的模拟参量。
STM32定时器入门篇——(基本定时器的使用) 时钟源来源于APB1总线(不懂的可以看看时钟树,这里先不做过多详细介绍,一般都为72MHZ)当然,通用定时器和基本定时器都来自这个总线。计数器时钟CK_CNT:每来一个时钟,先经过控制器,通过预分频器的分频,0为1分频,也就是不分频,1为2分频,如果时钟为72MHZ的话到达计数器则为36MHZ(预分频器为16位,最大可以写65535,也就是65536分频),即经过预分频器后的时钟为计数器时钟CK_CNT。公式CK_CNT = TIMxCLK/(PSC + 1)
STM32定时器篇——Systick定时器的使用(实现delay延时函数) Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器对于CM3,CM4内核芯片,都有Systick定时器。当Systick计到0时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。l常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。
Keil软件仿真的使用 复位按钮点击这个按钮会使目标硬件复位,功能等同于硬件上的复位按钮。开始或继续执行程序,用来快速执行到断点处。如果程序已经停在一个断点上,点击这个按钮将继续执行程序直到遇到下一个断点或程序结束。也就是说如果没有断点,程序会一直运行。停止程序执行。这个按钮将中止当前正在运行的程序。执行程序中的下一行代码。如果当前行调用了函数,将进入该函数内部。执行下一行代码,但是不进入函数内部。如果当前行调用了函数,将执行整个函数,然后停在下一行。
NRF24L01(2.4G)模块的使用——SPI时序(软件)篇 SPI 是英语的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上占用四根线,SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISI(Master Input Slave Output)、SS(Slave Select) ,其支持总线挂载多设备(一主多从)。主要应用在 EEPROM,FLASH,实时时钟,AD。
MPU6050篇——姿态解算,卡尔曼滤波 首先我们打开inv_mpu.c文件夹,如下图所示便是第一个要修改的地方:我们将其修改为:define定义可以改为自己使用的型号的单片机。修改后在上面定义这个宏,并加上一个MPU6050的宏,用于源文件区别芯片:然后我们打开inv_mpu_dmp_motion_driver.c,找到如下地方,和上面一样:修改为:(记得在上面加入#define STM32F10x_MPU6050)此时还有一些地方需要完善,但大致已经改完了,修缮一下:编译,报3处错,如下:这里报错:(inv_mpu.h文件中)
MPU6050篇——温度与角度的读取 1. 首先是2. 然后接下来便是:其中MPU6050的地址为7位,而八位为一个数据帧,所以在最后一位再加一位是指定对寄存器是读还是写操作。而器件地址上篇也介绍了,当AD0为0则地址为0X68,否则为0X69,这里我接的0,即地址为0x68;左移一位,低位自动补0,我们为写操作,所以无需操作。4. 写需要操作的寄存器地址:这里以reg代替。6. 发送需要对寄存器操作的数据:以data代替7. 最后等待Ack响应,结束IIC;这样,一个写时序就写好了;
MPU6050篇——(MPU6050的介绍及IIC时序) MPU6050是全球首例 9 轴运动处理传感器。它集成了 3 轴 MEMS 陀螺仪,3 轴 MEMS 加速度计,以及一个可扩展的数字运动处理器 DMP(Digital Motion Processor),可用 I2C 接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其 I2C 或 SPI 接口 输出一个 9 轴的信号(SPI 接口仅在 MPU-6000 可用)。MPU-60X0 也可以通过其 I2C 接口 连接非惯性的数字传感器,比如压力传感器。
STM32——DMA的使用(定时器触发ADC多通道扫描模式) DMA的英文直译的意思是直接内存访问,主要作用就是转移数据 ,用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输(通俗的讲就是讲数据从一个地址空间复制到另一个地址空间)。无须内核参与,数据可以通过DMA快速地移动,可以节省CPU的资源来做其他操作(比如使内核腾出手专心操作IO口或响应中断等)。在此举个例子让你们更好理解DMA带来的作用:比如下面的这个程序是先发送10000个串口数据,然才才能让LED闪烁。即发送数据和LED闪烁无法同时进行。for(i = 0;i<10000;i++)
STM32——ADC篇(ADC的使用) STM32F1的ADC为12位ADC,是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部 信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右 对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。STM32的ADC其转换时间为1us。
STM中断篇——外部中断的使用 所谓 NVIC ,即嵌套向量中断控制器,全称 Nested vectored interrupt controller。属于是内核的器件,其作用是对STM32中的中断进行管理,因为M3内核中的中断数量很多,当同时出现多个中断时,优先处理哪个中断?以及那些中断不处理等,都要靠NVIC 进行控制。NVIC可以统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先等级经行分组,进一步设置抢占优先级和响应优先级。
单片机数据类型长度以及优先级 如果为不同类型数据时,编译器会先将低级的数据类型转换为较高级的数据类型且运算后结果为高级数据类型。其长度是不确定的,主要和CPU的位数有关,即指针大小实际上是由寻址宽度决定的。8位的和16位的指针长度分别为1字节和2字节,32位处理器则是4字节,而64位处理器则是8字节了。1.在日常编程过程中,有符号型(signed)和无符号型(unsigned)两种如果不是必须的,尽可能选无符号型,能有效省去符号位检测,减去CPU负担。优先级顺序大概可以记为:算术运算>关系运算>逻辑运算>赋值运算。
从0开始点亮OLED屏幕(五)OLED显示汉字,图片 size1/8+size1%8的作用是取出汉字所占页数,乘上字宽也就得出需要写的次数。(一次写8个竖着的像素点,原理前文有介绍过)利用画点函数吧八个竖着的像素数据画出来,x就往下自增1,当x的增量为字宽时,就移到下一页继续写,这个就是现实汉字的原理了。如果是从我第一篇文章看起,这个还是很容易理解的。
从0开始点亮OLED屏幕(三)OLED画点,显示字符、字符串 而一个数据有8个点,我们可以利用画点函数去显示出来,即画一个点,y坐标加1,画完一个数据后便让x加1画后续一列的8个像素点,此时应该将y的值从新回到一开始的y值,也就是把y0赋过来。size1/8得此字符所占页数,(size1/2)得字符在x的位数,页数乘x方向位数即得出需要写的次数size2。可以发现第三个形参定义的是一个指针,指向要显示的字符串地址,到时显示完一个字符,地址自增,显示下一个字符,在此之前先判断一下是不是合法的字符(是不是可打印显示字符),最小为空格32、最大为'~':126。