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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1642|回復(fù): 0
收起左側(cè)

STM32F401xx輸出指定個(gè)數(shù),可調(diào)頻率、占空比的PWM波形 源程序

[復(fù)制鏈接]
ID:1039925 發(fā)表于 2022-7-19 16:39 | 顯示全部樓層 |閱讀模式
單片機(jī)源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * @文件名     : main.c
  4.   * @作者       : strongerHuang
  5.   * @版本       : V1.0.0
  6.   * @日期       : 2018年06月23日
  7.   * @摘要       : 主函數(shù) - Demo軟件工程
  8.   ******************************************************************************/
  9. /*----------------------------------------------------------------------------
  10.   更新日志:
  11.   2018-06-23 V1.0.0:初始版本
  12.   ----------------------------------------------------------------------------*/
  13. /* 包含的頭文件 --------------------------------------------------------------*/
  14. #include "bsp.h"
  15. #include "bsp_timer.h"


  16. /************************************************
  17. 函數(shù)名稱 : Delay
  18. 功    能 : 軟件延時(shí)
  19. 參    數(shù) : Cnt --- 延時(shí)計(jì)數(shù)
  20. 返 回 值 : 無
  21. 作    者 : strongerHuang
  22. *************************************************/
  23. static void Delay(uint32_t Cnt)
  24. {
  25.   uint32_t i;

  26.   while(Cnt--)
  27.   {
  28.     for(i=0; i<0x100000; i++);
  29.   }
  30. }

  31. /************************************************
  32. 函數(shù)名稱 : System_Initializes
  33. 功    能 : 系統(tǒng)初始化
  34. 參    數(shù) : 無
  35. 返 回 值 : 無
  36. 作    者 : strongerHuang
  37. *************************************************/
  38. void System_Initializes(void)
  39. {
  40.   BSP_Initializes();
  41. }

  42. /************************************************
  43. 函數(shù)名稱 : main
  44. 功    能 : 主函數(shù)入口
  45. 參    數(shù) : 無
  46. 返 回 值 : int
  47. 作    者 : strongerHuang
  48. *************************************************/
  49. int main(void)
  50. {
  51.   System_Initializes();

  52.   while(1)
  53.   {
  54.     LED_TOGGLE();                                //LED變化
  55.     Delay(5);                                    //延時(shí)(約240ms)

  56.     PWM_Output(1000, 20, 10);                    //1KHz, 20%占空比, 10個(gè)脈沖
  57.   }
  58. }
