STM32F030F4 无法在 Bare Metal 中正确启动 I2C1
STM32F030F4 does not start I2C1 correctly in Bare Metal
STM32F030F4没有正确启动I2C1。
这是我的代码:
//Clocks------------------------------------------------
RCC->AHBENR = 0x200000;
RCC->APB1ENR = 0x4040 ;
//------------------------------------------------------
//GPIO--------------------------------------------------
//Configure Alternate Fucntion GPIO to I2C1
GPIOA->AFR[1] = 0x440 //(0b0100)<<4 | (0b0100)<<8 //AF4;
//Set GPIOA Pin 9-10 as Alternate Function
GPIOA->MODER = 0x280000;
//Set GPIOA pin 9-10 as speed as High
GPIOA->OSPEEDR = 0x3c0000;
//Set GPIOA pin 9-10 as open drain
GPIOA->OTYPER = 0x600;
//Set GPIOA pin 9-10 as no Pull-up Pull-down
GPIOA->PUPDR = 0x0;
//------------------------------------------------------
//I2C Resgisters
I2C1->TIMINGR = 0x00201D2D;
I2C1->CR1 = 0x1;
I2C1->CR2 = 0x307001c;
I2C1->TXDR = 0x111;
//Start I2C
I2C1->CR2 |= (0b1) << 13;
但输出不正确。
是这样的:
SDA 端口不工作。
这一行好像有问题
GPIOA->AFR[1] = GPIO_Aternate_Function_I2C1;
如果I2C引脚为9和10,你应该设置AFSEL9和AFSEL10值。但是你设置了AFSEL8(AFR[1]中最低的),并清除其他值。
这段代码应该做的事情:
GPIOA->AFR[1] = GPIO_Aternate_Function_I2C1 * 0x00000110;
问题已解决..
时钟有问题:
变化:(
//Enable PORTA clocks
RCC->AHBENR |= 0x20000;
//Enable I2C1 clocks
RCC->APB1ENR |= 0x200000 ;
)
STM32F030F4没有正确启动I2C1。 这是我的代码:
//Clocks------------------------------------------------
RCC->AHBENR = 0x200000;
RCC->APB1ENR = 0x4040 ;
//------------------------------------------------------
//GPIO--------------------------------------------------
//Configure Alternate Fucntion GPIO to I2C1
GPIOA->AFR[1] = 0x440 //(0b0100)<<4 | (0b0100)<<8 //AF4;
//Set GPIOA Pin 9-10 as Alternate Function
GPIOA->MODER = 0x280000;
//Set GPIOA pin 9-10 as speed as High
GPIOA->OSPEEDR = 0x3c0000;
//Set GPIOA pin 9-10 as open drain
GPIOA->OTYPER = 0x600;
//Set GPIOA pin 9-10 as no Pull-up Pull-down
GPIOA->PUPDR = 0x0;
//------------------------------------------------------
//I2C Resgisters
I2C1->TIMINGR = 0x00201D2D;
I2C1->CR1 = 0x1;
I2C1->CR2 = 0x307001c;
I2C1->TXDR = 0x111;
//Start I2C
I2C1->CR2 |= (0b1) << 13;
但输出不正确。
是这样的:
SDA 端口不工作。
这一行好像有问题
GPIOA->AFR[1] = GPIO_Aternate_Function_I2C1;
如果I2C引脚为9和10,你应该设置AFSEL9和AFSEL10值。但是你设置了AFSEL8(AFR[1]中最低的),并清除其他值。
这段代码应该做的事情:
GPIOA->AFR[1] = GPIO_Aternate_Function_I2C1 * 0x00000110;
问题已解决..
时钟有问题: 变化:(
//Enable PORTA clocks
RCC->AHBENR |= 0x20000;
//Enable I2C1 clocks
RCC->APB1ENR |= 0x200000 ;
)