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 ...
MCU通信协议(二):I2C协议
I2C概述
I2C(Inter IC
BUS)是一种半双工的通信协议,具有以下特点:
同步半双工:一根线发送和接收数据,最大化利用线资源;时钟线保证时序一致性,去除对硬件异步电路依赖;
两根数据线:即时钟线SCL(Serial
Clock)与数据线SDA(Serial Data)
一主多从/多主多从:允许多个从机挂载在I2C总线上,一个系统的从机也可以通过多主多从成为主机;
具有数据应答功能:发送、接收一个字节都需要进行数据确定;
通信速率较低:100kbps、400kbps、3.4Mbps;
I2C硬件设计
硬件上,I2C只需要两根线就可以将多个从机链接在一起,节省了数据线的资源。另一个特点是,I2C的数据线均采用开漏输出的模式。
首先SDA必须采取开漏输出:在GPIO模式讨论过开漏输出的特点,也即低电平仍然是mos管导通接地,是一种强下拉。而漏极是开路的,说明无法直接输出高电平,只能通过外接电阻(I2C中一般采用4.7k限流电阻)输出高电平,mos管阻值很大,因此上拉电压接近外部电压,是一种弱上拉;这种模式在主机、从机SDA或者实现从机线与时,不会 ...
stm32开发:Keil环境配置
环境
Keil是一款强大的Debug软件,尤其适用于stm32还有其他一系列32、8系的处理器标准库、寄存器开发。但是少有的缺点是从头新建一个工程配置需要的步骤和细节也比较多,日子长了脑袋也不好使,每次都要查几次,就有了这篇文章作为参考记录;更换stm系列芯片例程也可以参考这篇文章。
环境:
Win10
Keil MDK 5/Keil MDK+C51 5
stm32f103c8t6
ST-Link
后两者不是必须,相应调整部分内容即可。
新建工程
新建一个文件夹,Project项新建项目指定该文件夹,然后会进入芯片选型;芯片选型来自在线下载(弹窗)或者手动导入(厂商提供的工具包);这里选择对应的芯片信号即可,OK完成创建;
在文件夹下可以看到新建的工程文件,创建新文件夹Start,存放stm32系统启动文件,包含:
core_cm3.c/core_cm3.h:提供了Cortex-M3内核的相关函数,例如中断、异常处理;
startup_stm32f10x_md.s:汇编语言编写的启动文件,设置堆栈指针、数据段等,后缀md代表中密度 ...
MCU通信协议(一):SPI协议
SPI概述
SPI(Serial Peripheral
Interface,串行外设接口)协议是一种全双工通信协议,SPI最主要的特点是:
一主多从:即一个主设备(主机)同时和多个串行设备(从机)通信;
同步全双工:具有时钟线作为同步信号,主机和从机需要共地,如果从机没有独立供电还需要主机提供供电口;能够同时发送和接收数据;
简单且高速:SPI的时序简单,因为线多端口多没有电平瓶颈(每新加一个从机主机就要增加一个SS端口进行片选,例如三个从机就要三个主机SS端口),主机输出配置成推挽输出,输入(MISO)配置成浮空或者上拉输入,电平驱动能力强;通信速率极高(几十Mbps);
四根通信线,接口开销大:SCK(Serial
Clock)、MOSI、MISO、SS(Slave
Select),其中MOSI、MISO其中的M代表主机Master,S代表从机Slave,分布代表主机发从机收,主机收从机发,MISO就接在从机的MISO上,MOSI就接在从机的MOSI上(一般命名上,从机作为没有主控的设备,MISO会命名成输出端,如DO、SDO等,MOSI会命名成DI、SDI等, ...
开源器件--温湿度传感器DHT11
参考文章:《DHT11详细介绍》:http://t.csdn.cn/L0M3r
本文实验平台:MM32F527x平台验证通过
开源器件这个系列将记录一系列我接触到的各种器件驱动模块,现在开源的资料众多,编程已经是基于模块化的思想,尤其是Arduino、Micropython等语法简单的开发语言的入局,大大降低了开发者开发难度。对于最经典的32位产品STM32而言,意法半导体公司也停止了标准库的更新,转而投入HAL库开发。以上无一例外是隐藏了部分底层原理结构换取调用的便捷性,这种对用户友好的做法很大程度上会带来系统性能的牺牲。接下来的这款DHT11的开发虽然简单,但是debug过程也遇到了一些与性能有关系的问题值得记录,与其让它烂在网盘里,不如发出来可能会对别人有所启发。
DHT11工作时序
DHT11采用单总线通信方式,过程为: 1
主从机引脚初始化,主机拉高总线至VCC,从机高电平下无应答; 2
主机发出通信请求,拉低总线电平至少18ms,再拉高总线电平20-40us,切换至浮空输入监听从机响应;
3
从机识别到主机信号,发起响应:从机拉低总线电平80us,再拉高电平 ...
格式化输出与数据类型
俗语说浅水淹死人,作为Hello
World的第一门必修语法,格式化输出就是这样的存在。明明熟背在心,隔几个礼拜不print就只记得print和printf了,每次要用都要上网再查一次。干脆在这篇博文,简单归纳一下C语言、python两大块常用的格式化输出语法。
参考文章: 《printf()用法详解》
《简述strcpy、sprintf、memcpy》 《C/C++中volatile关键字详解》
C语言 printf sprintf fprintf
printf
最简单用法: 1printf("Hello World")
和python的print和C++的cout不同,printf不能直接输出字符数据,如printf(a)这种写法是错误的,必须经过格式化参数输出,参数以下:
123456789参数 数据类型 说明 %d(%i) int 十进制有符号32bits整数 %u unsigned ...
stm32标准库开发(一):八种GPIO模式介绍
八种GPIO模式
stm32定义了GPIO的八种模式,分别为4种输入模式和4种输出模式,使用场合、时机有所不同:
12345678910typedef enum{ GPIO_Mode_AIN = 0x0, GPIO_Mode_IN_FLOATING = 0x04, GPIO_Mode_IPD = 0x28, GPIO_Mode_IPU = 0x48, GPIO_Mode_Out_OD = 0x14, GPIO_Mode_Out_PP = 0x10, GPIO_Mode_AF_OD = 0x1C, GPIO_Mode_AF_PP = 0x18}GPIOMode_TypeDef;
输入模式
GPIO_Mode_AIN:模拟输入模式;这是最容易区分的模式,只有需要模拟输入时才需要这种模式,例如AD模数转换。
后面三种模式可以放在一起讨论
GPIO_Mode_IN_FLOATING:浮空输入模式
GPIO_Mode_IPD:下拉输入模式
GPIO_Mode_IPU:上拉输入模式
这三个输入模式是配置红框位置而来,开关如果全 ...