你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32 tim1输入捕获+DMA,数据清除问题

[复制链接]
zenger_z 提问时间:2016-1-18 14:31 /
要求:实现测量外部脉冲宽度,读取脉宽后,清除脉宽数据,如果长时间无脉宽信号,输出报警信号。
实现方式:使用stm32 tim1输入捕获+DMA方式,把捕获的脉宽通过DMA方式存储到全局变量中,软件记取完成脉宽的全局变量后清除数据,连接长时间读取全局变量,如果无脉宽数据,报警输出。

最终测试发现:1,开机后,如果一直无脉宽数据,可以检测无效脉宽,并报警输出。
                       2,开机后,只要有一次有效脉宽数据,就无法清除DMA指定的存储的脉宽数据的全局变量。
收藏 1 评论3 发布时间:2016-1-18 14:31

举报

3个回答
zenger_z 回答时间:2016-1-18 16:02:40
void TIM1_Configuration(void)
        {
                //TIM1 clock enable TIM1时钟开启
                RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);       
                //TIM1 Peripheral Configuration
                TIM1_DeInit();//TIM1先复位,再无效               
                //Time Base configuration
                TIM1_TimeBaseStructure.TIM1_Prescaler = 0x0;
                TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up;
                TIM1_TimeBaseStructure.TIM1_Period = 65535;
                TIM1_TimeBaseStructure.TIM1_ClockDivision = 0x0;
                TIM1_TimeBaseStructure.TIM1_RepetitionCounter = 0x0;
                TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);       
                //Configurature TIM1 Capeture,channel work on PWMI mode
                TIM1_ICInitStructure.TIM1_Channel = TIM1_Channel_1;//TIM1通道1
                TIM1_ICInitStructure.TIM1_ICPolarity = TIM1_ICPolarity_Rising;//输入上升沿捕获;
                TIM1_ICInitStructure.TIM1_ICSelection = TIM1_ICSelection_DirectTI;//输入1、2、3、4分别对应IC1、IC2、 IC3、 IC4;
                TIM1_ICInitStructure.TIM1_ICPrescaler = TIM1_ICPSC_DIV1;  // 每次边缘事件捕获一次;
                TIM1_ICInitStructure.TIM1_ICFilter = 0x00; //指定输入捕获滤波器的值
                TIM1_PWMIConfig(&TIM1_ICInitStructure);
               
                TIM1_UpdateRequestConfig(TIM1_UpdateSource_Global);//更新源为计数器溢出或UG置位或通过从模式控制器产生更新事件;       
                //使能自动重载寄存器
                TIM1_ARRPreloadConfig(ENABLE);       
                //允许CCR1 DMA请求
                TIM1_DMACmd(TIM1_DMA_CC1, ENABLE);       
                //TIM1 Update DMA Request enable//允许更新DMA请求。
                TIM1_DMACmd(TIM1_DMA_Update, ENABLE);       
                //TIM1 counter enable
                TIM1_Cmd(ENABLE);
        }

        void DMA_Configuration(void)
        {
                DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体
       
                  //DMA clock enable DMA时钟开启
                RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);
               
                //DMA Channel2
                DMA_DeInit(DMA_Channel2);//复位DMA通道2
               
                DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)TIM1_CCR2ADDR;//定义DMA通道外设基地址
                DMA_InitStructure.DMA_MemoryBaseAddr = (u32)measure_dma;//把measure_dma首址赋给DMA存储器基址;
                DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址
                DMA_InitStructure.DMA_BufferSize = SIZE_MEASURE;//DMA_BUFFER_SIZE;//定义DMA缓冲区大小
                DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变
                DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable;// DMA_MemoryInc_Disable;//当前存储器地址也不变化
                DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位
                DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//定义存储器数据宽度16位
                DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式-位环形缓冲模式
                DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高
                DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;//DMA通道存储器到存储器传输
               
                DMA_Init(DMA_Channel2, &DMA_InitStructure);//初始化DMA通道2               
                //DMA Channel2 enable
                DMA_Cmd(DMA_Channel2, ENABLE);
        }


以上是配置TIM1和DMA的代码         
zenger_z 回答时间:2016-1-18 16:44:33
我用最笨的方法可以实现,读取完DMA数据后,复位DMA和TIM1,下次采集脉宽信号后,再重新初始化DMA和TIM1。
沐紫 回答时间:2016-1-19 17:21:05
要不就用最笨的方法,能实现就好

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版