Спойлер
Код: Выделить всё
#include <stm32f10x.h>
#include <main.h>
volatile uint16_t Test_1 = 0;
int main()
{
//Тактируем ядро
RCC->CFGR &= ~RCC_CFGR_SW; //Очистка битов выбора источника тактового сигнала
RCC->CR &= ~RCC_CR_PLLON; //Отключаем генератор PLL
RCC->CR &= ~RCC_CR_HSEON;
while((RCC->CR & RCC_CR_HSERDY)!=0) {}
RCC->CR |= RCC_CR_HSION; //Включить генератор HSI
while((RCC->CR & RCC_CR_HSIRDY)==0) {}
RCC->CFGR &= ~RCC_CFGR_SW; //Выбрать источником тактового сигнала HSI
while((RCC->CFGR & RCC_CFGR_SWS)!=0) {} // !=0 - HSI; !=4 - HSE; !=8 - PLL;
RCC->CFGR &= ~RCC_CFGR_PPRE1;
while((RCC->CFGR & RCC_CFGR_PPRE1)!=0){} // !=0 - Not devided; !=1024 - Dev=2; !=1280 - Dev=4; !=1536 - Dev=8; !=1792 - Dev=16;
/*Тактируем периферию*/
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
GPIOB->CRL = 0xDD444444;
RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
I2C1->CR1 = I2C_CR1_SWRST;
I2C1->CR1 = 0;
I2C1->CCR = 40; // F = PCLK1/CCR/2
I2C1->CR2 = 8; // Значение PCLK1 [МГц]
I2C1->TRISE = 9;
I2C1->CR1 = I2C_CR1_PE;
/*------------------------------_END--------------------------------*/
//////////////////////////////////////////////////////////////////////////////////////////////////////////
__enable_irq ();
while(1)
{
while (I2C1->SR2 & I2C_SR2_BUSY){;}
I2C1->CR1 |= I2C_CR1_START;
while (!(I2C1->SR1 & I2C_SR1_SB)){;}
Test_1 = I2C1->SR1;
I2C1->DR = 40;
Test_1 = 1;
while(1){}
}
}
Единственное, в настройках I2C переделал на 100кГц для протокола и на 8Мгц тактирование APB1.
Получается такая хрень (опять тактовый сигнал напоминает черт знает что):
Зумм:


