完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教各位,使用STM32f407VET6 用的tiM1 脉冲输入引脚为PA11(TIM1_CH4),目前已实现中断读取CC4的数值,因为中断太频繁想改用DMA获取的方法,不知道怎么操作?
TIM_HandleTypeDef TIM_PWMINPUT_Handle; DMA_HandleTypeDef TIM_DMA_Handle; uint32_t IC4_value[2]; //定时器配置 static void TIM_PWMINPUT_Config(void) { TIM_IC_InitTypeDef TIM_ICInitStructure; TIM_SlaveConfigTypeDef TIM_SlaveConfigStructure; __TIM1_CLK_ENABLE(); TIM_PWMINPUT_Handle.Instance = TIM1; TIM_PWMINPUT_Handle.Init.Period = 0xFFFF; // 高级控制定时器时钟源 TIMxCLK = HCLK=168MHz // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=1MHz TIM_PWMINPUT_Handle.Init.Prescaler = 168 - 1; TIM_PWMINPUT_Handle.Init.ClockDivision = 0; TIM_PWMINPUT_Handle.Init.CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_IC_Init( TIM_PWMINPUT_Handle); TIM_ICInitStructure.ICPolarity = TIM_ICPOLARITY_RISING; TIM_ICInitStructure.ICSelection = TIM_ICSELECTION_DIRECTTI; TIM_ICInitStructure.ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.ICFilter = 0x0; HAL_TIM_IC_ConfigChannel( TIM_PWMINPUT_Handle, TIM_ICInitStructure, TIM_CHANNEL_4); // HAL_TIM_IC_Start_IT( TIM_PWMINPUT_Handle, TIM_CHANNEL_4); } //DMA配置 void tim_dma_config(void) { __DMA2_CLK_ENABLE(); TIM_DMA_Handle.Instance = DMA2_Stream4; TIM_DMA_Handle.Init.Channel = DMA_CHANNEL_6; TIM_DMA_Handle.Init.Direction = DMA_PERIPH_TO_MEMORY; TIM_DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE; TIM_DMA_Handle.Init.MemInc = DMA_MINC_ENABLE; TIM_DMA_Handle.Init.PeriphDataAlignment = DMA_MDATAALIGN_WORD; TIM_DMA_Handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; TIM_DMA_Handle.Init.Mode = DMA_CIRCULAR; TIM_DMA_Handle.Init.Priority = DMA_PRIORITY_MEDIUM; TIM_DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; TIM_DMA_Handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; TIM_DMA_Handle.Init.MemBurst = DMA_MBURST_SINGLE; TIM_DMA_Handle.Init.PeriphBurst = DMA_PBURST_SINGLE; __HAL_LINKDMA( TIM_PWMINPUT_Handle,hdma[TIM_DMA_ID_CC4], TIM_DMA_Handle); HAL_DMA_Init(TIM_PWMINPUT_Handle.hdma[TIM_DMA_ID_CC4]); HAL_TIM_IC_Start_DMA( TIM_PWMINPUT_Handle,TIM_CHANNEL_4, IC4_value,4); // HAL_NVIC_EnableIRQ(DMA2_Stream4_IRQn); } 接下来,在主函数不断读取IC4_value的值明显不对。请教大家有没有错 |
|
相关推荐
1个回答
|
|
可以通过以下步骤来配置DMA来获取TIM1的CC4值:
1. 初始化TIM1和DMA模块: ```c TIM_HandleTypeDef TIM_PWMINPUT_Handle; DMA_HandleTypeDef TIM_DMA_Handle; uint32_t IC4_value[2]; // 存储CC4的值 static void TIM_PWMINPUT_Config(void) { // 使能TIM1的时钟 __TIM1_CLK_ENABLE(); // 初始化TIM1的参数,包括时钟分频、计数器模式等等 TIM_PWMINPUT_Handle.Instance = TIM1; TIM_PWMINPUT_Handle.Init.Prescaler = 0; TIM_PWMINPUT_Handle.Init.CounterMode = TIM_COUNTERMODE_UP; TIM_PWMINPUT_Handle.Init.Period = 0xFFFF; TIM_PWMINPUT_Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; TIM_PWMINPUT_Handle.Init.RepetitionCounter = 0; HAL_TIM_Base_Init(&TIM_PWMINPUT_Handle); // 配置DMA的参数,包括数据传输方向、数据宽度、传输模式等等 TIM_DMA_Handle.Instance = DMAx_STREAMy; // 根据具体的DMA通道进行配置 TIM_DMA_Handle.Init.Channel = DMA_CHANNEL_x; // 根据具体的DMA通道进行配置 TIM_DMA_Handle.Init.Direction = DMA_PERIPH_TO_MEMORY; TIM_DMA_Handle.Init.PeriphInc = DMA_PINC_DISABLE; TIM_DMA_Handle.Init.MemInc = DMA_MINC_ENABLE; TIM_DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; TIM_DMA_Handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; TIM_DMA_Handle.Init.Mode = DMA_CIRCULAR; TIM_DMA_Handle.Init.Priority = DMA_PRIORITY_HIGH; TIM_DMA_Handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; HAL_DMA_Init(&TIM_DMA_Handle); // 连接TIM1和DMA __HAL_LINKDMA(&TIM_PWMINPUT_Handle, hdma[TIM_DMA_ID_CC4], TIM_DMA_Handle); // 配置DMA中断 HAL_NVIC_SetPriority(DMAx_STREAMy_IRQn, 0, 0); HAL_NVIC_EnableIRQ(DMAx_STREAMy_IRQn); } ``` 2. 配置TIM1的CC4输入功能: ```c static void TIM_PWMINPUT_Config(void) { // ... // 配置TIM1的CC4通道 TIM_IC_InitTypeDef TIM_ICInitStructure; TIM_PWMINPUT_Handle.Init.ICPrescaler = TIM_ICPSC_DIV1; // 配置输入分频系数 TIM_PWMINPUT_Handle.Init.ICFilter = 0; // 配置输入滤波器 TIM_ICInitStructure.ICPolarity = TIM_ICPOLARITY_RISING; // 配置输入信号的极性 TIM_ICInitStructure.ICSelection = TIM_ICSELECTION_DIRECTTI; // 配置捕获输入复用 TIM_ICInitStructure.ICPrescaler = TIM_ICPSC_DIV1; // 配置输入分频系数 TIM_ICInitStructure.ICFilter = 0; // 配置输入滤波器 HAL_TIM_IC_ConfigChannel(&TIM_PWMINPUT_Handle, &TIM_ICInitStructure, TIM_CHANNEL_4); // ... } ``` 3. 启动TIM1和DMA: ```c static void TIM_PWMINPUT_Config(void) { // ... // 启动TIM1和DMA HAL_TIM_Base_Start(&TIM_PWMINPUT_Handle); HAL_TIM_IC_Start_DMA(&TIM_PWMINPUT_Handle, TIM_CHANNEL_4, (uint32_t*)IC4_value, 2); // ... } ``` 4. 在DMA的中断服务函数中,处理获取到的值: ```c void DMAx_STREAMy_IRQHandler(void) { HAL_DMA_IRQHandler(&TIM_DMA_Handle); } void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) { HAL_DMA_IRQHandler(hdma); if(hdma->Instance == DMAx_STREAMy) { // 根据具体的DMA通道进行配置 if(HAL_DMA_GetState(hdma) == HAL_DMA_STATE_READY) { /* 处理获取到的值 */ uint32_t value = IC4_value[1]; } } } ``` 注意:以上代码仅供参考,具体的DMA通道和DMA中断的相关配置需要根据实际情况进行修改。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1270 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1278 浏览 1 评论
677 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
507 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1281 浏览 2 评论
1705浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
400浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
370浏览 3评论
357浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
335浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-15 15:13 , Processed in 1.120635 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号