找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 5836|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

stm32f103R6,PWM控制蜂鳴器頻率串口輸出(附帶源碼和仿真圖)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
代碼僅供參考,小白一枚,請(qǐng)多指教。其中利用了system,TIM2,USART1,按鍵中斷等stm32基本設(shè)置。


單片機(jī)源程序如下:
  1. #include "stm32f10x.h"
  2. #include "KEY-LED.h"
  3. #include "bsp_usart.h"
  4. #include <string.h>
  5. #include "bsp_systick.h"
  6. #include "bsp_time.h"


  7. void Delay( uint32_t t );
  8. void RCC_Configuration(void);
  9. void EXTI_Configration(void);
  10. void NVIC_Configration(void);

  11. uint16_t Key_Value=0;

  12. void Delay( uint32_t t )
  13. {       
  14.                 while(--t);
  15. }

  16. void RCC_Configration(void)
  17. {
  18. ErrorStatus HSEStartUpStatus;         /* 定義枚舉類(lèi)型變量 HSEStartUpStatus */

  19.         /* 復(fù)位系統(tǒng)時(shí)鐘設(shè)置*/
  20.         RCC_DeInit();
  21.         /* 開(kāi)啟HSE*/
  22.         RCC_HSEConfig(RCC_HSE_ON);
  23.         /* 等待HSE起振并穩(wěn)定*/
  24.         HSEStartUpStatus = RCC_WaitForHSEStartUp();
  25.         /* 判斷HSE起是否振成功,是則進(jìn)入if()內(nèi)部 */
  26.         if(HSEStartUpStatus == SUCCESS)
  27.         {
  28.                 /* 選擇HCLK(AHB)時(shí)鐘源為SYSCLK 1分頻 */
  29.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);
  30.                 /* 選擇PCLK2時(shí)鐘源為 HCLK(AHB) 1分頻 */
  31.                 RCC_PCLK2Config(RCC_HCLK_Div1);
  32.                 /* 選擇PCLK1時(shí)鐘源為 HCLK(AHB) 8分頻   9M*/
  33.                 RCC_PCLK1Config(RCC_HCLK_Div1);
  34. //                /* 選擇鎖相環(huán)(PLL)時(shí)鐘源為HSE 1分頻,倍頻數(shù)為4,則PLL輸出頻率為 8MHz * 4 = 32MHz */
  35. //                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);
  36. //                /* 使能PLL */
  37. //                RCC_PLLCmd(ENABLE);
  38. //                /* 等待PLL輸出穩(wěn)定 */
  39. //                while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  40.                 /* 選擇SYSCLK時(shí)鐘源為HSE */
  41.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);
  42.                 /* 等待HSE成為SYSCLK時(shí)鐘源 */
  43.                 while(RCC_GetSYSCLKSource() != 0x04);
  44.         }
  45. }       
  46. void EXTI_Configration()
  47. {
  48.                 EXTI_InitTypeDef  EXTI_InitStructure;
  49.           RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
  50.                 //調(diào)用GPIO_EXTILineConfig函數(shù)分配引腳
  51.           GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
  52.                 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource13);
  53.     //調(diào)用EXTI_Init函數(shù)配置外部中斷
  54.           EXTI_InitStructure.EXTI_Line=EXTI_Line0|EXTI_Line13;
  55.           EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
  56.           EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
  57.           EXTI_InitStructure.EXTI_LineCmd=ENABLE;
  58.           EXTI_Init(&EXTI_InitStructure);
  59.          
  60. }
  61. /*配置中斷優(yōu)先級(jí)*/
  62. void NVIC_Configration ( )
  63. {
  64.         NVIC_InitTypeDef NVIC_InitStructure;
  65.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  66.        
  67.         NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;
  68.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  69.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  70.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  71.   NVIC_Init(&NVIC_InitStructure);
  72.        
  73.         NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
  74.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  75.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  76.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  77.   NVIC_Init(&NVIC_InitStructure);
  78.        
  79.         NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;
  80.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  81.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  82.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  83.   NVIC_Init(&NVIC_InitStructure);
  84.        
  85.         NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
  86.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  87.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  88.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  89.   NVIC_Init(&NVIC_InitStructure);
  90. }

  91. void SoftTimerInit(void)
  92. {
  93.   bsp_StartAutoTimer(Key_Scan_TMR_ID,10);
  94. }

  95. int main()
  96. {       
  97.         RCC_Configration();
  98.   Key_Configration();
  99.         NVIC_Configration();
  100.         bsp_InitSysTick();
  101.   SoftTimerInit();       
  102.         EXTI_Configration();
  103.   TIM2_Configuration(5000);
  104.   USART1_Configration();

  105.   printf("--------嵌入式創(chuàng)新設(shè)計(jì)--------\r\n");
  106.   printf("基于stm32的PWM波調(diào)節(jié)蜂鳴器頻率\r\n");
  107.         printf("------------------------------\r\n");
  108.         printf("key1頻率減小      key2頻率增加\r\n");       
  109.        
  110. while(1)
  111. {

  112.                  if( bsp_CheckTimer(Key_Scan_TMR_ID) )
  113.          {
  114.                  Key_Value = Key_Prosse();
  115.          }
  116.          if(gKey.KeyStatu == 1)
  117.          {
  118.            if(Key_Value == 1)
  119.                  {
  120.                          Key_Value=0;
  121.                          
  122.                          if(TIM2->ARR < 10000)
  123.                          {
  124.                                  TIM2->ARR += 500;
  125.                          }
  126.                          else if(TIM2->ARR >= 10000)
  127.                          {
  128. //                                 TIM2->ARR = 10000;
  129.                                  printf("超過(guò)范圍\r\n");
  130.                          }
  131.                  }                         
  132.                  else if(Key_Value == 2)
  133.                  {
  134.                           Key_Value=0;
  135.                          
  136.                          if(TIM2->ARR > 500)
  137.                          {
  138.                            TIM2->ARR -= 500;
  139.                          }
  140.                           else if(TIM2->ARR <= 500)
  141.                          {
  142. //                                 TIM2->ARR = 500;
  143.                                  printf("超過(guò)范圍\r\n");
  144.                          }       
  145.                  }
  146.                  TIM2->CCR2=(TIM2->ARR)/2;
  147.          }
  148. }
  149. }        
復(fù)制代碼

所有資料51hei提供下載:
創(chuàng)新設(shè)計(jì).7z (315.86 KB, 下載次數(shù): 200)

評(píng)分

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

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:743715 發(fā)表于 2020-6-14 11:17 | 只看該作者
大佬,這個(gè)led和數(shù)碼管沒(méi)反應(yīng)啊,這個(gè)有什么作用?
回復(fù)

使用道具 舉報(bào)

板凳
ID:607298 發(fā)表于 2020-9-27 18:28 | 只看該作者
感謝分享,正要用這顆芯片
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表