STM32的PWM输入模式设置并用DMA接收数据

本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

环境:

主机:WIN7

开发环境:MDK4.72

MCU:STM32F103

说明:

项目中需要进行红外学习,如果采用输入捕获的方式,因为定时器只能捕获上升沿或者下降沿,所以只能获得周期,而不能得到具体的红外波的高低电平的时间.所以采用PWM输入的方式进行捕获.

采用的是PA8脚,对应TIM1的通道1.

源代码:
————————————————
版权声明:本文为CSDN博主「jdh99」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jdh99/article/details/23252719

/*********************************************************************
*                           函数
**********************************************************************//*********************************************************************
*                           接口函数:初始化红外学习模块
**********************************************************************/void inf_infrared_study_init(void)
{//初始化io口inf_init_io();//初始化中断//inf_init_irq();//初始化定时器inf_init_timer();//打开DMAinf_infrared_study_open_dma(1);//打开定时器inf_infrared_study_open_timer(1);
}/*********************************************************************
*                           初始化io口
**********************************************************************/static void inf_init_io(void)
{//定义IO初始化结构体GPIO_InitTypeDef GPIO_InitStructure;//初始化时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//管脚初始化  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//设置为输入           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //初始化               GPIO_Init(GPIOA, &GPIO_InitStructure);
}/*********************************************************************
*                           初始化中断
**********************************************************************/static void inf_init_irq(void)
{//定义外部中断结构体EXTI_InitTypeDef EXTI_InitStructure;//初始化中断脚复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//配置中断源GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1);// 配置下降沿触发EXTI_ClearITPendingBit(EXTI_Line1);EXTI_InitStructure.EXTI_Line = EXTI_Line1;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}/*********************************************************************
*                           初始化定时器
**********************************************************************/static void inf_init_timer(void)
{//定义定时器结构体TIM_TimeBaseInitTypeDef timInitStruct;//输入捕获结构体TIM_ICInitTypeDef tim_icinit;//定义DMA结构体DMA_InitTypeDef DMA_InitStructure;//启动DMA时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1通道配置DMA_DeInit(DMA1_Channel2);//外设地址DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&TIM1->CCR1);//内存地址DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Rx_Buf_Tim_Dma1;//dma传输方向单向DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//设置DMA在传输时缓冲区的长度DMA_InitStructure.DMA_BufferSize = RX_LEN_TIM_DMA;//设置DMA的外设递增模式,一个外设DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA的内存递增模式DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//外设数据字长DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//内存数据字长DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//设置DMA的传输模式//DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的优先级别DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA的2个memory中的变量互相访问DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel2,&DMA_InitStructure);   //启动DMA时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1通道配置DMA_DeInit(DMA1_Channel3);//外设地址DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&TIM1->CCR2);//内存地址DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Rx_Buf_Tim_Dma2;//dma传输方向单向DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//设置DMA在传输时缓冲区的长度DMA_InitStructure.DMA_BufferSize = RX_LEN_TIM_DMA;//设置DMA的外设递增模式,一个外设DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA的内存递增模式DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//外设数据字长DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//内存数据字长DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//设置DMA的传输模式//DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的优先级别DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA的2个memory中的变量互相访问DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA1_Channel3,&DMA_InitStructure);  //开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//重新将Timer设置为缺省值TIM_DeInit(TIM1);//采用内部时钟提供时钟源TIM_InternalClockConfig(TIM1);//预分频timInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;    //计数频率为500ns跳转1次            timInitStruct.TIM_Prescaler = SystemCoreClock / 1000000 - 1;     //向上计数                timInitStruct.TIM_CounterMode = TIM_CounterMode_Up;    timInitStruct.TIM_RepetitionCounter = 0;//这个值实际上就是TIMX->ARR,延时开始时重新设定即可  timInitStruct.TIM_Period = 0xffff;                                 //初始化定时器TIM_TimeBaseInit(TIM1, &timInitStruct);//输入捕获配置//选择通道tim_icinit.TIM_Channel = TIM_Channel_1;//硬件滤波tim_icinit.TIM_ICFilter = 0x0;//触发捕获的电平tim_icinit.TIM_ICPolarity = TIM_ICPolarity_Falling;//每次检测到触发电平都捕获tim_icinit.TIM_ICPrescaler= TIM_ICPSC_DIV1;//通道方向选择tim_icinit.TIM_ICSelection = TIM_ICSelection_DirectTI;//初始化//TIM_ICInit(TIM1,&tim_icinit);TIM_PWMIConfig(TIM1, &tim_icinit);//禁止ARR预装载缓冲器  //TIM_ARRPreloadConfig(TIM1, DISABLE);  //输入跳变选择TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);//从机模式:复位模式TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);//主从模式选择TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);//配置定时器的DMATIM_DMAConfig(TIM1,TIM_DMABase_CCR1,TIM_DMABurstLength_2Bytes);//产生DMA请求信号TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE);//配置定时器的DMATIM_DMAConfig(TIM1,TIM_DMABase_CCR2,TIM_DMABurstLength_2Bytes);//产生DMA请求信号TIM_DMACmd(TIM1, TIM_DMA_CC2, ENABLE);//打开定时器TIM_Cmd(TIM1, ENABLE);
}/*********************************************************************
*                           接口函数:打开定时器
*参数:state:状态:0:关闭,1:打开
**********************************************************************/void inf_infrared_study_open_timer(uint8_t state)
{if (state){TIM_Cmd(TIM1, ENABLE);}else{TIM_Cmd(TIM1, DISABLE);}
}/*********************************************************************
*                           接口函数:打开中断
*参数:state:状态:0:关闭,1:打开
**********************************************************************/void inf_infrared_study_open_irq(uint8_t state)
{//定义中断结构体NVIC_InitTypeDef NVIC_InitStructure ;if (state){//打开中断NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;               //通道设置为外部中断线NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;      //中断抢占先等级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //中断响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //打开中断NVIC_Init(&NVIC_InitStructure);                                 //初始化}else{//关闭中断NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                //通道设置为外部中断线NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;      //中断抢占先等级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //中断响应优先级NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;                  //打开中断NVIC_Init(&NVIC_InitStructure);                                 //初始化}
}/*********************************************************************
*                           接口函数:打开DMA
*参数:state:状态:0:关闭,1:打开
**********************************************************************/void inf_infrared_study_open_dma(uint8_t state)
{if (state){//设置传输数据长度//DMA_SetCurrDataCounter(DMA1_Channel3,RX_LEN_TIM_DMA);//打开DMADMA_Cmd(DMA1_Channel2,ENABLE);DMA_Cmd(DMA1_Channel3,ENABLE);}else{DMA_Cmd(DMA1_Channel2,DISABLE);DMA_Cmd(DMA1_Channel3,ENABLE);}
}/*********************************************************************
*                           接口函数:得到DMA接收帧长
*返回:帧长
**********************************************************************/uint16_t inf_infrared_study_dma_rx_len(void)
{//获得接收帧帧长return (RX_LEN_TIM_DMA - DMA_GetCurrDataCounter(DMA1_Channel2));
}

STM32的PWM输入模式设置并用DMA接收数据相关推荐

  1. STM32输入捕获模式设置并用DMA接收数据

    参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ...

  2. stm32 笔记 PWM输入模式测量脉宽和占空比原理

    一.PWM 输入模式测量脉宽 1.1 测量脉宽简介 在测量占空比之前,我们先一步一步来,先让 STM32 可以测量脉宽. TIM3_CH1(tim3 定时器通道 1)捕获模式测量脉宽步骤如下: 1.输 ...

  3. STM32使用PWM输入模式测试频率和占空比

    参考文档: STM32中文参考考手册 1.cubuMX设置 主程序添加代码 测试主程序: /* USER CODE BEGIN Header */ /************************* ...

  4. 32 ART DMA 接收未知长度的数据和发送

    STM32实现USART+DMA接收未知长度的数据和发送 STM32学习笔记三 竹天笑 前言:开始学USART+DMA的时候看到帖子<STM32 UART DMA实现未知数据长度接收>,觉 ...

  5. android 串口一直打开_STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  6. c++ 定时器_【话说定时器系列】之十:PWM输入模式测量脉宽及占空比实验

    STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍.去年,电堂推出了<STM32 TIMER基础及常规应用介绍>,为大家梳理了 STM32 TIMER 的庞大内容, ...

  7. STM32 利用空闲中断接收数据

    STM32 利用串口空闲中断接收不定长数据 利用cubeMX打开DMA串口接收中断 利用CubeMX打开串口中断 HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); HA ...

  8. 串口的空闲中断+DMA接收(附F4代码)

    传统串口接受与发送: 串口接受一个很长的帧,接受帧时依靠串口中断每次只能传输8位,传一个帧要进入好多次中断,每次进入中断都要判断是否接收完毕. DMA串口接收与发送: 1,电脑通过串口1给STM32F ...

  9. STM32F413 SPI+DMA接收错误(SCK时钟接收后一直存在)【后参考网上论坛及F4官方例程:收发同时进行】

    1:平台 STM32F413 + GD5F4(spi nand flash)(没开启DMA中断,读写操作NAND 都是单片机发起,所以知道什么时候读,什么时候写) 2: 问题(STM32 SPI+DM ...

最新文章

  1. Python Qt GUI设计:QComboBox下拉列表框类(基础篇—14)
  2. 实体链接:信息抽取中的NLP的基础任务
  3. CNVD-C-2019-48814 漏洞
  4. Unity(一)Unity脚本程序开发
  5. Linux下shell反弹
  6. 自由读写配置文件的艺术[java c++ node](二)
  7. usb声卡驱动_哑巴电脑拯救者——它可能是你见过使用最简单的外接声卡!
  8. 采集抖音APP的10个经典方法
  9. eXosip注册函数与使用说明
  10. 淘宝APP用户行为数据分析
  11. LENET-5卷积神经网络的深度学习技术
  12. Vs2010中文版 使用 .net 3.5 时,智能提示英文变中文
  13. 如何让html 兼容IE和chrome,chrome兼容模式如何切换成IE兼容模式_chrome兼容模式切换成IE兼容模式的方法-系统城...
  14. 何为裂变?上百个裂变营销活动让我揭开了其神秘面目!
  15. 分享一个无需账号完全免费的 ChatGPT-4 的方法
  16. beyond compare 中文乱码问题解决方法
  17. 用turtle库制作一个简单的小游戏《鸡子大战篮球》
  18. 多WAN口宽带路由器到底几个口才算合理(转)
  19. torch.mannul_seed()使用和踩坑总结
  20. 二维码的生成(qrcode.js)

热门文章

  1. 标签 align 属性
  2. barManager的设置
  3. 数据库系统导论学习笔记
  4. 街机飞机游戏合集_建立游戏引擎,经典街机游戏的转折以及更多游戏新闻
  5. 20220513数据结构绿皮书读书笔记
  6. 哈希表(Hash table)
  7. Java容器--2021面试题系列教程(附答案解析)--大白话解读--JavaPub版本
  8. 2019 web安全基础知识学习
  9. hcl的ipsec实验
  10. git报错: git: not authorized :未经授权解决办法