您的位置:首页 > 其它

关于STM32使能除能(SETENA;CLRENA)的一些问题

2013-04-27 21:02 302 查看
最近由于国赛的原因,开始学STM32,看不完全手册和M3权威手册,有一些问题,关于SETENA和CLRENA,他们两个都是只能写1,写0会无效,但同时他们两个都是可读可写的,既然可读,那读出来的东西就应该有意义有规律,应该能反映中断的使能除能状态,不然硬件设计师没理由把这东西设计成可读的。于是我就在想,假设我先对使能位写一,然后对除能为写一,那么此时使能位应该是什么?理论推测,应该是0;这应该是一种反馈机制;(网上没有查到相应的资料,M3里面写得也不是很详细,所以此时只能是猜测),不过下面的程序简单地验证了这个猜想的反馈机制。
#include "sys.h"
#include "delay.h"
#include "usart.h"

#define SETENA0		(*((volatile unsigned long *)0xE000E100))
#define CLRENA0		(*((volatile unsigned long *)0xE000E180))
#define SETPEND0	(*((volatile unsigned long *)0xE000E200))
#define CLRPEND0	(*((volatile unsigned long *)0xE000E280))
int main(void)
{
//unsigned long t1 = 0;
//unsigned long t2 = 0;

Stm32_Clock_Init(9);
delay_init(72);
uart_init(72, 9600);

//SETENA0 = 0x00080000;
//SETENA0 = 0x00000000;
//CLRENA0 = 0x00080000;
//SETENA0 = 0x00080000;

//SETPEND0 = 0x00040000;
//SETPEND0 = 0x00000000;
//CLRPEND0 = 0x00040000;
//SETPEND0 = 0x00040000;

//delay_ms(10);

printf("process1:\n");
printf("INPUT-: \tSETENA0:0;\tCLRENA0:0\n");
delay_ms(10);
SETENA0 = 0x00000000;
CLRENA0 = 0x00000000;
printf( "SETENA0:%lx\n" , SETENA0);
printf( "CLRENA0:%lx\n" , CLRENA0);

printf("process2:\n");
printf("INPUT-: \tSETENA0:0;\tCLRENA0:1\n");
delay_ms(10);
SETENA0 = 0x00000000;
CLRENA0 = 0x00080000;
printf( "SETENA0:%lx\n" , SETENA0);
printf( "CLRENA0:%lx\n" , CLRENA0);

printf("process3:\n");
printf("INPUT-: \tSETENA0:1;\tCLRENA0:0\n");
delay_ms(10);
SETENA0 = 0x00080000;
CLRENA0 = 0x00000000;
printf( "SETENA0:%lx\n" , SETENA0);
printf( "CLRENA0:%lx\n" , CLRENA0);

printf("process4:\n");
printf("INPUT-: \tSETENA0:1;\tCLRENA0:1\n");
delay_ms(10);
SETENA0 = 0x00080000;
CLRENA0 = 0x00080000;
printf( "SETENA0:%lx\n" , SETENA0);
printf( "CLRENA0:%lx\n" , CLRENA0);

/*
**	交换顺序
*/
printf("switch the case:\n\n************************\n\n");
printf("process5:\n");
printf("INPUT-: \tCLRENA0:0;\tSETENA0:0\n");
delay_ms(10);
CLRENA0 = 0x00000000;
SETENA0 = 0x00000000;
printf( "SETENA0:%lx\n" , SETENA0);
printf( "CLRENA0:%lx\n" , CLRENA0);

printf("process6:\n");
printf("INPUT-: \tCLRENA0:0;\tSETENA0:1\n");
delay_ms(10);
CLRENA0 = 0x00000000;
SETENA0 = 0x00080000;
printf( "SETENA0:%lx\n" , SETENA0);
printf( "CLRENA0:%lx\n" , CLRENA0);

printf("process7:\n");
printf("INPUT-: \tCLRENA0:1;\tSETENA0:0\n");
delay_ms(10);
CLRENA0 = 0x00080000;
SETENA0 = 0x00000000;
printf( "SETENA0:%lx\n" , SETENA0);
printf( "CLRENA0:%lx\n" , CLRENA0);

printf("process8:\n");
printf("INPUT-: \tCLRENA0:1;\tSETENA0:1\n");
delay_ms(10);
CLRENA0 = 0x00080000;
SETENA0 = 0x00080000;
printf( "SETENA0:%lx\n" , SETENA0);
printf( "CLRENA0:%lx\n" , CLRENA0);

//printf( "SETPEND0:%lx\n" , SETPEND0);
//printf( "CLRPEND0:%lx\n" , CLRPEND0);

/*
while(1)
{
printf("t:%d\n", t);
delay_ms(500);
t++;
}
*/

}

以下是串口调试出来的结果

process1:
INPUT-:         SETENA0:0;      CLRENA0:0
SETENA0:0
CLRENA0:0
process2:
INPUT-:         SETENA0:0;      CLRENA0:1
SETENA0:0
CLRENA0:0
process3:
INPUT-:         SETENA0:1;      CLRENA0:0
SETENA0:80000
CLRENA0:80000
process4:
INPUT-:         SETENA0:1;      CLRENA0:1
SETENA0:0
CLRENA0:0
switch the case:

************************

process5:
INPUT-:         CLRENA0:0;      SETENA0:0
SETENA0:0
CLRENA0:0
process6:
INPUT-:         CLRENA0:0;      SETENA0:1
SETENA0:80000
CLRENA0:80000
process7:
INPUT-:         CLRENA0:1;      SETENA0:0
SETENA0:0
CLRENA0:0
process8:
INPUT-:         CLRENA0:1;      SETENA0:1
SETENA0:80000
CLRENA0:80000
结果验证了反馈的猜想,程序中,将使能和除能所有的赋值情况和复制顺序都考虑进去了;但是带来了一个新的问题,为什么一开始对使能位写一,除能位自动置一呢?这几种情况中,所有的使能和除能无论怎么写,之后都会保持一致的状态。这有什么用处吗?有什么深意吗?只能猜测这是为了方便,无论读取的是使能位还是除能位,随便读取一个中断寄存器,只要是1就是使能,只要是0就是除能。

当然这一切都只是根据现象做出的猜测,期望有了解硬件的大神给予有说服力的解释,不胜感激。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: