跑马灯程序,存储器映像。用宏定义,增强程序的可读性。。
头文件:
#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);
}
}
}