最近手头项目上有个需要模拟串口的地方,而模拟串口部分有这样的一个需求:当Strat信号来的时候启动定时器TIM3,到52us后采样Start信号是否是低电平,然后希望将定时器的周期改成104us,采样剩余的9个bit。
解决思路:
① 外部中断触发时候启动TIM3(同时关闭外部中断使能),等52us后在TIM3中断里判断Rx的状态;
② 如果是低电平就改变定时器TIM3的周期为104us;
③ 如果是高电平就不要接收了并恢复外部中断使能;
④ 在后续的9次中断里依次接收bit0...bit7还有STOP位;
⑤ 当接收到STOP位的时候就可以关闭TIM3了,然后再恢复外部中断使能;
知识难点:
TIM3的ARR寄存器一开始等于52-1;
等到START是低电平就改成104-1;
为了能让修改后ARR寄存器立即妥妥生效,建议在初始化完TIM3后添上这么一句:
TIM3->CR1 &= ~TIM_CR1_APRE;
通过这个波形我们可以看到TIM3的周期一开始是52us以后就变成104us了,我们再仔细观察2帧之间有208us(我实际测量的)空闲,这个波形是PC上一个串口工具发的,由此可见它这一个bit耗时104us*12=1.248ms
关键字:STM32 定时器 周期动态
引用地址:
STM32 定时器周期动态修改
推荐阅读最新更新时间:2024-03-16 16:23
单片机学习心得1:89c51单片机定时器应用!
定时器的应用涉及到中断方面的知识,可以先了解中断的概念再来看定时器 如,一个16位的定时器,它所能计数的范围是0~65535,如果单片机采用的是12M的晶振,那么定时器单次最长的时间为65535((1/12)12),因为一个一个机器周期等于12个振荡周期,那么定时器加一所用的时间是1/12M*12是1us,也就是一个12MHz晶振的51单片机单次最长时间约为65ms. 定时器的控制 89c51的定时器由两个寄存器控制,分别是工作模式寄存器TMOD和控制寄存器TCON 工作模式寄存器TMOD是用于控制定时器0/1的工作模式,通过对TMOD进行赋值,则可以改变定时器的工作模式 具体各位的定义如下 当我们使用定时器功能时,就只
[单片机]
AVR单片机定时器输出PWM的设计及注意问题
一、定时/计数器PWM设计要点 根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点: 1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。 2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。 3.快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。此时计数器仅工作在单程正向计数方式,
[单片机]
STM32的条状指纹采集与拼接系统
引言 指纹识别作为生物认证中可靠性较高、方便性较好、性价比较高的一种技术,已经得到了全面的应用。指纹采集是指纹识别的重要组成,其核心硬件就是指纹传感器。随着移动嵌入式设备自身体积越来越小,以及对成本和功耗的更高要求,指纹传感器也向着小型化方向发展。其中条状指纹传感器(也称为刮擦式传感器)具有体积小、价格低、无指纹残留等优点,在移动嵌入式领域得到越来越多的应用。条状指纹传感器是一种窄条形半导体传感器,无法一次性采集到完整的指纹图像,要求连续采集划过传感器表面的手指指纹,并对采集到的窄条状指纹图像序列进行拼接,从而形成完整的指纹图像。 本系统采用STM32F103RD处理器作为主控器件,采用AES1711条状指纹传感器作为采集
[单片机]
STM32部分知识之I2C
I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 多主机I2C总线系统结构: 因为STM32自带的I2C不稳定所以采用模拟I2C,所以首先的初始化I0口 void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,
[单片机]
关于STM32串口通信使用printf发送数据的配置方法
开发环境: Keil RVMDK 在 STM32 串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。 下面就说一下使用printf需要做哪些配置。 有两种配置方法: 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含 stdio.h (标准输入输出头文件)。 2、在main文件中重定义 fputc 函数。如下: // 发送数据 int fputc(int ch, FILE *f) { USART_SendData(USART1, (unsigned char)
[单片机]
STM32 CRC32与对应的软件CRC32
简单实现STM32 CRC32使用 使用前记得使能STM32 CRC时钟 //STM32硬件CRC32 byte数据计算,将数据移到最高位,低位补上FF u32 stm32_crc32_byte(u8 *pBuff, u32 len) { u32 i; u8 buff ; u32 *p32 = (u32 *)buff; CRC- CR = 1; //复位CRC寄存器 buff = buff = buff = buff = 0XFF; for(i = 0;i len;i ++) { buff = pBuff ; CRC- DR
[单片机]
Stm32 外部中断EXTI使用说明
硬件情况:采用PA11管脚 需要明确的是,PxN管脚共用外部中断线EXTIN和外部中断向量EXTIN_IRQn和中断服务程序入口EXTIN_IRQHandler,但是需要注意的是 共用EXTI9_5_IRQn和EXTI9_5_IRQHandler、 共用EXTI15_10_IRQn和EXTI15_10_IRQHandler 基本过程: 1、设置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); 注意需要打开AFIO时钟 2、配置GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_
[单片机]
[STM32]GPIO工作原理詳解
一、STM32的GPIO介绍 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F103ZET6芯片为144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 STM32的大部分引脚除了当GPIO使用之外,还可以复用位外设功能引脚(比如串口),这部分在【STM32】STM3
[单片机]