STM32中采用DMA实现方波的产生和捕获

STM32中采用DMA实现方波的产生和捕获
STM32中采用DMA实现方波的产生和捕获

STM32中采用DMA实现方波的产生和捕获

闫建国,孙克怡

【摘要】1 STM32微控制器介绍rnSTM32系列微控制器是ST公司基于Cortex—M3内核的高集成度的微控制器。它在性能、价格、功耗和实时性方面树立了一个新的标杆,集成了Cortex—M3内核,以及双ADC、多用途的通用时钟TIMx、RTC、I^2C、SPI、UART、CAN、DMA、USB等丰富的外设。其功耗在全速72MHz所有模块都打开时也仅仅为36mA,在低功耗模式下其功耗仅为2μA。

【期刊名称】单片机与嵌入式系统应用

【年(卷),期】2011(011)010

【总页数】3

【关键词】DMA;低功耗模式;捕获;方波;微控制器;高集成度;ST公司;I^2C

1 STM32微控制器介绍

STM32系列微控制器是ST公司基于Cortex-M3内核的高集成度的微控制器。它在性能、价格、功耗和实时性方面树立了一个新的标杆,集成了Cortex-M3内核,以及双ADC、多用途的通用时钟TIMx、RTC、I2 C、SPI、UART、CAN、DMA、USB等丰富的外设。其功耗在全速72MHz所有模块都打开时也仅仅为36mA,在低功耗模式下其功耗仅为2μA。

2 DMA和TIMx简介

STM32系列微控制器均含有DMA和通用时钟TIMx模块。其低端型号中仅包含DMA1,支持7个通道;高端型号还包括DMA2,支持5个通道。它的每个通道可任意指定工作模式,如内存到内存、内存到外设或外设到内存等。当

stm32f407 输入捕获两路方波

stm32f407 输入捕获两路方波,测下降沿时间间隔2017年08月07日18:49:23 muyepiao1阅读数:1303 标签:stm32f407输入捕获 记录调试过程: 实现方法:用TIM3,TIM4设置为输入捕获(下降沿触发),使能捕获中断,更新事件中断。 有时候两个下降沿间隔时间太久,超过溢出值,所以要开更新中断。更新中断手册上有讲: “●发生如下事件时生成中断/DMA 请求: —更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发) —触发事件(计数器启动、停止、初始化或通过内部/外部触发计数) —输入捕获 —输出比较 ” ·(计数器溢出,UDIS =0 ) --- (生成更新事件)--- 生成(更新中断或者DMA 请求) ( URS =0 ) ·计数器溢出,生成更新事件,(UDIS =1,禁止更新事件,所以此处还需UDIS =0) ·URS用来设置跟新请求源,就是用来选择哪些行为可以生成更新中断。此处URS=0; ·开始看手册时,不理解更新事件,其实不懂的时候,应该多看几遍手册,以下为手册原话: 发生更新事件时,将更新所有寄存器且将更新标志(TIMx_SR寄存器中的UIF位)置1(取 决于URS位): ●预分频器的缓冲区中将重新装载预装载值(TIMx_PSC寄存器的内容) ●自动重载影子寄存器将以预装载值进行更新

·影子寄存器存在的意义在于同步。具体可以百度。 在上是初始化设置要注意的地方。 捕获的过程描述,手册有讲,以下为来自手册: 在输入捕获模式下,当相应的ICx 信号检测到跳变沿后,将使用捕获/比较寄存器(TIMx_CCRx) 来锁存计数器的值。发生捕获事件时,会将相应的CCXIF 标志(TIMx_SR 寄存器)置1,并可发送中断或DMA 请求(如果已使能)。如果发生捕获事件时CCxIF 标志已处于高位,则会将重复捕获标志CCxOF(TIMx_SR 寄存器)置1。可通过软件向CCxIF 写入0 来给 CCxIF 清零,或读取存储在TIMx_CCRx 寄存器中的已捕获数据。向CCxOF 写入0 后会将 其清零。 要在重复捕获前,读取捕获值。由于我的输入信号是连续方波信号。重新开始一次捕获前,一定要清除中断标志位,防止误入中断。 中断处理后,要记得清标志。 清除状态寄存器 以下为TIM3初始化代码。 //捕获功能 void InitBuhuo(void) { TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

