久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16383|回復(fù): 16
打印 上一主題 下一主題
收起左側(cè)

STM32學(xué)習(xí)-使用DMA功能自動(dòng)更新PWM的輸出

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:81272 發(fā)表于 2015-5-27 16:28 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
完整程序源代碼工程文件下載地址: 使用DMA功能自動(dòng)更新PWM的輸出.RAR (253.23 KB, 下載次數(shù): 181)


  1. //------------------------------------------------------------------------------
  2. #if        (RCC_PLLMul==2)             // ok
  3.         #define RCC_PLLMul_  RCC_PLLMul_2
  4. #elif (RCC_PLLMul==4)
  5.         #define RCC_PLLMul_  RCC_PLLMul_4
  6. #elif (RCC_PLLMul==8)
  7.         #define RCC_PLLMul_  RCC_PLLMul_8
  8. #elif (RCC_PLLMul==9)
  9.         #define RCC_PLLMul_  RCC_PLLMul_9
  10. #elif (RCC_PLLMul==16)
  11.         #define RCC_PLLMul_  RCC_PLLMul_16
  12. #else
  13.         error
  14. #endif

  15. #define SYSCLK  (float)(FREQ_HSE*RCC_PLLMul)

  16. //------------------------------------------------------------------------------
  17. #if        (RCC_AHB_Div==1)                     // ok
  18.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div1
  19. #elif (RCC_AHB_Div==2)
  20.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div2
  21. #elif (RCC_AHB_Div==4)
  22.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div4
  23. #elif (RCC_AHB_Div==8)
  24.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div8
  25. #elif (RCC_AHB_Div==16)
  26.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div16
  27. #elif (RCC_AHB_Div==64)
  28.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div64
  29. #elif (RCC_AHB_Div==128)
  30.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div128
  31. #elif (RCC_AHB_Div==256)
  32.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div256
  33. #elif (RCC_AHB_Div==512)
  34.         #define RCC_HCLK_Div_ RCC_SYSCLK_Div512
  35. #else
  36.         error
  37. #endif

  38. #define HCLK (float)(SYSCLK/RCC_AHB_Div)
  39. #define FCLK (float)(HCLK)
  40. //------------------------------------------------------------------------------

  41. #if (RCC_APB1_Div==1)                         // ok
  42.         #define RCC_PCLK1_Div_ RCC_HCLK_Div1
  43. #elif (RCC_APB1_Div==2)
  44.         #define RCC_PCLK1_Div_ RCC_HCLK_Div2
  45. #elif (RCC_APB1_Div==4)
  46.         #define RCC_PCLK1_Div_ RCC_HCLK_Div4
  47. #elif (RCC_APB1_Div==8)
  48.         #define RCC_PCLK1_Div_ RCC_HCLK_Div8
  49. #elif (RCC_APB1_Div==16)
  50.         #define RCC_PCLK1_Div_ RCC_HCLK_Div16
  51. #else
  52.         error
  53. #endif

  54. #define PCLK1 (float)(HCLK/RCC_APB1_Div)


  55. //------------------------------------------------------------------------------

  56. #if (RCC_APB2_Div==1)                         // ok
  57.         #define RCC_PCLK2_Div_ RCC_HCLK_Div1
  58. #elif (RCC_APB2_Div==2)
  59.         #define RCC_PCLK2_Div_ RCC_HCLK_Div2
  60. #elif (RCC_APB2_Div==4)
  61.         #define RCC_PCLK2_Div_ RCC_HCLK_Div4
  62. #elif (RCC_APB2_Div==8)
  63.         #define RCC_PCLK2_Div_ RCC_HCLK_Div8
  64. #elif (RCC_APB2_Div==16)
  65.         #define RCC_PCLK2_Div_ RCC_HCLK_Div16
  66. #else
  67.         error
  68. #endif

  69. #define PCLK2 (float)(HCLK/RCC_APB2_Div)

  70. //------------------------------------------------------------------------------

  71. #if (RCC_ADC_DIV==2)
  72.         #define RCC_ADC_DIV_ RCC_PCLK2_Div2
  73. #elif (RCC_ADC_DIV==4)
  74.         #define RCC_ADC_DIV_ RCC_PCLK2_Div4
  75. #elif (RCC_ADC_DIV==6)
  76.         #define RCC_ADC_DIV_ RCC_PCLK2_Div6
  77. #elif (RCC_ADC_DIV==8)
  78.         #define RCC_ADC_DIV_ RCC_PCLK2_Div8
  79. #else
  80.         error
  81. #endif

  82. //------------------------------------------------------------------------------

  83. #if (RCC_APB1_Div==1)
  84.         #define FACTOR_TIM234567        1
  85. #else
  86.         #define FACTOR_TIM234567        2
  87. #endif
  88. #define TIM234567CLK         (PCLK1*FACTOR_TIM234567)
  89. #define TIM2CLK                 TIM234567CLK
  90. #define TIM3CLK                 TIM234567CLK
  91. #define TIM4CLK                 TIM234567CLK
  92. #define TIM5CLK                 TIM234567CLK
  93. #define TIM6CLK                 TIM234567CLK
  94. #define TIM7CLK                 TIM234567CLK

  95. //------------------------------------------------------------------------------
  96. #if (RCC_APB2_Div==1)
  97.         #define TIM1CLK         (PCLK2)  
  98.         #define TIM8CLK         (PCLK2)  
  99. #else
  100.         #define TIM1CLK         (PCLK2*2)   
  101.         #define TIM8CLK         (PCLK2*2)   
  102. #endif

  103. //------------------------------------------------------------------------------
  104. #define ADCCLK                 ((float)PCLK2/RCC_ADC_DIV)  

  105. #define ADCCLKx10         (10*FREQ_HSE*RCC_PLLMul/(RCC_AHB_Div*RCC_APB2_Div*RCC_ADC_DIV))  // 僅僅用于下面的判斷
  106. #if (ADCCLKx10<6)
  107.         error                     // adc的時(shí)鐘最小為0.6MHz
  108. #elif (ADCCLKx10>140)
  109.         error                     // adc的時(shí)鐘最大為14MHz
  110. #else
  111.                                         // 正常的adc頻率范圍
  112. #endif

  113. //------------------------------------------------------------------------------
  114. //------------------------------------------------------------------------------
  115. //------------------------------------------------------------------------------

復(fù)制代碼
  1. /*******************************************************************************
  2. 編譯環(huán)境:        EWARM V5.30
  3. 硬件環(huán)境:        DZY2.PCB
  4. STM32 FW:   V3.0.0
  5. 作者        :        szlihongtao
  6. ******************************************************************************
  7. REV                :        V1.00
  8. DATE        :        2017-04-18
  9. NOTE        :  
  10. *******************************************************************************/
  11. #include "stm32f10x.h"
  12. #include "stm32_m.h"
  13. #include "dzy.h"   
  14. #include "myRCC.h"   
  15. //******************************************************************************
  16. #define TIM1_CCR3_Address    0x40012C3C

  17. bit f_tb;                                // 基本定時(shí)標(biāo)志
  18. bit f_100ms,f_1000ms;                         
  19. INT16U cnt_test;                // 計(jì)數(shù)器,僅供軟件調(diào)試使用
  20. float clk_sys;                        // 僅供軟件調(diào)試使用
  21. #if 0
  22. uint16_t SRC_Buffer[]={72*5};// 由于載波頻率取20kHZ,所以最大脈沖寬度不要超50us,即常數(shù)不要超過72*50
  23. #else
  24. uint16_t SRC_Buffer[]={72*2,72*5,72*10,72*20,72*40,72*10};// 由于載波頻率取20kHZ,所以最大脈沖寬度不要超50us,即常數(shù)不要超過72*50
  25. #endif
  26. //******************************************************************************
  27. // 延時(shí)程序,單位為*1ms
  28. //******************************************************************************
  29. void delayms(INT16U cnt)
  30. {
  31. //#define          CONST_1MS  7333          // 72MhZ
  32. //#define          CONST_1MS 3588          // 32MhZ
  33. #define          CONST_1MS (105*FCLK)
  34.         
  35.         INT16U i;

  36.    __no_operation();
  37.         while(cnt--)
  38.                 for (i=0; i<CONST_1MS; i++);
  39. }
  40. //******************************************************************************
  41. // pcb上的指示燈
  42. //******************************************************************************
  43. static void led_toggle(void)
  44. {
  45.         GPIOC->ODR ^= GPIO_Pin_7;                // led2 toogle
  46.         GPIOC->ODR ^= GPIO_Pin_6;                // led3 toogle
  47. }
  48. //******************************************************************************
  49. // 時(shí)鐘設(shè)置初始化
  50. //******************************************************************************
  51. static void RCC_Configuration(void)
  52. {
  53.   ErrorStatus HSEStartUpStatus;
  54. /*
  55. RCC_AdjustHSICalibrationValue 調(diào)整內(nèi)部高速晶振(HSI)校準(zhǔn)值
  56. RCC_ITConfig 使能或者失能指定的RCC中斷
  57. RCC_ClearFlag 清除RCC的復(fù)位標(biāo)志位
  58. RCC_GetITStatus 檢查指定的RCC中斷發(fā)生與否
  59. RCC_ClearITPendingBit 清除RCC的中斷待處理位
  60. */
  61.           /* RCC system reset(for debug purpose) */
  62.           // 時(shí)鐘系統(tǒng)復(fù)位
  63.           RCC_DeInit();

  64.         // 使能外部的8M晶振
  65.         // 設(shè)置外部高速晶振(HSE)
  66.           /* Enable HSE */
  67.           RCC_HSEConfig(RCC_HSE_ON);

  68.         // 使能或者失能內(nèi)部高速晶振(HSI)
  69.         RCC_HSICmd(DISABLE);

  70.         // 等待HSE起振
  71.         // 該函數(shù)將等待直到HSE就緒,或者在超時(shí)的情況下退出
  72.           /* Wait till HSE is ready */
  73.           HSEStartUpStatus = RCC_WaitForHSEStartUp();

  74.           if(HSEStartUpStatus == SUCCESS)
  75.           {
  76.                 // 設(shè)置AHB時(shí)鐘(HCLK)
  77.             RCC_HCLKConfig(RCC_HCLK_Div_);        // 36 MHz

  78.                 // 設(shè)置低速AHB時(shí)鐘(PCLK1)
  79.             RCC_PCLK1Config(RCC_PCLK1_Div_);        // 2.25 MHz

  80.                 // 設(shè)置高速AHB時(shí)鐘(PCLK2)
  81.             RCC_PCLK2Config(RCC_PCLK2_Div_);        // 2.25 MHz

  82.             /* ADCCLK = PCLK2/8 */
  83.                 // 設(shè)置ADC時(shí)鐘(ADCCLK)
  84.                    RCC_ADCCLKConfig(RCC_ADC_DIV_);        // 0.281Mhz

  85.                 // 設(shè)置USB時(shí)鐘(USBCLK)
  86.                 // USB時(shí)鐘 = PLL時(shí)鐘除以1.5
  87.                 //RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);

  88.                 // 設(shè)置外部低速晶振(LSE)
  89.                 RCC_LSEConfig(RCC_LSE_OFF);

  90.                 // 使能或者失能內(nèi)部低速晶振(LSI)
  91.                 // LSE晶振OFF
  92.                 RCC_LSICmd(DISABLE);

  93.                 // 設(shè)置RTC時(shí)鐘(RTCCLK)
  94.                 // 選擇HSE時(shí)鐘頻率除以128作為RTC時(shí)鐘
  95.                 //RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

  96.                 // 使能或者失能RTC時(shí)鐘
  97.                 // RTC時(shí)鐘的新狀態(tài)
  98.                 RCC_RTCCLKCmd(DISABLE);

  99.             /* Flash 2 wait state */
  100.             FLASH_SetLatency(FLASH_Latency_2);

  101.             /* Enable Prefetch Buffer */
  102.             FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  103.             /* PLLCLK = 8MHz * 9 = 72 MHz */
  104.                 // 設(shè)置PLL時(shí)鐘源及倍頻系數(shù)
  105.             RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_);
  106.                
  107.             /* Enable PLL */
  108.                 // 使能或者失能PLL
  109.             RCC_PLLCmd(ENABLE);

  110.             /* Wait till PLL is ready */
  111.                 // 檢查指定的RCC標(biāo)志位設(shè)置與否
  112.             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  113.             {
  114.             }

  115.             /* Select PLL as system clock source */
  116.                 // 設(shè)置系統(tǒng)時(shí)鐘(SYSCLK)
  117.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  118.             /* Wait till PLL is used as system clock source */
  119.                 // 返回用作系統(tǒng)時(shí)鐘的時(shí)鐘源
  120.             while(RCC_GetSYSCLKSource() != 0x08)
  121.             {
  122.             }
  123.   }

  124.         // 使能或者失能AHB外設(shè)時(shí)鐘
  125.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1
  126.                                                         |RCC_AHBPeriph_DMA2
  127.                                                         |RCC_AHBPeriph_SRAM
  128.                                                         |RCC_AHBPeriph_FLITF
  129.                                                         |RCC_AHBPeriph_CRC
  130.                                                         |RCC_AHBPeriph_FSMC
  131.                                                         |RCC_AHBPeriph_SDIO,DISABLE);
  132.         // 使能或者失能APB1外設(shè)時(shí)鐘
  133.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL,DISABLE);

  134.         // 強(qiáng)制或者釋放高速APB(APB2)外設(shè)復(fù)位
  135.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,ENABLE);
  136.         // 退出復(fù)位狀態(tài)
  137.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,DISABLE);

  138.         // 強(qiáng)制或者釋放低速APB(APB1)外設(shè)復(fù)位
  139.         RCC_APB1PeriphResetCmd(RCC_APB1Periph_ALL,ENABLE);

  140.         // 強(qiáng)制或者釋放后備域復(fù)位
  141.         RCC_BackupResetCmd(ENABLE);

  142.         // 使能或者失能時(shí)鐘安全系統(tǒng)
  143.         RCC_ClockSecuritySystemCmd(DISABLE);
  144. }
  145. //******************************************************************************
  146. // NVIC設(shè)置
  147. //******************************************************************************
  148. void NVIC_Configuration(void)
  149. {
  150.         NVIC_InitTypeDef  NVIC_InitStructure;

  151.           /* Configure one bit for preemption priority */
  152.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  153.         NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_IRQn;
  154.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  155.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  156.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  157.           //NVIC_Init(&NVIC_InitStructure);

  158.         NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQn;
  159.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  160.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  161.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  162.           //NVIC_Init(&NVIC_InitStructure);
  163.        
  164.         NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel5_IRQn;
  165.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  166.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  167.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  168.           NVIC_Init(&NVIC_InitStructure);
  169. }
  170. //******************************************************************************
  171. // SysTick設(shè)置初始化
  172. //******************************************************************************
  173. static void SysTick_Config1(void)
  174. {
  175. #if 1
  176.         #define SystemFreq                (FCLK*1000000.0)    // 單位為Hz
  177.         #define TB_SysTick                (TIME_TB*1000)                // 單位為uS,與示波器實(shí)測一致

  178.         static INT32U ticks;

  179.         ticks=(INT32U)((TB_SysTick/1000000.0)*SystemFreq);
  180.         SysTick_Config(ticks);
  181. #endif       
  182. }
  183. //******************************************************************************
  184. // GPIO設(shè)置
  185. //******************************************************************************
  186. static void GPIO_Configuration(void)
  187. {
  188.         GPIO_InitTypeDef GPIO_InitStructure;

  189.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA
  190.                                                         |RCC_APB2Periph_GPIOB
  191.                                                         |RCC_APB2Periph_GPIOC
  192.                                                         |RCC_APB2Periph_GPIOD
  193.                                                         |RCC_APB2Periph_AFIO, ENABLE);

  194. //------------------------------------------------------------------------------
  195.     GPIO_Write(GPIOA,0xffff);       
  196.    
  197.      /* GPIOA Configuration: Channel 3 as alternate function push-pull */
  198.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
  199.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  200.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  201.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  202.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10;
  203.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  204.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  205.    // GPIO_Init(GPIOA, &GPIO_InitStructure);
  206.        
  207.     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;
  208.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  209.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  210.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  211. //------------------------------------------------------------------------------

  212.     GPIO_Write(GPIOB,0xffff);        // 11111101-11111111     
  213.    
  214.      /* GPIOB Configuration: Channel 3N as alternate function push-pull */
  215.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  216.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  217.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  218.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  219. //------------------------------------------------------------------------------
  220.        
  221.         GPIO_Write(GPIOC,0xff0f);        // 11111111-00001111

  222.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_4|GPIO_Pin_5;
  223.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  224.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  225.           GPIO_Init(GPIOC, &GPIO_InitStructure);
  226. //------------------------------------------------------------------------------
  227.         GPIO_Write(GPIOD,0xffff);        // 11111111-11111111   

  228.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_2;
  229.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  230.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  231.           GPIO_Init(GPIOD, &GPIO_InitStructure);
  232. }
  233. //******************************************************************************
  234. void DMA_Configuration(void)
  235. {
  236.         DMA_InitTypeDef DMA_InitStructure;

  237.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);                // dma1時(shí)鐘使能
  238.        
  239.         DMA_DeInit(DMA1_Channel5);                        // DMA復(fù)位
  240.         DMA_StructInit(&DMA_InitStructure);// DMA缺省的參數(shù)

  241.           DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_CCR3_Address;                //外設(shè)地址
  242.           DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer;//內(nèi)存地址
  243.           DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;        //dma傳輸方向,單向
  244.           DMA_InitStructure.DMA_BufferSize = sizeof(SRC_Buffer)/2;                //設(shè)置DMA在傳輸時(shí)緩沖區(qū)的長度
  245.           DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//設(shè)置DMA的外設(shè)遞增模式,一個(gè)外設(shè)
  246.           DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//設(shè)置DMA的內(nèi)存遞增模式,
  247.           DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //外設(shè)數(shù)據(jù)字長
  248.           DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;                        //內(nèi)存數(shù)據(jù)字長
  249.         //循環(huán)模式開啟,Buffer寫滿后,自動(dòng)回到初始地址開始傳輸
  250.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                //設(shè)置DMA的傳輸模式
  251.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;        //設(shè)置DMA的優(yōu)先級(jí)別
  252.           DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                //設(shè)置DMA的2個(gè)memory中的變量互相訪問
  253.           DMA_Init(DMA1_Channel5, &DMA_InitStructure);

  254.         DMA_ClearFlag(DMA1_IT_TC5);
  255.         DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);

  256.           DMA_Cmd(DMA1_Channel5, ENABLE);
  257. }

  258. /* TIM1 DMA Transfer example -------------------------------------------------
  259.   TIM1CLK = 72 MHz, Prescaler = 0, TIM1 counter clock = 72 MHz
  260.   The TIM1 Channel3 is configured to generate a complementary PWM signal with
  261.   a frequency equal to: TIM1 counter clock / (TIM1_Period + 1) = 17.57 KHz and
  262.   a variable duty cycle that is changed by the DMA after a specific number of
  263.   Update DMA request.
  264.   The number of this repetitive requests is defined by the TIM1 Repetion counter,
  265.   each 3 Update Requests, the TIM1 Channel 3 Duty Cycle changes to the next new
  266.   value defined by the SRC_Buffer .
  267.   -----------------------------------------------------------------------------*/
  268. //******************************************************************************
  269. void Tim1_Configuration(void)
  270. {
  271.         INT16U TIM_Prescaler,TIM_Period;
  272.         INT32U utemp;
  273.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  274.     TIM_OCInitTypeDef TIM_OCInitStructure;
  275.        
  276.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  277.        
  278.         TIM_DeInit(TIM1);         
  279.          
  280.         utemp=(INT32U)(TIM1CLK*1000000.0)/Freq_PWM;

  281.         TIM_Prescaler=utemp/65536;
  282.         ++TIM_Prescaler;                       // 注意這句話,一定要++

  283.         utemp=(INT32U)(TIM1CLK*1000000.0)/TIM_Prescaler;  // 分頻后的定時(shí)器輸入頻率
  284.         TIM_Period=utemp/Freq_PWM;               // 周期常數(shù)
  285.   
  286.     TIM_TimeBaseStructure.TIM_Period = TIM_Period-1;
  287.         TIM_TimeBaseStructure.TIM_Prescaler = TIM_Prescaler-1;
  288.           TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  289.           TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  290.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 1-1;// 每次直接更新
  291.           TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  292. //------------------------------------------------------------------------------
  293.         /* PWM1 Mode configuration: Channel1 */   
  294.           TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  295.           TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能輸出比較狀態(tài)
  296.           TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; // 失能輸出比較N狀態(tài)
  297.           TIM_OCInitStructure.TIM_Pulse = 72;                
  298. /*           
  299.         TIM_OCMode_PWM2  TIM_OCPolarity_Low    正脈沖模式
  300.         TIM_OCMode_PWM2  TIM_OCPolarity_High   負(fù)脈沖模式

  301.         TIM_OCMode_PWM1  TIM_OCPolarity_Low    負(fù)脈沖模式
  302.         TIM_OCMode_PWM1  TIM_OCPolarity_High   正脈沖模式

  303.         TIM1_OCPolarity輸出極性---TIM_OCPolarity_High,輸出比較極性高,輸出的是正脈沖
  304.         TIM1_OCPolarity輸出極性---TIM_OCPolarity_Low, 輸出比較極性低,輸出的是負(fù)脈沖
  305. */
  306.           TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  307.           TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; // 互補(bǔ)輸出極性
  308.           // 選擇空閑狀態(tài)下的非工作狀態(tài)
  309.           // 當(dāng)MOE=0設(shè)置TIM1輸出比較空閑狀態(tài)      
  310.           // 默認(rèn)輸出位低電平               
  311.           TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  312.           // 選擇空閑狀態(tài)下的非工作狀態(tài)
  313.           // 當(dāng)MOE=0重置TIM1輸出比較N空閑狀態(tài)
  314.           TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  315.           TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  316.           TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);// 使能TIMx在CCR1上的預(yù)裝載寄存器

  317.       /* TIM1 Update DMA Request enable */         
  318.     TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);

  319.            //TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);        // 定時(shí)中斷使能
  320.            //TIM_ITConfig(TIM1,TIM_IT_CC3,ENABLE);        // 定時(shí)中斷使能
  321.     TIM_Cmd(TIM1, ENABLE);                                         // 定時(shí)器開始運(yùn)行
  322.                  
  323.         // 這條語句必須要有!!!
  324.         TIM_CtrlPWMOutputs(TIM1, ENABLE);                 /* Main Output Enable */   
  325. }
  326. //******************************************************************************
  327. // 基本定時(shí)程序,周期為 TIME_TB
  328. //******************************************************************************
  329. static func_tb(void)
  330. {
  331.         static INT16U tmr_100ms;
  332.         static INT16U tmr_1000ms;
  333.        
  334.         if (!f_tb)                          
  335.                 return;
  336.         f_tb=0;
  337.    
  338.         if (++tmr_100ms>=(100/TIME_TB))
  339.         {
  340.                 tmr_100ms=0;
  341.                 f_100ms=1;     
  342.       
  343.             GPIOC->ODR ^= GPIO_Pin_4;                // led5 toogle         
  344.         }
  345.         if (++tmr_1000ms>=(1000/TIME_TB))
  346.         {
  347.                 tmr_1000ms=0;
  348.                 f_1000ms=1;
  349.             GPIOC->ODR ^= GPIO_Pin_5;                // led4 toogle      
  350.         }       
  351. }

  352. //******************************************************************************
  353. // 進(jìn)入睡眠模式
  354. // 自行編寫
  355. //******************************************************************************
  356. void myPWR_EnterSleepMode(void)
  357. {
  358.           //PWR->CR |= CR_CWUF_Set;        /* Clear Wake-up flag */

  359.           /* Set SLEEPDEEP bit of Cortex System Control Register */
  360.           //*(__IO uint32_t *) SCB_SysCtrl |= SysCtrl_SLEEPDEEP_Set;
  361.         /* This option is used to ensure that store operations are completed */

  362.         __WFI();                 /* Request Wait For Interrupt */
  363. }
  364. //******************************************************************************
  365. // 主程序
  366. //******************************************************************************
  367. void main(void)
  368. {         
  369.     int i;
  370.    
  371.         RCC_Configuration();   
  372.           GPIO_Configuration();
  373.         delayms(100);                        // 延時(shí),等待電壓穩(wěn)定
  374.         Tim1_Configuration();     
  375.         DMA_Configuration();
  376.           SysTick_Config1();
  377.         NVIC_Configuration();       
  378. //------------------------------------------------------------------------------
  379.     for(i=0;i<6;++i)
  380.         {
  381.                 //i=0;
  382.                 //GPIOA->ODR ^= GPIO_Pin_10;                // led3 toogle
  383.                 //GPIOA->ODR ^= GPIO_Pin_11;                // led3 toogle
  384.        
  385.                 delayms(1);       
  386.         led_toggle();               
  387.     }
  388. //------------------------------------------------------------------------------        
  389.         for(;;)
  390.         {               
  391.                 //if (set_sw&0x01)
  392.                         //myPWR_EnterSleepMode(); // 休眠,降低功耗

  393.                 func_tb();
  394.     }
  395. }
  396. //******************************************************************************
  397. #ifdef  USE_FULL_ASSERT
  398. /**
  399.   * @brief  Reports the name of the source file and the source line number
  400.   *   where the assert_param error has occurred.
  401.   * @param file: pointer to the source file name
  402.   * @param line: assert_param error line source number
  403.   * @retval : None
  404.   */
  405. void assert_failed(uint8_t* file, uint32_t line)
  406. {
  407.   /* User can add his own implementation to report the file name and line number,
  408.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  409.   /* Infinite loop */
  410.   while (1)
  411.   {
  412.   }
  413. }
  414. #endif
  415. //******************************************************************************
  416. /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
  417. //******************************************************************************

  418. /*
  419.         LED2---------PC7
  420.         LED3---------PC6
  421.         LED4---------PC5
  422.         LED5---------PC4

  423.         KEY2---------PD3
  424.         KEY3---------PD4

  425. @par Example Description

  426. This example provides a description of how to use DMA with TIM1 Update request
  427. to transfer Data from memory to TIM1 Capture Compare Register3.

  428. TIM1CLK = 72 MHz, Prescaler = 0, TIM1 counter clock = 72 MHz
  429. The TIM1 Channel3 is configured to generate a complementary PWM signal with
  430. a frequency equal to: TIM1 counter clock / (TIM1_Period + 1) = 17.57 KHz

  431. The TIM1 Channel3 is configured to generate a complementary PWM signal with
  432. a frequency equal to 17.578 KHz and a variable duty cycle that is changed
  433. by the DMA after a specific number of Update event.
  434. The number of this repetitive requests is defined by the TIM1 Repetion counter,
  435. each 3 Update Requests, the TIM1 Channel3 Duty Cycle changes to the next new value
  436. defined by the SRC_Buffer.

  437.   - STM3210E-EVAL and STM3210B-EVAL Set-up
  438.     - Connect the following pins to an oscilloscope to monitor the different waveforms:  
  439.         - TIM1 CH3  (PA.10)   pin69
  440.         - TIM1 CH3N (PB.15)   pin54
  441. */