復(fù)制代碼
  1. /**
  2.   ******************************************************************************
  3.   * @文件名     : bsp_timer.c
  4.   * @作者       : strongerHuang
  5.   * @版本       : V1.0.0
  6.   * @日期       : 2018年06月23日
  7.   * @摘要       : 定時(shí)器底層源文件
  8.   ******************************************************************************/
  9. /*----------------------------------------------------------------------------
  10.   更新日志:
  11.   2018-06-23 V1.0.0:初始版本
  12.   ----------------------------------------------------------------------------*/
  13. /* 包含的頭文件 --------------------------------------------------------------*/
  14. #include "bsp_timer.h"


  15. /******************************************* PWM輸出 ********************************************/
  16. /************************************************
  17. 函數(shù)名稱 : PWM_TIM_Configuration
  18. 功    能 : PWM輸出定時(shí)器配置
  19. 參    數(shù) : 無
  20. 返 回 值 : 無
  21. 作    者 : strongerHuang
  22. *************************************************/
  23. void PWM_TIM_Configuration(void)
  24. {
  25.   GPIO_InitTypeDef        GPIO_InitStructure;
  26.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  27.   TIM_OCInitTypeDef       TIM_OCInitStructure;

  28.   /* 時(shí)鐘配置 */
  29.   RCC_APB1PeriphClockCmd(PWM_TIM_CLK, ENABLE);
  30.   RCC_AHB1PeriphClockCmd(PWM_TIM_GPIO_CLK, ENABLE);

  31.   GPIO_InitStructure.GPIO_Pin = PWM_TIM_PIN;
  32.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  33.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  34.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  35.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  36.   GPIO_Init(PWM_TIM_GPIO_PORT, &GPIO_InitStructure);

  37.   /* 映射配置 */
  38.   GPIO_PinAFConfig(PWM_TIM_GPIO_PORT, PWM_TIM_SOURCE, PWM_TIM_AF);

  39.   /* 時(shí)基配置 */
  40.   TIM_TimeBaseStructure.TIM_Prescaler = PWM_PRESCALER;               //預(yù)分頻值
  41.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上計(jì)數(shù)
  42.   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;                         //定時(shí)周期
  43.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;            //分頻因子
  44.   TIM_TimeBaseInit(PWM_TIMx, &TIM_TimeBaseStructure);

  45.   /* PWM模式配置 */
  46.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                  //PWM1模式
  47.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;      //使能輸出
  48.   TIM_OCInitStructure.TIM_Pulse = 0xFFFF;                            //脈寬值
  49.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;          //輸出極性
  50.   PWM_TIM_OCxInit(PWM_TIMx, &TIM_OCInitStructure);

  51.   TIM_Cmd(PWM_TIMx, DISABLE);
  52. }

  53. /************************************************
  54. 函數(shù)名稱 : CNT_TIM_Configuration
  55. 功    能 : 計(jì)時(shí)定時(shí)器配置
  56. 參    數(shù) : 無
  57. 返 回 值 : 無
  58. 作    者 : strongerHuang
  59. *************************************************/
  60. void CNT_TIM_Configuration(void)
  61. {
  62.   GPIO_InitTypeDef        GPIO_InitStructure;
  63.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  64.   NVIC_InitTypeDef        NVIC_InitStructure;

  65.   /* 時(shí)鐘配置 */
  66.   RCC_APB1PeriphClockCmd(CNT_TIM_CLK, ENABLE);
  67.   RCC_AHB1PeriphClockCmd(CNT_TIM_GPIO_CLK, ENABLE);

  68.   GPIO_InitStructure.GPIO_Pin = CNT_TIM_PIN;
  69.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  70.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  71.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  72.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  73.   GPIO_Init(CNT_TIM_GPIO_PORT, &GPIO_InitStructure);

  74.   /* 映射配置 */
  75.   GPIO_PinAFConfig(CNT_TIM_GPIO_PORT, CNT_TIM_SOURCE, CNT_TIM_AF);

  76.   /* NVIC配置 */
  77.   NVIC_InitStructure.NVIC_IRQChannel = CNT_TIM_IRQn;
  78.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = CNT_TIM_Priority;
  79.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  80.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  81.   NVIC_Init(&NVIC_InitStructure);

  82.   /* 使用外部時(shí)鐘源 */
  83.   TIM_ETRClockMode2Config(CNT_TIMx, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted, 0);

  84.   /* 時(shí)基配置 */
  85.   TIM_TimeBaseStructure.TIM_Prescaler = 0;                           //預(yù)分頻值
  86.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上計(jì)數(shù)
  87.   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;                         //定時(shí)周期
  88.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;            //分頻因子
  89.   TIM_TimeBaseInit(CNT_TIMx, &TIM_TimeBaseStructure);

  90.   TIM_ClearFlag(CNT_TIMx, TIM_FLAG_Update);
  91.   TIM_ITConfig(CNT_TIMx, TIM_IT_Update, ENABLE);                     //使能"更新"中斷

  92.   TIM_Cmd(CNT_TIMx, DISABLE);
  93. }

  94. /************************************************
  95. 函數(shù)名稱 : PWM_Output
  96. 功    能 : 輸出PWM
  97. 參    數(shù) : Frequency --- 頻率
  98.             Dutycycle --- 占空比(12代表占空比為12%)
  99.             NumPulse  --- 脈沖個(gè)數(shù)
  100. 返 回 值 : 無
  101. 作    者 : strongerHuang
  102. *************************************************/
  103. void PWM_Output(uint32_t Frequency, uint32_t Dutycycle, uint32_t NumPulse)
  104. {
  105.   uint32_t pwm_period;
  106.   uint32_t pwm_pulse;

  107.   /* 輸出PWM */
  108.   pwm_period = PWM_CK_CNT/Frequency - 1;                             //計(jì)算出計(jì)數(shù)周期(決定輸出的頻率)
  109.   pwm_pulse  = (pwm_period + 1)*Dutycycle / 100;                     //計(jì)算出脈寬值(決定PWM占空比)

  110.   /* 判斷是否為32位定時(shí)器 */
  111.   if((TIM2 == PWM_TIMx) || (TIM5 == PWM_TIMx))                       //32位定時(shí)器:
  112.   {
  113.   }
  114.   else
  115.   {
  116.     if((0xFFFF < pwm_period) || (0xFFFF < pwm_pulse))                //16位定時(shí)器:period和pulse都不能超過0xFFFF
  117.     {
  118.       return;
  119.     }
  120.   }

  121.   TIM_Cmd(PWM_TIMx, DISABLE);                                        //失能TIM
  122.   TIM_SetCounter(PWM_TIMx, 0);                                       //計(jì)數(shù)清零
  123.   TIM_SetAutoreload(PWM_TIMx, pwm_period);                           //更改頻率
  124.   PWM_TIM_SetComparex(PWM_TIMx, pwm_pulse);                          //更改占空比
  125.   TIM_Cmd(PWM_TIMx, ENABLE);                                         //使能TIM

  126.   /* 脈沖個(gè)數(shù)計(jì)時(shí) */
  127.   TIM_Cmd(CNT_TIMx, DISABLE);
  128.   TIM_SetCounter(CNT_TIMx, 0);
  129.   TIM_SetAutoreload(CNT_TIMx, NumPulse-1);                           //設(shè)置中斷更新數(shù)
  130.   TIM_ClearFlag(CNT_TIMx, TIM_FLAG_Update);
  131.   TIM_Cmd(CNT_TIMx, ENABLE);
  132. }

  133. /************************************************
  134. 函數(shù)名稱 : TIM_Initializes
  135. 功    能 : TIM定時(shí)器初始化
  136. 參    數(shù) : 無
  137. 返 回 值 : 無
  138. 作    者 : strongerHuang
  139. *************************************************/
  140. void TIM_Initializes(void)
  141. {
  142.   PWM_TIM_Configuration();
  143.   CNT_TIM_Configuration();
  144. }