使用STM32的定时器进行输入脉冲的计数

使用STM32的定时器进行输入脉冲的计数STM32的定时器具有计数功能,在实际应用中可以用来对引脚上的输入信号进行统计。其输入信号作为计数时钟,输入引脚为ETR引脚。 本例程使用Timer 2,其ETR输入引脚为PA1,初始化是设置该引脚工作模式为输入模式,Timer2的工作模式为从模式。 为了方便测试,另外使用PC6模式输出一个时钟信号。测试时将PC6与PA1短接。(用户也可另外连接一个时钟信号到PA1引脚上。) 代码如下: int main(void) { unsigned char i_Loop; unsigned char n_Counter; #ifdef DEBUG debug(); #endif RCC_Configuration(); // System Clocks Configuration NVIC_Configuration(); // NVIC configuration GPIO_Configuration(); // Configure the GPIO ports TIM_TimeBaseStructure.TIM_Period = 0xFFFF;

TIM_TimeBaseStructure.TIM_Prescaler = 0x00; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base configuration TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInver ted,0); TIM_SetCounter(TIM2, 0); TIM_Cmd(TIM2, ENABLE); for(i_Loop = 0; i_Loop < 100; i_Loop ++) { GPIO_SetBits(GPIOC, GPIO_Pin_6); Delay(10); GPIO_ResetBits(GPIOC, GPIO_Pin_6); Delay(10); } n_Counter = TIM_GetCounter(TIM2); while (1) {}

STM32_DAC 实验(正弦波_方波_锯齿波_发生器)

/*---------------------------------------------------------------------------- * 开发者:红芯电子_飞哥 * 功能:STM32 DAC 数模转换(正弦波/矩形波/锯齿波)输出实验 * 说明:按SW5 输出正弦波/ 按SW4 输出矩形波/ 按SW3 输出锯齿波, 输出端口PA4 * 网址:https://www.360docs.net/doc/bc4072126.html, *----------------------------------------------------------------------------*/ #include #include // STM32F10x Library Definitions #include "STM32_Reg.h" // STM32 register and bit Definitions #include "STM32_Init.h" // STM32 Initialization #include "common.h" #include "sine_wave_1024.h" // 输出端口: PA4 #define SINE_W A VE 1//sine 正弦波 #define RECT_W A VE 2//rectangular 矩形波 #define HACKLE_WA VE 3//hackle 锯齿波 UINT8 flag = 0; UINT8 func = SINE_W A VE; /*---------------------------------------------------------------------------- MAIN function *----------------------------------------------------------------------------*/ int main (void) { UINT16 i = 0; UINT32 *pDAC_BASE = (UINT32 *)DAC_BASE; stm32_Init(); // STM32 setup LED_Init(); //打开DAC时钟使能,请参考STM32_Ref_Manul.pdf 第105页 RCC->APB1ENR |= (UINT32)(1 << 29); //设置DAC控制参数,请参考STM32_Ref_Manul.pdf 第260页,里面有对该寄存器中每一位的介绍 *(pDAC_BASE + 0x00) = (0x01 << 0)| (0x00 << 2) | (0x04 << 3) | (0x03 << 6) | (0x0b << 8); *(pDAC_BASE + 0x04) = 0x01;

STM32单片机定时器调试之方波输出

STM32单片机定时器调试之方波输出 今天试着让STM32的定时器输出50%占空比信号,按 照例程写了一下方波初始化函数,例程用的是STM32自 带库函数,由于嫌麻烦,我又自己写了一个简单的,采 用定时器1进行输出。结果一上来,没反应,修改了很 多参数,还是没反应,然后将开发板例程写进芯片后, 有反应,仔细越多数据手册,没有问题,纠结一上午, 中午吃饭。吃完饭后,下午又开始试验,还是别人程序 有反映,自己程序,没反应。再看了看,开发板程序使 用的是TIM3,而我使用的是TIM1,于是又把我的程序将TIM1换成TIM3,点击调试运行,有反应。不会是高级 定时器只能干高级的任务吧,像输出方波这么简单的低 级任务他不惜的干?郁闷了半天。后来通过在网上查找,这个程序 以下为源代码,CC1进行比较输出,模式为翻转电平. 程序运行后,CC中断可以进去,PA.11的指示灯能闪, 但PA.08的指示一直为低电平,请教一下程序哪里错了??? void TIM1_CC_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;

/* 使能定时器 TIM1_CC 中断 */ NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPrior ity = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* 配置 PA.11 为推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIOA->;BSRR = GPIO_Pin_11; // 将PA.08配置为高电平 /* 配置 PA.08 为复用推挽输出 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 预分频自动重载寄存器 */

STM32的捕获模式应用

STM32捕获模式应用。。。。。 1、stm32脉冲方波捕获 脉冲方波长度捕获 a)目的:基础PWM输入也叫捕获,以及中断配合应用。使用前一章的输出管脚P B1(19脚),直接使用跳线连接输入的PA3(13脚),配置为TIM2_CH4,进行实验。 b)对于简单的PWM输入应用,暂时无需考虑TIM1的高级功能之区别,按照目前我的应用目标其实只需要采集高电平宽度,而不必知道周期,所以并不采用PWM 输入模式,而是普通脉宽捕获模式。 c)初始化函数定义: void TIM_Configuration(void); //定义TIM初始化函数 d)初始化函数调用: TIM_Configuration(); //TIM初始化函数调用 e)初始化函数,不同于前面模块,TIM的CAP初始化分为三部分——计时器基本初始化、通道初始化和时钟启动初始化: void TIM_Configuration(void)//TIM2的CAP初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 TIM_ICInitTypeDef TIM_ICInitStructure; //通道输入初始化结构 //TIM2输出初始化 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //周期0~FFFF TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式

STM32F4_TIM输入波形捕获(脉冲频率)

本文在前面文章“STM32基本的计数原理”的基础上进行拓展,讲述关于“定时器输入捕获”的功能,和上一篇文章“定时器比较输出”区别还是挺大的。在引脚上刚好相反:一个输入、一个输出。 本文只使用一个TIM5通道3(也可其他通道)捕获输入脉冲的频率,通过捕获两次输入脉冲的间隔时间来计算脉冲波形的频率。间隔一定时间读取频率并通过串口打印出来。 当然也可通过两路通道捕获脉冲信号的占空比,计划后期整理。 笔者通过信号发生器产生信号,上位机串口助手显示捕获的脉冲频率。(没有信号发生器的朋友可以结合上一篇文章PWM输出做信号源:在同一块板子上也可以使用不同定时器,将输出引脚接在输入引脚) 先看一下实例的实验现象: 关于本文的更多详情请往下看。 Ⅱ、实例工程下载 笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。 笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。 提供下载的软件工程是STM32F417的,但F4其他型号也适用(适用F4其他型号:关注微信,回复“修改型号”)。 STM32F4_TIM输入波形捕获(脉冲频率)实例:

