寄存器版跑马灯实验程序,完全通过操作地址来实现的,不直观,而且容易出错。现在用存储器映像,添加宏定义,增强程序的可读性。
一、存储器映像头文件
#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); } } }