復(fù)制代碼
  1. /**
  2.   ******************************************************************************
  3.   * @文件名     : bsp.c
  4.   * @作者       : strongerHuang
  5.   * @版本       : V1.0.0
  6.   * @日期       : 2018年06月23日
  7.   * @摘要       : BSP底層源文件
  8.   ******************************************************************************/
  9. /*----------------------------------------------------------------------------
  10.   更新日志:
  11.   2018-06-23 V1.0.0:初始版本
  12.   ----------------------------------------------------------------------------*/
  13. /* 包含的頭文件 --------------------------------------------------------------*/
  14. #include "bsp.h"
  15. #include "bsp_timer.h"


  16. /************************************************
  17. 函數(shù)名稱 : RCC_Configuration
  18. 功    能 : 時(shí)鐘配置
  19. 參    數(shù) : 無
  20. 返 回 值 : 無
  21. 作    者 : strongerHuang
  22. *************************************************/
  23. void RCC_Configuration(void)
  24. {
  25.   /* 使能AHB1時(shí)鐘 */
  26.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
  27.                          RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD |
  28.                          RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF |
  29.                          RCC_AHB1Periph_GPIOG | RCC_AHB1Periph_GPIOH, ENABLE);

  30.   /* 使能AHB2時(shí)鐘 */
  31.   RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);

  32.   /* 使能APB1時(shí)鐘 */
  33.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  34.   /* 使能APB2時(shí)鐘 */
  35.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  36. }

  37. /************************************************
  38. 函數(shù)名稱 : LED_Initializes
  39. 功    能 : LED初始化
  40. 參    數(shù) : 無
  41. 返 回 值 : 無
  42. 作    者 : strongerHuang
  43. *************************************************/
  44. void LED_Initializes(void)
  45. {
  46.   GPIO_InitTypeDef GPIO_InitStructure;

  47.   /* 使能時(shí)鐘 */
  48.   RCC_AHB1PeriphClockCmd(LED_GPIO_CLK, ENABLE);

  49.   /* 引腳配置 */
  50.   GPIO_InitStructure.GPIO_Pin = LED_PIN;
  51.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  52.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  53.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  54.   GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure);

  55.   LED_OFF();

  56. #if 0
  57.   /* MCO時(shí)鐘輸出 */
  58.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  59.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  60.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  61.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  62.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  63.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  64.   RCC_MCO1Config(RCC_MCO1Source_PLLCLK, RCC_MCO1Div_2);
  65. #endif
  66. }

  67. /************************************************
  68. 函數(shù)名稱 : BSP_Initializes
  69. 功    能 : 底層初始化
  70. 參    數(shù) : 無
  71. 返 回 值 : 無
  72. 作    者 : strongerHuang
  73. *************************************************/
  74. void BSP_Initializes(void)
  75. {
  76.   LED_Initializes();                             //LED初始化
  77.   TIM_Initializes();
  78. }
復(fù)制代碼
本人初學(xué),僅供參考,存在錯(cuò)誤和不足之處,請大家回帖多多指教,切勿照搬,文件下載:
Keil代碼下載: Keil代碼.7z (388.56 KB, 下載次數(shù): 34)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 午夜一区二区三区 | www.国产| 精品日韩| 国产精品国产自产拍高清 | 成人a网 | 天天看天天爽 | 成人精品系列 | 99精品国产一区二区三区 | 国产精品揄拍一区二区 | 亚洲欧美一区二区三区视频 | 91久久国产综合久久91精品网站 | 久青草影院 | 亚洲日本国产 | 精品视频一区二区 | avmans最新导航地址 | 999热在线视频 | 天天躁日日躁狠狠很躁 | 中日字幕大片在线播放 | 成人福利视频 | 国产99精品 | 成人一区二 | 日韩中文字幕一区二区 | 精品国产一区二区三区久久 | 成人国产精品一级毛片视频毛片 | 久久九七 | av免费观看在线 | 欧美一区二区视频 | 国产精品7777777 | 欧美一级片免费看 | 久久成人免费观看 | 国产传媒| 日韩中出 | 91看片网址| 国产伦精品一区二区三区照片91 | 精品国产乱码久久久久久88av | 日韩精品 电影一区 亚洲 | 超碰最新在线 | 国产精品福利视频 | 国产精品一区二区久久 | 午夜电影在线播放 | 爱爱免费视频 |