https://https://www.360docs.net/doc/bc4072126.html,/cB6XrSi6rK3TP 访问密码 STM32F4资料: https://https://www.360docs.net/doc/bc4072126.html,/cR2pxqF5x2d9c 访问密码53e7 Ⅲ、原理描述 笔者将TIM分为三大块:时基部分、比较输出和输入捕获,请看下面截图“通用TIM框图”。 前面的文章已经将“时基部分”的一些基础知识讲述过了,“时基部分”的功能是比较有用的,它除了可以用来延时(定时)之外,它还可以拿来触发其他一些功能,如:触发DA转换、AD采集等。 上一篇文章讲述的就是图中比较输出部分,比较输出部分功能相对比较简单。 该文主要讲述“输入捕获”部分,这部分输入的通道1与2、通道3与4可以相互协作。该文只使用了TIM5的通道3,捕获输入信号频率。 通用TIM框图: 上面两图截取“STM32F4x5、x7参考手册”建议下载手册参看。 Ⅳ、源代码分析 笔者以F4标准外设库(同时也建议初学者使用官方的标准外设库)为基础建立的工程,主要以库的方式来讲述。

STM32输入捕获模式

输入捕获模式 库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\I nputCapture 在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。 在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。PWM输入模式 库函数例程位置:STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\P WM_Input 该模式是输入捕获模式的一个特例 例如,你需要测量输入到TI1上的PWM信号的长度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值) ● 选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选择TI1)。 ● 选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器):置CC1P=0(上升沿有效)。 ● 选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择TI1)。 ● 选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。 ● 选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。 ● 配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。 ● 使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。 由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。 强置输出模式 在输出模式(TIMx_CCMRx寄存器中CCxS=00)下,输出比较信号(OCxREF和相应的OCx)能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结果。 例如:CCxP=0(OCx高电平有效),则OCx被强置为高电平。置TIMx_CCMRx 寄存器中的OCxM=100,可强置OCxREF信号为低。 输出比较模式 此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作: ● 将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER 寄存器中的CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻转(OCxM=011)。 ● 设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。 ● 若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。 ● 若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器

stm32F1外部脉冲计数(库函数实现)

主函数 #include "stm32f10x.h" #include "timer.h" #include "led.h" #include "delay.h" #include "oled.h" #include "sys.h" int main(void) { u16 t=0; delay_init(); LED_Init(); TIM3_PWM_Init(9999,719); TIM2_Excnt_Init(10); OLED_Init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); OLED_ShowString(20,0,"EXCNT_TEST",16); OLED_Refresh_Gram(); TIM_SetCompare2(TIM3,1000); while(1) { delay_ms(1);

t=TIM_GetCounter(TIM2); OLED_ShowNum(20,30,t,6,16); OLED_Refresh_Gram(); } } timer.c #include "timer.h" #include "led.h" #include "usart.h" #include "oled.h" void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDefGPIO_InitStructure; TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; TIM_OCInitTypeDefTIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,

STM32 波形采集、存储与回放

波形采集、存储与回放系统设计 摘要 本设计是基于数字示波器的原理,以STM32-cortex-m3作为控制芯片,把波形采集分为A、B两个通道,对A通道的输入信号进行衰减,对B通道的输入信号进行放大,然后采用内部集成的高速AD对信号进行实时采样,方式为上升沿内触发,可以实现波形的单次和多次触发存储和回放显示,以及频率、周期、峰-峰值的测量和显示,并具有掉电存储功能。由信号采集、数据处理、波形显示,控制面板等功能模块组成,整个系统分成A/D转换部分、D/A转换部分、波形存储部分、键盘输入控制四大部分,系统操作简便,输出波形可以在示波器输出显示,此存储示波器即具有一般示波器实时采样实时显示的功能,又可以对某段波形进行即时存储和连续回放显示,且界面友好,达到了较好的性能指标。具体设计原理以及过程在下面章节中详细说明。 关键字:STM32、波形采集、波形存储、波形回放

Abstract The design is based on the principle of digital oscilloscope, with STM32-cortex-m3 as the control chip, the waveform acquisition is divided into A, B two channel, the A channel input signal attenuation on B channel, the input signal is amplified, then using the internal integration of high-speed AD on real time data sampling, as rising edge trigger, can achieve waveform of single and multiple triggers the storage and playback and display, frequency, cycle, peak to peak value measurement and display, and power failure memory function. The signal acquisition, data processing, waveform display, the control panel and other functional modules, the system is divided into A/D transformation, D/A converting part, waveform storage, keyboard input control system four parts, simple operation, the output waveform can be output in the oscilloscope display, this storage oscilloscope namely has the common oscilloscope real-time sampling real time display function, can be a real-time storage and continuous playback waveform display, and friendly interface, has achieved good performance. The design principle and process are described in detail in the following sections. Keywords: STM32, waveform acquisition, storage, waveform waveform playback

