STM32從零開始(二) 點亮led燈

先看頭文件

#ifndef __GPIO_LED72MHZ__
#define __GPIO_LED72MHZ__

#define GPIOB_BASE 0x40010c00
#define GPIOB_CRH (GPIOB_BASE + 0x04)
#define GPIOB_ODR (GPIOB_BASE + 0x0c) 
#define rGPIOB_CRH (*(unsigned int *)GPIOB_CRH)
#define rGPIOB_ODR (*(unsigned int *)GPIOB_ODR)

#define RCC_BASE 0x40021000
#define RCC_APB2ENR (RCC_BASE + 0x18)
#define rRCC_APB2ENR (*(unsigned int *)RCC_APB2ENR)

void ledInit(void);
void ledFlash(void);
void delay(unsigned int i);

#endif

這個就很標準的寫法。
這些地址的值查stm32中文手冊即可
在這裏插入圖片描述
在這裏插入圖片描述
這個就是初始地址。
在這裏插入圖片描述
偏移量就是在剛纔上邊的基地址上加偏移量就是現在的地址。4個字節一般是。因爲32位除以8等於4,就是4個字節。每次傳輸數據都是4字節。具體寄存器是多少手冊裏找到對應的位寫就行。
在這裏插入圖片描述手冊裏第六章是rcc寄存器,第八章是gpio,一眼就能找到。

#include "GPIO_LED72MHZ.h"

int main(void)
{
	ledInit();
	while(1)
	{
		ledFlash();
	}
	return 0;
}

void ledInit(void)
{
	rRCC_APB2ENR = 0x00000008;
	rGPIOB_CRH = 0x33333333;
	rGPIOB_ODR = 0x0000ff00;
}

void ledFlash(void)
{
	unsigned char i,j;
	for(i = 0; i < 4; i ++)
	{
		rGPIOB_ODR = 0x0000ff00;
		for(j = 0; j < 50; j++)
			delay(50000);
		rGPIOB_ODR = 0x0000f000;
		for(j = 0; j < 50; j++)
			delay(50000);
	}
	
}

void delay(unsigned int i)
{
	while(i --);
}

思路是這樣的。
STM32使用的時候先設置時鐘。在下一章裏會詳細設置。這裏直接就用系統默認的就行。rRCC_APB2ENR 是給APB2總線上的gpiob口使能,讓他上邊的時鐘工作起來。不設置的話就不動彈。時鐘是他的靈魂。

rGPIOB_ODR 這個是輸出口,設置1輸出1,設置0輸出0。因爲這32輸入和輸出是不同的寄存器。

rGPIOB_CRH 就是端口配置寄存器在這裏插入圖片描述
是用來設置輸入輸出方式的。

兩個控制寄存器配置結束,就可以用了
輸出寄存器odr設置多少就輸出多少
就沒啦。

下一期講設置時鐘。有問題留言就行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章