www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

8-pinski ARM in (simuliran) 16 segmentni prikazovalnik
Pojdi na stran Prejšnja  1, 2, 3
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Čet Avg 18, 2022 7:17 am    Naslov sporočila:   Odgovori s citatom

Za uporabo HAL knjižnice rabimo še konfiguracijsko datoteko. Predlogo najdemo v
.stm32g0xx_hal_driver\Inc pod imenom "stm32g0xx_hal_conf_template.h".

To skopiramo v svoj "inc" in spremenimo ime v stm32g0xx_hal_conf.h

na začetku kode zakomentiramo vse module, razen tistih, ki jih bomo potrebovali v naši aplikaciji:
HAL_MODULE_ENABLED
HAL_I2C_MODULE_ENABLED
HAL_RTC_MODULE_ENABLED
HAL_UART_MODULE_ENABLED
HAL_GPIO_MODULE_ENABLED
HAL_EXTI_MODULE_ENABLED
HAL_DMA_MODULE_ENABLED
HAL_RCC_MODULE_ENABLED
HAL_FLASH_MODULE_ENABLED
HAL_PWR_MODULE_ENABLED
HAL_CORTEX_MODULE_ENABLED


Vsebina datoteke:
Koda:

/**
  ******************************************************************************
  * @file    stm32g0xx_hal_conf.h
  * @author  MCD Application Team
  * @brief   HAL configuration file.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2018 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef STM32G0xx_HAL_CONF_H
#define STM32G0xx_HAL_CONF_H

#ifdef __cplusplus
extern "C" {
#endif

/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/

/* ########################## Module Selection ############################## */
/**
  * @brief This is the list of modules to be used in the HAL driver
  */
#define HAL_MODULE_ENABLED
/* #define HAL_ADC_MODULE_ENABLED   */
/* #define HAL_CEC_MODULE_ENABLED   */
/* #define HAL_COMP_MODULE_ENABLED   */
/* #define HAL_CRC_MODULE_ENABLED   */
/* #define HAL_CRYP_MODULE_ENABLED   */
/* #define HAL_DAC_MODULE_ENABLED   */
/* #define HAL_EXTI_MODULE_ENABLED   */
/* #define HAL_FDCAN_MODULE_ENABLED   */
/* #define HAL_HCD_MODULE_ENABLED   */
#define HAL_I2C_MODULE_ENABLED
/* #define HAL_I2S_MODULE_ENABLED   */
/* #define HAL_IWDG_MODULE_ENABLED   */
/* #define HAL_IRDA_MODULE_ENABLED   */
/* #define HAL_LPTIM_MODULE_ENABLED   */
/* #define HAL_PCD_MODULE_ENABLED   */
/* #define HAL_RNG_MODULE_ENABLED   */
#define HAL_RTC_MODULE_ENABLED
/* #define HAL_SMARTCARD_MODULE_ENABLED   */
/* #define HAL_SMBUS_MODULE_ENABLED   */
/* #define HAL_SPI_MODULE_ENABLED   */
/* #define HAL_TIM_MODULE_ENABLED   */
#define HAL_UART_MODULE_ENABLED
/* #define HAL_USART_MODULE_ENABLED   */
/* #define HAL_WWDG_MODULE_ENABLED   */
#define HAL_GPIO_MODULE_ENABLED
#define HAL_EXTI_MODULE_ENABLED
#define HAL_DMA_MODULE_ENABLED
#define HAL_RCC_MODULE_ENABLED
#define HAL_FLASH_MODULE_ENABLED
#define HAL_PWR_MODULE_ENABLED
#define HAL_CORTEX_MODULE_ENABLED

/* ########################## Register Callbacks selection ############################## */
/**
  * @brief This is the list of modules where register callback can be used
  */
#define USE_HAL_ADC_REGISTER_CALLBACKS    0u
#define USE_HAL_CEC_REGISTER_CALLBACKS    0u
#define USE_HAL_COMP_REGISTER_CALLBACKS   0u
#define USE_HAL_CRYP_REGISTER_CALLBACKS   0u
#define USE_HAL_DAC_REGISTER_CALLBACKS    0u
#define USE_HAL_FDCAN_REGISTER_CALLBACKS  0u
#define USE_HAL_HCD_REGISTER_CALLBACKS    0u
#define USE_HAL_I2C_REGISTER_CALLBACKS    0u
#define USE_HAL_I2S_REGISTER_CALLBACKS    0u
#define USE_HAL_IRDA_REGISTER_CALLBACKS   0u
#define USE_HAL_LPTIM_REGISTER_CALLBACKS  0u
#define USE_HAL_PCD_REGISTER_CALLBACKS    0u
#define USE_HAL_RNG_REGISTER_CALLBACKS    0u
#define USE_HAL_RTC_REGISTER_CALLBACKS    0u
#define USE_HAL_SMBUS_REGISTER_CALLBACKS  0u
#define USE_HAL_SPI_REGISTER_CALLBACKS    0u
#define USE_HAL_TIM_REGISTER_CALLBACKS    0u
#define USE_HAL_UART_REGISTER_CALLBACKS   0u
#define USE_HAL_USART_REGISTER_CALLBACKS  0u
#define USE_HAL_WWDG_REGISTER_CALLBACKS   0u

/* ########################## Oscillator Values adaptation ####################*/
/**
  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
  *        This value is used by the RCC HAL module to compute the system frequency
  *        (when HSE is used as system clock source, directly or through the PLL).
  */
#if !defined  (HSE_VALUE)
#define HSE_VALUE    (8000000UL)         /*!< Value of the External oscillator in Hz */
#endif /* HSE_VALUE */

#if !defined  (HSE_STARTUP_TIMEOUT)
#define HSE_STARTUP_TIMEOUT    (100UL)         /*!< Time out for HSE start up, in ms */
#endif /* HSE_STARTUP_TIMEOUT */

/**
  * @brief Internal High Speed oscillator (HSI) value.
  *        This value is used by the RCC HAL module to compute the system frequency
  *        (when HSI is used as system clock source, directly or through the PLL).
  */
#if !defined  (HSI_VALUE)
#define HSI_VALUE    (16000000UL)            /*!< Value of the Internal oscillator in Hz*/
#endif /* HSI_VALUE */

#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
/**
  * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG.
  *        This internal oscillator is mainly dedicated to provide a high precision clock to
  *        the USB peripheral by means of a special Clock Recovery System (CRS) circuitry.
  *        When the CRS is not used, the HSI48 RC oscillator runs on it default frequency
  *        which is subject to manufacturing process variations.
  */
#if !defined  (HSI48_VALUE)
  #define HSI48_VALUE   48000000U             /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz.
                                               The real value my vary depending on manufacturing process variations.*/
#endif /* HSI48_VALUE */
#endif

/**
  * @brief Internal Low Speed oscillator (LSI) value.
  */
#if !defined  (LSI_VALUE)
#define LSI_VALUE  (32000UL)                /*!< LSI Typical Value in Hz*/
#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz
The real value may vary depending on the variations
in voltage and temperature.*/
/**
  * @brief External Low Speed oscillator (LSE) value.
  *        This value is used by the UART, RTC HAL module to compute the system frequency
  */
#if !defined  (LSE_VALUE)
#define LSE_VALUE    (32768UL)               /*!< Value of the External oscillator in Hz*/
#endif /* LSE_VALUE */

#if !defined  (LSE_STARTUP_TIMEOUT)
#define LSE_STARTUP_TIMEOUT    (5000UL)      /*!< Time out for LSE start up, in ms */
#endif /* LSE_STARTUP_TIMEOUT */

/**
  * @brief External clock source for I2S1 peripheral
  *        This value is used by the RCC HAL module to compute the I2S1 clock source
  *        frequency.
  */
#if !defined  (EXTERNAL_I2S1_CLOCK_VALUE)
#define EXTERNAL_I2S1_CLOCK_VALUE    (12288000UL) /*!< Value of the I2S1 External clock source in Hz*/
#endif /* EXTERNAL_I2S1_CLOCK_VALUE */

#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)
/**
  * @brief External clock source for I2S2 peripheral
  *        This value is used by the RCC HAL module to compute the I2S2 clock source
  *        frequency.
  */
#if !defined  (EXTERNAL_I2S2_CLOCK_VALUE)
  #define EXTERNAL_I2S2_CLOCK_VALUE    48000U /*!< Value of the I2S2 External clock source in Hz*/
#endif /* EXTERNAL_I2S2_CLOCK_VALUE */
#endif

/* Tip: To avoid modifying this file each time you need to use different HSE,
   ===  you can define the HSE value in your toolchain compiler preprocessor. */

/* ########################### System Configuration ######################### */
/**
  * @brief This is the HAL system configuration section
  */
#define  VDD_VALUE                    (3300UL)                                        /*!< Value of VDD in mv */
#define  TICK_INT_PRIORITY            3U /*!< tick interrupt priority */
#define  USE_RTOS                     0U
#define  PREFETCH_ENABLE              1U
#define  INSTRUCTION_CACHE_ENABLE     1U

/* ################## SPI peripheral configuration ########################## */

/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
* Activated: CRC code is present inside driver
* Deactivated: CRC code cleaned from driver
*/

#define USE_SPI_CRC                     0U

/* ################## CRYP peripheral configuration ########################## */

#define USE_HAL_CRYP_SUSPEND_RESUME     1U

/* ########################## Assert Selection ############################## */
/**
  * @brief Uncomment the line below to expanse the "assert_param" macro in the
  *        HAL drivers code
  */
/* #define USE_FULL_ASSERT    1U */

/* Includes ------------------------------------------------------------------*/
/**
  * @brief Include modules header file
  */

#ifdef HAL_RCC_MODULE_ENABLED
#include "stm32g0xx_hal_rcc.h"
#endif /* HAL_RCC_MODULE_ENABLED */

#ifdef HAL_GPIO_MODULE_ENABLED
#include "stm32g0xx_hal_gpio.h"
#endif /* HAL_GPIO_MODULE_ENABLED */

#ifdef HAL_DMA_MODULE_ENABLED
#include "stm32g0xx_hal_dma.h"
#endif /* HAL_DMA_MODULE_ENABLED */

#ifdef HAL_CORTEX_MODULE_ENABLED
#include "stm32g0xx_hal_cortex.h"
#endif /* HAL_CORTEX_MODULE_ENABLED */

#ifdef HAL_ADC_MODULE_ENABLED
#include "stm32g0xx_hal_adc.h"
#include "stm32g0xx_hal_adc_ex.h"
#endif /* HAL_ADC_MODULE_ENABLED */

#ifdef HAL_CEC_MODULE_ENABLED
#include "stm32g0xx_hal_cec.h"
#endif /* HAL_CEC_MODULE_ENABLED */

#ifdef HAL_COMP_MODULE_ENABLED
#include "stm32g0xx_hal_comp.h"
#endif /* HAL_COMP_MODULE_ENABLED */

#ifdef HAL_CRC_MODULE_ENABLED
#include "stm32g0xx_hal_crc.h"
#endif /* HAL_CRC_MODULE_ENABLED */

#ifdef HAL_CRYP_MODULE_ENABLED
#include "stm32g0xx_hal_cryp.h"
#endif /* HAL_CRYP_MODULE_ENABLED */

#ifdef HAL_DAC_MODULE_ENABLED
#include "stm32g0xx_hal_dac.h"
#endif /* HAL_DAC_MODULE_ENABLED */

#ifdef HAL_EXTI_MODULE_ENABLED
#include "stm32g0xx_hal_exti.h"
#endif /* HAL_EXTI_MODULE_ENABLED */

#ifdef HAL_FLASH_MODULE_ENABLED
#include "stm32g0xx_hal_flash.h"
#endif /* HAL_FLASH_MODULE_ENABLED */

#ifdef HAL_FDCAN_MODULE_ENABLED
#include "stm32g0xx_hal_fdcan.h"
#endif /* HAL_FDCAN_MODULE_ENABLED */

#ifdef HAL_HCD_MODULE_ENABLED
#include "stm32g0xx_hal_hcd.h"
#endif /* HAL_HCD_MODULE_ENABLED */

#ifdef HAL_I2C_MODULE_ENABLED
#include "stm32g0xx_hal_i2c.h"
#endif /* HAL_I2C_MODULE_ENABLED */

#ifdef HAL_I2S_MODULE_ENABLED
#include "stm32g0xx_hal_i2s.h"
#endif /* HAL_I2S_MODULE_ENABLED */

#ifdef HAL_IRDA_MODULE_ENABLED
#include "stm32g0xx_hal_irda.h"
#endif /* HAL_IRDA_MODULE_ENABLED */

#ifdef HAL_IWDG_MODULE_ENABLED
#include "stm32g0xx_hal_iwdg.h"
#endif /* HAL_IWDG_MODULE_ENABLED */

#ifdef HAL_LPTIM_MODULE_ENABLED
#include "stm32g0xx_hal_lptim.h"
#endif /* HAL_LPTIM_MODULE_ENABLED */

#ifdef HAL_PCD_MODULE_ENABLED
#include "stm32g0xx_hal_pcd.h"
#endif /* HAL_PCD_MODULE_ENABLED */

#ifdef HAL_PWR_MODULE_ENABLED
#include "stm32g0xx_hal_pwr.h"
#endif /* HAL_PWR_MODULE_ENABLED */

#ifdef HAL_RNG_MODULE_ENABLED
#include "stm32g0xx_hal_rng.h"
#endif /* HAL_RNG_MODULE_ENABLED */

#ifdef HAL_RTC_MODULE_ENABLED
#include "stm32g0xx_hal_rtc.h"
#endif /* HAL_RTC_MODULE_ENABLED */

#ifdef HAL_SMARTCARD_MODULE_ENABLED
#include "stm32g0xx_hal_smartcard.h"
#endif /* HAL_SMARTCARD_MODULE_ENABLED */