stm32的定时器输入捕获与输出比较讲解

stm32的定时器输入捕获与输出比较 (2015-09-28 09:26:24) 转载▼ 分类:stm32 标签: it 明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用 输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。 外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。 时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。 输出比较:定时器中计数寄存器在初始化完后会自动的计数。从bottom计数到top。并且有不同的工作模式。 另外还有个比较寄存器。一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。 然后根据不同的工作模式计数寄存器将清零或者计数到top值。

1、朋友,可以解释一下输入捕获的工作原理不? 计数寄存器的初值,是自己写进去的吗? 我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不? timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不? 那输出比较的原理你可以帮我介绍一下不?

比较单元的值是人为设进去的吧? 上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了” 设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不? 011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?

STM32定时器控制方波

/* \\\|/// \\ - - // ( @ @ ) +---------------------oOOo-(_)-oOOo-------------------------+ | 奋斗版STM32开发板试验程序| | TIM1-PWM实验| | Sun68 | | 2009.12.8 | | 演示通过示波器观察TIM1的1通道的PWM波形| | 奋斗STM32嵌入式开发工作室| | https://www.360docs.net/doc/bc4072126.html, | | QQ: 9191274 | | Oooo | +-----------------------oooO--( )-------------------------+ ( ) ) / \ ( (_/ \_) */ /*引脚A0、A1、A3*/ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" #include "stm32f10x_tim.h" #include "stm32f10x_rcc.h" #include "stm32f10x_flash.h" #include "stm32f10x_gpio.h" #include "misc.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ TIM_TimeBaseInitTypeDef TIM2_TimeBaseStructure; TIM_TimeBaseInitTypeDef TIM3_TimeBaseStructure; TIM_OCInitTypeDef TIM2_OCInitStructure; TIM_BDTRInitTypeDef TIM2_BDTRInitStructure; TIM_OCInitTypeDef TIM3_OCInitStructure; TIM_BDTRInitTypeDef TIM3_BDTRInitStructure; NVIC_InitTypeDef NVIC_InitStructure; u16 capture = 0; u16 CCR1_Val = 20 * 200 / 100;

stm32脉冲方波捕获

1、stm32脉冲方波捕获 脉冲方波长度捕获 a)目的:基础PWM输入也叫捕获,以及中断配合应用。使用前一章的输出管脚P B1(19脚),直接使用跳线连接输入的PA3(13脚),配置为TIM2_CH4,进行实验。 b)对于简单的PWM输入应用,暂时无需考虑TIM1的高级功能之区别,按照目前我的应用目标其实只需要采集高电平宽度,而不必知道周期,所以并不采用PWM 输入模式,而是普通脉宽捕获模式。 c)初始化函数定义: void TIM_Configuration(void); //定义TIM初始化函数 d)初始化函数调用: TIM_Configuration(); //TIM初始化函数调用 e)初始化函数,不同于前面模块,TIM的CAP初始化分为三部分——计时器基本初始化、通道初始化和时钟启动初始化: void TIM_Configuration(void)//TIM2的CAP初始化函数 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 TIM_ICInitTypeDef TIM_ICInitStructure; //通道输入初始化结构 //TIM2输出初始化 TIM_TimeBaseStructure.TIM_Period = 0xFFFF; //周期0~F FFF TIM_TimeBaseStructure.TIM_Prescaler = 5; //时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化 //TIM2通道的捕捉初始化 TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;//通道选择 TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;//下降沿 TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;/ /管脚与寄存器对应关系 TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频器 TIM_ICInitStructure.TIM_ICFilter = 0x4; //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF TIM_ICInit(TIM2, &TIM_ICInitStructure); //初始化 TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2); //选择时钟触发源 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//触发方式 TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发 TIM_ITConfig(TIM2, TIM_IT_CC4, ENABLE); //打开中断 TIM_Cmd(TIM2, ENABL E); //启动TIM2 }

STM32中采用DMA实现方波的产生和捕获

STM32中采用DMA实现方波的产生和捕获 1 STM3 2 微控制器介绍STM32 系列微控制器是ST 公司基于Cortex-M 3 内核的高集成度的微控制器。它在性能、价格、功耗和实时性方面树立了一个 新的标杆,集成了Cortex-M3 内核,以及双ADC、多用途的通用时钟 TIMx、RTC、I2C、SPI、UART、CAN、DMA、USB 等丰富的外设。其功耗 在全速72MHz 所有模块都打开时也仅仅为36 mA,在低功耗模式下其功耗仅为2μA。2 DMA 和TIMx 简介STM32 系列微控制器均含有DMA 和通用时钟TIMx 模块。其低端型号中仅包含DMA1,支持7 个通道;高端型号还包 括DMA2,支持5 个通道。它的每个通道可任意指定工作模式,如内存到内存、内存到外设或外设到内存等。当涉及到外设时,一般是由外设来触发DMA 的 一次传输,如串口收到数据的标志位可触发DMA。DMA 的每次传输都分为 4 个阶段:申请仲裁、地址计算、总线存取和应答。除总线存取阶段,其他3 个阶段都只需要一个系统周期,并且不占用总线,可在DMA 控制器内部并发 地执行。总线存取阶段,每个字(4 字节)的传输需要3 个系统周期。DMA 和CPU 工作在交替方式下,不会相互阻塞。DMA 各个通道可独立设置优先级, 当访问同一资源时高优先级通道先获得资源。DMA 的使用比较简单,每路DMA 仅包括4 个寄存器,用于指定DMA 的工作模式、源地址、目标地址和传输次数。ST 公司提供了很好的驱动库,简化了外设的使用,方便阅读和移植。本文采用库函数来展示功能。其通用时钟是很有特色的外围模块,可实现多种复杂的功能。时钟模块内部主要包含一个计数器和4 个通道的比较/捕获寄 存器。时钟可工作在捕获或比较模式。在捕获模式下,若有对应的触发信号, 计数器的值会保存到比较/捕获寄存器,并触发中断或DMA;在比较模式下,若计数器的值与比较/捕获寄存器的值相等,则对外输出预选设定好的信号,

stm32基于定时器计量外部脉冲的实现

stm32基于定时器计量外部脉冲的实现(Gavin) 选用stm32f103c8作主控制器,来计量外部输入的脉冲数.选用外部时钟触发模式(TIM—ETRClockMode2Config),下面介绍具体的实现: 1、设置GPIO,根据硬件电路原理图,配置对应的资源IO引脚。 GPIO_InitTypeDef GPIO_InitStructure; /****** PA0,PA12-> 配置为脉冲输入引脚******/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度 GPIO_Init(GPIOA, &GPIO_InitStructure); 注意:(1)stm32f103c8只有TIM1_ETR(PA12,Pin33),和TIM2_CH1_ETR(PA0,Pin10)两个可以用。其它更多管脚的芯片,有更多的可以输入(如100管脚的有4个可以输入的);(2)外部时钟输入与中断无关;(3)stm32f103c8的这个两个应用中,不需要重映射。对于哪些需要重映射,参考数据手册。 2、设置RCC,RCC_ClocksTypeDef RCC_ClockFreq; SystemInit(); //源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 3、第三步,设置定时器模式 void TIM1_Configuration(void) //只用一个外部脉冲端口 { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //配置TIMER1作为计数器 TIM_DeInit(TIM1); TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 0x00; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;

理解STM32定时器中的输入捕获滤波器

