最近在遇到了一个使用环境,需要在某个IO输入脉冲信号 并且跟随输出脉冲信号。
因此,采用的思路是dmamux 中的 触发输入,从而产生请求。

做法:
采用TIM2 CH3 PWM输出到某个引脚上。TIM12脉冲作为触发输入,DMA1将GPIOx->IDR搬到buffer,buffer再到GPIOy->ORD。(不过BDMA似乎可以实现 外设到外设 具体还没尝试)
注意:
buffer 必须是 DMA1 可访问的地址(DMA2也可) ,因此,要设置
ALIGN_32BYTES(__attribute__((section (".RAM_D3"))) uint32_t buffer1[4]) = {0};
当然分散加载里面要设置
RW_IRAM4 0x38000000 0x00010000 { ; RW data - 64KB SRAM4(0x38000000)
*(.RAM_D3)
以及MPU要对这块区域设置
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x38000000;
MPU_InitStruct.Size = ARM_MPU_REGION_SIZE_64KB;
MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER2;
MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
MPU_InitStruct.SubRegionDisable = 0x00;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
效果如下:


在几百KHz下效果还凑合。
又测试了一个200Hz触发中断的情况
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
printf("hello");
}


参考:安富莱H7-BSP DMAMUX的定时器触+DMA双缓冲控制任意IO做PWM和脉冲数控制例程
1万+




被折叠的 条评论
为什么被折叠?



