<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM32的PWM輸入模式設置并用DMA接收數據

STM32的PWM輸入模式設置并用DMA接收數據

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò ) 收藏

參考 :STM32輸入捕獲模式設置并用DMA接收數據

PWM input mode

This mode is a particular case of input capture mode.

本文引用地址:http://dyxdggzs.com/article/201611/318023.htm

The procedure is the same except:

? Two ICx signals are mapped on the same TIx input.
? These 2 ICx signals are active on edges with opposite polarity.
? One of the two TIxFP signals is selected as trigger input and the slave mode controlleris configured in reset mode.


For example, you can measure the period (in TIMx_CCR1 register) and the duty cycle (inTIMx_CCR2 register)

of the PWM applied on TI1 using the following procedure (dependingon CK_INT frequency and prescaler value):

? Select the active input for TIMx_CCR1: write the CC1S bits to 01 in the TIMx_CCMR1register (TI1 selected).
? Select the active polarity for TI1FP1 (used both for capture in TIMx_CCR1 and counterclear): write the CC1P and CC1NP bits to ‘0’ (active on rising edge).
? Select the active input for TIMx_CCR2: write the CC2S bits to 10 in the TIMx_CCMR1register (TI1 selected).
? Select the active polarity for TI1FP2 (used for capture in TIMx_CCR2): write the CC2Pand CC2NP bits to ‘1’ (active on falling edge).
? Select the valid trigger input: write the TS bits to 101 in the TIMx_SMCR register(TI1FP1 selected).
? Configure the slave mode controller in reset mode: write the SMS bits to 100 in theTIMx_SMCR register.
? Enable the captures: write the CC1E and CC2E bits to ‘1’ in the TIMx_CCER register.

STM32的PWM輸入模式設置并用DMA接收數據

項目中需要進(jìn)行紅外學(xué)習,如果采用輸入捕獲的方式,因為定時(shí)器只能捕獲上升沿或者下降沿,

所以只能獲得周期,而不能得到具體的紅外波的高低電平的時(shí)間.

所以采用PWM輸入的方式進(jìn)行捕獲.采用的是PA8腳,對應TIM1的通道1.

