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设置多少就输出多少
就没啦。

下一期讲设置时钟。有问题留言就行。

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