0

Lập trình C cho hệ thống nhúng (P7- Standby Function- Halt mode trong V850E)

1. Khái niệm

Khi lập trình cho hệ thống nhúng , ngoài việc đáp ứng đầy đủ các yêu cầu đề mà hệ thống đề ra ,chúng ta cũng còn phải quan tâm đến vấn đề năng lượng tiêu thụ của con vi điều khiển mà chúng ta đang sử dụng. Hôm nay mình sẽ giới thiệu cho các bạn cách sử dụng standby function của V850E, nhằm giảm thiểu một cách hiệu quả điện năng tiêu thụ của hệ thống . Standby funtion của V850E có 3 mode hoạt động : HALT mode , IDLE mode và STOP mode. Trong bài viết này mình sẽ chỉ giới thiệu về HALT Mode , còn các mode khác thì mình sẽ giới thiệu sau. HALT mode là mode mà trong đó chúng ta chỉ dừng clock hoạt động của CPU.

2. Hoạt động

HALT mode sẽ được hoạt động khi một chỉ dẫn được thiết lập sẵn được thực thi trong Normal mode. HALT mode sẽ dừng hoạt động và quay trở về normal mode khi có một ngắt không che (watchdog) , một tín hiệu ngắt ngoài , hoặc một tín hiệu reset được tạo ra

3. Lập trình cho halt mode hoạt động

Sơ đồ khối Main Funtion

Sơ đồ khối của HALT mode setting , interrupt và Halt mode release setting

Source code tham khảo

#pragma ioreg								/* Peripheral I/O register name enable specification */
#pragma interrupt INTP07	external_int	/* INTP07 interrupt function declaration */
/*───────────────────────────────────
*	Function Prototypes
* ───────────────────────────────────
*/
void halt_main(void);					/* HALT mode function */
void halt_init(void);					/* HALT mode release setting function */
void halt_mode(void);					/* HALT mode setting function */
/*───────────────────────────────────
*   Main Function
* ───────────────────────────────────
*/
void halt_main(void)
{
	__DI();								/* Maskable interrupt disable */
	
	halt_init();						/* HALT mode release setting function */
	
	__EI();								/* Maskable interrupt enable */
	
	halt_mode();						/* HALT mode setting function */
	
	return;
}

/*───────────────────────────────────
*   Halt_Init Function
* ───────────────────────────────────
*/
void halt_init(void)
{
	PFC0 = 0x00;						/* Set INTP7 input. */
	PMC0 = 0x80;						/* Set the P07 pin to the INTP7 input pin. */
										/* Setting of P0 and PM0 not required */
	
	/* Detect an edge, because an external interrupt will be used. */
	INTR0 = 0x80;						/* Rising edge */
	INTF0 = 0x00;						/* Rising edge */
	
	PIF07 = 0;							/* INTP7 interrupt request flag clear */
	
	IMR5 = 0xFFFF;						/* Unused interrupt mask */
	IMR4 = 0xFFFF;						/* Unused interrupt mask */
	IMR3 = 0xFFFF;						/* Unused interrupt mask */
	IMR2 = 0xFFFF;						/* Unused interrupt mask */
	IMR1 = 0xFFFF;						/* Unused interrupt mask */
	IMR0 = 0xFFFF;						/* Unused interrupt mask */
	
	PMK07 = 0;							/* INTP7 interrupt processing enabled */
	
	return;
}

/*───────────────────────────────────
*   Halt_Mode Function
* ───────────────────────────────────
*/
void halt_mode(void)
{
	__asm("halt");						/* Perform HALT mode */
	__asm("nop");						/* Insert at least five NOP instructions after the HALT instruction. */
	__asm("nop");
	__asm("nop");
	__asm("nop");
	__asm("nop");
	
	return;
}




All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí