Bu projenin amacı nedir?
Bu bölümde, ARM mikrodenetleyicisi STM32F serisini kullanarak IIM42351 sensörünü başlatacağız. Bu projede daha rahat ve optimum şekilde kullanmak için iki hazır modül GB309A ve Gebra STM32F303 kullanıyoruz. Bu iki modül, Gebra ekibi tarafından çalışmayı kolaylaştırmak için sağlanan IIM42351 sensörünün ve STM32F mikrodenetleyicisinin minimum gerekli öğelerini içerir.
Bu eğitimde neler öğreneceğiz?
Bu eğitimde, IIM42351 sensörünü kurmanın ve kullanmanın yanı sıra, tüm IIM42351 sensör kayıtlarını, SPI protokolünü kullanarak bu sensörü kurmak için STM32 mikrodenetleyicisinin çeşitli parçalarını nasıl ayarlayacağınızı, GB309A modülüne özgü kütüphane ve sürücü dosyasını nasıl kullanacağınızı öğreneceksiniz. Ayrıca, fonksiyonları nasıl bildireceğinizi ve son olarak Keil derleyicisinde sensör verilerini nasıl alacağınızı da öğreneceksiniz.
Bu projeye başlamak için neye ihtiyacımız var?
bu projeyi gerçekleştirmek için bazı donanım ve yazılımlara ihtiyacımız var. Bu donanım ve yazılımların başlıkları aşağıdaki tabloda sizlere sunulmuştur ve her birinin üzerine tıklayarak hazırlayabilir/indirebilir ve başlamaya hazırlanabilirsiniz.
GEREKLİ DONANIM | GEREKLİ YAZILIM |
---|---|
ST-LINK/V2 Programmer | Keil uVision Programmer – (Nasıl kurulur ?) |
STM32 Microcontroller – ( Gebra STM32f303 ) | STM32CubeMX Program – (Nasıl kurulur ?) |
Gebra IIM-42351 İvmeölçer modülü |
SPI protokolü üzerinden haberleşmek için öncelikle kart üzerindeki seçici jumper’lar kullanılarak SPI haberleşme protokolü seçilmeli, ardından aşağıdaki şekilde Gebra STM32F303 modülü üzerinde Pin To Pin olarak yerleştirilmelidir:
Not: Yukarıdaki görselin sadece Gebra IIM42351 modülünün Gebra STM32F303 modülü üzerinde Pin to Pin olarak nasıl yerleştirildiğini göstermek için olduğunu ve kullanıcıların SPI haberleşme protokolünü kullanabilmek için yerleşik seçici jumper’ların doğru durumunu seçmeleri gerektiğini lütfen unutmayın.
Son olarak, Keil derleyicisinin “Debug Session” modundaki “Watch1” penceresinde üç “X, Y, Z” eksenindeki sıcaklık ve ivme değerlerini gerçek zamanlı olarak göreceğiz.
STM32CubeMX ayarları
Aşağıda, Gebra IAM20380 modülünü kurmak için STM32F303 mikrodenetleyicisindeki I2C, RCC, Debug ve Clock bölümlerinin her biriyle ilgili ayarları açıklayacağız.
I2C ayarları
Gebra STM32F303 ile Gebra IIM-42351 I2C aracılığıyla iletişim kurmak için Connectivity->I2C kısmından Standart Mod‘u seçin ve PB8 ve PB9 pinlerini SCL ve SDA olarak seçin
Not: Eğer başka bir mikroişlemci kullanıyorsanız veya i2c için başka pin kullanmak istiyorsanız istediğiniz pine tıklayıp i2c1_scl , i2c1_sda pinleri seçebilirsiniz
RCC / Clock ayarları
Gebra STM32F303‘de harici kristalin (External Crystal) bulunması nedeniyle “RCC” kısmında “Crystal/Ceramic Resonator”i seçiyoruz:
Daha sonra Clock Configuration sayfasından PLLCLK modunu seçiyoruz ve diğer gereklı ayarları yapıyoruz (daha fazla bilgi için tıklayınız)
Debug & Programming ayarları
bu modülde Debug&Programming sırasında pin sayısını azaltmak için “SWCLK” ve “SWDIO” pinleri için “SYS” bloğunda “Debug” kısmından “Serial Wire” seçeneğini seçiyoruz.
Project Manager ayarları
“Project Manager” ayarları aşağıdaki gibidir, burada “MDK-ARM” versiyon “5.32” kullandık. eğer siz kodlamak için başka bir İDE kullanıyorsanız Toolchain seçeneğinden kullandığınız İDE’yi seçmeniz gerekecek
Yukarıdaki tüm ayarları tamamladıktan sonra GENERATE CODE seçeneğine tıklıyoruz.
Source Code
Projenin kütüphanesi (Library)
GebraMS, çeşitli sensör ve entegrelerin modüler tasarımına ek olarak, kullanıcıların yazılım kurma ve geliştirme işlemlerini kolaylaştırmak için C dilinde çeşitli yapılandırılmış ve donanımdan bağımsız kütüphaneler (Library) sağlamaya çalışır. Bu amaçla, kullanıcılar, istedikleri modülün kütüphanesini “.h” ve “.c” dosyasını (Başlık ve Kaynak) olarak indirebilirler.
GebraMS tarafından sağlanan projenin kütüphanesini projenize ekleyerek ( projeye dosya nasıl eklenir ) kodumuzu kolayca geliştirebiliriz. ilgili dosyaları projenin sonunda veya sağ tarafta ilgili sayfalar kısmında bulabilirsiniz
Kütüphanede tanımlanan tüm fonksiyonlar tüm detaylarıyla yorumlanmakta ve fonksiyonların argümanlarında alınan tüm parametreler ve dönüş değerleri kısaca açıklanmaktadır. Kütüphaneler donanımdan bağımsız olduğundan kullanıcı istediği compiler’e kolaylıkla kütüphaneyi ekleyebilir ve istediği mikroişlemci ve geliştirme kartı ile geliştirebilir.
Gebra IIM42351.h başlık dosyası
Gebra IIM42351.h başlık dosyasında, sensörün veya IC’nin veri sayfasına dayanarak, tüm adres kayıtları, her kaydın değerleri “Numaralandırma” biçiminde tanımlanır. Ayrıca, IIM42351 sensörünün kasası ve IIM42351 sensörünün her bir dahili bloğuyla ilgili yapılandırmalar, Gebra_IIM42351 adlı bir “STRUCT” biçiminde tanımlanır. Son olarak, Hata Ayıklama Oturumu ortamında, her blokla ilgili tüm yapılandırmalar gerçek zamanlı olarak görülebilir.
IIM42351_Bank_Sel Enum
The sensor internal registry banks are defined in this enum:
typedef enum bank_sel
{
BANK_0 = 0 ,
BANK_1 ,
BANK_2 ,
BANK_3 ,
BANK_4
}IIM42351_Bank_Sel;
IIM42351_Interface Enum
This enum is used to select the communication protocol with the sensor:
typedef enum interface
{
NOT_SPI = 0 ,
IS_SPI
}IIM42351_Interface;
IIM42351_Soft_Reset_Config Enum
This enum is used for software reset of the sensor:
typedef enum Soft_Reset_Config
{
IIM42351_RESET = 0x01,
IIM42351_NOT_RESET = 0x00,
} IIM42351_Soft_Reset_Config;
IIM42351_PIN9_FUNCTION Enum
This enum is used for pin number 9 function settings are defined in this structure:
typedef enum Pin9_Function
{
INT2 = 0,
FSYNC = 1,
CLKIN = 2
} IIM42351_PIN9_FUNCTION;
IIM42351_Accel_Fs_Sel Enum
This enum is used to set the Full Scale Range of the sensor:
typedef enum accel_fs_sel
{
FS_16g = 0 ,
FS_8g ,
FS_4g ,
FS_2g
}IIM42351_Accel_Fs_Sel;
IIM42351_Accel_Scale_Factor Enum
The Scale Factor values corresponding to Full Scale Range are defined in this enum:
typedef enum Scale_Factor
{
SCALE_FACTOR_2048_LSB_g = 2048 ,
SCALE_FACTOR_4096_LSB_g = 4096 ,
SCALE_FACTOR_8192_LSB_g = 8192 ,
SCALE_FACTOR_16384_LSB_g = 16384
}IIM42351_Accel_Scale_Factor;
IIM42351_Accel_ODR Enum
By Using the values of this enum, the Output Data Rate Sensor value is determined:
typedef enum accel_odr
{
ODR_8KHz = 3,
ODR_4KHz = 4,
ODR_2KHz = 5,
ODR_1KHz = 6,
ODR_200Hz = 7,
ODR_100Hz = 8,
ODR_50Hz = 9,
ODR_25Hz = 10,
ODR_12Hz5 = 11,
ODR_6Hz25 = 12,
ODR_3Hz125 = 13,
ODR_1Hz5625 = 14,
ODR_500Hz = 15
}IIM42351_Accel_ODR;
IIM42351_FIFO_MODE Enum
The FIFO working mode of the sensor is set by using the values of this enum:
typedef enum FIFO_Config
{
BYPASS = 0 ,
STREAM_TO_FIFO ,
STOP_ON_FULL
}IIM42351_FIFO_MODE ;
IIM42351_Ability Enum
The values of this enum are used to activate and deactivate different parts of the sensor:
typedef enum Ability
{
Disable = 0 ,
Enable
}IIM42351_Ability;
IIM42351_Data_Endian Enum
The values of this enum are used to specify the data format in FIFO:
typedef enum
{
LITTLE = 0 ,
BIG
}IIM42351_Data_Endian;
IIM42351_Timestamp_Resolution Enum
To determine the sensor “Time Stamp” resolution, the values of this enum are set:
typedef enum timestamp_resolution
{
_1_uS = 0 ,
_16_uS
} IIM42351_Timestamp_Resolution;
IIM42351_FIFO_Counting Enum
The values of this enum are used to specify how to FIFO count:
typedef enum
{
IN_BYTES = 0 ,
IN_RECORDS
}IIM42351_FIFO_Counting;
IIM42351_UI_Filter_Order Enum
The values of this enum are used to determine the filter used in the sensor:
typedef enum UI_Filter_Order
{
_1_ORDER = 0 ,
_2_ORDER ,
_3_ORDER
}IIM42351_UI_Filter_Order ;
IIM42351_Power_Mode Enum
The values of this enum are used to set the Power Mode of the sensor:
typedef enum Power_Mode
{
IIM42351_LOW_NOISE = 0x03,
IIM42351_LOW_POWER = 0x02,
IIM42351_ACCEL_OFF = 0x01
} IIM42351_Power_Mode;
IIM42351_Low_Noise_Filter_BW Enum
To set the sensor filter in Low Noise mode, the values of this enum are used:
typedef enum
{
LN_FILTER_BW_40 = 0x7 ,
LN_FILTER_BW_20 = 0x6 ,
LN_FILTER_BW_16 = 0x5 ,
LN_FILTER_BW_10 = 0x4 ,
LN_FILTER_BW_8 = 0x3 ,
LN_FILTER_BW_5 = 0x2 ,
LN_FILTER_BW_4 = 0x1 ,
LN_FILTER_BW_2 = 0x0
} IIM42351_Low_Noise_Filter_BW;
IIM42351_ Low_Power_Filter_AVG Enum
The values of this enum are used to determine the filter used in the sensor in Low Power mode:
typedef enum
{
LP_1x_AVG_FILTER = 0x1 ,
LP_16x_AVG_FILTER = 0x6
} IIM42351_Low_Power_Filter_AVG;
IIM42351_Preparation Enum
This enum reflects the status of being ready or not for any data in the sensor:
typedef enum Preparation
{
IS_NOT_Ready = 0 ,
IS_Ready
}IIM42351_Preparation;
IIM42351_Reset_Status Enum
The final status of the sensor software reset is expressed in this enum:
typedef enum Reset_Status
{
FAILED = 0 ,
DONE
}IIM42351_Reset_Status;
GebraBit_IIM42351 structure
All the information and configuration implemented on the sensor are stored in this “structure” and you can see the changes in each part of the sensor in the “Debug Session” environment.
Declaration of functions
At the end of this file, all the functions for reading and writing in IIM42351 registers, sensor configuration , FIFO and receiving data from the sensor are declared:
/********************************************************
*Declare Read&Write IIM42351 Register Values Functions *
********************************************************/
extern uint8_t GB_IIM42351_Read_Reg_Data ( uint8_t regAddr, IIM42351_Bank_Sel regBank, uint8_t* data);
extern uint8_t GB_IIM42351_Read_Reg_Bits (uint8_t regAddr, IIM42351_Bank_Sel regBank, uint8_t start_bit, uint8_t len, uint8_t* data);
extern uint8_t GB_IIM42351_Burst_Read(uint8_t regAddr, IIM42351_Bank_Sel regBank, uint8_t *data, uint16_t byteQuantity);
extern uint8_t GB_IIM42351_Write_Reg_Data(uint8_t regAddr, IIM42351_Bank_Sel regBank, uint8_t data);
extern uint8_t GB_IIM42351_Write_Reg_Bits(uint8_t regAddr, IIM42351_Bank_Sel regBank, uint8_t start_bit, uint8_t len, uint8_t data);
extern uint8_t GB_IIM42351_Burst_Write ( uint8_t regAddr, IIM42351_Bank_Sel regBank, uint8_t *data, uint16_t byteQuantity);
/********************************************************
* Declare IIM42351 Configuration Functions *
********************************************************/
extern void GB_IIM42351_Bank_Selection( IIM42351_Bank_Sel bsel);
extern void GB_IIM42351_Who_am_I(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Select_SPI4_Interface( IIM42351_Interface spisel);
extern void GB_IIM42351_Select_PIN9_Function( IIM42351_PIN9_FUNCTION pin9f);
extern void GB_IIM42351_DISABLE_FSYNC ( IIM42351_Ability able ) ;
extern void GB_IIM42351_DISABLE_RTC_Mode ( void ) ;
extern void GB_IIM42351_SET_Time_Stamp_Register(IIM42351_Ability ability);
extern void GB_IIM42351_Set_Timestamp_Resolution ( IIM42351_Timestamp_Resolution res ) ;
extern void GB_IIM42351_SET_INT_ASYNC_RESET_ZERO(void );
/********************************************************
* Declare IIM42351 FIFO Functions *
********************************************************/
extern void GB_IIM42351_Set_FIFO_MODE ( IIM42351_FIFO_MODE mode ) ;
extern void GB_IIM42351_SET_FIFO_Count ( IIM42351_FIFO_Counting counting , IIM42351_Data_Endian endian ) ;
extern void GB_IIM42351_SET_AllPackets_To_FIFO( IIM42351_Ability allpack);
extern void GB_IIM42351_SET_FIFO_WATERMARK (IIM42351_Ability watermark , uint16_t wm );
extern void GB_IIM42351_SET_FIFO_Decimation_Factor (uint8_t factor );
extern void GB_IIM42351_FIFO_Configuration ( GebraBit_IIM42351 * iim42351 ) ;
extern void GB_IIM42351_SET_FIFO_High_Resolution( IIM42351_Ability highres);
/********************************************************
* Declare IIM42351 ACCEL Functions *
********************************************************/
extern void GB_IIM42351_Set_ACCEL_FS ( GebraBit_IIM42351 * iim42351 , IIM42351_Accel_Fs_Sel fs ) ;
extern void GB_IIM42351_Set_ACCEL_ODR ( IIM42351_Accel_ODR odr ) ;
extern void GB_IIM42351_UI_Filter_Order ( IIM42351_UI_Filter_Order order ) ;
extern void GB_IIM42351_ACCEL_LN_Filter_Configuration( IIM42351_Low_Noise_Filter_BW filter);
extern void GB_IIM42351_ACCEL_LP_Filter_Configuration( IIM42351_Low_Power_Filter_AVG filter);
extern void GB_IIM42351_Set_Power_Management(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_SET_Data_Ready_Interrupt(IIM42351_Ability ability);
extern IIM42351_Preparation GB_IIM42351_Check_Data_Preparation(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_Sensor_Data_Endian ( IIM42351_Data_Endian * data_end ) ;
/********************************************************
* Declare IIM42351 DATA Functions *
********************************************************/
extern void GB_IIM42351_Get_Temp_Register_Raw_Data(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_Temp_Register_Valid_Data(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_ACCEL_DATA_X_Register_Raw(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_ACCEL_DATA_Y_Register_Raw(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_ACCEL_DATA_Z_Register_Raw(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_ACCEL_DATA_X_Register_Valid_Data(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_ACCEL_DATA_Y_Register_Valid_Data(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_ACCEL_DATA_Z_Register_Valid_Data(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_Temperature(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_XYZ_ACCELERATION(GebraBit_IIM42351 * iim42351);
extern void GB_IIM42351_Get_Data(GebraBit_IIM42351 * iim42351);
/********************************************************
* Declare IIM42351 HIGH LEVEL Functions *
********************************************************/
extern void GB_IIM42351_Format_Data_Base_On_Endian(GebraBit_IIM42351 * iim42351, const uint8_t *datain, uint16_t *dataout);
extern void GB_IIM42351_Soft_Reset ( GebraBit_IIM42351 * iim42351 );
extern void GB_IIM42351_initialize( GebraBit_IIM42351 * iim42351 );
extern void GB_IIM42351_Configuration(GebraBit_IIM42351 * iim42351);
Gebra_IIM42351.c kaynak dosyası
Gebra_IIM42351.c kaynak dosyası C dilinde yazılmıştır ve tüm fonksiyonlar tüm ayrıntılarıyla yorumlanmıştır ve fonksiyonların argümanlarında alınan tüm parametreler ve bunların dönüş değerleri açıkça açıklanmıştır, bu nedenle bu açıklamalarla sınırlıyız ve kullanıcıları daha fazla bilgi için doğrudan bu dosyayı incelemeye davet ediyoruz.
Keil’deki örnek program
STM32CubeMX kullanarak Keil projesini yaptıktan ve Gebra’in sağladığı Gebra_IIM42351.c kütüphanesini ekledikten sonra, örnek eğitim programının ana kısmı olan main.c dosyasını inceleyeceğiz ve Keil programının Debugging ortamının watch kısmında Gebra IIM42351 modülünün çıktısını göreceğiz.
“main.c” dosyasının açıklaması
“main.c” dosyasının başlangıç kısmına dikkatlice bakarsanız, Gebra IIM42351 modülü tarafından gerekli olan yapılara ve işlevlere erişmek için “Gebra_IIM42351.h” başlığının eklendiğini fark edeceksiniz. Bir sonraki kısımda, Gebra_IIM42351 yapı tipinin IIM42351_Module adlı bir değişkeni (bu yapı Gebra_IIM42351 başlığındadır ve Gebra_IIM42351 kütüphane açıklama bölümünde açıklanmıştır) Gebra IIM42351 modülünün yapılandırması için tanımlanmıştır:
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
GebraBit_IIM42351 IIM42351_Module;
/* USER CODE END PTD */
Yazılı kodun bir sonraki bölümünde, Gebra IIM42351 modülünün yapılandırması ve ayarları “IIM42351_Module” yapısı kullanılarak yapılır. Son olarak, Gebra IIM42351 modülü, GB_IIM42351_initialize() ve GB_IIM42351_Configuration() fonksiyonlarının argümanlarına IIM42351_Module yapısına başvurularak yapılandırılır:
GB_IIM42351_initialize( &IIM42351_Module );
GB_IIM42351_Configuration(&IIM42351_Module);
Son olarak programın “while” kısmında Gebra IIM42351 modül sıcaklığı ve 3 eksenin (X, Y, Z) değerleri sürekli olarak alınır:
GB_IIM42351_Get_Data( &IIM42351_Module )
“main.c” dosyasının kod metni:
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
//#include "i2c.h"
#include "spi.h"
#include "gpio.h"
#include "GebraBit_IIM42351.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
GebraBit_IIM42351 IIM42351_Module;
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
IIM42351_Module.Bank_Sel = BANK_0 ;
IIM42351_Module.INT_ASYNC_RESET = 0 ;
IIM42351_Module.Interface = IS_SPI ;
IIM42351_Module.Pin9_Function = FSYNC ;
IIM42351_Module.FSYNC = Disable;
IIM42351_Module.RTC_Mode = Disable ;
IIM42351_Module.ACCEL_FS_SEL = FS_4g ;
IIM42351_Module.ACCEL_ODR = ODR_1KHz ;
IIM42351_Module.UI_FILTER_ORDER = _2_ORDER ;
IIM42351_Module.Power_Mode = IIM42351_LOW_NOISE ;
IIM42351_Module.LN_Filter_BW = LN_FILTER_BW_4 ;
IIM42351_Module.Data_Ready_INT = Enable ;
//IIM42351_Module.SENSOR_DATA_ENDIAN = BIG ;
IIM42351_Module.FIFO_STREAM = Disable ;
IIM42351_Module.FIFO_MODE = BYPASS ;
IIM42351_Module.AllPackets_To_FIFO = Disable ;
IIM42351_Module.FIFO_WATERMARK = Disable ;
//IIM42351_Module.VALID_ACCEL_DATA_Z = 0.0f ;
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
//MX_I2C1_Init();
MX_SPI1_Init();
GB_IIM42351_initialize( &IIM42351_Module );
GB_IIM42351_Configuration(&IIM42351_Module);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
GB_IIM42351_Get_Data( &IIM42351_Module ) ;
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
STLINK V2
STM32CubeMX kullanarak Keil projesini oluşturup kütüphaneyi ekledikten sonra STLINKV2 adaptörünü kullanarak STLINK V2 programlayıcıyı Gebra STM32F303‘e bağlıyoruz.
STLINK V2 programlayıcısını Gebra STM32F303’e bağladığınızda, modüle güç vermeye gerek kalmaz çünkü besleme voltajını doğrudan STLINK V2 programlayıcısından alacak.
Sonra Build (F7) a tıklayıp Build Output penceresin olası hatalar için kontrol ediyoruz.
Son olarak “Debug” moduna girip “IIM42351_Module” ü “watch” penceresine ekleyip programı çalıştırdığımızda 3 eksende (X, Y, Z) sıcaklık değişimlerini ve Gebra IIM42351 modül değerlerinin değişimini görebiliriz: