你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
积分商城
每日签到
stm32 tim1输入捕获+DMA,数据清除问题
[复制链接]
zenger_z
提问时间:2016-1-18 14:31 /
问答
是否解决:
要求:实现测量外部脉冲宽度,读取脉宽后,清除脉宽数据,如果长时间无脉宽信号,输出报警信号。
实现方式:使用stm32 tim1输入捕获+DMA方式,把捕获的脉宽通过DMA方式存储到全局变量中,软件记取完成脉宽的全局变量后清除数据,连接长时间读取全局变量,如果无脉宽数据,报警输出。
最终测试发现:1,开机后,如果一直无脉宽数据,可以检测无效脉宽,并报警输出。
2,开机后,只要有一次有效脉宽数据,就无法清除DMA指定的存储的脉宽数据的全局变量。
赞
0
收藏
1
评论
3
分享
发布时间:2016-1-18 14:31
举报
请先
登录
后回复
3个回答
zenger_z
回答时间:2016-1-18 16:02:40
a0a.1 32b0c
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的代码
赞
0
评论
回复
支持
反对
zenger_z
回答时间:2016-1-18 16:44:33
a0a.1 32b0c
我用最笨的方法可以实现,读取完DMA数据后,复位DMA和TIM1,下次采集脉宽信号后,再重新初始化DMA和TIM1。
赞
0
评论
回复
支持
反对
沐紫
回答时间:2016-1-19 17:21:05
a0a.1 32b0c
要不就用最笨的方法,能实现就好
赞
0
评论
回复
支持
反对
所属标签
相似问题
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
{
//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的代码