復(fù)制代碼





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:82014 發(fā)表于 2015-6-4 13:54 | 只看該作者

東西不錯(cuò)啊。。。
回復(fù)

使用道具 舉報(bào)

板凳
ID:103550 發(fā)表于 2016-1-17 11:40 | 只看該作者
謝謝分享,51黑有你更精彩!
回復(fù)

使用道具 舉報(bào)

地板
ID:110543 發(fā)表于 2016-3-24 14:56 | 只看該作者
所有的好東西我都要  哇哈哈哈哈
回復(fù)

使用道具 舉報(bào)

5#
ID:110736 發(fā)表于 2016-3-26 09:46 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

6#
ID:159590 發(fā)表于 2017-1-3 13:55 | 只看該作者
正是我想要的,謝謝
回復(fù)

使用道具 舉報(bào)

7#
ID:91907 發(fā)表于 2017-1-12 19:08 | 只看該作者
正是我想要的,謝謝
回復(fù)

使用道具 舉報(bào)

8#
ID:159524 發(fā)表于 2017-2-24 09:46 | 只看該作者
支持一下
回復(fù)

使用道具 舉報(bào)

9#
ID:232839 發(fā)表于 2017-9-13 12:10 | 只看該作者
木有黑幣,下載不了源碼
回復(fù)

