按照实验手册上, 对着把程序重写了一遍, 编译运行后蜂鸣器并不响。 加载光盘配的程序也是一样不响,都得不到正确的运行结果。按逻辑来说函数BellMain应该是没有错的,但加载运行后就是得不到正确的实验结果 (即蜂鸣器有规律鸣响)。
解决方法: 在做ADS实验5时也出现同样的问题, 原来是我在CodeWarrior IDE外面用VIM写好代码转回来后init.s源码并没有选择编译, 导致加载时并没有从ldr r13, =0x1000指令开始执行, 而是从main.c 的delay执行. 后来仔细看编译的报告才发现有一个警告忽略了, 下次如果发现有奇怪错误的时候, 一定要留意警告(Warning), 编译警告有时候可能会产生意想不到的结果.
ARM汇编程序加载代码:init.s
AREA |DATA|,CODE,READONLY ENTRY ldr r13, =0x1000 ; Set sp IMPORT BellMain b BellMain END
蜂鸣器的代码:main.c
// by Dooit.Lee@gmail.com // Description: The Beeper // Refer to: www.witech.com.cn //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; //公司名称:保定飞凌嵌入式技术有限公司 //描 述:蜂鸣器 //版 权:保定飞凌嵌入式技术有限公司 //网 址:www.witech.com.cn //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; /* 本实验接口说明 * GPB0 ------ 蜂鸣器控制口 */ /*-------------------- 地址声明 ------------------------------*/ #define GPBCON (*(volatile unsigned *)0x56000010) #define GPBDAT (*(volatile unsigned *)0x56000014) #define GPBUP (*(volatile unsigned *)0x56000018) #define BEEP_TIME 40 /* Functions declaration */ //void delay(unsigned int count); void delay(int x); /* * Function: BellMain * DESC: Entry subroutine. 初始化后,进入按键扫描(Beep the beeper)死循环 * Param: None * RETURN: int 0 */ int BellMain(void) { GPBUP &= ~(0x1); /* Enable GPB0's pull-up function */ GPBCON = (GPBCON & ~(0x3)) | 0x1; /* Set GPB0 for output */ while (1) { GPBDAT |= 0x1; /* Beep the beeper (GPB0 = 1) */ delay(BEEP_TIME); GPBDAT &= ~(0x1); /* Shutdown the beeper (GPB0 = 0) */ delay(BEEP_TIME); } return 0; } #if 0 /* * Function: delay * DESC: delay function, delay `count` ms * Param: int count * RETURN: NONE */ void delay(unsigned int count) { unsigned int i, j, k; for (i = 0; i < count; i++) { for (k = 0; k <= 0xff; k++) for (j = 0; j <= 0xff; j++) ; } } #endif /* * Function: delay * DESC: delay function * Param: int x * RETURN: NONE */ void delay(int x) { int k, j; while (x != 0) { for (k = 0; k <= 0xff; k++) for (j = 0; j <= 0xff; j++) ; x--; } return; }