#ifdef HAL_SMBUS_MODULE_ENABLED
#include "stm32g0xx_hal_smbus.h"
#endif /* HAL_SMBUS_MODULE_ENABLED */

#ifdef HAL_SPI_MODULE_ENABLED
#include "stm32g0xx_hal_spi.h"
#endif /* HAL_SPI_MODULE_ENABLED */

#ifdef HAL_TIM_MODULE_ENABLED
#include "stm32g0xx_hal_tim.h"
#endif /* HAL_TIM_MODULE_ENABLED */

#ifdef HAL_UART_MODULE_ENABLED
#include "stm32g0xx_hal_uart.h"
#endif /* HAL_UART_MODULE_ENABLED */

#ifdef HAL_USART_MODULE_ENABLED
#include "stm32g0xx_hal_usart.h"
#endif /* HAL_USART_MODULE_ENABLED */

#ifdef HAL_WWDG_MODULE_ENABLED
#include "stm32g0xx_hal_wwdg.h"
#endif /* HAL_WWDG_MODULE_ENABLED */

/* Exported macro ------------------------------------------------------------*/
#ifdef  USE_FULL_ASSERT
/**
  * @brief  The assert_param macro is used for functions parameters check.
  * @param  expr If expr is false, it calls assert_failed function
  *         which reports the name of the source file and the source
  *         line number of the call that failed.
  *         If expr is true, it returns no value.
  * @retval None
  */
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_t *file, uint32_t line);
#else
#define assert_param(expr) ((void)0U)
#endif /* USE_FULL_ASSERT */

#ifdef __cplusplus
}
#endif

#endif /* STM32G0xx_HAL_CONF_H */

_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Čet Avg 18, 2022 7:20 am    Naslov sporočila:   Odgovori s citatom

Sedaj se bi moralo prevesti brez napak:

Citiram:
Program Size: Code=308 RO-data=208 RW-data=0 ZI-data=1632
".\Objects\forumvaja1.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:42


S tem je vse pripravljeno za bolj resno delo.

Najprej bomo inicializirali periferijo.

_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Čet Avg 18, 2022 11:11 pm    Naslov sporočila:   Odgovori s citatom

Tale STM32 HAL je na prvo žogo malo čuden, ampak ko se stvari navadiš, je sila enostavno in uporabno.

Dajmo zdaj za vajo inicializirati I2C.

Najprej preimenujmo grupo, kjer imamo datoteko main.c v "Aplikacija". Dodajmo še eno grupo in jo poimenujmo "STM32G031" (slika spodaj).

V grupo "STM32G01" dodajmo novo datoteko init.c. Ne pozabiti na lokacijo v direktoriju "src" (druga slika spodaj).



proj-i2c.jpg
 Opis:
 Velikost datoteke:  18.2 KB
 Pogledana:  1016 krat

proj-i2c.jpg



add-init.jpg
 Opis:
 Velikost datoteke:  63.33 KB
 Pogledana:  1 krat

add-init.jpg



_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Čet Avg 18, 2022 11:43 pm    Naslov sporočila:   Odgovori s citatom

Sedaj lahko napišemo kodo, ki bo inicializirala I2C. Do te kode sicer lahko pridemo tudi povsem avtomatično s pomočjo CUBE generatorja kode, samo pri tem nastane škoda, saj nimamo blage veze, kaj in kako deluje. Za nekoga, ki se s tem prvič srečuje, je najbolje uporabiti CUBE, vendar tu bom opisal malo bolj podrobno in predvsem brez nepotrebno nasmetene kode (s komentarji "user code start" in "user code end" ter podobnim).


Najprej vključimo nujne headerje:

Koda:
#include "stm32g0xx.h"                  // Device header
#include "stm32g0xx_hal.h"



Za I2C (kot tudi za vse ostale periferne enote) je definirana specifična struktura, kjer so shranjene vse nastavitve in ostali podatki. Za I2C se imenuje I2C_HandleTypeDef, najdemo jo pa v HAL knjižnici v datoteki "stm32g0xx_hal_i2c.h". Polja strukture so:

