欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32从零开始(二) 点亮led灯

程序员文章站 2022-03-13 17:24:00
...

先看头文件

#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中文手册即可
STM32从零开始(二) 点亮led灯
STM32从零开始(二) 点亮led灯
这个就是初始地址。
STM32从零开始(二) 点亮led灯
偏移量就是在刚才上边的基地址上加偏移量就是现在的地址。4个字节一般是。因为32位除以8等于4,就是4个字节。每次传输数据都是4字节。具体寄存器是多少手册里找到对应的位写就行。
STM32从零开始(二) 点亮led灯手册里第六章是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 就是端口配置寄存器STM32从零开始(二) 点亮led灯
是用来设置输入输出方式的。

两个控制寄存器配置结束,就可以用了
输出寄存器odr设置多少就输出多少
就没啦。

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

相关标签: 嵌入式