偶刚刚接触STM32,发现了两个令人费解的问题,请香主及各位帮忙(使用Keil uVision3 V3.55A): 1、中断子程序的起始地址影响中断正常运行: 我将I2C2设成主机,并使用中断方式与I2C1通信,起初一切正常,这时I2C2中断程序的入口地址是0x08000A60,后来在主程序里增加了一些程序,发现I2C通信就不正常了,仔细查找后,发现这是由于I2C2程序的入口地址改变引起的,只要入口地址大于0x08000A64,程序就不正常了。 何解?是不是中断向量初始化不正确呢?
2、程序放置的地址不同,则运行时间不同? 由于需要精确控制脉冲频率及个数,我写了如下程序: void PulseHigh(void) { GPIOB->ODR |= (1<<5); //H01 GPIOB->ODR |= (1<<5); //H02 GPIOB->ODR |= (1<<5); //H03 GPIOB->ODR |= (1<<5); //H04 GPIOB->ODR |= (1<<5); //H05 GPIOB->ODR |= (1<<5); //H06 GPIOB->ODR |= (1<<5); //H07 GPIOB->ODR |= (1<<5); //H08 GPIOB->ODR |= (1<<5); //H09 GPIOB->ODR |= (1<<5); //H10 GPIOB->ODR |= (1<<5); //H11 GPIOB->ODR |= (1<<5); //H12 GPIOB->ODR |= (1<<5); //H13 } void PulseLow(void) { GPIOB->ODR &= ~(1<<5);//L01 GPIOB->ODR &= ~(1<<5);//L02 GPIOB->ODR &= ~(1<<5);//L03 GPIOB->ODR &= ~(1<<5);//L04 GPIOB->ODR &= ~(1<<5);//L05 GPIOB->ODR &= ~(1<<5);//L06 GPIOB->ODR &= ~(1<<5);//L07 GPIOB->ODR &= ~(1<<5);//L08 GPIOB->ODR &= ~(1<<5);//L09 GPIOB->ODR &= ~(1<<5);//L10 GPIOB->ODR &= ~(1<<5);//L11 GPIOB->ODR &= ~(1<<5);//L12 GPIOB->ODR &= ~(1<<5);//L13 } 调用过程如下: PulseHigh(); PulseLow(); PulseHigh(); PulseLow(); ……
但奇怪的事情发生了,此时占空比不为1:1,高的时间为1.98us,低的时间为1.94us,但把PulseHigh, PulseLow两个子程序摆放顺序(注意不是调用顺序)对调一下,占空比也跟着对调了,高的时间变成1.94us,低的时间为1.98us。百思不得其解!特求助香主及各位! |