#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
//"IO口操作,只对单一的IO口!"
//"确保n的值小于16! "
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//"IO口地址映射"
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //"输出 "
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //"输入 "
void ErZhiHua__GPIO_Init(void)//硬件二值化
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFFF0;//PA0设置成下拉输入
GPIOA->CRL|=0X00000008;
}
/*------------------------------------------------------------------------------*/
//void ErZhiHua1__GPIO_Init(void)
//{
// GPIO_InitTypeDef GPIO_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //GPIOA能
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //I/O口的方向,下拉输入
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //I/O的最高输出速度
// GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化外设的0端口
//}
/*--
*(pucTemp + i) =  Ain(0); // GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0); //
*(pucTemp + i) =GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
一个用的是寄存器版操作,一个用库函数版,结果在中断中赋值给 *(pucTemp + i) ,可寄存器版能工作,库函数版就不能工作了;后来我用寄存器版初始化IO,用库函数版读值,和用库函数版初始化,寄存器版读值,都不能工作;可我直接在主函数中读值再通过串口发送出来看,结果两种方式都能读对呀;请问这问题是出在哪呀,应该是我的库函数里初始化IO口PA_0出问题了吧,导致在中断中不工作?具体问题在哪呀????有点纠结(我对寄存器版不是很了解)。
|