Koda:
typedef struct __I2C_HandleTypeDef
{
  I2C_TypeDef                *Instance;      /*!< I2C registers base address                */
  I2C_InitTypeDef            Init;           /*!< I2C communication parameters              */
  uint8_t                    *pBuffPtr;      /*!< Pointer to I2C transfer buffer            */
  uint16_t                   XferSize;       /*!< I2C transfer size                         */
  __IO uint16_t              XferCount;      /*!< I2C transfer counter                      */
  __IO uint32_t              XferOptions;    /*!< I2C sequantial transfer options, this parameter can
                                                  be a value of @ref I2C_XFEROPTIONS */
  __IO uint32_t              PreviousState;  /*!< I2C communication Previous state          */
  HAL_StatusTypeDef(*XferISR)(struct __I2C_HandleTypeDef *hi2c, uint32_t ITFlags, uint32_t ITSources);
  /*!< I2C transfer IRQ handler function pointer */
  DMA_HandleTypeDef          *hdmatx;        /*!< I2C Tx DMA handle parameters              */
  DMA_HandleTypeDef          *hdmarx;        /*!< I2C Rx DMA handle parameters              */
  HAL_LockTypeDef            Lock;           /*!< I2C locking object                        */
  __IO HAL_I2C_StateTypeDef  State;          /*!< I2C communication state                   */
  __IO HAL_I2C_ModeTypeDef   Mode;           /*!< I2C communication mode                    */
  __IO uint32_t              ErrorCode;      /*!< I2C Error code                            */
  __IO uint32_t              AddrEventCount; /*!< I2C Address Event counter                 */
} I2C_HandleTypeDef;



V init.c definiramo spremenljivko hi2c1:
Koda:

I2C_HandleTypeDef hi2c1;



Funkcija za inicializacijo I2C1 zgleda potem nekako takole:

Koda:
/**
  * @brief I2C1 Initialization Function
  * @param None
  * @retval None
  */
static int I2C1_Init(void)
{

  hi2c1.Instance = I2C1;
  hi2c1.Init.Timing = 0x00602173;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    return -1;
  }

  /** Configure Analogue filter
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    return -1;
  }

  /** Configure Digital filter
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
  {
    return -1;
  }
  return 0;
}



Nekaj stvari je samoumevnih, nekaj pa potrebuje razlago.

Najprej je timing register. V oknu s projektom kliknemo na "Books" in odpremo datoteko "STM32G0x1 Reference Manual". V poglavju 32.7.5 I2C timing register (I2C_TIMINGR) je opisan ta register.

Vsi časi se nanašajo na tPRESC, ki je definiran z biti 31:28. To je delilnik takta, ki napaja I2C enoto. Če malo podpiramo lenobo in se nam ne ljubi računat iz binarne vrednosti, lahko vrednost registra določimo s pomočjo CUBE_MX.

Tu se pa sedaj srečamo še z enim taktom (oz. periodo) tI2CCLK. O sami "napeljavi" takta znotraj mikrokontrolerja nismo še nič rekli. To bom opisal takoj v nadaljevanju.

Če se vrnemo na inicializacijo I2C... naslavljanje pustimo najbolj klasično (7 bitna adresa, lahko bi bila tudi 10-bitna), brez sekundarnega naslavljanja, naprava deluje kot master in ne rabi lastnega naslova, clock streching-a tudi ne rabimo, general call (adresa s samimi enicami) naj ne bo aktiven in to je to.

V nadaljevanju je še konfiguracija analognega in digitalnega filtra na samih I2C linijah.

Če pogledamo blok shemo I2C, vidimo da je analogni filter izven I2C enote in je med GPIO logiko (stikali, ki priklopijo pin na I2C enoto) in samo I2C enoto. Digitalni filter pa se nahaja znotraj same periferne enote. Sama filtra sta uporabno orodje za večjo imunost I2C, a ob napačni konfiguraciji lahko naredimo več škode kot koristi.

Analogni filtzer načeloma poreže špice nad 50ns. Digitalni filter pa je nastavljiv od 1 do 15 taktov vhodnega takta v I2C enoto. Vedeti moramo tudi to, da nastavljanje filtrov ni možno, če je I2C aktiven. Pred spreminjanjem moramo I2C najprej deaktivirati.

Tu bomo obravnavali le master način dela, seveda pa lahko I2C deluje tudi kot slave. Več podrobnosti je v RM v poglavju 32, če bi koga zanimalo.



i2c.jpg
 Opis:
 Velikost datoteke:  68.91 KB
 Pogledana:  3 krat

i2c.jpg



_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Pet Avg 19, 2022 12:11 am    Naslov sporočila:   Odgovori s citatom

Takole, zdaj gremo en korak nazaj in poglejmo, kaj je v funkciji iz HAL_Init HAL knjižnice:

Koda:
HAL_StatusTypeDef HAL_Init(void)
{
  HAL_StatusTypeDef  status = HAL_OK;

  /* Configure Flash prefetch, Instruction cache             */
  /* Default configuration at reset is:                      */
  /* - Prefetch disabled                                     */
  /* - Instruction cache enabled                             */

#if (INSTRUCTION_CACHE_ENABLE == 0U)
  __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();
#endif /* INSTRUCTION_CACHE_ENABLE */

#if (PREFETCH_ENABLE != 0U)
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif /* PREFETCH_ENABLE */

  /* Use SysTick as time base source and configure 1ms tick (default clock after Reset is HSI) */
  if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK)
  {
    status = HAL_ERROR;
  }
  else
  {
  /* Init the low level hardware */
  HAL_MspInit();
  }

  /* Return function status */
  return status;
}


Tam na koncu vidimo en klic funkcije HAL_MspInit();

Ta je v osnovi "prazna", je pa to pravo mesto, da inicializiramo kakšne low-level zadeve. Tipičen primer je mapiranje pinov, vklop takta v določene enote in podobno.

V našem primeru moramo narediti "remap" pinov PA11 in PA12, saj bomo potrebovali PA9 (USART1 TX) namesto PA11 in PA10 (I2C1_SDA) namesto PA12.


Naša funkcija HAL_MspInit() zgleda takole:

Koda:
void HAL_MspInit(void)
{

  __HAL_RCC_SYSCFG_CLK_ENABLE();
  __HAL_RCC_PWR_CLK_ENABLE();

  HAL_SYSCFG_EnableRemap(SYSCFG_REMAP_PA11);
  HAL_SYSCFG_EnableRemap(SYSCFG_REMAP_PA12);

}


Šreden lahko spreminjamo konfiguracijo povezave pinov, je seveda potrebno vklopiti takt.


V prispevku zgoraj smo videli, kako se nastavi parametre samemu I2C. Kako pa pripravimo pine, na katerih je I2C? Poglejmo, kaj je v HAL funkciji HAL_I2C_Init(). Nekje v init funkciji naletimo na klic funkcije HAL_I2C_MspInit():

Koda:
/* Init the low level hardware : GPIO, CLOCK, CORTEX...etc */
    HAL_I2C_MspInit(hi2c);


Komentar pove vse Smile

Pa dajmo pogledat, kaj je potrebno narediti, da dobimo na pine I2C in da bodo ti prav skonfigurirani:

Koda:
/**
* @brief I2C MSP Initialization
* This function configures the hardware resources used by I2C
* @param hi2c: I2C handle pointer
* @retval None
*/
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(hi2c->Instance==I2C1)
  {

  /** Initializes the peripherals clocks
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
    PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      __asm__("BKPT #1");
    }

    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**I2C1 GPIO Configuration
    PB8     ------> I2C1_SCL
    PA10 [PA12]     ------> I2C1_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_I2C1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_I2C1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __HAL_RCC_I2C1_CLK_ENABLE();
    /* I2C1 interrupt Init */
    HAL_NVIC_SetPriority(I2C1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(I2C1_IRQn);
  }

}




Najprej preverimo, ali gre sploh za I2C1:
Koda:
if(hi2c->Instance==I2C1)

To funkcijo lahko kliče HAL_I2C_Init() tudi ob inicializaciji npr. I2C2 in to moramo seveda ločiti, saj je I2C2 na drugih pinih (pa I2C3, ... če seveda v izbranem ohišju mikrokontrolerja to obstaja).

Najpre vklopimo takt v enoto I2C in v GPIO enoti (port A in port B), kjer sta SDA in CLK pina.

Zgoraj sem dal primer, da se v slučaju neuspešnega konfiguriranja izvede

Koda:
      __asm__("BKPT #1");


To je asemblerski ukaz, ki povzroči prekinitev izvajanja - isto, kot bi imeli na tem mestu prekinitveno točko, le da se to izvede programsko. Na ta način lahko vidimo, kje je prišlo do napake. Če nimamo priključenega debuggerja, pa bo procesor končal v hard fault.

...

Na koncu sledi še konfiguracija pinov in inicializacije prekinitev za I2C. O samih prekinitvah bomo kakšno rekli tudi malo kasneje.

_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Sob Avg 27, 2022 6:51 pm    Naslov sporočila:   Odgovori s citatom

Sedaj lahko končamo I2C del, na vodilo priklopimo OLED in dodamo kodo za pogon OLED prikazovalnika.

V projekt dodamo datoteko init.c s funkcijami za inicializacijo periferije.

Poleg I2C bomo inicializirali še UART1 in 2 (Rx in Tx pina sta tako postavljena, da rabimo oba, saj se drugače ne da skombinirat na 8 pinskem. Pa če RTC bomo sproti inicializirali.

Celotna datoteka init.c...
Koda:
#include "stm32g0xx.h"                  // Device header
#include "stm32g0xx_hal.h"


I2C_HandleTypeDef hi2c1;
RTC_HandleTypeDef hrtc;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;


int SystemClock_Config(void);
static int GPIO_Init(void);
static int I2C1_Init(void);
static int USART1_UART_Init(void);
static int USART2_UART_Init(void);

int MCU_Init(void) {
   
   int status = 0;
   
   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  if (HAL_Init() != HAL_OK) status = -1;

  /* Configure the system clock */
   status += SystemClock_Config();
   
  /* Initialize all configured peripherals */
  status += GPIO_Init();
  status += I2C1_Init();
  //status += RTC_Init();
  status += USART1_UART_Init();
  status += USART2_UART_Init();

   return status;

}


/**
  * @brief System Clock Configuration
  * @retval None
  */
int SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;
  RCC_OscInitStruct.PLL.PLLN = 8;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    return -1;
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    return -1;
  }
   
   return 0;
}


/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static int GPIO_Init(void)
{

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

   return 0;
}



/**
  * @brief I2C1 Initialization Function
  * @param None
  * @retval None
  */
static int I2C1_Init(void)
{

  hi2c1.Instance = I2C1;
  hi2c1.Init.Timing = 0x00602173;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    return -1;
  }

  /** Configure Analogue filter
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  {
    return -1;
  }

  /** Configure Digital filter
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
  {
    return -1;
  }
  return 0;
}


/**
  * @brief USART1 Initialization Function
  * @param None
  * @retval None
  */
static int USART1_UART_Init(void)
{
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_HalfDuplex_Init(&huart1) != HAL_OK)
  {
    return -1;
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    return -1;
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    return -1;
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    return -1;
  }
  return 0;
}

/**
  * @brief USART2 Initialization Function
  * @param None
  * @retval None
  */
static int USART2_UART_Init(void)
{
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_HalfDuplex_Init(&huart2) != HAL_OK)
  {
    return -1;
  }
  return 0;
}



/**************************************************************************************/
/***** MSP initialization ---- HAL library calls these function during periphery init */

/**
  * Initializes the Global MSP.
  */
void HAL_MspInit(void)
{

  __HAL_RCC_SYSCFG_CLK_ENABLE();
  __HAL_RCC_PWR_CLK_ENABLE();

  HAL_SYSCFG_EnableRemap(SYSCFG_REMAP_PA11);
  HAL_SYSCFG_EnableRemap(SYSCFG_REMAP_PA12);

}


/**
* @brief I2C MSP Initialization
* This function configures the hardware resources used by I2C
* @param hi2c: I2C handle pointer
* @retval None
*/
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(hi2c->Instance==I2C1)
  {

  /** Initializes the peripherals clocks
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
    PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      __asm__("BKPT #1");
    }

    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**I2C1 GPIO Configuration
    PB8     ------> I2C1_SCL
    PA10 [PA12]     ------> I2C1_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_I2C1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF6_I2C1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __HAL_RCC_I2C1_CLK_ENABLE();
    /* I2C1 interrupt Init */
    HAL_NVIC_SetPriority(I2C1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(I2C1_IRQn);
  }

}



/**
* @brief I2C MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hi2c: I2C handle pointer
* @retval None
*/
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c)
{
  if(hi2c->Instance==I2C1)
  {
    /* Peripheral clock disable */
    __HAL_RCC_I2C1_CLK_DISABLE();

    /**I2C1 GPIO Configuration
    PB8     ------> I2C1_SCL
    PA10 [PA12]     ------> I2C1_SDA
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8);

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_10);

    /* I2C1 interrupt DeInit */
    HAL_NVIC_DisableIRQ(I2C1_IRQn);
  }

}

/**
* @brief RTC MSP Initialization
* This function configures the hardware resources used in this example
* @param hrtc: RTC handle pointer
* @retval None
*/
void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
{
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(hrtc->Instance==RTC)
  {

  /** Initializes the peripherals clocks
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
    PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;

    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      __asm__("BKPT #1");
    }

    /* Peripheral clock enable */
    __HAL_RCC_RTC_ENABLE();
    __HAL_RCC_RTCAPB_CLK_ENABLE();
  }

}

/**
* @brief RTC MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param hrtc: RTC handle pointer
* @retval None
*/
void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc)
{
  if(hrtc->Instance==RTC)
  {
    /* Peripheral clock disable */
    __HAL_RCC_RTC_DISABLE();
    __HAL_RCC_RTCAPB_CLK_DISABLE();
  }

}

/**
* @brief UART MSP Initialization
* This function configures the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(huart->Instance==USART1)
  {

  /** Initializes the peripherals clocks
  */
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
    PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    {
      __asm__("BKPT #1");
    }

    /* Peripheral clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA9 [PA11]     ------> USART1_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_USART1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  }
  else if(huart->Instance==USART2)
  {

    /* Peripheral clock enable */
    __HAL_RCC_USART2_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART2 GPIO Configuration
    PA2     ------> USART2_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF1_USART2;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART2 interrupt Init */
    HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART2_IRQn);
  }

}

