STM32微控制器之跑马灯实验程序(宏定义改进版)

寄存器版跑马灯实验程序,完全通过操作地址来实现的,不直观,而且容易出错。现在用存储器映像,添加宏定义,增强程序的可读性。

一、存储器映像头文件

#ifndef __STM32F10x_H
#define __STM32F10x_H

#define PERIPH_BASE			(0X40000000)
#define APB1PERIPH_BASE		PERIPH_BASE
#define APB2PERIPH_BASE		(PERIPH_BASE + 0X10000)
#define AHBPERIPH_BASE		(PERIPH_BASE + 0X20000)

#define RCC_BASE			(AHBPERIPH_BASE + 0X1000)
#define GPIOB_BASE			(APB2PERIPH_BASE + 0X0C00)

#define RCC_APB2ENR			*(unsigned int *)(RCC_BASE + 0X18)
#define GPIOB_CRL			*(unsigned int *)(GPIOB_BASE + 0X00)
#define GPIOB_CRH			*(unsigned int *)(GPIOB_BASE + 0X04)
#define GPIOB_ODR			*(unsigned int *)(GPIOB_BASE + 0X0C)
#endif 

二、改进版源代码

#include "stm32f10x.h"

// 粗略延时函数
static void delay(unsigned int n)
{
	for(unsigned int i=0; i<n; i++)
	{
		for(unsigned int j=0; j<1024; j++)
		{
			for(unsigned int k=0; k<1024; k++)
			{
				__asm("nop");
			}
		}
	}
}

int main(void)
{
	// 使能GPIOB端口时钟
	// RCC起始地址:0X40021000
	// RCC_APB2ENR偏移地址:0X18
	RCC_APB2ENR |= (1 << 3);
	
	// 配置IO口为输出模式
	// CNFy[1:0]: 00 - 通用推挽输出模式
	// MODEy[1:0]:01 - 输出模式,最大速度10MHz
	for(unsigned int i=0; i<8; i++)
	{
		// GPIOB起始地址:0X40010C00
		// GPIOx_CRL偏移地址:0X00
		GPIOB_CRL |= (1 << (4*i + 0));
		GPIOB_CRL &= ~(1 << (4*i + 1));
		GPIOB_CRL &= ~(1 << (4*i + 2));
		GPIOB_CRL &= ~(1 << (4*i + 3));
	}

	// 设置IO口为高电平,关闭LED灯
	// GPIOB起始地址:0X40010C00
	// GPIOx_ODR地址偏移:0X0C
	GPIOB_ODR |= 0xFF;

	while(1)
	{
		for(unsigned int i=0; i<8; i++)
		{
			// 设置IO口为低电平,打开LED灯
			// GPIOB起始地址:0X40010C00
			// GPIOx_ODR地址偏移:0X0C
			GPIOB_ODR &= ~(1 << i);
			delay(1);
			
			// 设置IO口为高电平,关闭LED灯
			// GPIOB起始地址:0X40010C00
			// GPIOx_ODR地址偏移:0X0C
			GPIOB_ODR |= (1 << i);
			delay(1);
		}
	}
}

Leave a Reply

Your email address will not be published. Required fields are marked *