[Solved] [Embedded] [FL2440] ADS实验4: 蜂鸣器实验: 蜂鸣器响都不响一声

时间:2021-09-01 19:31:57


按照实验手册上, 对着把程序重写了一遍, 编译运行后蜂鸣器并不响。 加载光盘配的程序也是一样不响,都得不到正确的运行结果。按逻辑来说函数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;
}