理解STM32定时器中的输入捕获滤波器 关于STM32定时器中的输入捕获滤波器的功能描述,在中文参考手册中描述如下: 我不理解官方的说明,在网上搜了老半天,基本都是下面这几句话: 1)当滤波器连续采样到N次个有效电平时,认为一次有效的输入电平。 2)该数字滤波器实际上是个事件计数器,它记录到N个事件后会产生一个输出的跳变。例如:当f(CK_INT) = 72MHz, CKD[1:0] = 01时,选择f(DTS) = f(CK_INT)/2 = 36MHz; 而ETF[3:0] = 0100,则采样频率f(SAMPLING) = f(DTS) / 2 = 18MHz, N = 6,此时高于3MHz 的信号 将被这个滤波器滤除,这样就有效地屏蔽了高于3MHz的干扰。 看了这些说法,我还是不理解这个数字滤波器到底是如何工作的,问题如下: 问题1:当滤波器连续采样到N次个有效电平时,是输出这个电平?还是输出一个跳变?问题2:当滤波器没有连续采样到N次个有效电平时,输出是的什么? 带着这两个问题,我们来分析一下,下面以TIM3为例: 首先可以肯定输入捕获过程如下:详细信息见参考手册中的14.2节,通用定时器框图 TIM3_CH1(PA.6) ----> TI1(外部信号) -------> 输入滤波器IC1F[3:0] -----> IC1(滤波器输出信号) -------> 输入捕获预分频器IC1PSC[1:0] ----> 捕获/比较1寄存器CCR1 从上面的过程可以知道, 1)发生输入捕获所需要的跳变沿是由滤波器输出产生的。 2)滤波器和预分频器可软件编程,如果IC1F[3:0] = 0x0,则滤波器全通,即TI1 和IC1是同一个信号。 借助这两点分析,我假设的滤波器的工作原理是: 问题1猜测答案:当滤波器连续采样到N次个有效电平时,就输出这个有效电平。 问题2猜测答案:当滤波器没有连续采样到N次个有效电平时,再从0开始计数,输出一

STM32--输入捕获和输出比较

