日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

用定時器控制Led燈閃爍

出處:eefocus 發(fā)布于:2023-07-17 17:43:05

  實驗目的

  閃燈程序在嵌入式學習中猶如“Hello World!”在C/C++語言學習中一樣經(jīng)典。它以簡單的方式引導了無數(shù)的嵌入式愛好者。通過本節(jié)的學習你可以基本了解STM32的GPIO以及基本定時器的使用。

  硬件說明

  本例程需要一個定時器和一個LED,其中LED就是擴展板上的紅色LED接在PD3上且正極接在高電平上,定時器選用基本定時器7。

  1. STM32 GPIO簡介

   GPIO主要特性

   輸出狀態(tài)可選推挽、開漏、上拉或下拉

  可為每個I/O選擇速度

   輸入狀態(tài)可選則懸空、上拉/下拉、模擬

   每個I/O引腳都有復用功能

  可對每個輸出引腳進行位操作

  STM32的每個GPIO都有4個32位配置寄存器:模式選擇寄存器、輸出類型配置寄存器、輸出速度配置寄存器、上拉/下拉電阻配置寄存器;2個32位數(shù)據(jù)寄存器:數(shù)據(jù)輸入寄存器、數(shù)據(jù)輸出寄存器;1個32位鎖定寄存器和2個32位復用功能選擇寄存器。無論你選擇某個I/O作為輸入還是輸出,都可以給根據(jù)需求選擇是否使用上拉或下拉電阻??偟膩碇v,每個I/O有8中模式可供選擇:輸入懸空、帶上拉輸入、來下拉輸入、帶上拉或下拉開漏輸出、帶上拉或下拉推挽輸出、模擬輸入、推挽且?guī)侠蛳吕膹陀霉δ堋㈤_漏且?guī)侠蛳吕膹陀霉δ堋?/p>

  1.1 I/O模式選擇

  每個I/O引腳都有4種用途模式可供選擇。GPIOx_MODER(x = A..I)是一個32位寄存器,每兩位配置一個引腳,位[1:0]配置引腳0以此類推。其取值及含義如表1.1所示。

  表1.1 I/O用途模式設置

  MODER[1:0] 描述

  B00 輸入模式(初始值)

  B01 通用輸出模式

  B10 復用功能模式

  B11 模擬信號模式

  1.2 輸出類型選擇

  根據(jù)輸出需求你可在GPIOx_OTYPER中設置推挽或開漏輸出。這個寄存器只有低16位有效,取值及定義如表1.2所示。

  表1.2 輸出類型設置

  OT[0] 描述

  B0 推挽輸出(初始值)

  B1 開漏輸出

  1.3 輸出速度設置

  表1.3 端口輸出速度設置

  OSPEEDER[1:0] 描述

  B00 2MHZ低速

  B01 25MHZ中速

  B10 50MHZ快速

  B11 100MHZ高速

  1.4 上拉下拉電阻設置

  表1.4 上拉下拉電阻設置

  PUPDR[1:0] 描述

  B00 無上拉或下拉電阻

  B01 上拉電阻連接

  B10 下拉電阻連接

  B11 保留

  1.5 數(shù)據(jù)輸入和輸出

  當GPIO設置為通用輸入時,讀取寄存器GPI Ox_IDR)(x = A..I)可得到端口的輸入狀態(tài)且這個寄存器是只讀的;GPIOx_ODR(x = A..I)是一個可讀寫寄存器,寫數(shù)據(jù)到這個寄存器可控制端口輸出電平,從這個寄存器讀數(shù)據(jù)可判斷端口的輸出狀態(tài)。

  1.6 復用功能選擇

  STM32中有16種復用功能,一個引腳會對應其中幾種。共有兩個寄

  存器GPIOx_AFRL與GPIOx_AFRH 用來設置引腳的復用功能,其中每

  4位對應一個引腳。

  表1.6 復用功能配置

  AFR[3:0] 描述

  0X1 AF1(TIM1/TIM2)

  0X2 AF2(TIM3...5)

  0X4 AF4(I2C1...3)

  0XD AF14(DCMI)

  2. STM32基本定時器簡介

  STM32的定時器非常強大,根據(jù)功能可分為控制定時器、通用定時器、基本定時,其中定時器6、7為基本定時器。在這里我們主要對基本定時器給予簡單介紹。它具有一個16位自動重載加法計數(shù)器和一個16位可編程預分頻器。預分頻器對輸入時鐘進行分頻,然后提供給計數(shù)器作為計數(shù)時鐘使用。STM32的自動重載寄存器(TIMx_ARR)在物理上對應兩個寄存器,一個是咱們可以隨便讀寫的,另一個則只能被定時器讀取。這個咱們無法操作的寄存器被稱作影子寄存器。當TIMx_CR1中的ARPE位等于0時改變TIMx_ARR的值就可馬上改變影子寄存器里的值。當ARPE等于1時TIMx_ARR的值被緩存起來了,只有當更新事件發(fā)生后才會將新的值傳送到影子寄存器中。

  操作定會器前需要先打開輸入時鐘,然后可設置重預分頻系數(shù)寄存器(TIMx_PSC)和自動載值寄存器。因為我們要讓定時器產(chǎn)生更新中斷,因此必需使能TIMx_DIER中的UIE位以及設置NVIC相關(guān)寄存器。初始化完成后設置TIMx_CR1的CEN位即可開啟定時器。

  實驗原理及程序結(jié)構(gòu)

實驗設計

 利用STM32的基本定時器產(chǎn)生更新中斷,在中斷處理函數(shù)中控制LED引腳的電平,帶給大家一個閃燈的效果。本例程會涉及到GPIO_D03以及基本定時器7的初始化和一個定時器7 中斷服務例程等。

  源程序說明

下面讓我們來看看blink.c是如何實現(xiàn)的。

  LED初始化

  /* blink.c */

  void led_init(void)

  {

  GPIO_InitTypeDef  GPIO_InitStructure;

  /* 使能GPIOD時鐘 */

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

  /* 配置GPIO_LED引腳 */

  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3;

  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

  GPIO_Init(GPIOD, &GPIO_InitStructure);

  }

  LED的初始化比較簡單,選擇好引腳并將引腳用途模式設置為輸出即可。需要注意的是STM32的每個外設的時鐘都可單獨控制,在操作前需要打開時鐘而且要從STM32用戶手冊中確認清楚,你要用到的外設具體掛載在哪個總線上的(AHB1、APB1等)。

  LED控制

  /* blink.c */

  void led_on(void)

  {

  /* 設置PD3為低電平 */

  GPIO_ResetBits(GPIOD, GPIO_Pin_3);

  }

  void led_off(void)

  {

  /* 設置PD3為高電平 */

  GPIO_SetBits(GPIOD, GPIO_Pin_3);

  }

  void led_toggle(void)

  {

  /* 切換PD3電平狀態(tài) */

  GPIO_ToggleBits(GPIOD, GPIO_Pin_3);

  }

  這三個LED控制函數(shù)都使用了位操作,由于LED的正極是接在高電平上的,led_on是讓PD3輸出低電平從而點亮LED。led_toggle將會在定時器的中斷服務例程中調(diào)用,它會把引腳在高低電平之間切換達到閃燈的果。

  定時器初始化

  /* blink.c */

  void TIM7_Configuration(void)

  {

  NVIC_InitTypeDef NVIC_InitStructure;

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;

  /* 操作定時器前先使能輸入時鐘 */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);

  /**** Time base configuration ****/

  /* 設置自動重裝載周期,計數(shù)到5000為1000ms */

  TIM_TimeBaseInitStruct.TIM_Period = 5000;

  /* 設置預分頻值,即定時器計數(shù)頻率為10Khz */

  TIM_TimeBaseInitStruct.TIM_Prescaler =(8400-1);

  TIM_TimeBaseInitStruct.TIM_ClockDivision = 0;

  /* 向上計數(shù)模式 */

  TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;

  /* 根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIM7的時基單位 */

  TIM_TimeBaseInit(TIM7, &TIM_TimeBaseInitStruct);

  /* 使能TIM7更新中斷 */

  TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);

  /* Configure the NVIC Preemption Priority Bits */

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  /* Enable the TIM7 global Interrupt */

  NVIC_InitStructure.NVIC_IRQChannel = TIM7_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

  /* 啟動定時器 */

  TIM_Cmd(TIM7, ENABLE);

  }

  這里使用的是簡單的基本定時器,打開輸入時鐘、設置預分頻器和計數(shù)重載值后配置好相關(guān)中斷寄存器后就可啟動定時器了。在ST庫代碼的stm32f4xx_it.C中定義了所有中斷入口,我們需要在里面添加如下代碼:

  定時器7中斷服務例程

  /* stm32f4xx_it.C */

  void TIM7_IRQHandler(void)

  {

  if (TIM_GetITStatus(TIM7, TIM_IT_Update) != RESET)

  {

  /* 清除中斷標志 */

  TIM_ClearITPendingBit(TIM7, TIM_IT_Update  );

  /* 切換I/O狀態(tài) */

  led_toggle();

  }

  }


關(guān)鍵詞:用定時器控制Led燈閃爍定時器控制,Led燈閃爍

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務:
賣家服務:
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!