/**********************************************************************             函數**********************************************************************//**********************************************************************             接口函數:初始化紅外學(xué)習模塊**********************************************************************/void inf_infrared_study_init( void ){//初始化io口inf_init_io( );//初始化中斷//inf_init_irq();//初始化定時(shí)器inf_init_timer( );//打開(kāi)DMAinf_infrared_study_open_dma( 1 );//打開(kāi)定時(shí)器inf_infrared_study_open_timer( 1 );}/**********************************************************************             初始化io口**********************************************************************/static void inf_init_io( void ){//定義IO初始化結構體GPIO_InitTypeDef GPIO_InitStructure;//初始化時(shí)鐘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;//初始化中斷腳復用時(shí)鐘RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );//配置中斷源GPIO_EXTILineConfig( GPIO_PortSourceGPIOB, GPIO_PinSource1 );// 配置下降沿觸發(fā)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 );}/**********************************************************************             初始化定時(shí)器**********************************************************************/static void inf_init_timer( void ){//定義定時(shí)器結構體TIM_TimeBaseInitTypeDef timInitStruct;//輸入捕獲結構體TIM_ICInitTypeDef tim_icinit;//定義DMA結構體DMA_InitTypeDef DMA_InitStructure;//啟動(dòng)DMA時(shí)鐘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在傳輸時(shí)緩沖區的長(cháng)度DMA_InitStructure.DMA_BufferSize = RX_LEN_TIM_DMA;//設置DMA的外設遞增模式,一個(gè)外設DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//設置DMA的內存遞增模式DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//外設數據字長(cháng)DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//內存數據字長(cháng)DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//設置DMA的傳輸模式//DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//設置DMA的優(yōu)先級別DMA_InitStructure.DMA_Priority = DMA_Priority_High;//設置DMA的2個(gè)memory中的變量互相訪(fǎng)問(wèn)DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init( DMA1_Channel2, &DMA_InitStructure );//啟動(dòng)DMA時(shí)鐘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在傳輸時(shí)緩沖區的長(cháng)度DMA_InitStructure.DMA_BufferSize = RX_LEN_TIM_DMA;//設置DMA的外設遞增模式,一個(gè)外設DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//設置DMA的內存遞增模式DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//外設數據字長(cháng)DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//內存數據字長(cháng)DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//設置DMA的傳輸模式//DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//設置DMA的優(yōu)先級別DMA_InitStructure.DMA_Priority = DMA_Priority_High;//設置DMA的2個(gè)memory中的變量互相訪(fǎng)問(wèn)DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init( DMA1_Channel3, &DMA_InitStructure );//開(kāi)啟時(shí)鐘RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );//重新將Timer設置為缺省值TIM_DeInit( TIM1 );//采用內部時(shí)鐘提供時(shí)鐘源TIM_InternalClockConfig( TIM1 );//預分頻timInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//計數頻率為500ns跳轉1次      timInitStruct.TIM_Prescaler = SystemCoreClock / 1 - 1;//向上計數          timInitStruct.TIM_CounterMode = TIM_CounterMode_Up;timInitStruct.TIM_RepetitionCounter = 0;//這個(gè)值實(shí)際上就是TIMX->ARR,延時(shí)開(kāi)始時(shí)重新設定即可 timInitStruct.TIM_Period = 0xffff;//初始化定時(shí)器TIM_TimeBaseInit( TIM1, &timInitStruct );//輸入捕獲配置//選擇通道tim_icinit.TIM_Channel = TIM_Channel_1;//硬件濾波tim_icinit.TIM_ICFilter = 0x0;//觸發(fā)捕獲的電平tim_icinit.TIM_ICPolarity = TIM_ICPolarity_Falling;//每次檢測到觸發(fā)電平都捕獲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 );//配置定時(shí)器的DMATIM_DMAConfig( TIM1, TIM_DMABase_CCR1, TIM_DMABurstLength_2Bytes );//產(chǎn)生DMA請求信號TIM_DMACmd( TIM1, TIM_DMA_CC1, ENABLE );//配置定時(shí)器的DMATIM_DMAConfig( TIM1, TIM_DMABase_CCR2, TIM_DMABurstLength_2Bytes );//產(chǎn)生DMA請求信號TIM_DMACmd( TIM1, TIM_DMA_CC2, ENABLE );//打開(kāi)定時(shí)器TIM_Cmd( TIM1, ENABLE );}/**********************************************************************             接口函數:打開(kāi)定時(shí)器*參數:state:狀態(tài):0:關(guān)閉,1:打開(kāi)**********************************************************************/void inf_infrared_study_open_timer( uint8_t state ){if ( state ){TIM_Cmd( TIM1, ENABLE );}else{TIM_Cmd( TIM1, DISABLE );}}/**********************************************************************             接口函數:打開(kāi)中斷*參數:state:狀態(tài):0:關(guān)閉,1:打開(kāi)**********************************************************************/void inf_infrared_study_open_irq( uint8_t state ){//定義中斷結構體NVIC_InitTypeDef NVIC_InitStructure;if ( state ){//打開(kāi)中斷NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;        //通道設置為外部中斷線(xiàn)NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     //中斷搶占先等級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //中斷響應優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               //打開(kāi)中斷NVIC_Init( &NVIC_InitStructure );                                 //初始化}else{//關(guān)閉中斷NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;        //通道設置為外部中斷線(xiàn)NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;     //中斷搶占先等級NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //中斷響應優(yōu)先級NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;              //打開(kāi)中斷NVIC_Init( &NVIC_InitStructure );                                 //初始化}}/**********************************************************************             接口函數:打開(kāi)DMA*參數:state:狀態(tài):0:關(guān)閉,1:打開(kāi)**********************************************************************/void inf_infrared_study_open_dma( uint8_t state ){if ( state ){//設置傳輸數據長(cháng)度//DMA_SetCurrDataCounter(DMA1_Channel3,RX_LEN_TIM_DMA);//打開(kāi)DMADMA_Cmd( DMA1_Channel2, ENABLE );DMA_Cmd( DMA1_Channel3, ENABLE );}else{DMA_Cmd( DMA1_Channel2, DISABLE );DMA_Cmd( DMA1_Channel3, ENABLE );}}/**********************************************************************             接口函數:得到DMA接收幀長(cháng)*返回:幀長(cháng)**********************************************************************/uint16_t inf_infrared_study_dma_rx_len( void ){//獲得接收幀幀長(cháng)return ( RX_LEN_TIM_DMA - DMA_GetCurrDataCounter( DMA1_Channel2 ) );}



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>