1. 程式人生 > 其它 >Java演算法案例,選班長

Java演算法案例,選班長

技術標籤:微控制器STM32微控制器stm32程式語言

用庫函式點亮跑馬燈-STM32F103微控制器

學習微控制器,很基礎的一個模組就是點亮跑馬燈。點亮跑馬燈有三種方法,分別是庫函式法、暫存器法、和位操作法。本文講庫函式法。

步驟如下

第一步:使能IO口時鐘
第二步:GPIO函式配置
第三步:程式設計點亮

LED燈的點亮前準備

我們點亮LED小燈,就是要給IO口輸出一個低電平0
通過檢視原理圖可知,LED一端是高電平3.3V,要點亮LED小燈,就是要讓對應的IO口輸出一個低電平0
在這裡插入圖片描述在這裡插入圖片描述
通過檢視原理圖,我們知道LED0、LED1對應的兩個引腳,分別是PA8和PD2(以這個為例子,其他種類微控制器檢視對應引腳就好了)。先且記下,我們後面會用到。

下面再來介紹通過利用庫函式來點亮LED的方法

1、使能時鐘

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);	 //使能PA,PD埠時鐘

針對STM32微控制器而言,要使用IO口,第一件事就是使能時鐘。那這個時鐘函式如何找呢?
我們要使用的埠是PA8和PD2,在 stm32f10x_rcc.h中,我們去看這兩個埠的掛載。
在這裡插入圖片描述

#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC ((uint32_t)0x00000010) #define RCC_APB2Periph_GPIOD ((uint32_t)0x00000020)

可以看到是 RCC_APB2Periph,於是找到在rcc.h中找到時鐘使能函式

RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

這一步似乎沒有必要這麼複雜,但這是一種方法。當以後埠改變,不再是點亮LED,而用到其他比如按鍵、ADC時,使能時鐘都可以用這種方法的。

時鐘函式找到後,我們還需要對其進行引數配置,如下所示,

在這裡插入圖片描述

選中函式,點選右鍵,可以看到該函式有兩個引數需要配置,一個是需要使能的埠,一個是使能ENABLE。這裡有個小技巧,我們可以使用 "|"運算,來使能PA8和PD2而不用分別使能了。

2.GPIO函式配置

首先,應該對GPIO函式進行初始化,在GPIO.h中找到GPIO初始化函式

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

點選右鍵,可以看到GPIO_init()函式需要配置的三個引數,同樣的點右鍵可以對引數進行進一步檢視。

assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  

分別為輸出速度(50HZ),輸出模式(推輓輸出)、輸出引腳(PA8和PD2)。
這裡要使用結構體進行定義。(關於GPIO的輸入輸出以及C語言有關結構體知識,以後專門寫文章)

 GPIO_InitTypeDef  GPIO_Initstructure;
 GPIO_Initstructure.GPIO_Pin =GPIO_Pin_8; //PA8
	 GPIO_Initstructure.GPIO_Speed  = GPIO_Speed_50MHz;  //速度
	 GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推輓輸出
	 GPIO_Init(GPIOA,&GPIO_Initstructure); 

這樣GPIO就基本配置好了,我們要點亮LED燈,需要對埠輸出低電平0,而輸出高電平1燈就會滅點。

3.點亮

最後一步,我們還要用到改變埠狀態的函式,這個函式同樣在gpio.h檔案裡面。

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

分別是設定引腳為高電平的函式和低電平的函式。其中的引數,埠引腳,比如PA8和PD2。這一步比較簡單,就不細講了。

GPIO_SetBits(GPIOD,GPIO_Pin_2); //高電平
	  GPIO_ResetBits(GPIOA,GPIO_Pin_8);  
	  delay_ms (300);
      GPIO_ResetBits(GPIOD,GPIO_Pin_2);  //低電平
	  GPIO_SetBits(GPIOA,GPIO_Pin_8);
      delay_ms (300);

通過這些步驟,就可以迴圈點亮流水燈了。
不過需要注意的是,想要兩個燈交替閃爍,不要忘記延時函式,不然我們是沒法看到點亮效果的。