关于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就是除能。
当然这一切都只是根据现象做出的猜测,期望有了解硬件的大神给予有说服力的解释,不胜感激。
相关文章推荐
- STM32中关于检测按键的一些问题(关于采用传统的延时消抖方式和采用中断方式)
- 关于STM32做IAP程序的一些问题
- 关于 STM32 UART4 的一些小问题
- 关于stm32 的 USB 转串口 virtual_Com_Port的例程的一些问题
- 关于使用STM32- PB3引脚的一些问题
- 关于STM32发送中断的一些问题
- 关于基础架构的一些零碎问题的整理记录
- 工作学习笔记——一些关于链接的有趣小问题
- 关于wordpress的一些问题的解决办法
- 关于安装Android Studio的一些问题的解决方法
- 关于Web Service的一些问题
- 关于Linux的一些问题
- 关于项目属相版本不对的一些问题,库加载不了
- 关于ASP.NET在IIS一些问题的经验总结
- 关于STM32 MDK中USE_STDPERIPH_DRIVER问题的解释
- 关于GIT的一些问题
- 关于框架的一些问题
- JavaScript关于事件对象的一些问题
- 深入浅出MFC 第8章 关于序列化(Serialize)的一些问题
- 关于线程问题的一些总结