使用道具 舉報(bào)

10#
ID:232839 發(fā)表于 2017-9-13 16:06 | 只看該作者
你好~
這能改變PWM頻率嗎?還是只改變占空比?
回復(fù)

使用道具 舉報(bào)

11#
ID:162417 發(fā)表于 2017-11-3 10:36 | 只看該作者
正在做自動(dòng)改變PWM頻率的項(xiàng)目,對(duì)我?guī)椭艽螅虏涣税。?/td>
回復(fù)

使用道具 舉報(bào)

12#
ID:123983 發(fā)表于 2018-5-20 22:25 | 只看該作者
好資源,謝謝
回復(fù)

使用道具 舉報(bào)

13#
ID:98945 發(fā)表于 2018-8-16 08:49 | 只看該作者
支持樓主,好資源
回復(fù)

使用道具 舉報(bào)

14#
ID:45330 發(fā)表于 2019-5-26 20:24 | 只看該作者
好東西要支持啊
回復(fù)

使用道具 舉報(bào)

15#
ID:547896 發(fā)表于 2019-5-26 21:50 | 只看該作者
厲害
回復(fù)

使用道具 舉報(bào)

16#
ID:524104 發(fā)表于 2019-5-27 14:14 | 只看該作者
在要使用這方面的功能,來做可控PWM脈沖數(shù)量的PWM輸出。
回復(fù)

使用道具 舉報(bào)

17#
ID:595170 發(fā)表于 2020-2-2 12:05 | 只看該作者
學(xué)習(xí)了,謝謝,很好的參考資料
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产午夜高清 | 久久精品青青大伊人av | 亚洲高清视频在线观看 | 国产精品久久久久久久久久妞妞 | 亚洲免费精品 | 美人の美乳で授乳プレイ | 久久精品国产久精国产 | 羞羞的视频免费观看 | h网站在线观看 | 国产精品亚洲精品久久 | 成人不卡| av黄色免费 | 国产高潮av | 激情一区二区三区 | 成人免费视频观看 | 亚洲视频在线看 | 中文字幕在线观看一区 | 丁香一区二区 | 日韩欧美一区二区在线播放 | 中文字幕一区二区在线观看 | 欧美激情精品久久久久久变态 | 麻豆视频在线免费看 | 亚洲系列第一页 | 紧缚调教一区二区三区视频 | 亚洲精品1区2区3区 91免费看片 | 三级在线视频 | 视频二区| 老外几下就让我高潮了 | 国产精品久久久久无码av | 玖玖色在线视频 | 久久99精品久久久久子伦 | 亚洲成人综合社区 | 黄色一级片在线播放 | 国产精品久久久久久久久久 | 欧美日本亚洲 | 一区二区免费看 | 国产aa| 91美女视频 | 在线一区观看 | 国产精品欧美日韩 | 中文字幕视频在线 |