STM32学习日志--使用DMA功能自动更新PWM的输出
- /*******************************************************************************
- 编译环境: EWARM V5.30
- 硬件环境: DZY2.PCB
- STM32 FW: V3.0.0
- 作者 : szlihongtao
- ******************************************************************************
- REV : V1.00
- DATE : 2011-04-18
- NOTE :
- *******************************************************************************/
- #include "stm32f10x.h"
- #include "stm32_m.h"
- #include "dzy.h"
- #include "myRCC.h"
- //******************************************************************************
- #define TIM1_CCR3_Address 0x40012C3C
- bit f_tb; // 基本定时标志
- bit f_100ms, f_1000ms;
- INT16U cnt_test; // 计数器,仅供软件调试使用
- float clk_sys; // 仅供软件调试使用
- #if 1
- uint16_t SRC_Buffer[ ] =
- { * }; // 由于载波频率取20kHZ,所以最大脉冲宽度不要超50us,即常数不要超过72*50
- #else
- uint16_t SRC_Buffer[]=
- { *,*,*,*,*,*}; // 由于载波频率取20kHZ,所以最大脉冲宽度不要超50us,即常数不要超过72*50
- #endif
- //******************************************************************************
- // 延时程序,单位为*1ms
- //******************************************************************************
- void delayms( INT16U cnt )
- {
- //#define CONST_1MS 7333 // 72MhZ
- //#define CONST_1MS 3588 // 32MhZ
- #define CONST_1MS (105*FCLK)
- INT16U i;
- __no_operation( );
- while ( cnt-- )
- for ( i = ; i < CONST_1MS; i++ )
- ;
- }
- //******************************************************************************
- // pcb上的指示灯
- //******************************************************************************
- static void led_toggle( void )
- {
- GPIOC->ODR ^= GPIO_Pin_7; // led2 toogle
- GPIOC->ODR ^= GPIO_Pin_6; // led3 toogle
- }
- //******************************************************************************
- // 时钟设置初始化
- //******************************************************************************
- static void RCC_Configuration( void )
- {
- ErrorStatus HSEStartUpStatus;
- /*
- RCC_AdjustHSICalibrationValue 调整内部高速晶振(HSI)校准值
- RCC_ITConfig 使能或者失能指定的RCC中断
- RCC_ClearFlag 清除RCC的复位标志位
- RCC_GetITStatus 检查指定的RCC中断发生与否
- RCC_ClearITPendingBit 清除RCC的中断待处理位
- */
- /* RCC system reset(for debug purpose) */
- // 时钟系统复位
- RCC_DeInit( );
- // 使能外部的8M晶振
- // 设置外部高速晶振(HSE)
- /* Enable HSE */
- RCC_HSEConfig( RCC_HSE_ON );
- // 使能或者失能内部高速晶振(HSI)
- RCC_HSICmd( DISABLE );
- // 等待HSE起振
- // 该函数将等待直到HSE就绪,或者在超时的情况下退出
- /* Wait till HSE is ready */
- HSEStartUpStatus = RCC_WaitForHSEStartUp( );
- if ( HSEStartUpStatus == SUCCESS )
- {
- // 设置AHB时钟(HCLK)
- RCC_HCLKConfig( RCC_HCLK_Div_ ); // 36 MHz
- // 设置低速AHB时钟(PCLK1)
- RCC_PCLK1Config( RCC_PCLK1_Div_ ); // 2.25 MHz
- // 设置高速AHB时钟(PCLK2)
- RCC_PCLK2Config( RCC_PCLK2_Div_ ); // 2.25 MHz
- /* ADCCLK = PCLK2/8 */
- // 设置ADC时钟(ADCCLK)
- RCC_ADCCLKConfig( RCC_ADC_DIV_ ); // 0.281Mhz
- // 设置USB时钟(USBCLK)
- // USB时钟 = PLL时钟除以1.5
- //RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);
- // 设置外部低速晶振(LSE)
- RCC_LSEConfig( RCC_LSE_OFF );
- // 使能或者失能内部低速晶振(LSI)
- // LSE晶振OFF
- RCC_LSICmd( DISABLE );
- // 设置RTC时钟(RTCCLK)
- // 选择HSE时钟频率除以128作为RTC时钟
- //RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
- // 使能或者失能RTC时钟
- // RTC时钟的新状态
- RCC_RTCCLKCmd( DISABLE );
- /* Flash 2 wait state */
- FLASH_SetLatency( FLASH_Latency_2 );
- /* Enable Prefetch Buffer */
- FLASH_PrefetchBufferCmd( FLASH_PrefetchBuffer_Enable );
- /* PLLCLK = 8MHz * 9 = 72 MHz */
- // 设置PLL时钟源及倍频系数
- RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_ );
- /* Enable PLL */
- // 使能或者失能PLL
- RCC_PLLCmd( ENABLE );
- /* Wait till PLL is ready */
- // 检查指定的RCC标志位设置与否
- while ( RCC_GetFlagStatus( RCC_FLAG_PLLRDY ) == RESET )
- {
- }
- /* Select PLL as system clock source */
- // 设置系统时钟(SYSCLK)
- RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );
- /* Wait till PLL is used as system clock source */
- // 返回用作系统时钟的时钟源
- while ( RCC_GetSYSCLKSource( ) != 0x08 )
- {
- }
- }
- // 使能或者失能AHB外设时钟
- RCC_AHBPeriphClockCmd(
- RCC_AHBPeriph_DMA1 | RCC_AHBPeriph_DMA2 | RCC_AHBPeriph_SRAM
- | RCC_AHBPeriph_FLITF | RCC_AHBPeriph_CRC | RCC_AHBPeriph_FSMC
- | RCC_AHBPeriph_SDIO, DISABLE );
- // 使能或者失能APB1外设时钟
- RCC_APB1PeriphClockCmd( RCC_APB1Periph_ALL, DISABLE );
- // 强制或者释放高速APB(APB2)外设复位
- RCC_APB2PeriphResetCmd( RCC_APB2Periph_ALL, ENABLE );
- // 退出复位状态
- RCC_APB2PeriphResetCmd( RCC_APB2Periph_ALL, DISABLE );
- // 强制或者释放低速APB(APB1)外设复位
- RCC_APB1PeriphResetCmd( RCC_APB1Periph_ALL, ENABLE );
- // 强制或者释放后备域复位
- RCC_BackupResetCmd( ENABLE );
- // 使能或者失能时钟安全系统
- RCC_ClockSecuritySystemCmd( DISABLE );
- }
- //******************************************************************************
- // NVIC设置
- //******************************************************************************
- void NVIC_Configuration( void )
- {
- NVIC_InitTypeDef NVIC_InitStructure;
- /* Configure one bit for preemption priority */
- NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
- NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- //NVIC_Init(&NVIC_InitStructure);
- NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- //NVIC_Init(&NVIC_InitStructure);
- NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init( &NVIC_InitStructure );
- }
- //******************************************************************************
- // SysTick设置初始化
- //******************************************************************************
- static void SysTick_Config1( void )
- {
- #if 1
- #define SystemFreq (FCLK*1000000.0) // 单位为Hz
- #define TB_SysTick (TIME_TB*1000) // 单位为uS,与示波器实测一致
- static INT32U ticks;
- ticks = ( INT32U )( ( TB_SysTick / 1000000.0 ) * SystemFreq );
- SysTick_Config( ticks );
- #endif
- }
- //******************************************************************************
- // GPIO设置
- //******************************************************************************
- static void GPIO_Configuration( void )
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(
- RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
- | RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE );
- //------------------------------------------------------------------------------
- GPIO_Write( GPIOA, 0xffff );
- /* GPIOA Configuration: Channel 3 as alternate function push-pull */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init( GPIOA, &GPIO_InitStructure );
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- // GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init( GPIOA, &GPIO_InitStructure );
- //------------------------------------------------------------------------------
- GPIO_Write( GPIOB, 0xffff ); // 11111101-11111111
- /* GPIOB Configuration: Channel 3N as alternate function push-pull */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_Init( GPIOB, &GPIO_InitStructure );
- //------------------------------------------------------------------------------
- GPIO_Write( GPIOC, 0xff0f ); // 11111111-00001111
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_4
- | GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init( GPIOC, &GPIO_InitStructure );
- //------------------------------------------------------------------------------
- GPIO_Write( GPIOD, 0xffff ); // 11111111-11111111
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init( GPIOD, &GPIO_InitStructure );
- }
- //******************************************************************************
- void DMA_Configuration( void )
- {
- DMA_InitTypeDef DMA_InitStructure;
- RCC_AHBPeriphClockCmd( RCC_AHBPeriph_DMA1, ENABLE ); // dma1时钟使能
- DMA_DeInit( DMA1_Channel5 ); // DMA复位
- DMA_StructInit( &DMA_InitStructure ); // DMA缺省的参数
- DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) TIM1_CCR3_Address; //外设地址
- DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) SRC_Buffer; //内存地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //dma传输方向,单向
- DMA_InitStructure.DMA_BufferSize = sizeof( SRC_Buffer ) / ; //设置DMA在传输时缓冲区的长度
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //设置DMA的外设递增模式,一个外设
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA的内存递增模式,
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外设数据字长
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //内存数据字长
- //循环模式开启,Buffer写满后,自动回到初始地址开始传输
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //设置DMA的传输模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_High; //设置DMA的优先级别
- DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //设置DMA的2个memory中的变量互相访问
- DMA_Init( DMA1_Channel5, &DMA_InitStructure );
- DMA_ClearFlag( DMA1_IT_TC5 );
- DMA_ITConfig( DMA1_Channel5, DMA_IT_TC, ENABLE );
- DMA_Cmd( DMA1_Channel5, ENABLE );
- }
- /* TIM1 DMA Transfer example -------------------------------------------------
- TIM1CLK = 72 MHz, Prescaler = 0, TIM1 counter clock = 72 MHz
- The TIM1 Channel3 is configured to generate a complementary PWM signal with
- a frequency equal to: TIM1 counter clock / (TIM1_Period + 1) = 17.57 KHz and
- a variable duty cycle that is changed by the DMA after a specific number of
- Update DMA request.
- The number of this repetitive requests is defined by the TIM1 Repetion counter,
- each 3 Update Requests, the TIM1 Channel 3 Duty Cycle changes to the next new
- value defined by the SRC_Buffer .
- -----------------------------------------------------------------------------*/
- //******************************************************************************
- void Tim1_Configuration( void )
- {
- INT16U TIM_Prescaler, TIM_Period;
- INT32U utemp;
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_OCInitTypeDef TIM_OCInitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );
- TIM_DeInit( TIM1 );
- utemp = ( INT32U )( TIM1CLK * 1000000.0 ) / Freq_PWM;
- TIM_Prescaler = utemp / ;
- ++TIM_Prescaler; // 注意这句话,一定要++
- utemp = ( INT32U )( TIM1CLK * 1000000.0 ) / TIM_Prescaler; // 分频后的定时器输入频率
- TIM_Period = utemp / Freq_PWM; // 周期常数
- TIM_TimeBaseStructure.TIM_Period = TIM_Period - ;
- TIM_TimeBaseStructure.TIM_Prescaler = TIM_Prescaler - ;
- TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
- TIM_TimeBaseStructure.TIM_RepetitionCounter = - ; // 每次直接更新
- TIM_TimeBaseInit( TIM1, &TIM_TimeBaseStructure );
- //------------------------------------------------------------------------------
- /* PWM1 Mode configuration: Channel1 */
- TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
- TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出比较状态
- TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; // 失能输出比较N状态
- TIM_OCInitStructure.TIM_Pulse = ;
- /*
- TIM_OCMode_PWM2 TIM_OCPolarity_Low 正脉冲模式
- TIM_OCMode_PWM2 TIM_OCPolarity_High 负脉冲模式
- TIM_OCMode_PWM1 TIM_OCPolarity_Low 负脉冲模式
- TIM_OCMode_PWM1 TIM_OCPolarity_High 正脉冲模式
- TIM1_OCPolarity输出极性---TIM_OCPolarity_High,输出比较极性高,输出的是正脉冲
- TIM1_OCPolarity输出极性---TIM_OCPolarity_Low, 输出比较极性低,输出的是负脉冲
- */
- TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
- TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; // 互补输出极性
- // 选择空闲状态下的非工作状态
- // 当MOE=0设置TIM1输出比较空闲状态
- // 默认输出位低电平
- TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
- // 选择空闲状态下的非工作状态
- // 当MOE=0重置TIM1输出比较N空闲状态
- TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
- TIM_OC3Init( TIM1, &TIM_OCInitStructure );
- TIM_OC3PreloadConfig( TIM1, TIM_OCPreload_Enable ); // 使能TIMx在CCR1上的预装载寄存器
- /* TIM1 Update DMA Request enable */
- TIM_DMACmd( TIM1, TIM_DMA_Update, ENABLE );
- //TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); // 定时中断使能
- //TIM_ITConfig(TIM1,TIM_IT_CC3,ENABLE); // 定时中断使能
- TIM_Cmd( TIM1, ENABLE ); // 定时器开始运行
- // 这条语句必须要有!!!
- TIM_CtrlPWMOutputs( TIM1, ENABLE ); /* Main Output Enable */
- }
- //******************************************************************************
- // 基本定时程序,周期为 TIME_TB
- //******************************************************************************
- static func_tb( void )
- {
- static INT16U tmr_100ms;
- static INT16U tmr_1000ms;
- if ( !f_tb )
- return;
- f_tb = ;
- if ( ++tmr_100ms >= ( / TIME_TB ) )
- {
- tmr_100ms = ;
- f_100ms = ;
- GPIOC->ODR ^= GPIO_Pin_4; // led5 toogle
- }
- if ( ++tmr_1000ms >= ( / TIME_TB ) )
- {
- tmr_1000ms = ;
- f_1000ms = ;
- GPIOC->ODR ^= GPIO_Pin_5; // led4 toogle
- }
- }
- //******************************************************************************
- // 进入睡眠模式
- // 自行编写
- //******************************************************************************
- void myPWR_EnterSleepMode( void )
- {
- //PWR->CR |= CR_CWUF_Set; /* Clear Wake-up flag */
- /* Set SLEEPDEEP bit of Cortex System Control Register */
- //*(__IO uint32_t *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set;
- /* This option is used to ensure that store operations are completed */
- __WFI( ); /* Request Wait For Interrupt */
- }
- //******************************************************************************
- // 主程序
- //******************************************************************************
- void main( void )
- {
- int i;
- RCC_Configuration( );
- GPIO_Configuration( );
- delayms( ); // 延时,等待电压稳定
- Tim1_Configuration( );
- DMA_Configuration( );
- SysTick_Config1( );
- NVIC_Configuration( );
- //------------------------------------------------------------------------------
- for ( i = ; i < ; ++i )
- {
- //i=0;
- //GPIOA->ODR ^= GPIO_Pin_10; // led3 toogle
- //GPIOA->ODR ^= GPIO_Pin_11; // led3 toogle
- delayms( );
- led_toggle( );
- }
- //------------------------------------------------------------------------------
- for ( ;; )
- {
- //if (set_sw&0x01)
- //myPWR_EnterSleepMode(); // 休眠,降低功耗
- func_tb( );
- }
- }
- //******************************************************************************
- #ifdef USE_FULL_ASSERT
- /**
- * @brief Reports the name of the source file and the source line number
- * where the assert_param error has occurred.
- * @param file: pointer to the source file name
- * @param line: assert_param error line source number
- * @retval : None
- */
- void assert_failed(uint8_t* file, uint32_t line)
- {
- /* User can add his own implementation to report the file name and line number,
- ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
- /* Infinite loop */
- while ()
- {
- }
- }
- #endif
- /**
- ******************************************************************************
- * @file Project/Template/stm32f10x_it.c
- * @author MCD Application Team
- * @version V3.0.0
- * @date 04/06/2009
- * @brief Main Interrupt Service Routines.
- * This file provides template for all exceptions handler and
- * peripherals interrupt service routine.
- ******************************************************************************
- * @copy
- *
- * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
- * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
- * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
- * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
- * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
- * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
- *
- * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
- */
- /* Includes ------------------------------------------------------------------*/
- #include "stm32f10x_it.h"
- #include "stm32_m.h"
- int tt;
- extern bit f_tb; // 基本定时标志
- //******************************************************************************
- /******************************************************************************/
- /* Cortex-M3 Processor Exceptions Handlers */
- /******************************************************************************/
- /**
- * @brief This function handles NMI exception.
- * @param None
- * @retval : None
- */
- void NMI_Handler( void )
- {
- }
- /**
- * @brief This function handles Hard Fault exception.
- * @param None
- * @retval : None
- */
- void HardFault_Handler( void )
- {
- /* Go to infinite loop when Hard Fault exception occurs */
- while ( )
- {
- }
- }
- /**
- * @brief This function handles Memory Manage exception.
- * @param None
- * @retval : None
- */
- void MemManage_Handler( void )
- {
- /* Go to infinite loop when Memory Manage exception occurs */
- while ( )
- {
- }
- }
- /**
- * @brief This function handles Bus Fault exception.
- * @param None
- * @retval : None
- */
- void BusFault_Handler( void )
- {
- /* Go to infinite loop when Bus Fault exception occurs */
- while ( )
- {
- }
- }
- /**
- * @brief This function handles Usage Fault exception.
- * @param None
- * @retval : None
- */
- void UsageFault_Handler( void )
- {
- /* Go to infinite loop when Usage Fault exception occurs */
- while ( )
- {
- }
- }
- /**
- * @brief This function handles SVCall exception.
- * @param None
- * @retval : None
- */
- void SVC_Handler( void )
- {
- }
- /**
- * @brief This function handles Debug Monitor exception.
- * @param None
- * @retval : None
- */
- void DebugMon_Handler( void )
- {
- }
- /**
- * @brief This function handles PendSVC exception.
- * @param None
- * @retval : None
- */
- void PendSV_Handler( void )
- {
- }
- /**
- * @brief This function handles SysTick Handler.
- * @param None
- * @retval : None
- */
- void SysTick_Handler( void )
- {
- f_tb = ;
- }
- /******************************************************************************/
- /* STM32F10x Peripherals Interrupt Handlers */
- /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
- /* available peripheral interrupt handler's name please refer to the startup */
- /* file (startup_stm32f10x_xx.s). */
- /******************************************************************************/
- void TIM1_UP_IRQHandler( void ) // 实际测量,周期为50US
- {
- tt = ;
- TIM_ClearITPendingBit( TIM1, TIM_IT_Update );
- }
- /******************************************************************************/
- void TIM1_CC_IRQHandler( void )
- {
- tt = ;
- TIM_ClearITPendingBit( TIM1, TIM_IT_CC3 );
- }
- /******************************************************************************/
- void DMA1_Channel5_IRQHandler( void )
- {
- tt = ;
- DMA_ClearITPendingBit( DMA1_IT_TC5 );
- GPIOA->ODR ^= GPIO_Pin_11; // for test!
- }
- //******************************************************************************
- /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
- //******************************************************************************
STM32学习日志--使用DMA功能自动更新PWM的输出的更多相关文章
- [阿里DIN] 从论文源码学习 之 embedding层如何自动更新
[阿里DIN] 从论文源码学习 之 embedding层如何自动更新 目录 [阿里DIN] 从论文源码学习 之 embedding层如何自动更新 0x00 摘要 0x01 DIN源码 1.1 问题 1 ...
- stm32学习笔记之GPIO功能框图分析
GPIO 是通用输入输出端口的简称,简单来说就是STM32 可控制的引脚,STM32 芯片的GPIO 引脚与外部设备连接起来,从而实现与外部通讯.控制以及数据采集的功能.STM32 芯片的GPIO被分 ...
- STM32学习日志
今天是开学第二周周末 写这篇博客纯属是为了记住一些学到的知识,大佬勿喷.. 首先学32要知道一些选型知识,32中常用的芯片类型(某宝常卖的开发板芯片大多是这几种):C8T6,RBT6,RCT6,VET ...
- Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?
在 <Cordova webapp实战开发:(4)Android环境搭建>中我们搭建好了开发环境,也给大家布置了调用插件的预习作业,做得如何了呢?今天我们来学一下如何自己从头建立一个And ...
- spring cloud学习(六) 配置中心-自动更新
上一篇学习了spring cloud config的基本使用,但发现有个问题,就是每次更改配置后,都需要重启服务才能更新配置,这样肯定是不行的.在上网查资料了解后,spring cloud支持通过AM ...
- WinForm应用程序中实现自动更新功能
WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因 ...
- StringBoot整合ELK实现日志收集和搜索自动补全功能(详细图文教程)
@ 目录 StringBoot整合ELK实现日志收集和搜索自动补全功能(详细图文教程) 一.下载ELK的安装包上传并解压 1.Elasticsearch下载 2.Logstash下载 3.Kibana ...
- Android应用自动更新功能的代码实现
由于Android项目开源所致,市面上出现了N多安卓软件市场.为了让我们开发的软件有更多的用户使用,我们需要向N多市场发布,软件升级后,我们也必须到安卓市场上进行更新,给我们增加了工作量.因此我们有必 ...
- Winform(C#.NET)自动更新组件的使用及部分功能实现
声明:核心功能的实现是由园子里圣殿骑士大哥写的,本人是基于他核心代码,按照自己需求进行修改的. 而AutoUpdaterService.xml文件生成工具是基于评论#215楼 ptangbao的代 ...
随机推荐
- 在 Linux 中安装 VMware Tools
由于较新的Linux版本中都包含了vm的部分组件,导致直接安装VMware Tools失败.所以这里写了篇新的. 软件版本:VMware 12 Linux版本:Ubuntu Desktop 16.04 ...
- HDU 2054 又见GCD
又见GCD Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU 6406 Taotao Picks Apples 线段树维护
题意:给个T,T组数据: 每组给个n,m:n个数,m个操作: (对序列的操作是,一开始假设你手上东西是-INF,到i=1时拿起1,之后遍历,遇到比手头上的数量大的数时替换(拿到手的算拿走),问最后拿走 ...
- 一份最中肯的Java学习路线+资源分享(拒绝傻逼式分享)
这是一篇针对Java初学者,或者说在Java学习路线上出了一些问题(不知道该学什么.不知道整体的学习路线是什么样的) 第一步:Java基础(一个月左右) 推荐视频: 下面的是黑马内部视频,我比较推荐的 ...
- SquishIt引起的HTTP Error 500.0 - Internal Server Error
将一个ASP.NET项目从.NET Framework 4.0升级至.NET Framework 4.5之后,访问时出现HTTP Error 500.0 - Internal Server Error ...
- python3解析库pyquery
pyquery是一个类似jquery的python库,它实现能够在xml文档中进行jQuery查询,pyquery使用lxml解析器进行快速在xml和html文档上操作,它提供了和jQuery类似的语 ...
- springboot日志框架
Spring Boot日志框架Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用L ...
- hadoop控制map个数(转)
原文链接:https://blog.csdn.net/lylcore/article/details/9136555 hadooop提供了一个设置map个数的参数mapred.map.task ...
- 【mysql】source导入多个文件
在mysql中,可以将表导出为sql文件,比如1.sql, 2.sql等等. 导入一个文件: source /home/somepath/.sql 那么问题来了,如果我想一次导入100个文件呢?总不能 ...
- JS模块化编程(一):CommonJS,AMD/CMD
前言 模块化是什么? 为什么采用模块化? 场景: 一个html,因不同的业务需求开发,会不断的引入js文件.另外,a.js和b.js中的变量或函数必须是全局的,才能暴露给使用方. <script ...