diff --git a/Development Resources/TS100/TS100.ioc b/Development Resources/TS100/TS100.ioc index e2eeaf5f..837f5914 100644 --- a/Development Resources/TS100/TS100.ioc +++ b/Development Resources/TS100/TS100.ioc @@ -50,7 +50,7 @@ Dma.I2C1_RX.0.MemInc=DMA_MINC_ENABLE Dma.I2C1_RX.0.Mode=DMA_NORMAL Dma.I2C1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.I2C1_RX.0.PeriphInc=DMA_PINC_DISABLE -Dma.I2C1_RX.0.Priority=DMA_PRIORITY_LOW +Dma.I2C1_RX.0.Priority=DMA_PRIORITY_MEDIUM Dma.I2C1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.I2C1_TX.1.Direction=DMA_MEMORY_TO_PERIPH Dma.I2C1_TX.1.Instance=DMA1_Channel6 @@ -59,7 +59,7 @@ Dma.I2C1_TX.1.MemInc=DMA_MINC_ENABLE Dma.I2C1_TX.1.Mode=DMA_NORMAL Dma.I2C1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.I2C1_TX.1.PeriphInc=DMA_PINC_DISABLE -Dma.I2C1_TX.1.Priority=DMA_PRIORITY_LOW +Dma.I2C1_TX.1.Priority=DMA_PRIORITY_MEDIUM Dma.I2C1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority Dma.Request0=I2C1_RX Dma.Request1=I2C1_TX @@ -74,8 +74,9 @@ FREERTOS.configMINIMAL_STACK_SIZE=256 FREERTOS.configTICK_RATE_HZ=100 FREERTOS.configTOTAL_HEAP_SIZE=10240 File.Version=6 +I2C1.DutyCycle=I2C_DUTYCYCLE_2 I2C1.I2C_Mode=I2C_Fast -I2C1.IPParameters=I2C_Mode +I2C1.IPParameters=I2C_Mode,DutyCycle IWDG.IPParameters=Prescaler IWDG.Prescaler=IWDG_PRESCALER_256 KeepUserPlacement=false @@ -111,27 +112,30 @@ Mcu.Pin7=PA14 Mcu.Pin8=PB3 Mcu.Pin9=PB4 Mcu.PinsNb=18 +Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103T8Ux -MxCube.Version=4.22.0 -MxDb.Version=DB.4.0.220 -NVIC.ADC1_2_IRQn=true\:5\:0\:false\:false\:true\:true -NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true -NVIC.DMA1_Channel6_IRQn=true\:5\:0\:false\:false\:true\:true -NVIC.DMA1_Channel7_IRQn=true\:5\:0\:false\:false\:true\:true -NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false -NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true +MxCube.Version=4.25.0 +MxDb.Version=DB.4.0.250 +NVIC.ADC1_2_IRQn=true\:5\:0\:false\:false\:true\:true\:true +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true\:true +NVIC.DMA1_Channel6_IRQn=true\:5\:0\:false\:false\:true\:true\:true +NVIC.DMA1_Channel7_IRQn=true\:5\:0\:false\:false\:true\:true\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.I2C1_ER_IRQn=true\:5\:0\:false\:false\:true\:true\:true +NVIC.I2C1_EV_IRQn=true\:5\:0\:false\:false\:true\:true\:true +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.PendSV_IRQn=true\:15\:0\:false\:false\:false\:true\:true NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 -NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false -NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true -NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:false\:false\:true +NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:true\:true +NVIC.TIM1_UP_IRQn=true\:0\:0\:false\:false\:true\:false\:true NVIC.TimeBase=TIM1_UP_IRQn NVIC.TimeBaseIP=TIM1 -NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:true PA13.Locked=true PA13.Mode=Serial_Wire PA13.Signal=SYS_JTMS-SWDIO @@ -193,29 +197,30 @@ PCC.Vdd=3.3 PinOutPanel.RotationAngle=0 ProjectManager.AskForMigrate=true ProjectManager.BackupPrevious=false -ProjectManager.CompilerOptimize=2 +ProjectManager.CompilerOptimize=3 ProjectManager.ComputerToolchain=false ProjectManager.CoupleFile=false -ProjectManager.CustomerFirmwarePackage=C\:/Users/Ben V. Brown/STM32Cube/Repository/STM32Cube_FW_F1_V1.6.0 +ProjectManager.CustomerFirmwarePackage=C\:/Users/Ralim/STM32Cube/Repository/STM32Cube_FW_F1_V1.6.1 ProjectManager.DefaultFWLocation=true ProjectManager.DeletePrevious=true ProjectManager.DeviceId=STM32F103T8Ux -ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.6.0 +ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.6.1 ProjectManager.FreePins=true ProjectManager.HalAssertFull=false ProjectManager.HeapSize=0x200 ProjectManager.KeepUserCode=true ProjectManager.LastFirmware=true ProjectManager.LibraryCopy=1 +ProjectManager.MainLocation=Src ProjectManager.PreviousToolchain=SW4STM32 ProjectManager.ProjectBuild=false ProjectManager.ProjectFileName=TS100.ioc ProjectManager.ProjectName=TS100 ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=SW4STM32 -ProjectManager.ToolChainLocation=C\:\\Users\\Ralim\\Repo\\ts100\\TS100 +ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL,2-MX_DMA_Init-DMA-false-HAL,3-MX_I2C1_Init-I2C1-false-HAL,4-MX_ADC1_Init-ADC1-false-HAL,5-SystemClock_Config-RCC-false-HAL,6-MX_TIM3_Init-TIM3-false-HAL,7-MX_IWDG_Init-IWDG-false-HAL +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-MX_I2C1_Init-I2C1-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-SystemClock_Config-RCC-false-HAL-true,6-MX_TIM3_Init-TIM3-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true RCC.ADCFreqValue=8000000 RCC.ADCPresc=RCC_ADCPCLK2_DIV8 RCC.AHBFreq_Value=64000000 diff --git a/workspace/TS100/inc/FRToSI2C.hpp b/workspace/TS100/inc/FRToSI2C.hpp new file mode 100644 index 00000000..e0a19f1d --- /dev/null +++ b/workspace/TS100/inc/FRToSI2C.hpp @@ -0,0 +1,32 @@ +/* + * FRToSI2C.hpp + * + * Created on: 14Apr.,2018 + * Author: Ralim + */ + +#ifndef FRTOSI2C_HPP_ +#define FRTOSI2C_HPP_ +#include "stm32f1xx_hal.h" +#include "cmsis_os.h" + +class FRToSI2C { +public: + FRToSI2C(I2C_HandleTypeDef* i2chandle); + void MasterTxCpltCallback(); //Normal Tx Callback + void MemRxCpltCallback(); //Callback from memory read cycles + void MemTxCpltCallback(); //Callback from memory write cycles + + void Mem_Read(uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, + uint8_t *pData, uint16_t Size); + void Mem_Write(uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, + uint8_t *pData, uint16_t Size); + + void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size); + + +private: + I2C_HandleTypeDef* i2c; +}; + +#endif /* FRTOSI2C_HPP_ */ diff --git a/workspace/TS100/inc/LIS2DH12.hpp b/workspace/TS100/inc/LIS2DH12.hpp index c23e0712..243803d5 100644 --- a/workspace/TS100/inc/LIS2DH12.hpp +++ b/workspace/TS100/inc/LIS2DH12.hpp @@ -8,10 +8,11 @@ #ifndef LIS2DH12_HPP_ #define LIS2DH12_HPP_ #include "stm32f1xx_hal.h" +#include "FRToSI2C.hpp" #include "LIS2DH12_defines.hpp" class LIS2DH12 { public: - LIS2DH12(I2C_HandleTypeDef* i2cHandle); + LIS2DH12(FRToSI2C* i2cHandle); void initalize(); uint8_t getOrientation(); void getAxisReadings(int16_t *x, int16_t *y, int16_t *z); @@ -21,7 +22,7 @@ private: void I2C_RegisterWrite(uint8_t reg, uint8_t data); uint8_t I2C_RegisterRead(uint8_t reg); - I2C_HandleTypeDef* i2c; + FRToSI2C* i2c; }; #endif /* LIS2DH12_HPP_ */ diff --git a/workspace/TS100/inc/MMA8652FC.hpp b/workspace/TS100/inc/MMA8652FC.hpp index 271ff686..bbd778c2 100644 --- a/workspace/TS100/inc/MMA8652FC.hpp +++ b/workspace/TS100/inc/MMA8652FC.hpp @@ -9,11 +9,12 @@ #define MMA8652FC_HPP_ #include "stm32f1xx_hal.h" #include "MMA8652FC_defines.h" +#include "FRToSI2C.hpp" class MMA8652FC { public: - MMA8652FC(I2C_HandleTypeDef* i2cHandle); + MMA8652FC(FRToSI2C* i2cHandle); void initalize(); // Initalize the system uint8_t getOrientation();// Reads the I2C register and returns the orientation (true == left) void getAxisReadings(int16_t *x, int16_t *y, int16_t *z); @@ -23,7 +24,7 @@ private: void I2C_RegisterWrite(uint8_t reg, uint8_t data); uint8_t I2C_RegisterRead(uint8_t reg); - I2C_HandleTypeDef* i2c; + FRToSI2C* i2c; }; diff --git a/workspace/TS100/inc/OLED.hpp b/workspace/TS100/inc/OLED.hpp index 003607fc..b52c3c95 100644 --- a/workspace/TS100/inc/OLED.hpp +++ b/workspace/TS100/inc/OLED.hpp @@ -12,6 +12,7 @@ #include #include "stm32f1xx_hal.h" #include +#include "FRToSI2C.hpp" #include "Font.h" #ifdef __cplusplus extern "C" { @@ -25,7 +26,7 @@ extern "C" { class OLED { public: - OLED(I2C_HandleTypeDef* i2cHandle); // Initialize Driver and store I2C pointer + OLED(FRToSI2C* i2cHandle); // Initialize Driver and store I2C pointer void initialize(); // Startup the I2C coms (brings screen out of reset etc) void refresh(); // Draw the buffer out to the LCD using the DMA Channel void drawChar(char c, char preCursorCommand = '\0');// Draw a character to a specific location @@ -50,7 +51,7 @@ private: //Draw a buffer to the screen buffer - I2C_HandleTypeDef* i2c; //i2c Pointer + FRToSI2C* i2c; //i2c Pointer const uint8_t* currentFont; // Pointer to the current font used for rendering to the buffer uint8_t screenBuffer[12 + 96 + 96 + 10]; // The data buffer uint8_t* firstStripPtr; // Pointers to the strips to allow for buffer having extra content diff --git a/workspace/TS100/inc/Setup.h b/workspace/TS100/inc/Setup.h index 1b2fe516..1e1e7c99 100644 --- a/workspace/TS100/inc/Setup.h +++ b/workspace/TS100/inc/Setup.h @@ -17,9 +17,10 @@ extern "C" { extern ADC_HandleTypeDef hadc1; extern DMA_HandleTypeDef hdma_adc1; +extern DMA_HandleTypeDef hdma_i2c1_rx; +extern DMA_HandleTypeDef hdma_i2c1_tx; extern I2C_HandleTypeDef hi2c1; - extern IWDG_HandleTypeDef hiwdg; extern TIM_HandleTypeDef htim2; diff --git a/workspace/TS100/src/FRToSI2C.cpp b/workspace/TS100/src/FRToSI2C.cpp new file mode 100644 index 00000000..061270f5 --- /dev/null +++ b/workspace/TS100/src/FRToSI2C.cpp @@ -0,0 +1,50 @@ +/* + * FRToSI2C.cpp + * + * Created on: 14Apr.,2018 + * Author: Ralim + */ + +#include "FRToSI2C.hpp" + +FRToSI2C::FRToSI2C(I2C_HandleTypeDef* i2chandle) { + i2c = i2chandle; + +} + +void FRToSI2C::MasterTxCpltCallback() { + +} + +void FRToSI2C::MemRxCpltCallback() { +} +void FRToSI2C::MemTxCpltCallback() { +} + +void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress, + uint16_t MemAddSize, uint8_t* pData, uint16_t Size) { + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + taskENTER_CRITICAL(); + HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, + 5000); + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + taskEXIT_CRITICAL(); +} + +void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress, + uint16_t MemAddSize, uint8_t* pData, uint16_t Size) { + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + taskENTER_CRITICAL(); + HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData, Size, + 5000); + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + taskEXIT_CRITICAL(); +} + +void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) { + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + taskENTER_CRITICAL(); + HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000); + if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) + taskEXIT_CRITICAL(); +} diff --git a/workspace/TS100/src/LIS2DH12.cpp b/workspace/TS100/src/LIS2DH12.cpp index be793bd6..c0b6b822 100644 --- a/workspace/TS100/src/LIS2DH12.cpp +++ b/workspace/TS100/src/LIS2DH12.cpp @@ -7,7 +7,7 @@ #include #include "cmsis_os.h" -LIS2DH12::LIS2DH12(I2C_HandleTypeDef* i2cHandle) { +LIS2DH12::LIS2DH12(FRToSI2C* i2cHandle) { i2c = i2cHandle; } @@ -33,9 +33,7 @@ void LIS2DH12::initalize() { uint8_t LIS2DH12::getOrientation() { // 8=right handed,4=left,16=flat //So we ignore if not 8/4 - taskENTER_CRITICAL(); uint8_t pos = I2C_RegisterRead(LIS_INT2_SRC); - taskEXIT_CRITICAL(); if (pos == 8) return 1; else if (pos == 4) @@ -46,12 +44,9 @@ uint8_t LIS2DH12::getOrientation() { void LIS2DH12::getAxisReadings(int16_t* x, int16_t* y, int16_t* z) { uint8_t tempArr[6]; - taskENTER_CRITICAL(); - while (HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, 0xA8, - I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6, 5000) != HAL_OK) { - HAL_Delay(5); - } - taskEXIT_CRITICAL(); + i2c->Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8, I2C_MEMADD_SIZE_8BIT, + (uint8_t*) tempArr, 6); + (*x) = ((uint16_t) (tempArr[1] << 8 | tempArr[0])); (*y) = ((uint16_t) (tempArr[3] << 8 | tempArr[2])); (*z) = ((uint16_t) (tempArr[5] << 8 | tempArr[4])); @@ -61,13 +56,12 @@ void LIS2DH12::setSensitivity(uint8_t threshold, uint8_t filterTime) { } void LIS2DH12::I2C_RegisterWrite(uint8_t reg, uint8_t data) { - HAL_I2C_Mem_Write(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, - 1, 500); + i2c->Mem_Write(LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1); + } uint8_t LIS2DH12::I2C_RegisterRead(uint8_t reg) { uint8_t tx_data[1]; - HAL_I2C_Mem_Read(i2c, LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, - tx_data, 1, 500); + i2c->Mem_Read( LIS2DH_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, tx_data, 1); return tx_data[0]; } diff --git a/workspace/TS100/src/MMA8652FC.cpp b/workspace/TS100/src/MMA8652FC.cpp index 4e1b6d56..37e1faf4 100644 --- a/workspace/TS100/src/MMA8652FC.cpp +++ b/workspace/TS100/src/MMA8652FC.cpp @@ -8,20 +8,18 @@ #include #include "cmsis_os.h" -MMA8652FC::MMA8652FC(I2C_HandleTypeDef* i2cHandle) { +MMA8652FC::MMA8652FC(FRToSI2C* i2cHandle) { i2c = i2cHandle; } void MMA8652FC::I2C_RegisterWrite(uint8_t reg, uint8_t data) { - - HAL_I2C_Mem_Write(i2c, MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, - &data, 1, 500); + i2c->Mem_Write( MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1); } uint8_t MMA8652FC::I2C_RegisterRead(uint8_t reg) { uint8_t tx_data[1]; - HAL_I2C_Mem_Read(i2c, MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, - tx_data, 1, 500); + i2c->Mem_Read( MMA8652FC_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, tx_data, + 1); return tx_data[0]; } @@ -43,44 +41,35 @@ void MMA8652FC::initalize() { I2C_RegisterWrite( HP_FILTER_CUTOFF_REG, 0x03); //select high pass filtered data I2C_RegisterWrite( CTRL_REG1, 0x19); // ODR=12 Hz, Active mode - HAL_Delay(2); // ~1ms delay } void MMA8652FC::setSensitivity(uint8_t threshold, uint8_t filterTime) { uint8_t sens = 9 * 2 + 17; sens -= 2 * threshold; - taskENTER_CRITICAL(); I2C_RegisterWrite( CTRL_REG1, 0); // sleep mode I2C_RegisterWrite(FF_MT_THS_REG, (sens & 0x7F));// Set accumulation threshold I2C_RegisterWrite(FF_MT_COUNT_REG, filterTime); // Set debounce threshold I2C_RegisterWrite( CTRL_REG1, 0x31); // ODR=12 Hz, Active mode - taskEXIT_CRITICAL(); } uint8_t MMA8652FC::getOrientation() { //First read the PL_STATUS register - taskENTER_CRITICAL(); uint8_t plStatus = I2C_RegisterRead(PL_STATUS_REG); - taskEXIT_CRITICAL(); if ((plStatus & 0b10000000) == 0b10000000) { plStatus >>= 1; //We don't need the up/down bit plStatus &= 0x03; //mask to the two lower bits //0 == left handed //1 == right handed - return plStatus==0?2:1; + return plStatus == 0 ? 2 : 1; } else return 0; } void MMA8652FC::getAxisReadings(int16_t *x, int16_t *y, int16_t *z) { uint8_t tempArr[6]; - taskENTER_CRITICAL(); - while (HAL_I2C_Mem_Read(i2c, MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, - I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6, 0xFFFF) != HAL_OK) { - HAL_Delay(5); - } - taskEXIT_CRITICAL(); + i2c->Mem_Read( MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG,I2C_MEMADD_SIZE_8BIT, (uint8_t*) tempArr, 6); + (*x) = tempArr[0] << 8 | tempArr[1]; (*y) = tempArr[2] << 8 | tempArr[3]; (*z) = tempArr[4] << 8 | tempArr[5]; diff --git a/workspace/TS100/src/OLED.cpp b/workspace/TS100/src/OLED.cpp index 2c874ef3..08381c26 100644 --- a/workspace/TS100/src/OLED.cpp +++ b/workspace/TS100/src/OLED.cpp @@ -43,7 +43,7 @@ uint8_t OLED_Setup_Array[] = { /**/ }; //Setup based on the SSD1307 and modified for the SSD1306 -OLED::OLED(I2C_HandleTypeDef* i2cHandle) { +OLED::OLED(FRToSI2C* i2cHandle) { i2c = i2cHandle; cursor_x = cursor_y = 0; currentFont = FONT_12; @@ -63,8 +63,7 @@ void OLED::initialize() { HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET); HAL_Delay(5); //Send the setup settings - HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, - configLength, 0xFFFF); + i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, configLength); //displayOnOff(true); } @@ -86,12 +85,8 @@ void OLED::refresh() { screenBuffer[11] = 0x01; screenBuffer[12] = 0x40; //start of data marker - taskENTER_CRITICAL(); - //Because I2C is shared, we cant task switch in the middle of the xfer - HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED, screenBuffer, 12 + 96 * 2 + 1, - 500); - taskEXIT_CRITICAL(); + i2c->Transmit( DEVICEADDR_OLED, screenBuffer, 12 + 96 * 2 + 1); } @@ -101,10 +96,9 @@ void OLED::refresh() { * Precursor is the command char that is used to select the table. */ void OLED::drawChar(char c, char PrecursorCommand) { - if( c=='\n' && cursor_y==0) - { - cursor_x=0; - cursor_y=8; + if (c == '\n' && cursor_y == 0) { + cursor_x = 0; + cursor_y = 8; } if (c < ' ') { return; @@ -128,10 +122,10 @@ void OLED::drawChar(char c, char PrecursorCommand) { index = (128) + (c); break; #if defined(LANG_RU) || defined(LANG_UK) || defined(LANG_SR) || defined(LANG_BG) || defined(LANG_MK) - case 0xD0: + case 0xD0: index = (192) + (c); break; - case 0xD1: + case 0xD1: index = (256) + (c); break; #else @@ -165,8 +159,7 @@ void OLED::displayOnOff(bool on) { data[5] = 0xAE; } taskENTER_CRITICAL(); - - HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED, data, 6, 0xFFFF); + i2c->Transmit( DEVICEADDR_OLED, data, 6); taskEXIT_CRITICAL(); displayOnOffState = on; } @@ -184,8 +177,7 @@ void OLED::setRotation(bool leftHanded) { } taskENTER_CRITICAL(); - HAL_I2C_Master_Transmit(i2c, DEVICEADDR_OLED, - (uint8_t*) OLED_Setup_Array, 50, 0xFFFF); + i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, 50); taskEXIT_CRITICAL(); inLeftHandedMode = leftHanded; } @@ -300,11 +292,11 @@ void OLED::drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height, uint8_t visibleEnd = wide; // trimming to draw partials - if(x < 0) { - visibleStart -= x; //subtract negative value == add absolute value + if (x < 0) { + visibleStart -= x; //subtract negative value == add absolute value } - if(x + wide > 96) { - visibleEnd = 96 - x; + if (x + wide > 96) { + visibleEnd = 96 - x; } if (y == 0) { diff --git a/workspace/TS100/src/Setup.c b/workspace/TS100/src/Setup.c index d3ab5c9d..b1cb0036 100644 --- a/workspace/TS100/src/Setup.c +++ b/workspace/TS100/src/Setup.c @@ -9,6 +9,8 @@ ADC_HandleTypeDef hadc1; DMA_HandleTypeDef hdma_adc1; I2C_HandleTypeDef hi2c1; +DMA_HandleTypeDef hdma_i2c1_rx; +DMA_HandleTypeDef hdma_i2c1_tx; IWDG_HandleTypeDef hiwdg; TIM_HandleTypeDef htim2; diff --git a/workspace/TS100/src/main.cpp b/workspace/TS100/src/main.cpp index 5b3fa094..8bc0cf91 100644 --- a/workspace/TS100/src/main.cpp +++ b/workspace/TS100/src/main.cpp @@ -10,12 +10,14 @@ #include "string.h" #include "LIS2DH12.hpp" #include +#include "FRToSI2C.hpp" #define ACCELDEBUG 0 // C++ objects -OLED lcd(&hi2c1); -MMA8652FC accel(&hi2c1); -LIS2DH12 accel2(&hi2c1); +FRToSI2C i2cDev(&hi2c1); +OLED lcd(&i2cDev); +MMA8652FC accel(&i2cDev); +LIS2DH12 accel2(&i2cDev); uint8_t PCBVersion = 0; // File local variables uint16_t currentlyActiveTemperatureTarget = 0; @@ -620,6 +622,7 @@ static void gui_solderingMode() { // Undervoltage test if (checkVoltageForExit()) { + lastButtonTime = xTaskGetTickCount(); return; } @@ -628,6 +631,7 @@ static void gui_solderingMode() { if (xTaskGetTickCount() - lastMovementTime > sleepThres && xTaskGetTickCount() - lastButtonTime > sleepThres) { if (gui_SolderingSleepingMode()) { + lastButtonTime = xTaskGetTickCount(); return; // If the function returns non-0 then exit } } diff --git a/workspace/TS100/src/stm32f1xx_hal_msp.c b/workspace/TS100/src/stm32f1xx_hal_msp.c index bf10730f..c6312397 100644 --- a/workspace/TS100/src/stm32f1xx_hal_msp.c +++ b/workspace/TS100/src/stm32f1xx_hal_msp.c @@ -28,10 +28,10 @@ void HAL_MspInit(void) { /**NOJTAG: JTAG-DP Disabled and SW-DP Enabled */ - __HAL_AFIO_REMAP_SWJ_NOJTAG(); + __HAL_AFIO_REMAP_SWJ_NOJTAG() + ; // __HAL_AFIO_REMAP_SWJ_DISABLE(); /*Disable swd for debug io use*/ - } void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { @@ -77,22 +77,51 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; - if (hi2c->Instance == I2C1) { - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_PULLUP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /* Peripheral clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE() - ; + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE() + ; + /* I2C1 DMA Init */ + /* I2C1_RX Init */ + hdma_i2c1_rx.Instance = DMA1_Channel7; + hdma_i2c1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_i2c1_rx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_i2c1_rx.Init.MemInc = DMA_MINC_ENABLE; + hdma_i2c1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_i2c1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_i2c1_rx.Init.Mode = DMA_NORMAL; + hdma_i2c1_rx.Init.Priority = DMA_PRIORITY_MEDIUM; + HAL_DMA_Init(&hdma_i2c1_rx); - } + __HAL_LINKDMA(hi2c, hdmarx, hdma_i2c1_rx); + + /* I2C1_TX Init */ + hdma_i2c1_tx.Instance = DMA1_Channel6; + hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE; + hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma_i2c1_tx.Init.Mode = DMA_NORMAL; + hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_MEDIUM; + HAL_DMA_Init(&hdma_i2c1_tx); + + __HAL_LINKDMA(hi2c, hdmatx, hdma_i2c1_tx); + + /* I2C1 interrupt Init */ + HAL_NVIC_SetPriority(I2C1_EV_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(I2C1_EV_IRQn); + HAL_NVIC_SetPriority(I2C1_ER_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(I2C1_ER_IRQn); } diff --git a/workspace/TS100/src/stm32f1xx_it.c b/workspace/TS100/src/stm32f1xx_it.c index 68c4658e..2176e182 100644 --- a/workspace/TS100/src/stm32f1xx_it.c +++ b/workspace/TS100/src/stm32f1xx_it.c @@ -7,6 +7,7 @@ extern TIM_HandleTypeDef htim1; //used for the systick + /******************************************************************************/ /* Cortex-M3 Processor Interruption and Exception Handlers */ /******************************************************************************/ @@ -55,6 +56,7 @@ void DMA1_Channel1_IRQHandler(void) { HAL_DMA_IRQHandler(&hdma_adc1); } + //ADC interrupt used for DMA void ADC1_2_IRQHandler(void) { HAL_ADC_IRQHandler(&hadc1); @@ -82,5 +84,21 @@ void EXTI3_IRQHandler(void) { //EXTI 5 is triggered via the accelerometer on movement void EXTI9_5_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5); - +} + +void I2C1_EV_IRQHandler(void) { + HAL_I2C_EV_IRQHandler(&hi2c1); +} +void I2C1_ER_IRQHandler(void) { + HAL_I2C_ER_IRQHandler(&hi2c1); +} + +void DMA1_Channel6_IRQHandler(void) +{ + HAL_DMA_IRQHandler(&hdma_i2c1_tx); +} + +void DMA1_Channel7_IRQHandler(void) +{ + HAL_DMA_IRQHandler(&hdma_i2c1_rx); }