你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
{
//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的代码