/**
* @brief UART MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
  if(huart->Instance==USART1)
  {
    /* Peripheral clock disable */
    __HAL_RCC_USART1_CLK_DISABLE();

    /**USART1 GPIO Configuration
    PA9 [PA11]     ------> USART1_TX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);

    /* USART1 interrupt DeInit */
    HAL_NVIC_DisableIRQ(USART1_IRQn);
  }
  else if(huart->Instance==USART2)
  {
    /* Peripheral clock disable */
    __HAL_RCC_USART2_CLK_DISABLE();

    /**USART2 GPIO Configuration
    PA2     ------> USART2_TX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2);

    /* USART2 interrupt DeInit */
    HAL_NVIC_DisableIRQ(USART2_IRQn);
  }

}




_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Sob Avg 27, 2022 7:33 pm    Naslov sporočila:   Odgovori s citatom

Za OLED imamo dva dela "gonilnika". V prvem so funkcije za nekaj osnovnegrafike, v drugem delu pa definicija fontov.

Kode je kar nekaj, zato prilagam kar cel projekt.



OLED-vaja.zip
 Opis:

Download
 Ime datoteke:  OLED-vaja.zip
 Velikost datoteke:  1.04 MB
 Downloadano:  4 krat


_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Wrecker
Član
Član



Pridružen-a: Pet 11 Feb 2011 22:43
Prispevkov: 250
Aktiv.: 1.56

PrispevekObjavljeno: Pet Sep 02, 2022 9:51 pm    Naslov sporočila:   Odgovori s citatom

Tole je super narejeno in upam, da bo šlo še naprej.

Malo se igram z 20 pinskom stm32g031, pa me zanima, če kdo ve kaj je razlika med uart1 in uart2? Inicializacijo imam narejeno podobno kot v tej temi.

Uart1 mi deluje odlično, uarta2 pa če vse napišem po enekem principu kot pri uart1 ga ne morem nikakor usposobiti. Sploh ne sproži prekinitve. Piše, da je treba nastaviti za uart2 frekvenco APB do max 36 Mhz ->APB prescaler na 2 a tudi to ne pomaga, očitno so še neke razlike ali kak detajl? Prosim za kakšno idejo kaj lahko še naredim.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Pet Sep 02, 2022 10:15 pm    Naslov sporočila:   Odgovori s citatom

Preveri, če so vsi takti vklopljeni pred inicializacijo: gpio port pinov (preveri tudi če je funkcija pinov nastavljena), uart clk enable, irq controller ...
_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
mosqito
Član
Član



Pridružen-a: Čet 07 Apr 2016 23:22
Prispevkov: 3241
Aktiv.: 33.09

PrispevekObjavljeno: Pon Sep 12, 2022 4:03 pm    Naslov sporočila:   Odgovori s citatom

Morda še par besed o hardveru, oz pinih. Sam MCU deluje na napajanju 3,3V. Vedno je treba preveriti datasheet. V sekciji "GPIO pins" je tabela z vsemi funkcijami pinov in tudi podatkom o tem, ali je določen pin "5V tolerant". Če je, to pomeni, da lahko direktno priklopimo periferijo, ki na svojem izhodu generira napetosti do 5V. Seveda sam mcu ne bo generiral 5V, če je pin skonfiguriran kot izhod. Isto velja tudi za alternativne funkcije pinov: npr. na Rx vhodni pin od UART lahko prupeljemo tudi 5V brez vsakega problema, na Tx izhodu pa bosta seveda le nivoja 0V ali 3,3V. Lahko pa pin tudi če ima drugo funkcijo kot GPIO skonfiguriramo kot npr. open drain in damo pullup na 5V. V tem lrimeru bo na izhodu nivo 5V. Paziti pa je seveda treba na parazitne kapacitivnosti, saj preprost pullup ne bo zmogel hitrih prehodov iz 0 na 5V, če bo "videl" kapacitivno breme.

Ravno te dni sem preizkušal max. hitrosti na UART na stm32g0, le da sem dal na izhodu še en NPN transistor, ki je dvignil nivo na 24V. Sam UART v STM32 ima tudi opcijo, da invertira Rx in/ali Tx, tako da na ven se ni nič spremenilo. Brez težav sem dosegel 4Mbaud s komunikacijo z 9 podatkovbimi biti (ja, UART je lahko tudi 9 bitni - data register je sicer 16 bitni, a vzame lahko spodnjih 9). Poleg obračanja polaritete ima možnost tudi zamebjave Rx/Tx in celo invertiranja data bitov (ne na nivoju pina, ampak samo pidatkov - start in stop tako nista invertirana).

Nekatere od teh opcij na seriji L0 niso na voljo....

_________________
Always going the extra mile.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3
Stran 3 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 75 dni


Powered by phpBB © 2001, 2005 phpBB Group