如题,因为测量脉宽较小,所以不打算采用中断方式,以节约时间,我的想法是各种初始化完成后,用定时器1上升沿捕获,触发DMA请求,DMA读取计数器值到某一我自己定义的变量,while语句里面循环判断是否有DMA传输完成标志,再if判断这是上升沿还是下降沿,如果这次捕获到的是上升沿,此时清除计数器值,设置定时器1下降沿捕获。如果是下降沿,则此时我的变量里面是脉宽值,下面是我的代码,变量MAIKUAN始终是0,想了两天了,不知道自己哪里想错了,实在没辙了,顾来求援啊
[mw_shl_code=c,true]#include "timer.h"
#include "sys.h"
#include "dma.h"
u16 CNT=0; //捕获次数
u16 MAIKUAN;
void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
RCC->AHBENR|=1<<0; //开启DMA1时钟
DMA_CHx->CPAR=cpar; //DMA1外设地址
DMA_CHx->CMAR=(u32)cmar; //DMA1存储器地址
DMA_CHx->CNDTR=cndtr; //DMA1传输数据量
DMA_CHx->CCR=0X00000000; //复位
DMA_CHx->CCR|=0<<4; //从外设读
DMA_CHx->CCR|=1<<5; //循环模式
DMA_CHx->CCR|=1<<6; //外设地址增量模式
DMA_CHx->CCR|=1<<7; //存储器增量模式
DMA_CHx->CCR|=1<<8; //外设数据宽度16位
DMA_CHx->CCR|=1<<10; //存储器数据宽度16位
DMA_CHx->CCR|=2<<12; //高优先级
DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
DMA_CHx->CCR|=1<<0; //开启DMA通道
}
void TIM1_Int_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<11; //TIM1时钟使能
RCC->APB2ENR|=1<<2; //使能端口A时钟
GPIOA->CRH&=0XFFFFFFF0; //PA8 清楚之前的设置
GPIOA->CRH|=0X00000008; //PA8输入
GPIOA->ODR|=0<<8; //PA8下拉
TIM1->ARR=arr; //周期
TIM1->  SC=psc; //时基
TIM1->CCMR1|=1<<0; //选择输入端,IC1映射到TI1
TIM1->CCMR1|=0<<10; //IC2PS=00 ,不分频,不滤波
TIM1->CCER|=0<<1; //CC1P=0 上升沿捕获
TIM1->CCER|=1<<0; //CC1E=1 捕获使能
TIM1->DIER|=1<<9; //允许捕获1的DMA请求
TIM1->CR1=0x01; //使能定时器1
}
void TIM4_Int_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<2; //TIM4时钟使能
RCC->APB2ENR|=1<<3; //使能端口B时钟
GPIOB->CRL&=0XF0FFFFFF;
GPIOB->CRL|=0X0B000000;//PB6 推挽输出
TIM4->ARR=arr; //周期
TIM4->  SC=psc; //时基
TIM4->CCMR1|=3<<4; //CH1翻转模式
TIM4->CCMR1|=1<<3; //CH1预装载使能
TIM4->CCER|=1<<0; //OC1 输出使能
TIM4->CR1=0x0080; //自动重装载预装载允许
TIM4->CR1|=0x01; //使能定时器4
}
int main()
{
Stm32_Clock_Init(9); //系统时钟设置
MYDMA_Config(DMA1_Channel2,(u32)&TIM1->CNT,(u32)MAIKUAN,0xFFFF);//DMA1通道2,外设为计数器,存储器为MAIKUAN,长度0xFFFF
TIM4_Int_Init(359,0);//输出
TIM1_Int_Init(0XFFFF,0); //72MHz频率计数,捕获
while(1)
{
if(DMA1->ISR==0x0020)//是否传输完成
{
if(CNT==0)
{
TIM1->CNT=0;
TIM1->CCER|=1<<1; //CC1P=1下降沿捕获
DMA1->IFCR|=1<<5;//清除传输完成标志
CNT=1;
}
else
{
TIM4->ARR=MAIKUAN;
TIM1->CCER|=0<<1; //CC1P=0上升沿捕获
DMA1->IFCR|=1<<5;//清除传输完成标志
CNT=0;
}
}
}
}[/mw_shl_code]
|