LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

STM32Butterfly2: sterowanie LED RGB za pomocą wyspecjalizowanego sterownika PCA9633

Na początku programu realizowana jest inicjalizacja linii wykorzystywanych przez joystick. Odbywa się to poprzez włączenie zegara dla używanego portu GPIO, skonfigurowanie linii jako wejść i podciągnięciu ich do potencjału dodatniego. Za konfiguracje linii jako wyjścia odpowiada funkcja io_config_ext, która jako pierwszy parametr przyjmuje nazwę portu, jako drugi wartość określającą, które linie podlegają konfiguracji, natomiast trzeci i czwarty parametr określa tryb działania. Z kolei funkcja io_set_clr_mask powoduje podciągnięcie linii do VCC, funkcja do działania wymaga podania trzech parametrów. Pierwszy parametr funkcji określa port, drugi parametr określa, które linie zostają ustawione, a które wyzerowane, natomiast trzeci parametr jest maską blokującą zmianę stanu pozostałych linii.

W kolejnym kroku inicjalizowany jest licznik SysTick, realizuje to funkcja time_init(). Inicjalizacja polega na zapisaniu do odpowiedniego rejestru wartości określającej częstotliwość występowania przerwania od licznika SysTick, ustawieniu priorytetu przerwania oraz włączeniu licznika.

Następnie przeprowadzana jest inicjalizacja sprzętowego kontrolera magistrali I2C. Odpowiada za to funkcja i2cm_init, przyjmuje ona parametr, który określa częstotliwość taktowania wysyłanych danych. Listing funkcji inicjalizującej został przedstawiony poniżej.

errno_t i2cm_init( unsigned clk_speed)
{

	//GPIO configuration
	RCC->APB2ENR |= I2C1_GPIO_ENR;
	io_config(I2C1_PORT,I2C1_SDA_PIN,GPIO_MODE_50MHZ,GPIO_CNF_ALT_OD);
	io_config(I2C1_PORT,I2C1_SCL_PIN,GPIO_MODE_50MHZ,GPIO_CNF_ALT_OD);
	io_set(I2C1_PORT,I2C1_SCL_PIN);
	io_set(I2C1_PORT,I2C1_SDA_PIN);
	//I2C module configuration
	RCC->APB1ENR |= I2C1_ENR;

	/* Enable I2C module*/
	i2c->CR1 |= CR1_PE_SET;
	/* Reset the i2c device */
	i2c->CR1 |= CR1_SWRST;
	nop();
	i2c->CR1 &= ~CR1_SWRST;

	 uint16_t tmpreg = i2c->CR2;
	 /* Clear frequency FREQ[5:0] bits */
	 tmpreg &= CR2_FREQ_RESET;
	 tmpreg |= (uint16_t)(CONFIG_PCLK1_HZ/1000000);
	 i2c->CR2 = tmpreg;

	 //Set speed
	 i2cm_set_speed(clk_speed);

	 /* CR1 configuration */
	 /* Get the I2Cx CR1 value */
	 tmpreg = i2c->CR1;
	 /* Clear ACK, SMBTYPE and SMBUS bits */
	 tmpreg &= CR1_CLEAR_MASK;
	 /* Configure I2Cx: mode and acknowledgement */
	 /* Set SMBTYPE and SMBUS bits according to I2C_Mode value */
	 /* Set ACK bit according to I2C_Ack value */
	 tmpreg |= I2C_MODE_I2C | I2C_ACK_ENABLE;
	 /* Write to I2Cx CR1 */
	 i2c->CR1 = tmpreg;

	 /* Set I2Cx Own Address1 and acknowledged address */
	 i2c->OAR1 = I2C_AcknowledgedAddress_7bit;

	 i2c->SR1 = 0; i2c->SR2 = 0;

	 /* Enable interrupt controller */
	 nvic_set_priority( I2C1_EV_IRQn, IRQ_PRIO, IRQ_SUB);
   nvic_set_priority( I2C1_ER_IRQn, IRQ_PRIO, IRQ_SUB);
	 nvic_irq_enable(I2C1_EV_IRQn,true);
   nvic_irq_enable(I2C1_ER_IRQn,true);
	 return ERR_OK;
}

 

W pierwszym kroku funkcji włączany jest zegar portu GPIO, w którym występują linie używane do transmisji. Następnie przeprowadzana jest konfiguracja linii jako alternatywne z otwartym drenem i podciągnięte do VCC. Funkcje użyte do tej konfiguracji są identyczne jak przy konfiguracji linii podłączonych do joysticka, opisanej powyżej. Kolejną czynnością jest włączenie zegara dla pierwszego kontrolera I2C. Włączenie zegara odbywa się poprzez ustawienie odpowiedniego bitu w rejestrze APB1ENR.

W kolejnym etapie następuje włączenie kontrolera I2C oraz jego zresetowanie. Czynność włączenia realizowana jest poprzez zapis bitu CR1_PE_SET, natomiast reset odbywa się poprzez udstawienie i wyzerowanie bitu CR1_SWRST, które oddzielone jest operacją nop(). Powyższe operacje wykonywane są na rejestrze I2C_CR1.

Następnie ustawiana jest częstotliwość kontrolera, wartość ta zapisana jest jako sześć najmłodszych bitów rejestru I2C_CR2. W celu zachowania stanu pozostałych bitu rejestru bez zmian rejestr najpierw jest odczytywany, następnie zerowane są najmłodsze bity, po czym na podstawie częstotliwości taktowania magistrali APB obliczana jest zapisywana wartość.

W następnym kroku ustawiana jest szybkość wysyłania danych, odpowiada za to funkcja i2cm_set_speed, która jako parametr przyjmuje częstotliwość transmisji. Do ustawienia powyższego parametru została wydzielona odrębna funkcja gdyż wymagane jest zachowanie odpowiedniej kolejności działania.

Kolejnym krokiem jest konfiguracja rejestru I2C_CR2, odbywa się to poprzez działanie na kopi zawartości. Na początku zerowana jest część bitów, po czym odbywa się ustawianie bitu ACK. Po wprowadzaniu zmian kopia zapisywana jest do rejestru.

Następnie poprzez zapis do rejestru I2C_OAR1 ustawiany jest adres urządzenia oraz zerowane rejestry I2C_SR1 i I2C_SR2 informujące o statusie kontrolera I2C. Na zakończenie przeprowadzana jest konfiguracja priorytetu przerwań i następuje ich włączenie.

Tagi: GPIO, LED, SMBus