概述 首先,明确一点对比AD的构造,stm32有3个AD, 每个AD有很多通道(一个外设可以有多个中断通道,但是每个中断通道只有一个外设),使用哪个通道就配置成哪个通道(只设置用一个就可以),这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用, 也可以配置为输出比较--------输出PWM使用 输入捕获 输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。 外部事件发生的触发信号由单片机中对应的引脚输入(对应的引脚设置成输入)(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。 时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。 1.1、朋友,可以解释一下输入捕获的工作原理不? 很简单,当你设置的捕获开始的时候,cpu会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获。它没多大用处,最常用来测频率。 1.2、计数寄存器的初值,是自己写进去的吗? 是的,不过默认不要写入(即计数寄存器为零) 1.3、我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不? 是的 1.4、timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不? 那是肯定的,通道很像ADC通道,是可以进行切换的。 输出比较 输出比较:定时器中的计数寄存器在初始化完后会自动的计数,从bottom计数到top,并且有不同的工作模式。另外,还有个比较寄存器。一旦计数寄存器在从bottom到top 计数过程中与比较寄存器匹配(在计数的过程中进行比较,不单指bottom或top)则会产生比较中断(比较中断使能的情况下),这里的匹配指的是计数寄存器的值与比较寄存器的值相等。 然后根据不同的工作模式计数寄存器将清零或者计数到top值。

STM32中基于DMA的频率信号采集

2019年第3期 信息通信2019 (总第 195 期)INFORMATION&COMMUNICATIONS(Sum.No 195) STM32中基于DM A的频率信号采集 樊芊 (中国航空工业集团公司西安航空计算技术研究所,陕西西安710068 ) 摘要:以意法半导体的STM32F4系列单片机为例,针对嵌入式实时系统实现了一种基于D M A的频率信号采集方法。该 方法与周期任务配合后不用中断CPU,也不需要配合外部可编程逻辑芯片,就能实现频率信号采集,且可采集的频率信 号范围较宽,更适合在资源较少的实时系统中使用,可以降低系统成本,极大地提高系统的运行效率。同时试验■表明,该 方法具有很高的精度,可以广泛应用于实时控制系统。 关键词:频率采集;D M A;STM32单片机;嵌入式系统 中图分类号:TP274.2 文献标识码:A文章编号:1673-1131(2019)03-0143-03 Frequency Signal Acquisition Based on DMA in STM32 Fan Qian (Xi'an Aeronautics Computing Technique Research Institute,AV1C,Xi'an710068, China) Abstract:Realized a method to acquire frequency signal based on DM A for embedded real-time systems,using STM32F4. Li coopa^tion with periodic task,this method can acquire frequency signal without interrupting the CPU or using FPGA.This method can acquire a wide range o f frequency signal,fit for real-time systems with less resource,reduce the system cost,im-prove the efficiency o f t he system.Test shows that this method has high precision and can be widely used for real-time control systems. Keyword:Frequency signal acquisition;DMA;STM32 SCM;Embedded system 0引言 频率信号采集是工业控制系统常用的功能之一,广泛用 于汽车控制和航空发动机控制等领域。对于转速信号来说,频率信号采集是将输入的正弦形式的模拟信号,经比较电路 转化为同频方波信号,再经采样后获取相邻上升沿或下降沿 时间差的一种信号处理方法。工业控制系统一般均为实时系 统,无法依靠频繁中断CPU直接采集频率信号,因此大多使用 可编程逻辑芯片实现频率信号的采集,但同时会占用本来就不多的可编程逻辑芯片的资源,同时还会增加系统成本。本文针对具有D M A模块,且D M A请求可以被通用定时器输入捕获单元触发的CPU,提出了一种频率信号的采集方法,该方 法可以仅使用C P U实现频率信号的采集,且不会中断实时系 统中的其他任务。 STM32F4是意法半导体在2010年推出的CortexM4内核的髙性能、高集成度的微控制器11],该系列微控制器均含有直接内存存取D M A单元和通用时钟T IM单元,其中TIM 单元除了包含通用时钟的功能外,还具有强大的输入捕获功能,可以实现方波信号的频率采集,同时每个T IM单元均至 图2自动化部署构架示意图 (3)云资源监控。在监控资源过程中,云计算技术就是把故障的相关问题。 随着云计算技术不断成熟与发展,必然会对信息时代产 生重大影响,有效改变用户所处核心地位。从现状来看,云计 算技术处于快速发展阶段,虽然能够有效改变用户对资源的 运用方式,但是很多方面依然需要不断完善。相信在互联网 中,云计算技术具有更大发展前景,为互联网稳健发展发挥推 波助澜的功效。 参考文献: [1]王健勇?浅析计算机“云计算”技术现状及发展[J].信息系 统工程,2013(04)_ [2]郭达永,杨楠,贾耀文.计算机云计算及其实现技术分析[J]. 电子技术与软件工程’2015G3). 服务器管理与相关数据相结合,合理整合动态化的信息数据,[3]宋国平?计算机云计算及其实现技术分析[J]?电子技术与 为快速数据服务提供依据,合理转化动态资源,从而实现资源监控管理,对数据进行分析,实现云资源的有效分配,而且部 署动态资源是系统及时跟进的重要部分。因此,当信息数据 软件工程,2013(21)_ [4]方海诺.计算机云计算及其实现技术分析[J].科技与企业, 2016(10). 传送到数据仓库,就会监控各个环节的数据资源运行程序情 况,并对资源数据进行系统、精准的分析。采用云计算技术监作者简介:潘巍(1982-),男,江苏无锡人,硕士,研究方向:云计 察信息,整合传统服务器上各种数据,可及时检査与排除引发 算、网络技术。 143

相关文档
最新文档