Merge pull request #634 from Ralim/feat/BSP
Feature: Move board dependant code to be separate
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
FROM ubuntu:rolling
|
FROM ubuntu:20.04
|
||||||
LABEL maintainer="Ben V. Brown <ralim@ralimtek.com>"
|
LABEL maintainer="Ben V. Brown <ralim@ralimtek.com>"
|
||||||
|
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
|
|||||||
55
workspace/TS100/Core/BSP/BSP.h
Normal file
55
workspace/TS100/Core/BSP/BSP.h
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
#include "BSP_Flash.h"
|
||||||
|
#include "BSP_Power.h"
|
||||||
|
#include "BSP_QC.h"
|
||||||
|
#include "Defines.h"
|
||||||
|
#include "UnitSettings.h"
|
||||||
|
#include "stdint.h"
|
||||||
|
/*
|
||||||
|
* BSP.h -- Board Support
|
||||||
|
*
|
||||||
|
* This exposes functions that are expected to be implemented to add support for different hardware
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BSP_BSP_H_
|
||||||
|
#define BSP_BSP_H_
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Called first thing in main() to init the hardware
|
||||||
|
void preRToSInit();
|
||||||
|
// Called once the RToS has started for any extra work
|
||||||
|
void postRToSInit();
|
||||||
|
|
||||||
|
// Called to reset the hardware watchdog unit
|
||||||
|
void resetWatchdog();
|
||||||
|
// Accepts a output level of 0.. to use to control the tip output PWM
|
||||||
|
void setTipPWM(uint8_t pulse);
|
||||||
|
// Returns the Handle temp in C, X10
|
||||||
|
uint16_t getHandleTemperature();
|
||||||
|
// Returns the Tip temperature ADC reading in raw units
|
||||||
|
uint16_t getTipRawTemp(uint8_t refresh);
|
||||||
|
// Returns the main DC input voltage, using the adjustable divisor + sample flag
|
||||||
|
uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample);
|
||||||
|
|
||||||
|
// Readers for the two buttons
|
||||||
|
// !! Returns 1 if held down, 0 if released
|
||||||
|
uint8_t getButtonA();
|
||||||
|
uint8_t getButtonB();
|
||||||
|
|
||||||
|
// This is a work around that will be called if I2C starts to bug out
|
||||||
|
// This should toggle the SCL line until SDA goes high to end the current transaction
|
||||||
|
void unstick_I2C();
|
||||||
|
|
||||||
|
// Reboot the IC when things go seriously wrong
|
||||||
|
void reboot();
|
||||||
|
|
||||||
|
// If the user has programmed in a bootup logo, draw it to the screen from flash
|
||||||
|
// Returns 1 if the logo was printed so that the unit waits for the timeout or button
|
||||||
|
uint8_t showBootLogoIfavailable();
|
||||||
|
|
||||||
|
void delay_ms(uint16_t count);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* BSP_BSP_H_ */
|
||||||
26
workspace/TS100/Core/BSP/BSP_Flash.h
Normal file
26
workspace/TS100/Core/BSP/BSP_Flash.h
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* BSP_Flash.h
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
#include "stdint.h"
|
||||||
|
#ifndef BSP_BSP_FLASH_H_
|
||||||
|
#define BSP_BSP_FLASH_H_
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Wrappers to allow read/writing to a sector of flash that we use to store all of the user settings
|
||||||
|
*
|
||||||
|
* Should allow reading and writing to the flash
|
||||||
|
*/
|
||||||
|
|
||||||
|
//Erase the flash, then save the buffer. Returns 1 if worked
|
||||||
|
uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length);
|
||||||
|
|
||||||
|
void flash_read_buffer(uint8_t *buffer, const uint16_t length);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* BSP_BSP_FLASH_H_ */
|
||||||
27
workspace/TS100/Core/BSP/BSP_Power.h
Normal file
27
workspace/TS100/Core/BSP/BSP_Power.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#include "stdint.h"
|
||||||
|
/*
|
||||||
|
* BSP_Power.h -- Board Support for Power control
|
||||||
|
*
|
||||||
|
* These functions are hooks used to allow for power control
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BSP_POWER_H_
|
||||||
|
#define BSP_POWER_H_
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Called once at startup, after RToS
|
||||||
|
// This can handle negotiations for QC/PD etc
|
||||||
|
void power_probe();
|
||||||
|
|
||||||
|
// Called periodically in the movement handling thread
|
||||||
|
// Can be used to check any details for the power system
|
||||||
|
void power_check();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
42
workspace/TS100/Core/BSP/BSP_QC.h
Normal file
42
workspace/TS100/Core/BSP/BSP_QC.h
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* BSP_QC.h
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BSP_BSP_QC_H_
|
||||||
|
#define BSP_BSP_QC_H_
|
||||||
|
#include "stdint.h"
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Init GPIO for QC neg
|
||||||
|
void QC_Init_GPIO();
|
||||||
|
// Set the DP pin to 0.6V
|
||||||
|
void QC_DPlusZero_Six();
|
||||||
|
// Set the DM pin to 0.6V
|
||||||
|
void QC_DNegZero_Six();
|
||||||
|
// Set the DP pin to 3.3V
|
||||||
|
void QC_DPlusThree_Three();
|
||||||
|
// Set the DM pin to 3.3V
|
||||||
|
void QC_DNegThree_Three();
|
||||||
|
// Turn on weak pulldown on the DM pin
|
||||||
|
// This is used as a helper for some power banks
|
||||||
|
void QC_DM_PullDown();
|
||||||
|
// Turn off the pulldown
|
||||||
|
void QC_DM_No_PullDown();
|
||||||
|
// Turn on output drivers that were initally disabled to prevent spike through QC disable mode
|
||||||
|
void QC_Post_Probe_En();
|
||||||
|
// Check if DM was pulled down
|
||||||
|
// 1=Pulled down, 0 == pulled high
|
||||||
|
uint8_t QC_DM_PulledDown();
|
||||||
|
|
||||||
|
// Re-sync if required
|
||||||
|
void QC_resync();
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* BSP_BSP_QC_H_ */
|
||||||
19
workspace/TS100/Core/BSP/Defines.h
Normal file
19
workspace/TS100/Core/BSP/Defines.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Defines.h
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BSP_DEFINES_H_
|
||||||
|
#define BSP_DEFINES_H_
|
||||||
|
|
||||||
|
|
||||||
|
enum Orientation {
|
||||||
|
ORIENTATION_LEFT_HAND = 0, ORIENTATION_RIGHT_HAND = 1, ORIENTATION_FLAT = 3
|
||||||
|
};
|
||||||
|
|
||||||
|
//It is assumed that all hardware implements an 8Hz update period at this time
|
||||||
|
#define PID_TIM_HZ (8)
|
||||||
|
|
||||||
|
#endif /* BSP_DEFINES_H_ */
|
||||||
256
workspace/TS100/Core/BSP/Miniware/BSP.cpp
Normal file
256
workspace/TS100/Core/BSP/Miniware/BSP.cpp
Normal file
@@ -0,0 +1,256 @@
|
|||||||
|
//BSP mapping functions
|
||||||
|
|
||||||
|
#include "BSP.h"
|
||||||
|
#include "Setup.h"
|
||||||
|
#include "history.hpp"
|
||||||
|
#include "Pins.h"
|
||||||
|
#include "main.hpp"
|
||||||
|
#include "history.hpp"
|
||||||
|
#include "I2C_Wrapper.hpp"
|
||||||
|
volatile uint16_t PWMSafetyTimer = 0;
|
||||||
|
volatile uint8_t pendingPWM = 0;
|
||||||
|
|
||||||
|
//2 second filter (ADC is PID_TIM_HZ Hz)
|
||||||
|
history<uint16_t, PID_TIM_HZ> rawTempFilter = { { 0 }, 0, 0 };
|
||||||
|
void resetWatchdog() {
|
||||||
|
HAL_IWDG_Refresh(&hiwdg);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t getHandleTemperature() {
|
||||||
|
// We return the current handle temperature in X10 C
|
||||||
|
// TMP36 in handle, 0.5V offset and then 10mV per deg C (0.75V @ 25C for
|
||||||
|
// example) STM32 = 4096 count @ 3.3V input -> But We oversample by 32/(2^2) =
|
||||||
|
// 8 times oversampling Therefore 32768 is the 3.3V input, so 0.1007080078125
|
||||||
|
// mV per count So we need to subtract an offset of 0.5V to center on 0C
|
||||||
|
// (4964.8 counts)
|
||||||
|
//
|
||||||
|
int32_t result = getADC(0);
|
||||||
|
result -= 4965; // remove 0.5V offset
|
||||||
|
// 10mV per C
|
||||||
|
// 99.29 counts per Deg C above 0C
|
||||||
|
result *= 100;
|
||||||
|
result /= 993;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t getTipInstantTemperature() {
|
||||||
|
uint16_t sum = 0; // 12 bit readings * 8 -> 15 bits
|
||||||
|
uint16_t readings[8];
|
||||||
|
//Looking to reject the highest outlier readings.
|
||||||
|
//As on some hardware these samples can run into the op-amp recovery time
|
||||||
|
//Once this time is up the signal stabilises quickly, so no need to reject minimums
|
||||||
|
readings[0] = hadc1.Instance->JDR1;
|
||||||
|
readings[1] = hadc1.Instance->JDR2;
|
||||||
|
readings[2] = hadc1.Instance->JDR3;
|
||||||
|
readings[3] = hadc1.Instance->JDR4;
|
||||||
|
readings[4] = hadc2.Instance->JDR1;
|
||||||
|
readings[5] = hadc2.Instance->JDR2;
|
||||||
|
readings[6] = hadc2.Instance->JDR3;
|
||||||
|
readings[7] = hadc2.Instance->JDR4;
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
sum += readings[i];
|
||||||
|
}
|
||||||
|
return sum; // 8x over sample
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t getTipRawTemp(uint8_t refresh) {
|
||||||
|
if (refresh) {
|
||||||
|
uint16_t lastSample = getTipInstantTemperature();
|
||||||
|
rawTempFilter.update(lastSample);
|
||||||
|
return lastSample;
|
||||||
|
} else {
|
||||||
|
return rawTempFilter.average();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) {
|
||||||
|
// ADC maximum is 32767 == 3.3V at input == 28.05V at VIN
|
||||||
|
// Therefore we can divide down from there
|
||||||
|
// Multiplying ADC max by 4 for additional calibration options,
|
||||||
|
// ideal term is 467
|
||||||
|
#ifdef MODEL_TS100
|
||||||
|
#define BATTFILTERDEPTH 32
|
||||||
|
#else
|
||||||
|
#define BATTFILTERDEPTH 8
|
||||||
|
|
||||||
|
#endif
|
||||||
|
static uint8_t preFillneeded = 10;
|
||||||
|
static uint32_t samples[BATTFILTERDEPTH];
|
||||||
|
static uint8_t index = 0;
|
||||||
|
if (preFillneeded) {
|
||||||
|
for (uint8_t i = 0; i < BATTFILTERDEPTH; i++)
|
||||||
|
samples[i] = getADC(1);
|
||||||
|
preFillneeded--;
|
||||||
|
}
|
||||||
|
if (sample) {
|
||||||
|
samples[index] = getADC(1);
|
||||||
|
index = (index + 1) % BATTFILTERDEPTH;
|
||||||
|
}
|
||||||
|
uint32_t sum = 0;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < BATTFILTERDEPTH; i++)
|
||||||
|
sum += samples[i];
|
||||||
|
|
||||||
|
sum /= BATTFILTERDEPTH;
|
||||||
|
return sum * 4 / divisor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setTipPWM(uint8_t pulse) {
|
||||||
|
PWMSafetyTimer = 10; // This is decremented in the handler for PWM so that the tip pwm is
|
||||||
|
// disabled if the PID task is not scheduled often enough.
|
||||||
|
|
||||||
|
pendingPWM = pulse;
|
||||||
|
}
|
||||||
|
|
||||||
|
// These are called by the HAL after the corresponding events from the system
|
||||||
|
// timers.
|
||||||
|
|
||||||
|
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
|
||||||
|
// Period has elapsed
|
||||||
|
if (htim->Instance == TIM2) {
|
||||||
|
// we want to turn on the output again
|
||||||
|
PWMSafetyTimer--;
|
||||||
|
// We decrement this safety value so that lockups in the
|
||||||
|
// scheduler will not cause the PWM to become locked in an
|
||||||
|
// active driving state.
|
||||||
|
// While we could assume this could never happen, its a small price for
|
||||||
|
// increased safety
|
||||||
|
htim2.Instance->CCR4 = pendingPWM;
|
||||||
|
if (htim2.Instance->CCR4 && PWMSafetyTimer) {
|
||||||
|
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
|
||||||
|
} else {
|
||||||
|
HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
|
||||||
|
}
|
||||||
|
} else if (htim->Instance == TIM1) {
|
||||||
|
// STM uses this for internal functions as a counter for timeouts
|
||||||
|
HAL_IncTick();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) {
|
||||||
|
// This was a when the PWM for the output has timed out
|
||||||
|
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4) {
|
||||||
|
HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void unstick_I2C() {
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
int timeout = 100;
|
||||||
|
int timeout_cnt = 0;
|
||||||
|
|
||||||
|
// 1. Clear PE bit.
|
||||||
|
hi2c1.Instance->CR1 &= ~(0x0001);
|
||||||
|
/**I2C1 GPIO Configuration
|
||||||
|
PB6 ------> I2C1_SCL
|
||||||
|
PB7 ------> I2C1_SDA
|
||||||
|
*/
|
||||||
|
// 2. Configure the SCL and SDA I/Os as General Purpose Output Open-Drain, High level (Write 1 to GPIOx_ODR).
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
|
||||||
|
GPIO_InitStruct.Pin = SCL_Pin;
|
||||||
|
HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
|
||||||
|
|
||||||
|
GPIO_InitStruct.Pin = SDA_Pin;
|
||||||
|
HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET);
|
||||||
|
|
||||||
|
while (GPIO_PIN_SET != HAL_GPIO_ReadPin(SDA_GPIO_Port, SDA_Pin)) {
|
||||||
|
//Move clock to release I2C
|
||||||
|
HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_RESET);
|
||||||
|
asm("nop");
|
||||||
|
asm("nop");
|
||||||
|
asm("nop");
|
||||||
|
asm("nop");
|
||||||
|
HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
|
||||||
|
|
||||||
|
timeout_cnt++;
|
||||||
|
if (timeout_cnt > timeout)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 12. Configure the SCL and SDA I/Os as Alternate function Open-Drain.
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
|
|
||||||
|
GPIO_InitStruct.Pin = SCL_Pin;
|
||||||
|
HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
GPIO_InitStruct.Pin = SDA_Pin;
|
||||||
|
HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
|
||||||
|
HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET);
|
||||||
|
|
||||||
|
// 13. Set SWRST bit in I2Cx_CR1 register.
|
||||||
|
hi2c1.Instance->CR1 |= 0x8000;
|
||||||
|
|
||||||
|
asm("nop");
|
||||||
|
|
||||||
|
// 14. Clear SWRST bit in I2Cx_CR1 register.
|
||||||
|
hi2c1.Instance->CR1 &= ~0x8000;
|
||||||
|
|
||||||
|
asm("nop");
|
||||||
|
|
||||||
|
// 15. Enable the I2C peripheral by setting the PE bit in I2Cx_CR1 register
|
||||||
|
hi2c1.Instance->CR1 |= 0x0001;
|
||||||
|
|
||||||
|
// Call initialization function.
|
||||||
|
HAL_I2C_Init(&hi2c1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t getButtonA() {
|
||||||
|
return HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ?
|
||||||
|
1 : 0;
|
||||||
|
}
|
||||||
|
uint8_t getButtonB() {
|
||||||
|
return HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ?
|
||||||
|
1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Catch the IRQ that says that the conversion is done on the temperature
|
||||||
|
* readings coming in Once these have come in we can unblock the PID so that it
|
||||||
|
* runs again
|
||||||
|
*/
|
||||||
|
void HAL_ADCEx_InjectedConvCpltCallback(ADC_HandleTypeDef *hadc) {
|
||||||
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||||||
|
if (hadc == &hadc1) {
|
||||||
|
if (pidTaskNotification) {
|
||||||
|
vTaskNotifyGiveFromISR(pidTaskNotification,
|
||||||
|
&xHigherPriorityTaskWoken);
|
||||||
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
|
||||||
|
FRToSI2C::CpltCallback();
|
||||||
|
}
|
||||||
|
void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
|
||||||
|
FRToSI2C::CpltCallback();
|
||||||
|
}
|
||||||
|
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
|
||||||
|
FRToSI2C::CpltCallback();
|
||||||
|
}
|
||||||
|
void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c __unused) {
|
||||||
|
|
||||||
|
FRToSI2C::CpltCallback();
|
||||||
|
}
|
||||||
|
void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
|
||||||
|
|
||||||
|
FRToSI2C::CpltCallback();
|
||||||
|
}
|
||||||
|
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c __unused) {
|
||||||
|
FRToSI2C::CpltCallback();
|
||||||
|
}
|
||||||
|
void reboot() {
|
||||||
|
NVIC_SystemReset();
|
||||||
|
}
|
||||||
|
|
||||||
|
void delay_ms(uint16_t count) {
|
||||||
|
HAL_Delay(count);
|
||||||
|
}
|
||||||
142
workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp
Normal file
142
workspace/TS100/Core/BSP/Miniware/I2C_Wrapper.cpp
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
/*
|
||||||
|
* FRToSI2C.cpp
|
||||||
|
*
|
||||||
|
* Created on: 14Apr.,2018
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
#include <I2C_Wrapper.hpp>
|
||||||
|
#include "BSP.h"
|
||||||
|
#include "Setup.h"
|
||||||
|
#define I2CUSESDMA
|
||||||
|
SemaphoreHandle_t FRToSI2C::I2CSemaphore;
|
||||||
|
StaticSemaphore_t FRToSI2C::xSemaphoreBuffer;
|
||||||
|
|
||||||
|
void FRToSI2C::CpltCallback() {
|
||||||
|
hi2c1.State = HAL_I2C_STATE_READY; // Force state reset (even if tx error)
|
||||||
|
if (I2CSemaphore) {
|
||||||
|
xSemaphoreGiveFromISR(I2CSemaphore, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
|
||||||
|
uint8_t *pData, uint16_t Size) {
|
||||||
|
|
||||||
|
if (I2CSemaphore == NULL) {
|
||||||
|
// no RToS, run blocking code
|
||||||
|
HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT,
|
||||||
|
pData, Size, 5000);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
// RToS is active, run threading
|
||||||
|
// Get the mutex so we can use the I2C port
|
||||||
|
// Wait up to 1 second for the mutex
|
||||||
|
if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) {
|
||||||
|
#ifdef I2CUSESDMA
|
||||||
|
if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress,
|
||||||
|
I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) {
|
||||||
|
|
||||||
|
I2C_Unstick();
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
|
if (HAL_I2C_Mem_Read(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, pData, Size,
|
||||||
|
5000)==HAL_OK){
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
void FRToSI2C::I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data) {
|
||||||
|
Mem_Write(address, reg, &data, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t FRToSI2C::I2C_RegisterRead(uint8_t add, uint8_t reg) {
|
||||||
|
uint8_t tx_data[1];
|
||||||
|
Mem_Read(add, reg, tx_data, 1);
|
||||||
|
return tx_data[0];
|
||||||
|
}
|
||||||
|
void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
|
||||||
|
uint8_t *pData, uint16_t Size) {
|
||||||
|
|
||||||
|
if (I2CSemaphore == NULL) {
|
||||||
|
// no RToS, run blocking code
|
||||||
|
HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT,
|
||||||
|
pData, Size, 5000);
|
||||||
|
} else {
|
||||||
|
// RToS is active, run threading
|
||||||
|
// Get the mutex so we can use the I2C port
|
||||||
|
// Wait up to 1 second for the mutex
|
||||||
|
if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) {
|
||||||
|
#ifdef I2CUSESDMA
|
||||||
|
if (HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress,
|
||||||
|
I2C_MEMADD_SIZE_8BIT, pData, Size, 500) != HAL_OK) {
|
||||||
|
|
||||||
|
I2C_Unstick();
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
}
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
#else
|
||||||
|
if (HAL_I2C_Mem_Write(&hi2c1, DevAddress, MemAddress, I2C_MEMADD_SIZE_8BIT, pData,
|
||||||
|
Size, 5000) != HAL_OK) {
|
||||||
|
}
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size) {
|
||||||
|
if (I2CSemaphore == NULL) {
|
||||||
|
// no RToS, run blocking code
|
||||||
|
HAL_I2C_Master_Transmit(&hi2c1, DevAddress, pData, Size, 5000);
|
||||||
|
} else {
|
||||||
|
// RToS is active, run threading
|
||||||
|
// Get the mutex so we can use the I2C port
|
||||||
|
// Wait up to 1 second for the mutex
|
||||||
|
if (xSemaphoreTake(I2CSemaphore, (TickType_t)50) == pdTRUE) {
|
||||||
|
#ifdef I2CUSESDMA
|
||||||
|
|
||||||
|
if (HAL_I2C_Master_Transmit_DMA(&hi2c1, DevAddress, pData, Size)
|
||||||
|
!= HAL_OK) {
|
||||||
|
|
||||||
|
I2C_Unstick();
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
HAL_I2C_Master_Transmit(&hi2c1, DevAddress, pData, Size, 5000);
|
||||||
|
xSemaphoreGive(I2CSemaphore);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FRToSI2C::probe(uint16_t DevAddress) {
|
||||||
|
uint8_t buffer[1];
|
||||||
|
if (Mem_Read(DevAddress, 0, buffer, 1)) {
|
||||||
|
//ACK'd
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FRToSI2C::I2C_Unstick() {
|
||||||
|
unstick_I2C();
|
||||||
|
}
|
||||||
@@ -1,148 +1,83 @@
|
|||||||
/*
|
/*
|
||||||
* Hardware.h
|
* Pins.h
|
||||||
*
|
*
|
||||||
* Created on: 29Aug.,2017
|
* Created on: 29 May 2020
|
||||||
* Author: Ben V. Brown
|
* Author: Ralim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef HARDWARE_H_
|
#ifndef BSP_MINIWARE_PINS_H_
|
||||||
#define HARDWARE_H_
|
#define BSP_MINIWARE_PINS_H_
|
||||||
#include "Setup.h"
|
|
||||||
#include "stm32f1xx_hal.h"
|
#if defined(MODEL_TS100) + defined(MODEL_TS80) > 1
|
||||||
#include "FreeRTOS.h"
|
#error "Multiple models defined!"
|
||||||
#include "stm32f1xx_hal.h"
|
#elif defined(MODEL_TS100) + defined(MODEL_TS80) == 0
|
||||||
#include "cmsis_os.h"
|
#error "No model defined!"
|
||||||
#include "unit.h"
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef MODEL_TS100
|
||||||
extern "C" {
|
|
||||||
#endif
|
#define KEY_B_Pin GPIO_PIN_6
|
||||||
|
#define KEY_B_GPIO_Port GPIOA
|
||||||
enum Orientation {
|
#define TMP36_INPUT_Pin GPIO_PIN_7
|
||||||
ORIENTATION_LEFT_HAND = 0, ORIENTATION_RIGHT_HAND = 1, ORIENTATION_FLAT = 3
|
#define TMP36_INPUT_GPIO_Port GPIOA
|
||||||
};
|
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_7
|
||||||
#define PID_TIM_HZ (8)
|
#define TIP_TEMP_Pin GPIO_PIN_0
|
||||||
#if defined(MODEL_TS100) + defined(MODEL_TS80) > 1
|
#define TIP_TEMP_GPIO_Port GPIOB
|
||||||
#error "Multiple models defined!"
|
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_8
|
||||||
#elif defined(MODEL_TS100) + defined(MODEL_TS80) == 0
|
#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_8
|
||||||
#error "No model defined!"
|
#define VIN_Pin GPIO_PIN_1
|
||||||
#endif
|
#define VIN_GPIO_Port GPIOB
|
||||||
|
#define VIN_ADC1_CHANNEL ADC_CHANNEL_9
|
||||||
#ifdef MODEL_TS100
|
#define VIN_ADC2_CHANNEL ADC_CHANNEL_9
|
||||||
|
#define OLED_RESET_Pin GPIO_PIN_8
|
||||||
#define KEY_B_Pin GPIO_PIN_6
|
#define OLED_RESET_GPIO_Port GPIOA
|
||||||
#define KEY_B_GPIO_Port GPIOA
|
#define KEY_A_Pin GPIO_PIN_9
|
||||||
#define TMP36_INPUT_Pin GPIO_PIN_7
|
#define KEY_A_GPIO_Port GPIOA
|
||||||
#define TMP36_INPUT_GPIO_Port GPIOA
|
#define INT_Orientation_Pin GPIO_PIN_3
|
||||||
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_7
|
#define INT_Orientation_GPIO_Port GPIOB
|
||||||
#define TIP_TEMP_Pin GPIO_PIN_0
|
#define PWM_Out_Pin GPIO_PIN_4
|
||||||
#define TIP_TEMP_GPIO_Port GPIOB
|
#define PWM_Out_GPIO_Port GPIOB
|
||||||
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_8
|
#define PWM_Out_CHANNEL TIM_CHANNEL_1
|
||||||
#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_8
|
#define PWM_Out_CCR
|
||||||
#define VIN_Pin GPIO_PIN_1
|
#define INT_Movement_Pin GPIO_PIN_5
|
||||||
#define VIN_GPIO_Port GPIOB
|
#define INT_Movement_GPIO_Port GPIOB
|
||||||
#define VIN_ADC1_CHANNEL ADC_CHANNEL_9
|
#define SCL_Pin GPIO_PIN_6
|
||||||
#define VIN_ADC2_CHANNEL ADC_CHANNEL_9
|
#define SCL_GPIO_Port GPIOB
|
||||||
#define OLED_RESET_Pin GPIO_PIN_8
|
#define SDA_Pin GPIO_PIN_7
|
||||||
#define OLED_RESET_GPIO_Port GPIOA
|
#define SDA_GPIO_Port GPIOB
|
||||||
#define KEY_A_Pin GPIO_PIN_9
|
|
||||||
#define KEY_A_GPIO_Port GPIOA
|
#else
|
||||||
#define INT_Orientation_Pin GPIO_PIN_3
|
// TS80 pin map
|
||||||
#define INT_Orientation_GPIO_Port GPIOB
|
#define KEY_B_Pin GPIO_PIN_0
|
||||||
#define PWM_Out_Pin GPIO_PIN_4
|
#define KEY_B_GPIO_Port GPIOB
|
||||||
#define PWM_Out_GPIO_Port GPIOB
|
#define TMP36_INPUT_Pin GPIO_PIN_4
|
||||||
#define PWM_Out_CHANNEL TIM_CHANNEL_1
|
#define TMP36_INPUT_GPIO_Port GPIOA
|
||||||
#define PWM_Out_CCR
|
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_4
|
||||||
#define INT_Movement_Pin GPIO_PIN_5
|
#define TIP_TEMP_Pin GPIO_PIN_3
|
||||||
#define INT_Movement_GPIO_Port GPIOB
|
#define TIP_TEMP_GPIO_Port GPIOA
|
||||||
#define SCL_Pin GPIO_PIN_6
|
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3
|
||||||
#define SCL_GPIO_Port GPIOB
|
#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_3
|
||||||
#define SDA_Pin GPIO_PIN_7
|
|
||||||
#define SDA_GPIO_Port GPIOB
|
#define VIN_Pin GPIO_PIN_2
|
||||||
|
#define VIN_GPIO_Port GPIOA
|
||||||
#else
|
#define VIN_ADC1_CHANNEL ADC_CHANNEL_2
|
||||||
// TS80 pin map
|
#define VIN_ADC2_CHANNEL ADC_CHANNEL_2
|
||||||
#define KEY_B_Pin GPIO_PIN_0
|
#define OLED_RESET_Pin GPIO_PIN_15
|
||||||
#define KEY_B_GPIO_Port GPIOB
|
#define OLED_RESET_GPIO_Port GPIOA
|
||||||
#define TMP36_INPUT_Pin GPIO_PIN_4
|
#define KEY_A_Pin GPIO_PIN_1
|
||||||
#define TMP36_INPUT_GPIO_Port GPIOA
|
#define KEY_A_GPIO_Port GPIOB
|
||||||
#define TMP36_ADC1_CHANNEL ADC_CHANNEL_4
|
#define INT_Orientation_Pin GPIO_PIN_4
|
||||||
#define TIP_TEMP_Pin GPIO_PIN_3
|
#define INT_Orientation_GPIO_Port GPIOB
|
||||||
#define TIP_TEMP_GPIO_Port GPIOA
|
#define PWM_Out_Pin GPIO_PIN_6
|
||||||
#define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_3
|
#define PWM_Out_GPIO_Port GPIOA
|
||||||
#define TIP_TEMP_ADC2_CHANNEL ADC_CHANNEL_3
|
#define PWM_Out_CHANNEL TIM_CHANNEL_1
|
||||||
|
#define INT_Movement_Pin GPIO_PIN_5
|
||||||
#define VIN_Pin GPIO_PIN_2
|
#define INT_Movement_GPIO_Port GPIOB
|
||||||
#define VIN_GPIO_Port GPIOA
|
#define SCL_Pin GPIO_PIN_6
|
||||||
#define VIN_ADC1_CHANNEL ADC_CHANNEL_2
|
#define SCL_GPIO_Port GPIOB
|
||||||
#define VIN_ADC2_CHANNEL ADC_CHANNEL_2
|
#define SDA_Pin GPIO_PIN_7
|
||||||
#define OLED_RESET_Pin GPIO_PIN_15
|
#define SDA_GPIO_Port GPIOB
|
||||||
#define OLED_RESET_GPIO_Port GPIOA
|
|
||||||
#define KEY_A_Pin GPIO_PIN_1
|
#endif
|
||||||
#define KEY_A_GPIO_Port GPIOB
|
|
||||||
#define INT_Orientation_Pin GPIO_PIN_4
|
#endif /* BSP_MINIWARE_PINS_H_ */
|
||||||
#define INT_Orientation_GPIO_Port GPIOB
|
|
||||||
#define PWM_Out_Pin GPIO_PIN_6
|
|
||||||
#define PWM_Out_GPIO_Port GPIOA
|
|
||||||
#define PWM_Out_CHANNEL TIM_CHANNEL_1
|
|
||||||
#define INT_Movement_Pin GPIO_PIN_5
|
|
||||||
#define INT_Movement_GPIO_Port GPIOB
|
|
||||||
#define SCL_Pin GPIO_PIN_6
|
|
||||||
#define SCL_GPIO_Port GPIOB
|
|
||||||
#define SDA_Pin GPIO_PIN_7
|
|
||||||
#define SDA_GPIO_Port GPIOB
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Keep in a uint8_t range for the ID's
|
|
||||||
*/
|
|
||||||
#ifdef MODEL_TS100
|
|
||||||
enum TipType {
|
|
||||||
TS_B2 = 0,
|
|
||||||
TS_D24 = 1,
|
|
||||||
TS_BC2 = 2,
|
|
||||||
TS_C1 = 3,
|
|
||||||
Tip_MiniWare = 4,
|
|
||||||
HAKKO_BC2 = 4,
|
|
||||||
Tip_Hakko = 5,
|
|
||||||
Tip_Custom = 5,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
#ifdef MODEL_TS80
|
|
||||||
enum TipType {
|
|
||||||
TS_B02 = 0, TS_D25 = 1, Tip_MiniWare = 2, Tip_Custom = 3,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
extern uint16_t tipGainCalValue ;
|
|
||||||
|
|
||||||
uint16_t lookupTipDefaultCalValue(enum TipType tipID);
|
|
||||||
uint16_t getHandleTemperature();
|
|
||||||
uint16_t getTipRawTemp(uint8_t refresh);
|
|
||||||
uint16_t getInputVoltageX10(uint16_t divisor,uint8_t sample);
|
|
||||||
|
|
||||||
void setTipPWM(uint8_t pulse);
|
|
||||||
uint16_t ctoTipMeasurement(uint16_t temp);
|
|
||||||
uint16_t tipMeasurementToC(uint16_t raw);
|
|
||||||
uint16_t ftoTipMeasurement(uint16_t temp);
|
|
||||||
#ifdef ENABLED_FAHRENHEIT_SUPPORT
|
|
||||||
uint16_t tipMeasurementToF(uint16_t raw);
|
|
||||||
#endif
|
|
||||||
void seekQC(int16_t Vx10, uint16_t divisor);
|
|
||||||
void setCalibrationOffset(int16_t offSet);
|
|
||||||
void setTipType(enum TipType tipType, uint8_t manualCalGain);
|
|
||||||
uint32_t calculateTipR();
|
|
||||||
int16_t calculateMaxVoltage(uint8_t useHP);
|
|
||||||
void startQC(uint16_t divisor); // Tries to negotiate QC for highest voltage, must be run after
|
|
||||||
// RToS
|
|
||||||
// This will try for 12V, failing that 9V, failing that 5V
|
|
||||||
// If input is over 12V returns -1
|
|
||||||
// If the input is [5-12] Will return the value.
|
|
||||||
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
|
|
||||||
StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) ;
|
|
||||||
void vApplicationIdleHook(void);
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* HARDWARE_H_ */
|
|
||||||
21
workspace/TS100/Core/BSP/Miniware/Power.cpp
Normal file
21
workspace/TS100/Core/BSP/Miniware/Power.cpp
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#include "BSP.h"
|
||||||
|
#include "BSP_Power.h"
|
||||||
|
#include "QC3.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
void power_probe() {
|
||||||
|
// If TS80 probe for QC
|
||||||
|
// If TS100 - noop
|
||||||
|
#ifdef MODEL_TS80
|
||||||
|
startQC(systemSettings.voltageDiv);
|
||||||
|
|
||||||
|
seekQC((systemSettings.cutoutSetting) ? 120 : 90,
|
||||||
|
systemSettings.voltageDiv); // this will move the QC output to the preferred voltage to start with
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void power_check() {
|
||||||
|
#ifdef MODEL_TS80
|
||||||
|
QC_resync();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
74
workspace/TS100/Core/BSP/Miniware/QC_GPIO.cpp
Normal file
74
workspace/TS100/Core/BSP/Miniware/QC_GPIO.cpp
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* QC.c
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
#include "BSP.h"
|
||||||
|
#include "Pins.h"
|
||||||
|
#include "QC3.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
void QC_DPlusZero_Six() {
|
||||||
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_RESET); // pull down D+
|
||||||
|
}
|
||||||
|
void QC_DNegZero_Six() {
|
||||||
|
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
|
||||||
|
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);
|
||||||
|
}
|
||||||
|
void QC_DPlusThree_Three() {
|
||||||
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3, GPIO_PIN_SET); // pull up D+
|
||||||
|
}
|
||||||
|
void QC_DNegThree_Three() {
|
||||||
|
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_10, GPIO_PIN_SET);
|
||||||
|
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);
|
||||||
|
}
|
||||||
|
void QC_DM_PullDown() {
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_11;
|
||||||
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
}
|
||||||
|
void QC_DM_No_PullDown() {
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_11;
|
||||||
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
}
|
||||||
|
void QC_Init_GPIO() {
|
||||||
|
// Setup any GPIO into the right states for QC
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_3;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_10;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
// Turn off output mode on pins that we can
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_NOPULL;
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_13;
|
||||||
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
}
|
||||||
|
void QC_Post_Probe_En() {
|
||||||
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
|
||||||
|
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_10;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
|
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t QC_DM_PulledDown() { return HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET ? 1 : 0; }
|
||||||
|
|
||||||
|
void QC_resync() {
|
||||||
|
#ifdef MODEL_TS80
|
||||||
|
seekQC((systemSettings.cutoutSetting) ? 120 : 90,
|
||||||
|
systemSettings.voltageDiv); // Run the QC seek again if we have drifted too much
|
||||||
|
#endif
|
||||||
|
}
|
||||||
12
workspace/TS100/Core/BSP/Miniware/README.md
Normal file
12
workspace/TS100/Core/BSP/Miniware/README.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# BSP section for STM32F103 based Miniware products
|
||||||
|
|
||||||
|
This folder contains the hardware abstractions required for the TS100, TS80 and probably TS80P soldering irons.
|
||||||
|
|
||||||
|
## Main abstractions
|
||||||
|
|
||||||
|
* Hardware Init
|
||||||
|
* -> Should contain all bootstrap to bring the hardware up to an operating point
|
||||||
|
* -> Two functions are required, a pre and post FreeRToS call
|
||||||
|
* I2C read/write
|
||||||
|
* Set PWM for the tip
|
||||||
|
* Links between IRQ's on the system and the calls in the rest of the firmware
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
* Author: Ben V. Brown
|
* Author: Ben V. Brown
|
||||||
*/
|
*/
|
||||||
#include "Setup.h"
|
#include "Setup.h"
|
||||||
|
#include "Pins.h"
|
||||||
ADC_HandleTypeDef hadc1;
|
ADC_HandleTypeDef hadc1;
|
||||||
ADC_HandleTypeDef hadc2;
|
ADC_HandleTypeDef hadc2;
|
||||||
DMA_HandleTypeDef hdma_adc1;
|
DMA_HandleTypeDef hdma_adc1;
|
||||||
@@ -32,12 +33,8 @@ static void MX_ADC2_Init(void);
|
|||||||
|
|
||||||
void Setup_HAL() {
|
void Setup_HAL() {
|
||||||
SystemClock_Config();
|
SystemClock_Config();
|
||||||
#ifndef LOCAL_BUILD
|
|
||||||
__HAL_AFIO_REMAP_SWJ_DISABLE()
|
__HAL_AFIO_REMAP_SWJ_DISABLE()
|
||||||
;
|
;
|
||||||
#else
|
|
||||||
__HAL_AFIO_REMAP_SWJ_NOJTAG();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MX_GPIO_Init();
|
MX_GPIO_Init();
|
||||||
MX_DMA_Init();
|
MX_DMA_Init();
|
||||||
@@ -49,8 +46,8 @@ void Setup_HAL() {
|
|||||||
MX_IWDG_Init();
|
MX_IWDG_Init();
|
||||||
HAL_ADC_Start(&hadc2);
|
HAL_ADC_Start(&hadc2);
|
||||||
HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*) ADCReadings, 64); // start DMA of normal readings
|
HAL_ADCEx_MultiModeStart_DMA(&hadc1, (uint32_t*) ADCReadings, 64); // start DMA of normal readings
|
||||||
HAL_ADCEx_InjectedStart(&hadc1); // enable injected readings
|
HAL_ADCEx_InjectedStart(&hadc1); // enable injected readings
|
||||||
HAL_ADCEx_InjectedStart(&hadc2); // enable injected readings
|
HAL_ADCEx_InjectedStart(&hadc2); // enable injected readings
|
||||||
}
|
}
|
||||||
|
|
||||||
// channel 0 -> temperature sensor, 1-> VIN
|
// channel 0 -> temperature sensor, 1-> VIN
|
||||||
@@ -336,7 +333,7 @@ static void MX_TIM2_Init(void) {
|
|||||||
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
|
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
|
||||||
|
|
||||||
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
||||||
sConfigOC.Pulse = 255 + 13;//13 -> Delay of 5ms
|
sConfigOC.Pulse = 255 + 13; //13 -> Delay of 5ms
|
||||||
//255 is the largest time period of the drive signal, and then offset ADC sample to be a bit delayed after this
|
//255 is the largest time period of the drive signal, and then offset ADC sample to be a bit delayed after this
|
||||||
/*
|
/*
|
||||||
* It takes 4 milliseconds for output to be stable after PWM turns off.
|
* It takes 4 milliseconds for output to be stable after PWM turns off.
|
||||||
@@ -1,38 +1,38 @@
|
|||||||
/*
|
/*
|
||||||
* Setup.h
|
* Setup.h
|
||||||
*
|
*
|
||||||
* Created on: 29Aug.,2017
|
* Created on: 29Aug.,2017
|
||||||
* Author: Ben V. Brown
|
* Author: Ben V. Brown
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SETUP_H_
|
#ifndef SETUP_H_
|
||||||
#define SETUP_H_
|
#define SETUP_H_
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#include <hardware.h>
|
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
extern ADC_HandleTypeDef hadc1;
|
extern ADC_HandleTypeDef hadc1;
|
||||||
extern ADC_HandleTypeDef hadc2;
|
extern ADC_HandleTypeDef hadc2;
|
||||||
extern DMA_HandleTypeDef hdma_adc1;
|
extern DMA_HandleTypeDef hdma_adc1;
|
||||||
|
|
||||||
extern DMA_HandleTypeDef hdma_i2c1_rx;
|
extern DMA_HandleTypeDef hdma_i2c1_rx;
|
||||||
extern DMA_HandleTypeDef hdma_i2c1_tx;
|
extern DMA_HandleTypeDef hdma_i2c1_tx;
|
||||||
extern I2C_HandleTypeDef hi2c1;
|
extern I2C_HandleTypeDef hi2c1;
|
||||||
|
|
||||||
extern IWDG_HandleTypeDef hiwdg;
|
extern IWDG_HandleTypeDef hiwdg;
|
||||||
|
|
||||||
extern TIM_HandleTypeDef htim2;
|
extern TIM_HandleTypeDef htim2;
|
||||||
extern TIM_HandleTypeDef htim3;
|
extern TIM_HandleTypeDef htim3;
|
||||||
void Setup_HAL();
|
void Setup_HAL();
|
||||||
uint16_t getADC(uint8_t channel);
|
uint16_t getADC(uint8_t channel);
|
||||||
|
|
||||||
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim); //Since the hal header file does not define this one
|
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); //Since the hal header file does not define this one
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* SETUP_H_ */
|
#endif /* SETUP_H_ */
|
||||||
18
workspace/TS100/Core/BSP/Miniware/UnitSettings.h
Normal file
18
workspace/TS100/Core/BSP/Miniware/UnitSettings.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* UnitSettings.h
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BSP_MINIWARE_UNITSETTINGS_H_
|
||||||
|
#define BSP_MINIWARE_UNITSETTINGS_H_
|
||||||
|
//On the TS80, the LIS accel is mounted backwards
|
||||||
|
#ifdef MODEL_TS80
|
||||||
|
#define LIS_ORI_FLIP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* BSP_MINIWARE_UNITSETTINGS_H_ */
|
||||||
49
workspace/TS100/Core/BSP/Miniware/flash.c
Normal file
49
workspace/TS100/Core/BSP/Miniware/flash.c
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* flash.c
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "BSP_Flash.h"
|
||||||
|
#include "BSP.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
/*Flash start OR'ed with the maximum amount of flash - 1024 bytes*/
|
||||||
|
/*We use the last 1024 byte page*/
|
||||||
|
#define FLASH_ADDR (0x8000000 |0xFC00)
|
||||||
|
uint8_t flash_save_buffer(const uint8_t *buffer, const uint16_t length) {
|
||||||
|
FLASH_EraseInitTypeDef pEraseInit;
|
||||||
|
pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
|
||||||
|
pEraseInit.Banks = FLASH_BANK_1;
|
||||||
|
pEraseInit.NbPages = 1;
|
||||||
|
pEraseInit.PageAddress = FLASH_ADDR;
|
||||||
|
uint32_t failingAddress = 0;
|
||||||
|
resetWatchdog();
|
||||||
|
__HAL_FLASH_CLEAR_FLAG(
|
||||||
|
FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR | FLASH_FLAG_BSY);
|
||||||
|
HAL_FLASH_Unlock();
|
||||||
|
HAL_Delay(10);
|
||||||
|
resetWatchdog();
|
||||||
|
HAL_FLASHEx_Erase(&pEraseInit, &failingAddress);
|
||||||
|
//^ Erase the page of flash (1024 bytes on this stm32)
|
||||||
|
// erased the chunk
|
||||||
|
// now we program it
|
||||||
|
uint16_t *data = (uint16_t*) buffer;
|
||||||
|
HAL_FLASH_Unlock();
|
||||||
|
for (uint8_t i = 0; i < (length / 2); i++) {
|
||||||
|
resetWatchdog();
|
||||||
|
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_ADDR + (i * 2),
|
||||||
|
data[i]);
|
||||||
|
}
|
||||||
|
HAL_FLASH_Lock();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void flash_read_buffer(uint8_t *buffer, const uint16_t length) {
|
||||||
|
|
||||||
|
uint16_t *data = (uint16_t*) buffer;
|
||||||
|
for (uint8_t i = 0; i < (length / 2); i++) {
|
||||||
|
data[i] = *((uint16_t*) (FLASH_ADDR + (i * 2)));
|
||||||
|
}
|
||||||
|
}
|
||||||
27
workspace/TS100/Core/BSP/Miniware/logo.cpp
Normal file
27
workspace/TS100/Core/BSP/Miniware/logo.cpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* logo.c
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "BSP.h"
|
||||||
|
#include "OLED.hpp"
|
||||||
|
// Second last page of flash set aside for logo image.
|
||||||
|
#define FLASH_LOGOADDR (0x8000000 | 0xF800)
|
||||||
|
|
||||||
|
// Logo header signature.
|
||||||
|
#define LOGO_HEADER_VALUE 0xF00DAA55
|
||||||
|
|
||||||
|
uint8_t showBootLogoIfavailable() {
|
||||||
|
// Do not show logo data if signature is not found.
|
||||||
|
if (LOGO_HEADER_VALUE
|
||||||
|
!= *(reinterpret_cast<const uint32_t*>(FLASH_LOGOADDR))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
OLED::drawAreaSwapped(0, 0, 96, 16, (uint8_t*) (FLASH_LOGOADDR + 4));
|
||||||
|
OLED::refresh();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
13
workspace/TS100/Core/BSP/Miniware/postRTOS.cpp
Normal file
13
workspace/TS100/Core/BSP/Miniware/postRTOS.cpp
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#include "BSP.h"
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "QC3.h"
|
||||||
|
#include "Settings.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include "main.hpp"
|
||||||
|
#include "power.hpp"
|
||||||
|
#include "stdlib.h"
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
|
void postRToSInit() {
|
||||||
|
// Any after RTos setup
|
||||||
|
}
|
||||||
22
workspace/TS100/Core/BSP/Miniware/preRTOS.cpp
Normal file
22
workspace/TS100/Core/BSP/Miniware/preRTOS.cpp
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* preRTOS.c
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <I2C_Wrapper.hpp>
|
||||||
|
#include "BSP.h"
|
||||||
|
#include "Setup.h"
|
||||||
|
#include "Pins.h"
|
||||||
|
void preRToSInit() {
|
||||||
|
/* Reset of all peripherals, Initializes the Flash interface and the Systick.
|
||||||
|
*/
|
||||||
|
HAL_Init();
|
||||||
|
Setup_HAL(); // Setup all the HAL objects
|
||||||
|
FRToSI2C::init();
|
||||||
|
HAL_Delay(50);
|
||||||
|
HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET);
|
||||||
|
HAL_Delay(50);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,136 +1,136 @@
|
|||||||
#include <hardware.h>
|
#include "Pins.h"
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
#include "Setup.h"
|
#include "Setup.h"
|
||||||
/**
|
/**
|
||||||
* Initializes the Global MSP.
|
* Initializes the Global MSP.
|
||||||
*/
|
*/
|
||||||
void HAL_MspInit(void) {
|
void HAL_MspInit(void) {
|
||||||
__HAL_RCC_AFIO_CLK_ENABLE()
|
__HAL_RCC_AFIO_CLK_ENABLE()
|
||||||
;
|
;
|
||||||
|
|
||||||
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
|
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
|
||||||
|
|
||||||
/* System interrupt init*/
|
/* System interrupt init*/
|
||||||
/* MemoryManagement_IRQn interrupt configuration */
|
/* MemoryManagement_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(MemoryManagement_IRQn, 0, 0);
|
||||||
/* BusFault_IRQn interrupt configuration */
|
/* BusFault_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(BusFault_IRQn, 0, 0);
|
||||||
/* UsageFault_IRQn interrupt configuration */
|
/* UsageFault_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(UsageFault_IRQn, 0, 0);
|
||||||
/* SVCall_IRQn interrupt configuration */
|
/* SVCall_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(SVCall_IRQn, 0, 0);
|
||||||
/* DebugMonitor_IRQn interrupt configuration */
|
/* DebugMonitor_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
|
HAL_NVIC_SetPriority(DebugMonitor_IRQn, 0, 0);
|
||||||
/* PendSV_IRQn interrupt configuration */
|
/* PendSV_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
|
HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0);
|
||||||
/* SysTick_IRQn interrupt configuration */
|
/* SysTick_IRQn interrupt configuration */
|
||||||
HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
|
HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
|
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
|
||||||
|
|
||||||
GPIO_InitTypeDef GPIO_InitStruct;
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
if (hadc->Instance == ADC1) {
|
if (hadc->Instance == ADC1) {
|
||||||
__HAL_RCC_ADC1_CLK_ENABLE()
|
__HAL_RCC_ADC1_CLK_ENABLE()
|
||||||
;
|
;
|
||||||
|
|
||||||
/* ADC1 DMA Init */
|
/* ADC1 DMA Init */
|
||||||
/* ADC1 Init */
|
/* ADC1 Init */
|
||||||
hdma_adc1.Instance = DMA1_Channel1;
|
hdma_adc1.Instance = DMA1_Channel1;
|
||||||
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||||
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
|
hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||||
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
|
hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
|
||||||
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
|
||||||
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
|
||||||
hdma_adc1.Init.Mode = DMA_CIRCULAR;
|
hdma_adc1.Init.Mode = DMA_CIRCULAR;
|
||||||
hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
|
hdma_adc1.Init.Priority = DMA_PRIORITY_VERY_HIGH;
|
||||||
HAL_DMA_Init(&hdma_adc1);
|
HAL_DMA_Init(&hdma_adc1);
|
||||||
|
|
||||||
__HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1);
|
__HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1);
|
||||||
|
|
||||||
/* ADC1 interrupt Init */
|
/* ADC1 interrupt Init */
|
||||||
HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);
|
HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);
|
||||||
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
|
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
|
||||||
} else {
|
} else {
|
||||||
__HAL_RCC_ADC2_CLK_ENABLE()
|
__HAL_RCC_ADC2_CLK_ENABLE()
|
||||||
;
|
;
|
||||||
|
|
||||||
/**ADC2 GPIO Configuration
|
/**ADC2 GPIO Configuration
|
||||||
PB0 ------> ADC2_IN8
|
PB0 ------> ADC2_IN8
|
||||||
PB1 ------> ADC2_IN9
|
PB1 ------> ADC2_IN9
|
||||||
*/
|
*/
|
||||||
GPIO_InitStruct.Pin = TIP_TEMP_Pin;
|
GPIO_InitStruct.Pin = TIP_TEMP_Pin;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
|
||||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
/* ADC2 interrupt Init */
|
/* ADC2 interrupt Init */
|
||||||
HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);
|
HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);
|
||||||
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
|
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {
|
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {
|
||||||
|
|
||||||
GPIO_InitTypeDef GPIO_InitStruct;
|
GPIO_InitTypeDef GPIO_InitStruct;
|
||||||
/**I2C1 GPIO Configuration
|
/**I2C1 GPIO Configuration
|
||||||
PB6 ------> I2C1_SCL
|
PB6 ------> I2C1_SCL
|
||||||
PB7 ------> I2C1_SDA
|
PB7 ------> I2C1_SDA
|
||||||
*/
|
*/
|
||||||
GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin;
|
GPIO_InitStruct.Pin = SCL_Pin | SDA_Pin;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
|
||||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
/* Peripheral clock enable */
|
/* Peripheral clock enable */
|
||||||
__HAL_RCC_I2C1_CLK_ENABLE()
|
__HAL_RCC_I2C1_CLK_ENABLE()
|
||||||
;
|
;
|
||||||
/* I2C1 DMA Init */
|
/* I2C1 DMA Init */
|
||||||
/* I2C1_RX Init */
|
/* I2C1_RX Init */
|
||||||
hdma_i2c1_rx.Instance = DMA1_Channel7;
|
hdma_i2c1_rx.Instance = DMA1_Channel7;
|
||||||
hdma_i2c1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
hdma_i2c1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||||
hdma_i2c1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
hdma_i2c1_rx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||||
hdma_i2c1_rx.Init.MemInc = DMA_MINC_ENABLE;
|
hdma_i2c1_rx.Init.MemInc = DMA_MINC_ENABLE;
|
||||||
hdma_i2c1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
hdma_i2c1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||||
hdma_i2c1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
hdma_i2c1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||||
hdma_i2c1_rx.Init.Mode = DMA_NORMAL;
|
hdma_i2c1_rx.Init.Mode = DMA_NORMAL;
|
||||||
hdma_i2c1_rx.Init.Priority = DMA_PRIORITY_LOW;
|
hdma_i2c1_rx.Init.Priority = DMA_PRIORITY_LOW;
|
||||||
HAL_DMA_Init(&hdma_i2c1_rx);
|
HAL_DMA_Init(&hdma_i2c1_rx);
|
||||||
|
|
||||||
__HAL_LINKDMA(hi2c, hdmarx, hdma_i2c1_rx);
|
__HAL_LINKDMA(hi2c, hdmarx, hdma_i2c1_rx);
|
||||||
|
|
||||||
/* I2C1_TX Init */
|
/* I2C1_TX Init */
|
||||||
hdma_i2c1_tx.Instance = DMA1_Channel6;
|
hdma_i2c1_tx.Instance = DMA1_Channel6;
|
||||||
hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
hdma_i2c1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||||
hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
hdma_i2c1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
|
||||||
hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE;
|
hdma_i2c1_tx.Init.MemInc = DMA_MINC_ENABLE;
|
||||||
hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
hdma_i2c1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
|
||||||
hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
hdma_i2c1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
|
||||||
hdma_i2c1_tx.Init.Mode = DMA_NORMAL;
|
hdma_i2c1_tx.Init.Mode = DMA_NORMAL;
|
||||||
hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
|
hdma_i2c1_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
|
||||||
HAL_DMA_Init(&hdma_i2c1_tx);
|
HAL_DMA_Init(&hdma_i2c1_tx);
|
||||||
|
|
||||||
__HAL_LINKDMA(hi2c, hdmatx, hdma_i2c1_tx);
|
__HAL_LINKDMA(hi2c, hdmatx, hdma_i2c1_tx);
|
||||||
|
|
||||||
/* I2C1 interrupt Init */
|
/* I2C1 interrupt Init */
|
||||||
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 15, 0);
|
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 15, 0);
|
||||||
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
|
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
|
||||||
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 15, 0);
|
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 15, 0);
|
||||||
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
|
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) {
|
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) {
|
||||||
if (htim_base->Instance == TIM3) {
|
if (htim_base->Instance == TIM3) {
|
||||||
/* Peripheral clock enable */
|
/* Peripheral clock enable */
|
||||||
__HAL_RCC_TIM3_CLK_ENABLE()
|
__HAL_RCC_TIM3_CLK_ENABLE()
|
||||||
;
|
;
|
||||||
} else if (htim_base->Instance == TIM2) {
|
} else if (htim_base->Instance == TIM2) {
|
||||||
/* Peripheral clock enable */
|
/* Peripheral clock enable */
|
||||||
__HAL_RCC_TIM2_CLK_ENABLE()
|
__HAL_RCC_TIM2_CLK_ENABLE()
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,158 +1,158 @@
|
|||||||
/**
|
/**
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @file stm32f1xx_hal_timebase_TIM.c
|
* @file stm32f1xx_hal_timebase_TIM.c
|
||||||
* @brief HAL time base based on the hardware TIM.
|
* @brief HAL time base based on the hardware TIM.
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* This notice applies to any and all portions of this file
|
* This notice applies to any and all portions of this file
|
||||||
* that are not between comment pairs USER CODE BEGIN and
|
* that are not between comment pairs USER CODE BEGIN and
|
||||||
* USER CODE END. Other portions of this file, whether
|
* USER CODE END. Other portions of this file, whether
|
||||||
* inserted by the user or by software development tools
|
* inserted by the user or by software development tools
|
||||||
* are owned by their respective copyright owners.
|
* are owned by their respective copyright owners.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2017 STMicroelectronics International N.V.
|
* Copyright (c) 2017 STMicroelectronics International N.V.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted, provided that the following conditions are met:
|
* modification, are permitted, provided that the following conditions are met:
|
||||||
*
|
*
|
||||||
* 1. Redistribution of source code must retain the above copyright notice,
|
* 1. Redistribution of source code must retain the above copyright notice,
|
||||||
* this list of conditions and the following disclaimer.
|
* this list of conditions and the following disclaimer.
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
* this list of conditions and the following disclaimer in the documentation
|
* this list of conditions and the following disclaimer in the documentation
|
||||||
* and/or other materials provided with the distribution.
|
* and/or other materials provided with the distribution.
|
||||||
* 3. Neither the name of STMicroelectronics nor the names of other
|
* 3. Neither the name of STMicroelectronics nor the names of other
|
||||||
* contributors to this software may be used to endorse or promote products
|
* contributors to this software may be used to endorse or promote products
|
||||||
* derived from this software without specific written permission.
|
* derived from this software without specific written permission.
|
||||||
* 4. This software, including modifications and/or derivative works of this
|
* 4. This software, including modifications and/or derivative works of this
|
||||||
* software, must execute solely and exclusively on microcontroller or
|
* software, must execute solely and exclusively on microcontroller or
|
||||||
* microprocessor devices manufactured by or for STMicroelectronics.
|
* microprocessor devices manufactured by or for STMicroelectronics.
|
||||||
* 5. Redistribution and use of this software other than as permitted under
|
* 5. Redistribution and use of this software other than as permitted under
|
||||||
* this license is void and will automatically terminate your rights under
|
* this license is void and will automatically terminate your rights under
|
||||||
* this license.
|
* this license.
|
||||||
*
|
*
|
||||||
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||||||
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||||
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
|
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
|
||||||
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||||
* SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
* SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
/* Includes ------------------------------------------------------------------*/
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
#include "stm32f1xx_hal_tim.h"
|
#include "stm32f1xx_hal_tim.h"
|
||||||
/** @addtogroup STM32F7xx_HAL_Examples
|
/** @addtogroup STM32F7xx_HAL_Examples
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** @addtogroup HAL_TimeBase
|
/** @addtogroup HAL_TimeBase
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
/* Private define ------------------------------------------------------------*/
|
/* Private define ------------------------------------------------------------*/
|
||||||
/* Private macro -------------------------------------------------------------*/
|
/* Private macro -------------------------------------------------------------*/
|
||||||
/* Private variables ---------------------------------------------------------*/
|
/* Private variables ---------------------------------------------------------*/
|
||||||
TIM_HandleTypeDef htim1;
|
TIM_HandleTypeDef htim1;
|
||||||
uint32_t uwIncrementState = 0;
|
uint32_t uwIncrementState = 0;
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
/* Private functions ---------------------------------------------------------*/
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function configures the TIM1 as a time base source.
|
* @brief This function configures the TIM1 as a time base source.
|
||||||
* The time source is configured to have 1ms time base with a dedicated
|
* The time source is configured to have 1ms time base with a dedicated
|
||||||
* Tick interrupt priority.
|
* Tick interrupt priority.
|
||||||
* @note This function is called automatically at the beginning of program after
|
* @note This function is called automatically at the beginning of program after
|
||||||
* reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
|
* reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig().
|
||||||
* @param TickPriority: Tick interrupt priorty.
|
* @param TickPriority: Tick interrupt priorty.
|
||||||
* @retval HAL status
|
* @retval HAL status
|
||||||
*/
|
*/
|
||||||
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
||||||
{
|
{
|
||||||
RCC_ClkInitTypeDef clkconfig;
|
RCC_ClkInitTypeDef clkconfig;
|
||||||
uint32_t uwTimclock = 0;
|
uint32_t uwTimclock = 0;
|
||||||
uint32_t uwPrescalerValue = 0;
|
uint32_t uwPrescalerValue = 0;
|
||||||
uint32_t pFLatency;
|
uint32_t pFLatency;
|
||||||
|
|
||||||
/*Configure the TIM1 IRQ priority */
|
/*Configure the TIM1 IRQ priority */
|
||||||
HAL_NVIC_SetPriority(TIM1_UP_IRQn, TickPriority ,0);
|
HAL_NVIC_SetPriority(TIM1_UP_IRQn, TickPriority ,0);
|
||||||
|
|
||||||
/* Enable the TIM1 global Interrupt */
|
/* Enable the TIM1 global Interrupt */
|
||||||
HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
|
HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
|
||||||
|
|
||||||
/* Enable TIM1 clock */
|
/* Enable TIM1 clock */
|
||||||
__HAL_RCC_TIM1_CLK_ENABLE();
|
__HAL_RCC_TIM1_CLK_ENABLE();
|
||||||
|
|
||||||
/* Get clock configuration */
|
/* Get clock configuration */
|
||||||
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
|
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
|
||||||
|
|
||||||
/* Compute TIM1 clock */
|
/* Compute TIM1 clock */
|
||||||
uwTimclock = HAL_RCC_GetPCLK2Freq();
|
uwTimclock = HAL_RCC_GetPCLK2Freq();
|
||||||
|
|
||||||
/* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */
|
/* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */
|
||||||
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
|
uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000) - 1);
|
||||||
|
|
||||||
/* Initialize TIM1 */
|
/* Initialize TIM1 */
|
||||||
htim1.Instance = TIM1;
|
htim1.Instance = TIM1;
|
||||||
|
|
||||||
/* Initialize TIMx peripheral as follow:
|
/* Initialize TIMx peripheral as follow:
|
||||||
+ Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base.
|
+ Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base.
|
||||||
+ Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
|
+ Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
|
||||||
+ ClockDivision = 0
|
+ ClockDivision = 0
|
||||||
+ Counter direction = Up
|
+ Counter direction = Up
|
||||||
*/
|
*/
|
||||||
htim1.Init.Period = (1000000 / 1000) - 1;
|
htim1.Init.Period = (1000000 / 1000) - 1;
|
||||||
htim1.Init.Prescaler = uwPrescalerValue;
|
htim1.Init.Prescaler = uwPrescalerValue;
|
||||||
htim1.Init.ClockDivision = 0;
|
htim1.Init.ClockDivision = 0;
|
||||||
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
|
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
|
||||||
if(HAL_TIM_Base_Init(&htim1) == HAL_OK)
|
if(HAL_TIM_Base_Init(&htim1) == HAL_OK)
|
||||||
{
|
{
|
||||||
/* Start the TIM time Base generation in interrupt mode */
|
/* Start the TIM time Base generation in interrupt mode */
|
||||||
return HAL_TIM_Base_Start_IT(&htim1);
|
return HAL_TIM_Base_Start_IT(&htim1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return function status */
|
/* Return function status */
|
||||||
return HAL_ERROR;
|
return HAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Suspend Tick increment.
|
* @brief Suspend Tick increment.
|
||||||
* @note Disable the tick increment by disabling TIM1 update interrupt.
|
* @note Disable the tick increment by disabling TIM1 update interrupt.
|
||||||
* @param None
|
* @param None
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
void HAL_SuspendTick(void)
|
void HAL_SuspendTick(void)
|
||||||
{
|
{
|
||||||
/* Disable TIM1 update Interrupt */
|
/* Disable TIM1 update Interrupt */
|
||||||
__HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE);
|
__HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Resume Tick increment.
|
* @brief Resume Tick increment.
|
||||||
* @note Enable the tick increment by Enabling TIM1 update interrupt.
|
* @note Enable the tick increment by Enabling TIM1 update interrupt.
|
||||||
* @param None
|
* @param None
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
void HAL_ResumeTick(void)
|
void HAL_ResumeTick(void)
|
||||||
{
|
{
|
||||||
/* Enable TIM1 Update interrupt */
|
/* Enable TIM1 Update interrupt */
|
||||||
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);
|
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||||
@@ -1,84 +1,84 @@
|
|||||||
// This is the stock standard STM interrupt file full of handlers
|
// This is the stock standard STM interrupt file full of handlers
|
||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
#include "stm32f1xx.h"
|
#include "stm32f1xx.h"
|
||||||
#include "stm32f1xx_it.h"
|
#include "stm32f1xx_it.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "Setup.h"
|
#include "Setup.h"
|
||||||
|
|
||||||
extern TIM_HandleTypeDef htim1; //used for the systick
|
extern TIM_HandleTypeDef htim1; //used for the systick
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* Cortex-M3 Processor Interruption and Exception Handlers */
|
/* Cortex-M3 Processor Interruption and Exception Handlers */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
void NMI_Handler(void) {
|
void NMI_Handler(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//We have the assembly for a breakpoint trigger here to halt the system when a debugger is connected
|
//We have the assembly for a breakpoint trigger here to halt the system when a debugger is connected
|
||||||
// Hardfault handler, often a screwup in the code
|
// Hardfault handler, often a screwup in the code
|
||||||
void HardFault_Handler(void) {
|
void HardFault_Handler(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Memory management unit had an error
|
// Memory management unit had an error
|
||||||
void MemManage_Handler(void) {
|
void MemManage_Handler(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prefetcher or busfault occured
|
// Prefetcher or busfault occured
|
||||||
void BusFault_Handler(void) {
|
void BusFault_Handler(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void UsageFault_Handler(void) {
|
void UsageFault_Handler(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DebugMon_Handler(void) {
|
void DebugMon_Handler(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Systick is used by FreeRTOS tick
|
// Systick is used by FreeRTOS tick
|
||||||
void SysTick_Handler(void) {
|
void SysTick_Handler(void) {
|
||||||
osSystickHandler();
|
osSystickHandler();
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
/* STM32F1xx Peripheral Interrupt Handlers */
|
/* STM32F1xx Peripheral Interrupt Handlers */
|
||||||
/* Add here the Interrupt Handlers for the used peripherals. */
|
/* Add here the Interrupt Handlers for the used peripherals. */
|
||||||
/* For the available peripheral interrupt handler names, */
|
/* For the available peripheral interrupt handler names, */
|
||||||
/* please refer to the startup file. */
|
/* please refer to the startup file. */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
// DMA used to move the ADC readings into system ram
|
// DMA used to move the ADC readings into system ram
|
||||||
void DMA1_Channel1_IRQHandler(void) {
|
void DMA1_Channel1_IRQHandler(void) {
|
||||||
HAL_DMA_IRQHandler(&hdma_adc1);
|
HAL_DMA_IRQHandler(&hdma_adc1);
|
||||||
}
|
}
|
||||||
//ADC interrupt used for DMA
|
//ADC interrupt used for DMA
|
||||||
void ADC1_2_IRQHandler(void) {
|
void ADC1_2_IRQHandler(void) {
|
||||||
HAL_ADC_IRQHandler(&hadc1);
|
HAL_ADC_IRQHandler(&hadc1);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Timer 1 has overflowed, used for HAL ticks
|
//Timer 1 has overflowed, used for HAL ticks
|
||||||
void TIM1_UP_IRQHandler(void) {
|
void TIM1_UP_IRQHandler(void) {
|
||||||
HAL_TIM_IRQHandler(&htim1);
|
HAL_TIM_IRQHandler(&htim1);
|
||||||
}
|
}
|
||||||
//Timer 3 is used for the PWM output to the tip
|
//Timer 3 is used for the PWM output to the tip
|
||||||
void TIM3_IRQHandler(void) {
|
void TIM3_IRQHandler(void) {
|
||||||
HAL_TIM_IRQHandler(&htim3);
|
HAL_TIM_IRQHandler(&htim3);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Timer 2 is used for co-ordination of PWM & ADC
|
//Timer 2 is used for co-ordination of PWM & ADC
|
||||||
void TIM2_IRQHandler(void) {
|
void TIM2_IRQHandler(void) {
|
||||||
HAL_TIM_IRQHandler(&htim2);
|
HAL_TIM_IRQHandler(&htim2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void I2C1_EV_IRQHandler(void) {
|
void I2C1_EV_IRQHandler(void) {
|
||||||
HAL_I2C_EV_IRQHandler(&hi2c1);
|
HAL_I2C_EV_IRQHandler(&hi2c1);
|
||||||
}
|
}
|
||||||
void I2C1_ER_IRQHandler(void) {
|
void I2C1_ER_IRQHandler(void) {
|
||||||
HAL_I2C_ER_IRQHandler(&hi2c1);
|
HAL_I2C_ER_IRQHandler(&hi2c1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DMA1_Channel6_IRQHandler(void) {
|
void DMA1_Channel6_IRQHandler(void) {
|
||||||
HAL_DMA_IRQHandler(&hdma_i2c1_tx);
|
HAL_DMA_IRQHandler(&hdma_i2c1_tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DMA1_Channel7_IRQHandler(void) {
|
void DMA1_Channel7_IRQHandler(void) {
|
||||||
HAL_DMA_IRQHandler(&hdma_i2c1_rx);
|
HAL_DMA_IRQHandler(&hdma_i2c1_rx);
|
||||||
}
|
}
|
||||||
@@ -1,317 +1,317 @@
|
|||||||
// This file was automatically generated by the STM Cube software
|
// This file was automatically generated by the STM Cube software
|
||||||
// And as such, is BSD licneced from STM
|
// And as such, is BSD licneced from STM
|
||||||
#include "stm32f1xx.h"
|
#include "stm32f1xx.h"
|
||||||
|
|
||||||
#if !defined (HSI_VALUE)
|
#if !defined (HSI_VALUE)
|
||||||
#define HSI_VALUE 8000000U /*!< Default value of the Internal oscillator in Hz.
|
#define HSI_VALUE 8000000U /*!< Default value of the Internal oscillator in Hz.
|
||||||
This value can be provided and adapted by the user application. */
|
This value can be provided and adapted by the user application. */
|
||||||
#endif /* HSI_VALUE */
|
#endif /* HSI_VALUE */
|
||||||
|
|
||||||
/*!< Uncomment the following line if you need to use external SRAM */
|
/*!< Uncomment the following line if you need to use external SRAM */
|
||||||
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
|
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
|
||||||
/* #define DATA_IN_ExtSRAM */
|
/* #define DATA_IN_ExtSRAM */
|
||||||
#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */
|
#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */
|
||||||
#ifndef LOCAL_BUILD
|
#ifndef LOCAL_BUILD
|
||||||
#define VECT_TAB_OFFSET 0x00004000U /*!< Vector Table base offset field.
|
#define VECT_TAB_OFFSET 0x00004000U /*!< Vector Table base offset field.
|
||||||
This value must be a multiple of 0x200. */
|
This value must be a multiple of 0x200. */
|
||||||
#else
|
#else
|
||||||
#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
|
#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
|
||||||
This value must be a multiple of 0x200. */
|
This value must be a multiple of 0x200. */
|
||||||
#warning LOCAL_BUILD SETUP
|
#warning LOCAL_BUILD SETUP
|
||||||
#endif
|
#endif
|
||||||
//We offset this by 0x4000 to because of the bootloader
|
//We offset this by 0x4000 to because of the bootloader
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
* Clock Definitions
|
* Clock Definitions
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
#if defined(STM32F100xB) ||defined(STM32F100xE)
|
#if defined(STM32F100xB) ||defined(STM32F100xE)
|
||||||
uint32_t SystemCoreClock = 24000000U; /*!< System Clock Frequency (Core Clock) */
|
uint32_t SystemCoreClock = 24000000U; /*!< System Clock Frequency (Core Clock) */
|
||||||
#else /*!< HSI Selected as System Clock source */
|
#else /*!< HSI Selected as System Clock source */
|
||||||
uint32_t SystemCoreClock = 64000000U; /*!< System Clock Frequency (Core Clock) */
|
uint32_t SystemCoreClock = 64000000U; /*!< System Clock Frequency (Core Clock) */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const uint8_t AHBPrescTable[16U] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
|
const uint8_t AHBPrescTable[16U] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
|
||||||
const uint8_t APBPrescTable[8U] = {0, 0, 0, 0, 1, 2, 3, 4};
|
const uint8_t APBPrescTable[8U] = {0, 0, 0, 0, 1, 2, 3, 4};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Setup the microcontroller system
|
* @brief Setup the microcontroller system
|
||||||
* Initialize the Embedded Flash Interface, the PLL and update the
|
* Initialize the Embedded Flash Interface, the PLL and update the
|
||||||
* SystemCoreClock variable.
|
* SystemCoreClock variable.
|
||||||
* @note This function should be used only after reset.
|
* @note This function should be used only after reset.
|
||||||
* @param None
|
* @param None
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
void SystemInit (void)
|
void SystemInit (void)
|
||||||
{
|
{
|
||||||
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
|
/* Reset the RCC clock configuration to the default reset state(for debug purpose) */
|
||||||
/* Set HSION bit */
|
/* Set HSION bit */
|
||||||
RCC->CR |= 0x00000001U;
|
RCC->CR |= 0x00000001U;
|
||||||
|
|
||||||
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
|
/* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */
|
||||||
#if !defined(STM32F105xC) && !defined(STM32F107xC)
|
#if !defined(STM32F105xC) && !defined(STM32F107xC)
|
||||||
RCC->CFGR &= 0xF8FF0000U;
|
RCC->CFGR &= 0xF8FF0000U;
|
||||||
#else
|
#else
|
||||||
RCC->CFGR &= 0xF0FF0000U;
|
RCC->CFGR &= 0xF0FF0000U;
|
||||||
#endif /* STM32F105xC */
|
#endif /* STM32F105xC */
|
||||||
|
|
||||||
/* Reset HSEON, CSSON and PLLON bits */
|
/* Reset HSEON, CSSON and PLLON bits */
|
||||||
RCC->CR &= 0xFEF6FFFFU;
|
RCC->CR &= 0xFEF6FFFFU;
|
||||||
|
|
||||||
/* Reset HSEBYP bit */
|
/* Reset HSEBYP bit */
|
||||||
RCC->CR &= 0xFFFBFFFFU;
|
RCC->CR &= 0xFFFBFFFFU;
|
||||||
|
|
||||||
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
|
/* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */
|
||||||
RCC->CFGR &= 0xFF80FFFFU;
|
RCC->CFGR &= 0xFF80FFFFU;
|
||||||
|
|
||||||
#if defined(STM32F105xC) || defined(STM32F107xC)
|
#if defined(STM32F105xC) || defined(STM32F107xC)
|
||||||
/* Reset PLL2ON and PLL3ON bits */
|
/* Reset PLL2ON and PLL3ON bits */
|
||||||
RCC->CR &= 0xEBFFFFFFU;
|
RCC->CR &= 0xEBFFFFFFU;
|
||||||
|
|
||||||
/* Disable all interrupts and clear pending bits */
|
/* Disable all interrupts and clear pending bits */
|
||||||
RCC->CIR = 0x00FF0000U;
|
RCC->CIR = 0x00FF0000U;
|
||||||
|
|
||||||
/* Reset CFGR2 register */
|
/* Reset CFGR2 register */
|
||||||
RCC->CFGR2 = 0x00000000U;
|
RCC->CFGR2 = 0x00000000U;
|
||||||
#elif defined(STM32F100xB) || defined(STM32F100xE)
|
#elif defined(STM32F100xB) || defined(STM32F100xE)
|
||||||
/* Disable all interrupts and clear pending bits */
|
/* Disable all interrupts and clear pending bits */
|
||||||
RCC->CIR = 0x009F0000U;
|
RCC->CIR = 0x009F0000U;
|
||||||
|
|
||||||
/* Reset CFGR2 register */
|
/* Reset CFGR2 register */
|
||||||
RCC->CFGR2 = 0x00000000U;
|
RCC->CFGR2 = 0x00000000U;
|
||||||
#else
|
#else
|
||||||
/* Disable all interrupts and clear pending bits */
|
/* Disable all interrupts and clear pending bits */
|
||||||
RCC->CIR = 0x009F0000U;
|
RCC->CIR = 0x009F0000U;
|
||||||
#endif /* STM32F105xC */
|
#endif /* STM32F105xC */
|
||||||
|
|
||||||
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
|
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
|
||||||
#ifdef DATA_IN_ExtSRAM
|
#ifdef DATA_IN_ExtSRAM
|
||||||
SystemInit_ExtMemCtl();
|
SystemInit_ExtMemCtl();
|
||||||
#endif /* DATA_IN_ExtSRAM */
|
#endif /* DATA_IN_ExtSRAM */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VECT_TAB_SRAM
|
#ifdef VECT_TAB_SRAM
|
||||||
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
|
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
|
||||||
#else
|
#else
|
||||||
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
|
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Update SystemCoreClock variable according to Clock Register Values.
|
* @brief Update SystemCoreClock variable according to Clock Register Values.
|
||||||
* The SystemCoreClock variable contains the core clock (HCLK), it can
|
* The SystemCoreClock variable contains the core clock (HCLK), it can
|
||||||
* be used by the user application to setup the SysTick timer or configure
|
* be used by the user application to setup the SysTick timer or configure
|
||||||
* other parameters.
|
* other parameters.
|
||||||
*
|
*
|
||||||
* @note Each time the core clock (HCLK) changes, this function must be called
|
* @note Each time the core clock (HCLK) changes, this function must be called
|
||||||
* to update SystemCoreClock variable value. Otherwise, any configuration
|
* to update SystemCoreClock variable value. Otherwise, any configuration
|
||||||
* based on this variable will be incorrect.
|
* based on this variable will be incorrect.
|
||||||
*
|
*
|
||||||
* @note - The system frequency computed by this function is not the real
|
* @note - The system frequency computed by this function is not the real
|
||||||
* frequency in the chip. It is calculated based on the predefined
|
* frequency in the chip. It is calculated based on the predefined
|
||||||
* constant and the selected clock source:
|
* constant and the selected clock source:
|
||||||
*
|
*
|
||||||
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
|
* - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
|
||||||
*
|
*
|
||||||
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
|
* - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
|
||||||
*
|
*
|
||||||
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
|
* - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
|
||||||
* or HSI_VALUE(*) multiplied by the PLL factors.
|
* or HSI_VALUE(*) multiplied by the PLL factors.
|
||||||
*
|
*
|
||||||
* (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value
|
* (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value
|
||||||
* 8 MHz) but the real value may vary depending on the variations
|
* 8 MHz) but the real value may vary depending on the variations
|
||||||
* in voltage and temperature.
|
* in voltage and temperature.
|
||||||
*
|
*
|
||||||
* (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value
|
* (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value
|
||||||
* 8 MHz or 25 MHz, depending on the product used), user has to ensure
|
* 8 MHz or 25 MHz, depending on the product used), user has to ensure
|
||||||
* that HSE_VALUE is same as the real frequency of the crystal used.
|
* that HSE_VALUE is same as the real frequency of the crystal used.
|
||||||
* Otherwise, this function may have wrong result.
|
* Otherwise, this function may have wrong result.
|
||||||
*
|
*
|
||||||
* - The result of this function could be not correct when using fractional
|
* - The result of this function could be not correct when using fractional
|
||||||
* value for HSE crystal.
|
* value for HSE crystal.
|
||||||
* @param None
|
* @param None
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
void SystemCoreClockUpdate (void)
|
void SystemCoreClockUpdate (void)
|
||||||
{
|
{
|
||||||
uint32_t tmp = 0U, pllmull = 0U, pllsource = 0U;
|
uint32_t tmp = 0U, pllmull = 0U, pllsource = 0U;
|
||||||
|
|
||||||
#if defined(STM32F105xC) || defined(STM32F107xC)
|
#if defined(STM32F105xC) || defined(STM32F107xC)
|
||||||
uint32_t prediv1source = 0U, prediv1factor = 0U, prediv2factor = 0U, pll2mull = 0U;
|
uint32_t prediv1source = 0U, prediv1factor = 0U, prediv2factor = 0U, pll2mull = 0U;
|
||||||
#endif /* STM32F105xC */
|
#endif /* STM32F105xC */
|
||||||
|
|
||||||
#if defined(STM32F100xB) || defined(STM32F100xE)
|
#if defined(STM32F100xB) || defined(STM32F100xE)
|
||||||
uint32_t prediv1factor = 0U;
|
uint32_t prediv1factor = 0U;
|
||||||
#endif /* STM32F100xB or STM32F100xE */
|
#endif /* STM32F100xB or STM32F100xE */
|
||||||
|
|
||||||
/* Get SYSCLK source -------------------------------------------------------*/
|
/* Get SYSCLK source -------------------------------------------------------*/
|
||||||
tmp = RCC->CFGR & RCC_CFGR_SWS;
|
tmp = RCC->CFGR & RCC_CFGR_SWS;
|
||||||
|
|
||||||
switch (tmp)
|
switch (tmp)
|
||||||
{
|
{
|
||||||
case 0x00U: /* HSI used as system clock */
|
case 0x00U: /* HSI used as system clock */
|
||||||
SystemCoreClock = HSI_VALUE;
|
SystemCoreClock = HSI_VALUE;
|
||||||
break;
|
break;
|
||||||
case 0x04U: /* HSE used as system clock */
|
case 0x04U: /* HSE used as system clock */
|
||||||
SystemCoreClock = HSE_VALUE;
|
SystemCoreClock = HSE_VALUE;
|
||||||
break;
|
break;
|
||||||
case 0x08U: /* PLL used as system clock */
|
case 0x08U: /* PLL used as system clock */
|
||||||
|
|
||||||
/* Get PLL clock source and multiplication factor ----------------------*/
|
/* Get PLL clock source and multiplication factor ----------------------*/
|
||||||
pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
|
pllmull = RCC->CFGR & RCC_CFGR_PLLMULL;
|
||||||
pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
|
pllsource = RCC->CFGR & RCC_CFGR_PLLSRC;
|
||||||
|
|
||||||
#if !defined(STM32F105xC) && !defined(STM32F107xC)
|
#if !defined(STM32F105xC) && !defined(STM32F107xC)
|
||||||
pllmull = ( pllmull >> 18U) + 2U;
|
pllmull = ( pllmull >> 18U) + 2U;
|
||||||
|
|
||||||
if (pllsource == 0x00U)
|
if (pllsource == 0x00U)
|
||||||
{
|
{
|
||||||
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
|
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
|
||||||
SystemCoreClock = (HSI_VALUE >> 1U) * pllmull;
|
SystemCoreClock = (HSI_VALUE >> 1U) * pllmull;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if defined(STM32F100xB) || defined(STM32F100xE)
|
#if defined(STM32F100xB) || defined(STM32F100xE)
|
||||||
prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U;
|
prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U;
|
||||||
/* HSE oscillator clock selected as PREDIV1 clock entry */
|
/* HSE oscillator clock selected as PREDIV1 clock entry */
|
||||||
SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
|
SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
|
||||||
#else
|
#else
|
||||||
/* HSE selected as PLL clock entry */
|
/* HSE selected as PLL clock entry */
|
||||||
if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET)
|
if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET)
|
||||||
{/* HSE oscillator clock divided by 2 */
|
{/* HSE oscillator clock divided by 2 */
|
||||||
SystemCoreClock = (HSE_VALUE >> 1U) * pllmull;
|
SystemCoreClock = (HSE_VALUE >> 1U) * pllmull;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SystemCoreClock = HSE_VALUE * pllmull;
|
SystemCoreClock = HSE_VALUE * pllmull;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
pllmull = pllmull >> 18U;
|
pllmull = pllmull >> 18U;
|
||||||
|
|
||||||
if (pllmull != 0x0DU)
|
if (pllmull != 0x0DU)
|
||||||
{
|
{
|
||||||
pllmull += 2U;
|
pllmull += 2U;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* PLL multiplication factor = PLL input clock * 6.5 */
|
{ /* PLL multiplication factor = PLL input clock * 6.5 */
|
||||||
pllmull = 13U / 2U;
|
pllmull = 13U / 2U;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pllsource == 0x00U)
|
if (pllsource == 0x00U)
|
||||||
{
|
{
|
||||||
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
|
/* HSI oscillator clock divided by 2 selected as PLL clock entry */
|
||||||
SystemCoreClock = (HSI_VALUE >> 1U) * pllmull;
|
SystemCoreClock = (HSI_VALUE >> 1U) * pllmull;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{/* PREDIV1 selected as PLL clock entry */
|
{/* PREDIV1 selected as PLL clock entry */
|
||||||
|
|
||||||
/* Get PREDIV1 clock source and division factor */
|
/* Get PREDIV1 clock source and division factor */
|
||||||
prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC;
|
prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC;
|
||||||
prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U;
|
prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U;
|
||||||
|
|
||||||
if (prediv1source == 0U)
|
if (prediv1source == 0U)
|
||||||
{
|
{
|
||||||
/* HSE oscillator clock selected as PREDIV1 clock entry */
|
/* HSE oscillator clock selected as PREDIV1 clock entry */
|
||||||
SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
|
SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{/* PLL2 clock selected as PREDIV1 clock entry */
|
{/* PLL2 clock selected as PREDIV1 clock entry */
|
||||||
|
|
||||||
/* Get PREDIV2 division factor and PLL2 multiplication factor */
|
/* Get PREDIV2 division factor and PLL2 multiplication factor */
|
||||||
prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4U) + 1U;
|
prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4U) + 1U;
|
||||||
pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8U) + 2U;
|
pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8U) + 2U;
|
||||||
SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull;
|
SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* STM32F105xC */
|
#endif /* STM32F105xC */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
SystemCoreClock = HSI_VALUE;
|
SystemCoreClock = HSI_VALUE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compute HCLK clock frequency ----------------*/
|
/* Compute HCLK clock frequency ----------------*/
|
||||||
/* Get HCLK prescaler */
|
/* Get HCLK prescaler */
|
||||||
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)];
|
tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)];
|
||||||
/* HCLK clock frequency */
|
/* HCLK clock frequency */
|
||||||
SystemCoreClock >>= tmp;
|
SystemCoreClock >>= tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
|
#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)
|
||||||
/**
|
/**
|
||||||
* @brief Setup the external memory controller. Called in startup_stm32f1xx.s
|
* @brief Setup the external memory controller. Called in startup_stm32f1xx.s
|
||||||
* before jump to __main
|
* before jump to __main
|
||||||
* @param None
|
* @param None
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
#ifdef DATA_IN_ExtSRAM
|
#ifdef DATA_IN_ExtSRAM
|
||||||
/**
|
/**
|
||||||
* @brief Setup the external memory controller.
|
* @brief Setup the external memory controller.
|
||||||
* Called in startup_stm32f1xx_xx.s/.c before jump to main.
|
* Called in startup_stm32f1xx_xx.s/.c before jump to main.
|
||||||
* This function configures the external SRAM mounted on STM3210E-EVAL
|
* This function configures the external SRAM mounted on STM3210E-EVAL
|
||||||
* board (STM32 High density devices). This SRAM will be used as program
|
* board (STM32 High density devices). This SRAM will be used as program
|
||||||
* data memory (including heap and stack).
|
* data memory (including heap and stack).
|
||||||
* @param None
|
* @param None
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
void SystemInit_ExtMemCtl(void)
|
void SystemInit_ExtMemCtl(void)
|
||||||
{
|
{
|
||||||
__IO uint32_t tmpreg;
|
__IO uint32_t tmpreg;
|
||||||
/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is
|
/*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is
|
||||||
required, then adjust the Register Addresses */
|
required, then adjust the Register Addresses */
|
||||||
|
|
||||||
/* Enable FSMC clock */
|
/* Enable FSMC clock */
|
||||||
RCC->AHBENR = 0x00000114U;
|
RCC->AHBENR = 0x00000114U;
|
||||||
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
/* Delay after an RCC peripheral clock enabling */
|
||||||
tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN);
|
tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN);
|
||||||
|
|
||||||
/* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */
|
/* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */
|
||||||
RCC->APB2ENR = 0x000001E0U;
|
RCC->APB2ENR = 0x000001E0U;
|
||||||
|
|
||||||
/* Delay after an RCC peripheral clock enabling */
|
/* Delay after an RCC peripheral clock enabling */
|
||||||
tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);
|
tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN);
|
||||||
|
|
||||||
(void)(tmpreg);
|
(void)(tmpreg);
|
||||||
|
|
||||||
/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/
|
/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/
|
||||||
/*---------------- SRAM Address lines configuration -------------------------*/
|
/*---------------- SRAM Address lines configuration -------------------------*/
|
||||||
/*---------------- NOE and NWE configuration --------------------------------*/
|
/*---------------- NOE and NWE configuration --------------------------------*/
|
||||||
/*---------------- NE3 configuration ----------------------------------------*/
|
/*---------------- NE3 configuration ----------------------------------------*/
|
||||||
/*---------------- NBL0, NBL1 configuration ---------------------------------*/
|
/*---------------- NBL0, NBL1 configuration ---------------------------------*/
|
||||||
|
|
||||||
GPIOD->CRL = 0x44BB44BBU;
|
GPIOD->CRL = 0x44BB44BBU;
|
||||||
GPIOD->CRH = 0xBBBBBBBBU;
|
GPIOD->CRH = 0xBBBBBBBBU;
|
||||||
|
|
||||||
GPIOE->CRL = 0xB44444BBU;
|
GPIOE->CRL = 0xB44444BBU;
|
||||||
GPIOE->CRH = 0xBBBBBBBBU;
|
GPIOE->CRH = 0xBBBBBBBBU;
|
||||||
|
|
||||||
GPIOF->CRL = 0x44BBBBBBU;
|
GPIOF->CRL = 0x44BBBBBBU;
|
||||||
GPIOF->CRH = 0xBBBB4444U;
|
GPIOF->CRH = 0xBBBB4444U;
|
||||||
|
|
||||||
GPIOG->CRL = 0x44BBBBBBU;
|
GPIOG->CRL = 0x44BBBBBBU;
|
||||||
GPIOG->CRH = 0x444B4B44U;
|
GPIOG->CRH = 0x444B4B44U;
|
||||||
|
|
||||||
/*---------------- FSMC Configuration ---------------------------------------*/
|
/*---------------- FSMC Configuration ---------------------------------------*/
|
||||||
/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/
|
/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/
|
||||||
|
|
||||||
FSMC_Bank1->BTCR[4U] = 0x00001091U;
|
FSMC_Bank1->BTCR[4U] = 0x00001091U;
|
||||||
FSMC_Bank1->BTCR[5U] = 0x00110212U;
|
FSMC_Bank1->BTCR[5U] = 0x00110212U;
|
||||||
}
|
}
|
||||||
#endif /* DATA_IN_ExtSRAM */
|
#endif /* DATA_IN_ExtSRAM */
|
||||||
#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */
|
#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
||||||
115
workspace/TS100/Core/Drivers/Buttons.cpp
Normal file
115
workspace/TS100/Core/Drivers/Buttons.cpp
Normal file
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
* Buttons.c
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
#include <Buttons.hpp>
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "task.h"
|
||||||
|
#include "gui.hpp"
|
||||||
|
uint32_t lastButtonTime = 0;
|
||||||
|
|
||||||
|
ButtonState getButtonState() {
|
||||||
|
/*
|
||||||
|
* Read in the buttons and then determine if a state change needs to occur
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the previous state was 00 Then we want to latch the new state if
|
||||||
|
* different & update time
|
||||||
|
* If the previous state was !00 Then we want to search if we trigger long
|
||||||
|
* press (buttons still down), or if release we trigger press
|
||||||
|
* (downtime>filter)
|
||||||
|
*/
|
||||||
|
static uint8_t previousState = 0;
|
||||||
|
static uint32_t previousStateChange = 0;
|
||||||
|
const uint16_t timeout = 40;
|
||||||
|
uint8_t currentState;
|
||||||
|
currentState = (getButtonA()) << 0;
|
||||||
|
currentState |= (getButtonB()) << 1;
|
||||||
|
|
||||||
|
if (currentState)
|
||||||
|
lastButtonTime = xTaskGetTickCount();
|
||||||
|
if (currentState == previousState) {
|
||||||
|
if (currentState == 0)
|
||||||
|
return BUTTON_NONE;
|
||||||
|
if ((xTaskGetTickCount() - previousStateChange) > timeout) {
|
||||||
|
// User has been holding the button down
|
||||||
|
// We want to send a button is held message
|
||||||
|
if (currentState == 0x01)
|
||||||
|
return BUTTON_F_LONG;
|
||||||
|
else if (currentState == 0x02)
|
||||||
|
return BUTTON_B_LONG;
|
||||||
|
else
|
||||||
|
return BUTTON_NONE; // Both being held case, we dont long hold this
|
||||||
|
} else
|
||||||
|
return BUTTON_NONE;
|
||||||
|
} else {
|
||||||
|
// A change in button state has occurred
|
||||||
|
ButtonState retVal = BUTTON_NONE;
|
||||||
|
if (currentState) {
|
||||||
|
// User has pressed a button down (nothing done on down)
|
||||||
|
if (currentState != previousState) {
|
||||||
|
// There has been a change in the button states
|
||||||
|
// If there is a rising edge on one of the buttons from double press we
|
||||||
|
// want to mask that out As users are having issues with not release
|
||||||
|
// both at once
|
||||||
|
if (previousState == 0x03)
|
||||||
|
currentState = 0x03;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// User has released buttons
|
||||||
|
// If they previously had the buttons down we want to check if they were <
|
||||||
|
// long hold and trigger a press
|
||||||
|
if ((xTaskGetTickCount() - previousStateChange) < timeout) {
|
||||||
|
// The user didn't hold the button for long
|
||||||
|
// So we send button press
|
||||||
|
|
||||||
|
if (previousState == 0x01)
|
||||||
|
retVal = BUTTON_F_SHORT;
|
||||||
|
else if (previousState == 0x02)
|
||||||
|
retVal = BUTTON_B_SHORT;
|
||||||
|
else
|
||||||
|
retVal = BUTTON_BOTH; // Both being held case
|
||||||
|
}
|
||||||
|
}
|
||||||
|
previousState = currentState;
|
||||||
|
previousStateChange = xTaskGetTickCount();
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
return BUTTON_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void waitForButtonPress() {
|
||||||
|
// we are just lazy and sleep until user confirms button press
|
||||||
|
// This also eats the button press event!
|
||||||
|
ButtonState buttons = getButtonState();
|
||||||
|
while (buttons) {
|
||||||
|
buttons = getButtonState();
|
||||||
|
GUIDelay();
|
||||||
|
}
|
||||||
|
while (!buttons) {
|
||||||
|
buttons = getButtonState();
|
||||||
|
GUIDelay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void waitForButtonPressOrTimeout(uint32_t timeout) {
|
||||||
|
timeout += xTaskGetTickCount();
|
||||||
|
// calculate the exit point
|
||||||
|
|
||||||
|
ButtonState buttons = getButtonState();
|
||||||
|
while (buttons) {
|
||||||
|
buttons = getButtonState();
|
||||||
|
GUIDelay();
|
||||||
|
if (xTaskGetTickCount() > timeout)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while (!buttons) {
|
||||||
|
buttons = getButtonState();
|
||||||
|
GUIDelay();
|
||||||
|
if (xTaskGetTickCount() > timeout)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
35
workspace/TS100/Core/Drivers/Buttons.hpp
Normal file
35
workspace/TS100/Core/Drivers/Buttons.hpp
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Buttons.h
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
#include "BSP.h"
|
||||||
|
#ifndef INC_BUTTONS_H_
|
||||||
|
#define INC_BUTTONS_H_
|
||||||
|
|
||||||
|
extern uint32_t lastButtonTime;
|
||||||
|
|
||||||
|
enum ButtonState {
|
||||||
|
BUTTON_NONE = 0, /* No buttons pressed / < filter time*/
|
||||||
|
BUTTON_F_SHORT = 1, /* User has pressed the front button*/
|
||||||
|
BUTTON_B_SHORT = 2, /* User has pressed the back button*/
|
||||||
|
BUTTON_F_LONG = 4, /* User is holding the front button*/
|
||||||
|
BUTTON_B_LONG = 8, /* User is holding the back button*/
|
||||||
|
BUTTON_BOTH = 16, /* User has pressed both buttons*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note:
|
||||||
|
* Pressed means press + release, we trigger on a full \__/ pulse
|
||||||
|
* holding means it has gone low, and been low for longer than filter time
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
|
||||||
|
//Returns what buttons are pressed (if any)
|
||||||
|
ButtonState getButtonState();
|
||||||
|
//Helpers
|
||||||
|
void waitForButtonPressOrTimeout(uint32_t timeout);
|
||||||
|
void waitForButtonPress();
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* INC_BUTTONS_H_ */
|
||||||
@@ -1,192 +1,192 @@
|
|||||||
/*
|
/*
|
||||||
* Font.h
|
* Font.h
|
||||||
*
|
*
|
||||||
* Created on: 17 Sep 2016
|
* Created on: 17 Sep 2016
|
||||||
* Author: Ralim
|
* Author: Ralim
|
||||||
*
|
*
|
||||||
* ... This file contains the font...
|
* ... This file contains the font...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FONT_H_
|
#ifndef FONT_H_
|
||||||
#define FONT_H_
|
#define FONT_H_
|
||||||
#include "Translation.h"
|
#include "Translation.h"
|
||||||
|
|
||||||
#define FONT_12_WIDTH 12
|
#define FONT_12_WIDTH 12
|
||||||
// FONTS ARE NO LONGER HERE, MOVED TO PYTHON AUTO GEN
|
// THE MAIN FONTS ARE NO LONGER HERE, MOVED TO PYTHON AUTO GEN
|
||||||
|
// THESE ARE ONLY THE SYMBOL FONTS
|
||||||
|
|
||||||
const uint8_t ExtraFontChars[] = {
|
const uint8_t ExtraFontChars[] = {
|
||||||
//width = 12
|
//width = 12
|
||||||
//height = 16
|
//height = 16
|
||||||
0x00,0x18,0x24,0x24,0x18,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x02,0x02,0x02,0x00,0x00,0x00, // Degrees F
|
0x00,0x18,0x24,0x24,0x18,0xC0,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x02,0x02,0x02,0x00,0x00,0x00, // Degrees F
|
||||||
0x00,0x18,0x24,0x24,0x18,0x80,0x40,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x10,0x10,0x10,0x00,0x00, // Degrees C
|
0x00,0x18,0x24,0x24,0x18,0x80,0x40,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x10,0x10,0x10,0x00,0x00, // Degrees C
|
||||||
0x00,0x00,0x20,0x30,0x38,0xFC,0xFE,0xFC,0x38,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00, // UP arrow
|
0x00,0x00,0x20,0x30,0x38,0xFC,0xFE,0xFC,0x38,0x30,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00, // UP arrow
|
||||||
|
|
||||||
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x00, // Battery Empty
|
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F,0x00, // Battery Empty
|
||||||
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x50,0x50,0x50,0x50,0x50,0x50,0x40,0x3F,0x00, // Battery 1*/
|
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x50,0x50,0x50,0x50,0x50,0x50,0x40,0x3F,0x00, // Battery 1*/
|
||||||
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x58,0x58,0x58,0x58,0x58,0x58,0x40,0x3F,0x00, // Battery 2*/
|
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x58,0x58,0x58,0x58,0x58,0x58,0x40,0x3F,0x00, // Battery 2*/
|
||||||
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5C,0x5C,0x5C,0x5C,0x5C,0x5C,0x40,0x3F,0x00, // Battery 3*/
|
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5C,0x5C,0x5C,0x5C,0x5C,0x5C,0x40,0x3F,0x00, // Battery 3*/
|
||||||
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5E,0x5E,0x5E,0x5E,0x5E,0x5E,0x40,0x3F,0x00, // Battery 4*/
|
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5E,0x5E,0x5E,0x5E,0x5E,0x5E,0x40,0x3F,0x00, // Battery 4*/
|
||||||
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 5*/
|
0x00,0xF0,0x08,0x0E,0x02,0x02,0x02,0x02,0x0E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 5*/
|
||||||
0x00,0xF0,0x08,0x8E,0x82,0x82,0x82,0x82,0x8E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 6*/
|
0x00,0xF0,0x08,0x8E,0x82,0x82,0x82,0x82,0x8E,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 6*/
|
||||||
0x00,0xF0,0x08,0xCE,0xC2,0xC2,0xC2,0xC2,0xCE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 7*/
|
0x00,0xF0,0x08,0xCE,0xC2,0xC2,0xC2,0xC2,0xCE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 7*/
|
||||||
0x00,0xF0,0x08,0xEE,0xE2,0xE2,0xE2,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 8*/
|
0x00,0xF0,0x08,0xEE,0xE2,0xE2,0xE2,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 8*/
|
||||||
0x00,0xF0,0x08,0xEE,0xE2,0xF2,0xF2,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 9*/
|
0x00,0xF0,0x08,0xEE,0xE2,0xF2,0xF2,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 9*/
|
||||||
0x00,0xF0,0x08,0xEE,0xE2,0xFA,0xFA,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 10*/
|
0x00,0xF0,0x08,0xEE,0xE2,0xFA,0xFA,0xE2,0xEE,0x08,0xF0,0x00,0x00,0x3F,0x40,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x40,0x3F,0x00, // Battery 10*/
|
||||||
|
|
||||||
0x00,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x00,0x00,0x38,0x3A,0x39,0x38,0x3A,0x39,0x38,0x3A,0x39,0x10,0x10, // heating
|
0x00,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x38,0xC4,0x00,0x00,0x00,0x38,0x3A,0x39,0x38,0x3A,0x39,0x38,0x3A,0x39,0x10,0x10, // heating
|
||||||
0x00,0x60,0xE0,0xFE,0xE0,0xE0,0xE0,0xE0,0xFE,0xE0,0x60,0x00,0x00,0x00,0x00,0x01,0x03,0xFF,0xFF,0x03,0x01,0x00,0x00,0x00, // AC
|
0x00,0x60,0xE0,0xFE,0xE0,0xE0,0xE0,0xE0,0xFE,0xE0,0x60,0x00,0x00,0x00,0x00,0x01,0x03,0xFF,0xFF,0x03,0x01,0x00,0x00,0x00, // AC
|
||||||
|
|
||||||
0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x82,0x62,0x1A,0x02,0xFC,0x3F,0x40,0x42,0x46,0x4C,0x58,0x46,0x41,0x40,0x40,0x40,0x3F, // ☑ (check box on, menu true)
|
0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x82,0x62,0x1A,0x02,0xFC,0x3F,0x40,0x42,0x46,0x4C,0x58,0x46,0x41,0x40,0x40,0x40,0x3F, // ☑ (check box on, menu true)
|
||||||
0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFC,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F, // ☐ (check box off, menu false)
|
0xFC,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFC,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x3F, // ☐ (check box off, menu false)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
0x00,0x00,0x00,0x80,0x80,0xFE,0xFF,0x83,0x87,0x06,0x00,0x00,0x00,0x00,0x30,0x70,0x60,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00, // Function?
|
0x00,0x00,0x00,0x80,0x80,0xFE,0xFF,0x83,0x87,0x06,0x00,0x00,0x00,0x00,0x30,0x70,0x60,0x7F,0x3F,0x00,0x00,0x00,0x00,0x00, // Function?
|
||||||
0x00,0x70,0xFA,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xFF,0xFE,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // a_
|
0x00,0x70,0xFA,0xDB,0xDB,0xDB,0xDB,0xDB,0xDB,0xFF,0xFE,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // a_
|
||||||
0x00,0x3C,0x7E,0xE7,0xC3,0xC3,0xC3,0xC3,0xE7,0x7E,0x3C,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // 0_
|
0x00,0x3C,0x7E,0xE7,0xC3,0xC3,0xC3,0xC3,0xE7,0x7E,0x3C,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00, // 0_
|
||||||
0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00, // 25% block
|
0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00,0x55,0x00,0xAA,0x00, // 25% block
|
||||||
0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55, // 50% pipe
|
0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55, // 50% pipe
|
||||||
0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF, // 75% block
|
0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF,0xAA,0xFF,0x55,0xFF, // 75% block
|
||||||
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // | pipe
|
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // | pipe
|
||||||
0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // T pipe ,|
|
0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // T pipe ,|
|
||||||
0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // ,| double pipe
|
0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // ,| double pipe
|
||||||
0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // || double pipe
|
0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // || double pipe
|
||||||
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // #NAME?//#NAME?
|
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0xFE,0xFE,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // #NAME?//#NAME?
|
||||||
0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x00,0x00,0x00,0x00,0x00, // ,^ double pupe
|
0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x00,0x00,0x00,0x00,0x00, // ,^ double pupe
|
||||||
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // #NAME?//#NAME?
|
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, // #NAME?//#NAME?
|
||||||
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // ,> pipe
|
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // ,> pipe
|
||||||
0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // _|_ pipe
|
0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // _|_ pipe
|
||||||
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // ,|, pipe
|
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // ,|, pipe
|
||||||
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // |, pipe
|
0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // |, pipe
|
||||||
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // #NAME?//#NAME?
|
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, // #NAME?//#NAME?
|
||||||
0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // #NAME?//#NAME?
|
0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x01,0x01,0x01,0x01,0x01,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // #NAME?//#NAME?
|
||||||
0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // ,> double pipe
|
0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // ,> double pipe
|
||||||
0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // ^, double pipe
|
0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // ^, double pipe
|
||||||
0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // _|_ double pipe
|
0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // _|_ double pipe
|
||||||
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0xFE,0xFE,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // ,|, double pipe
|
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0xFE,0xFE,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // ,|, double pipe
|
||||||
0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // |, double pipe
|
0x00,0x00,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0xFF,0xFF,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // |, double pipe
|
||||||
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // == double pipe
|
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06, // == double pipe
|
||||||
0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0xFE,0xFE,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // #NAME?//#NAME?
|
0xC0,0xC0,0xFF,0xFF,0x00,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0x06,0x06,0xFE,0xFE,0x00,0xFE,0xFE,0x06,0x06,0x06,0x06,0x06, // #NAME?//#NAME?
|
||||||
0x00,0x00,0x00,0x78,0xFC,0xCC,0x8C,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x3E,0x33,0x33,0x3F,0x1E,0x00,0x00,0x00, // Delta lowercase
|
0x00,0x00,0x00,0x78,0xFC,0xCC,0x8C,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x3E,0x33,0x33,0x3F,0x1E,0x00,0x00,0x00, // Delta lowercase
|
||||||
0x00,0x00,0x00,0x00,0x00,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 27 (')
|
0x00,0x00,0x00,0x00,0x00,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // 27 (')
|
||||||
0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00, // ,^ pipe
|
0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00, // ,^ pipe
|
||||||
0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // | , pipe
|
0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,0x01,0x01,0x01, // | , pipe
|
||||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // solid block
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // solid block
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // half block bottom
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // half block bottom
|
||||||
0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00, // 7C (|)
|
0x00,0x00,0x00,0x00,0x00,0xBF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00, // 7C (|)
|
||||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // top half solid block
|
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // top half solid block
|
||||||
0x00,0x00,0x0C,0xFC,0xFC,0x6C,0x60,0x60,0xE0,0xC0,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x36,0x06,0x06,0x07,0x03,0x00,0x00, // DE small
|
0x00,0x00,0x0C,0xFC,0xFC,0x6C,0x60,0x60,0xE0,0xC0,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x36,0x06,0x06,0x07,0x03,0x00,0x00, // DE small
|
||||||
0x00,0x00,0x03,0xFF,0xFF,0x1B,0x18,0x18,0xF8,0xF0,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x36,0x06,0x06,0x07,0x03,0x00,0x00, // DE large
|
0x00,0x00,0x03,0xFF,0xFF,0x1B,0x18,0x18,0xF8,0xF0,0x00,0x00,0x00,0x00,0x30,0x3F,0x3F,0x36,0x06,0x06,0x07,0x03,0x00,0x00, // DE large
|
||||||
0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ? (,)
|
0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // ? (,)
|
||||||
0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00, // =
|
0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00, // =
|
||||||
0x00,0x00,0x00,0x40,0x80,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // sideways comma
|
0x00,0x00,0x00,0x40,0x80,0x80,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // sideways comma
|
||||||
0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x01,0x03,0x01,0x00,0x00, // ..
|
0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x01,0x03,0x01,0x00,0x00, // ..
|
||||||
0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x00,0x00, // .
|
0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x01,0x00,0x00,0x00,0x00, // .
|
||||||
0x00,0x00,0x02,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // tiny 1
|
0x00,0x00,0x02,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // tiny 1
|
||||||
0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00, // small block
|
0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00, // small block
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t FontSymbols[] = {
|
const uint8_t FontSymbols[] = {
|
||||||
0x00,0x00,0x00,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00, // Right block
|
0x00,0x00,0x00,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00, // Right block
|
||||||
0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x00,0x00,0x00, // left block
|
0x00,0x00,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x00,0x00,0x00, // left block
|
||||||
0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3F,0x1C,0x0C,0x04,0x00,0x00, // UD arrow
|
0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3F,0x1C,0x0C,0x04,0x00,0x00, // UD arrow
|
||||||
0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x37,0x00,0x00,0x37,0x37,0x00,0x00,0x00, // !!
|
0x00,0x00,0x00,0xFE,0xFE,0x00,0x00,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x37,0x37,0x00,0x00,0x37,0x37,0x00,0x00,0x00, // !!
|
||||||
0x00,0x38,0x7C,0xC6,0x82,0xFE,0xFE,0x02,0xFE,0xFE,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x3F,0x3F,0x00,0x00, // paragraph
|
0x00,0x38,0x7C,0xC6,0x82,0xFE,0xFE,0x02,0xFE,0xFE,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x3F,0x3F,0x00,0x00, // paragraph
|
||||||
0x00,0x00,0xDC,0xFE,0x22,0x22,0x22,0x22,0xE6,0xC4,0x00,0x00,0x00,0x00,0x08,0x19,0x11,0x11,0x11,0x11,0x1F,0x0E,0x00,0x00, // section
|
0x00,0x00,0xDC,0xFE,0x22,0x22,0x22,0x22,0xE6,0xC4,0x00,0x00,0x00,0x00,0x08,0x19,0x11,0x11,0x11,0x11,0x1F,0x0E,0x00,0x00, // section
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x00, // cursor
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x00, // cursor
|
||||||
0x00,0x00,0x00,0x08,0x0C,0x0E,0xFF,0x0E,0x0C,0x08,0x00,0x00,0x00,0x00,0x00,0x44,0x4C,0x5C,0x7F,0x5C,0x4C,0x44,0x00,0x00, // UD arrow
|
0x00,0x00,0x00,0x08,0x0C,0x0E,0xFF,0x0E,0x0C,0x08,0x00,0x00,0x00,0x00,0x00,0x44,0x4C,0x5C,0x7F,0x5C,0x4C,0x44,0x00,0x00, // UD arrow
|
||||||
0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, // UP arrow
|
0x00,0x00,0x00,0x10,0x18,0x1C,0xFE,0x1C,0x18,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,0x00, // UP arrow
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3F,0x1C,0x0C,0x04,0x00,0x00, // Down arrow
|
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0C,0x1C,0x3F,0x1C,0x0C,0x04,0x00,0x00, // Down arrow
|
||||||
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x01,0x00,0x00, // right arrow
|
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x01,0x00,0x00, // right arrow
|
||||||
0x00,0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00, // left arrow
|
0x00,0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00, // left arrow
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
|
||||||
0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x07,0x03,0x01,0x00, // LR arrow
|
0x00,0x80,0xC0,0xE0,0xF0,0x80,0x80,0x80,0xF0,0xE0,0xC0,0x80,0x00,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x07,0x03,0x01,0x00, // LR arrow
|
||||||
0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04, // UP block
|
0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xC0,0x80,0x00,0x00,0x00,0x00,0x04,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x04, // UP block
|
||||||
0x00,0x20,0x60,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0x60,0x20,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x03,0x01,0x00,0x00,0x00 // Down block
|
0x00,0x20,0x60,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0x60,0x20,0x00,0x00,0x00,0x00,0x01,0x03,0x07,0x03,0x01,0x00,0x00,0x00 // Down block
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t WarningBlock24[] = {
|
const uint8_t WarningBlock24[] = {
|
||||||
//width = 24
|
//width = 24
|
||||||
//height = 16
|
//height = 16
|
||||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0x0C,0x02,0xF1,0xF1,0xF1,0x02,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x30,0x0C,0x02,0xF1,0xF1,0xF1,0x02,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
|
||||||
0x00,0x00,0x00,0xC0,0xB0,0x8C,0x83,0x80,0x80,0x80,0x80,0xB3,0xB3,0xB3,0x80,0x80,0x80,0x80,0x83,0x8C,0xB0,0xC0,0x00,0x00
|
0x00,0x00,0x00,0xC0,0xB0,0x8C,0x83,0x80,0x80,0x80,0x80,0xB3,0xB3,0xB3,0x80,0x80,0x80,0x80,0x83,0x8C,0xB0,0xC0,0x00,0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t idleScreenBG[] = {
|
const uint8_t idleScreenBG[] = {
|
||||||
//width = 84
|
//width = 84
|
||||||
//height = 16
|
//height = 16
|
||||||
0x00,0xE0,0x18,0x04,0x02,0x02,0x01,0x41,0x61,0x61,0x61,0xE1,0xC1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
|
0x00,0xE0,0x18,0x04,0x02,0x02,0x01,0x41,0x61,0x61,0x61,0xE1,0xC1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
|
||||||
0x81,0x81,0x81,0x81,0xC1,0xE1,0x61,0x61,0x61,0x41,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x00,0xE0,0x18,0x04,0x02,0x02,
|
0x81,0x81,0x81,0x81,0xC1,0xE1,0x61,0x61,0x61,0x41,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x00,0xE0,0x18,0x04,0x02,0x02,
|
||||||
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
|
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
|
||||||
0x99,0x65,0x01,0x01,0x81,0x41,0x01,0x02,0x02,0x04,0x18,0xE0,
|
0x99,0x65,0x01,0x01,0x81,0x41,0x01,0x02,0x02,0x04,0x18,0xE0,
|
||||||
0x00,0x07,0x18,0x20,0x40,0x40,0x80,0x82,0x86,0x86,0x86,0x87,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
|
0x00,0x07,0x18,0x20,0x40,0x40,0x80,0x82,0x86,0x86,0x86,0x87,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,
|
||||||
0x81,0x81,0x81,0x81,0x83,0x87,0x86,0x86,0x86,0x82,0x80,0x80,0x40,0x40,0x20,0x18,0x07,0x00,0x00,0x07,0x18,0x20,0x40,0x40,
|
0x81,0x81,0x81,0x81,0x83,0x87,0x86,0x86,0x86,0x82,0x80,0x80,0x40,0x40,0x20,0x18,0x07,0x00,0x00,0x07,0x18,0x20,0x40,0x40,
|
||||||
0x80,0x82,0x87,0x85,0x85,0x85,0x85,0x87,0x87,0x85,0x87,0x85,0x87,0x87,0x82,0x82,0x82,0x80,0x82,0x80,0x82,0x82,0x82,0x92,
|
0x80,0x82,0x87,0x85,0x85,0x85,0x85,0x87,0x87,0x85,0x87,0x85,0x87,0x87,0x82,0x82,0x82,0x80,0x82,0x80,0x82,0x82,0x82,0x92,
|
||||||
0x8A,0x84,0x82,0x81,0x80,0x80,0x80,0x40,0x40,0x20,0x18,0x07
|
0x8A,0x84,0x82,0x81,0x80,0x80,0x80,0x40,0x40,0x20,0x18,0x07
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint8_t idleScreenBGF[] = {
|
const uint8_t idleScreenBGF[] = {
|
||||||
//width = 84
|
//width = 84
|
||||||
//height = 16
|
//height = 16
|
||||||
0xE0,0x18,0x04,0x02,0x02,0x01,0x41,0x81,0x01,0x01,0x65,0x99,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
|
0xE0,0x18,0x04,0x02,0x02,0x01,0x41,0x81,0x01,0x01,0x65,0x99,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
|
||||||
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x00,0xE0,0x18,0x04,0x02,0x02,
|
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,0x00,0xE0,0x18,0x04,0x02,0x02,
|
||||||
0x01,0x01,0x41,0x61,0x61,0x61,0xE1,0xC1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0xC1,
|
0x01,0x01,0x41,0x61,0x61,0x61,0xE1,0xC1,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0xC1,
|
||||||
0xE1,0x61,0x61,0x61,0x41,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,
|
0xE1,0x61,0x61,0x61,0x41,0x01,0x02,0x02,0x04,0x18,0xE0,0x00,
|
||||||
0x07,0x18,0x20,0x40,0x40,0x80,0x80,0x80,0x81,0x82,0x84,0x8A,0x92,0x82,0x82,0x82,0x80,0x82,0x80,0x82,0x82,0x82,0x87,0x87,
|
0x07,0x18,0x20,0x40,0x40,0x80,0x80,0x80,0x81,0x82,0x84,0x8A,0x92,0x82,0x82,0x82,0x80,0x82,0x80,0x82,0x82,0x82,0x87,0x87,
|
||||||
0x85,0x87,0x85,0x87,0x87,0x85,0x85,0x85,0x85,0x87,0x82,0x80,0x40,0x40,0x20,0x18,0x07,0x00,0x00,0x07,0x18,0x20,0x40,0x40,
|
0x85,0x87,0x85,0x87,0x87,0x85,0x85,0x85,0x85,0x87,0x82,0x80,0x40,0x40,0x20,0x18,0x07,0x00,0x00,0x07,0x18,0x20,0x40,0x40,
|
||||||
0x80,0x80,0x82,0x86,0x86,0x86,0x87,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x83,
|
0x80,0x80,0x82,0x86,0x86,0x86,0x87,0x83,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x83,
|
||||||
0x87,0x86,0x86,0x86,0x82,0x80,0x40,0x40,0x20,0x18,0x07,0x00
|
0x87,0x86,0x86,0x86,0x82,0x80,0x40,0x40,0x20,0x18,0x07,0x00
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 16x16 icons
|
* 16x16 icons
|
||||||
* */
|
* */
|
||||||
const uint8_t SettingsMenuIcons[] = {
|
const uint8_t SettingsMenuIcons[] = {
|
||||||
|
|
||||||
// Soldering
|
// Soldering
|
||||||
//width = 16
|
//width = 16
|
||||||
//height = 16
|
//height = 16
|
||||||
0x00, 0x02, 0x04, 0x08, 0x12, 0x24, 0xC4, 0x42, 0x82, 0x04,
|
0x00, 0x02, 0x04, 0x08, 0x12, 0x24, 0xC4, 0x42, 0x82, 0x04,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x01, 0x02, 0x07, 0x0A, 0x14, 0x28, 0x50,
|
0x00, 0x00, 0x00, 0x01, 0x02, 0x07, 0x0A, 0x14, 0x28, 0x50,
|
||||||
0x60, 0x00,
|
0x60, 0x00,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Sleep
|
//Sleep
|
||||||
//width = 16
|
//width = 16
|
||||||
//height = 16
|
//height = 16
|
||||||
0x00, 0xC6, 0xE6, 0xF6, 0xBE, 0x9E, 0x8E, 0x86, 0x00, 0x00,
|
0x00, 0xC6, 0xE6, 0xF6, 0xBE, 0x9E, 0x8E, 0x86, 0x00, 0x00,
|
||||||
0x40, 0x40, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x01, 0x01, 0x01,
|
0x40, 0x40, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x01, 0x01, 0x01,
|
||||||
0x45, 0x65, 0x75, 0x5D, 0x4C, 0x00, 0x06, 0x07, 0x07, 0x05,
|
0x45, 0x65, 0x75, 0x5D, 0x4C, 0x00, 0x06, 0x07, 0x07, 0x05,
|
||||||
0x04, 0x00,
|
0x04, 0x00,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Menu
|
//Menu
|
||||||
//width = 16
|
//width = 16
|
||||||
//height = 16
|
//height = 16
|
||||||
0x00,0x80,0x06,0x86,0x46,0x06,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x00,
|
0x00,0x80,0x06,0x86,0x46,0x06,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x00,
|
||||||
0x00,0x00,0x61,0x60,0x00,0x00,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x00,
|
0x00,0x00,0x61,0x60,0x00,0x00,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x61,0x00,
|
||||||
|
|
||||||
//Wrench
|
//Wrench
|
||||||
///width = 16
|
///width = 16
|
||||||
//height = 16
|
//height = 16
|
||||||
0x00, 0x18, 0x30, 0x32, 0x7E, 0x7C, 0xF0, 0xC0, 0x80, 0x00,
|
0x00, 0x18, 0x30, 0x32, 0x7E, 0x7C, 0xF0, 0xC0, 0x80, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x01, 0x03, 0x0F, 0x3E, 0x7E, 0x4C, 0x0C,
|
0x00, 0x00, 0x00, 0x01, 0x03, 0x0F, 0x3E, 0x7E, 0x4C, 0x0C,
|
||||||
0x18, 0x00,
|
0x18, 0x00,
|
||||||
#ifdef NOTUSED
|
#ifdef NOTUSED
|
||||||
//Calibration (Not used, kept for future menu layouts)
|
//Calibration (Not used, kept for future menu layouts)
|
||||||
//width = 16
|
//width = 16
|
||||||
//height = 16
|
//height = 16
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE8, 0x70,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE8, 0x70,
|
||||||
0x7A, 0x5E, 0x8E, 0x1C, 0x30, 0x00, 0x00, 0x10, 0x38, 0x1C,
|
0x7A, 0x5E, 0x8E, 0x1C, 0x30, 0x00, 0x00, 0x10, 0x38, 0x1C,
|
||||||
0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x0E, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00,
|
0x00, 0x00,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif /* FONT_H_ */
|
#endif /* FONT_H_ */
|
||||||
@@ -1,44 +1,52 @@
|
|||||||
/*
|
/*
|
||||||
* FRToSI2C.hpp
|
* FRToSI2C.hpp
|
||||||
*
|
*
|
||||||
* Created on: 14Apr.,2018
|
* Created on: 14Apr.,2018
|
||||||
* Author: Ralim
|
* Author: Ralim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FRTOSI2C_HPP_
|
#ifndef FRTOSI2C_HPP_
|
||||||
#define FRTOSI2C_HPP_
|
#define FRTOSI2C_HPP_
|
||||||
#include "stm32f1xx_hal.h"
|
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
|
|
||||||
class FRToSI2C {
|
/*
|
||||||
public:
|
* Wrapper class to work with the device I2C bus
|
||||||
|
*
|
||||||
static void init(I2C_HandleTypeDef *i2chandle) {
|
* This provides mutex protection of the peripheral
|
||||||
i2c = i2chandle;
|
* Also allows hardware to use DMA should it want to
|
||||||
I2CSemaphore = nullptr;
|
*
|
||||||
}
|
*
|
||||||
|
*/
|
||||||
static void FRToSInit() {
|
class FRToSI2C {
|
||||||
I2CSemaphore = xSemaphoreCreateBinaryStatic(&xSemaphoreBuffer);
|
public:
|
||||||
xSemaphoreGive(I2CSemaphore);
|
|
||||||
}
|
static void init() {
|
||||||
|
I2CSemaphore = nullptr;
|
||||||
static void CpltCallback(); //Normal Tx Callback
|
}
|
||||||
|
|
||||||
static void Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
|
static void FRToSInit() {
|
||||||
uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
|
I2CSemaphore = xSemaphoreCreateBinaryStatic(&xSemaphoreBuffer);
|
||||||
static void Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
|
xSemaphoreGive(I2CSemaphore);
|
||||||
uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
|
}
|
||||||
|
|
||||||
static void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size);
|
static void CpltCallback(); //Normal Tx Callback
|
||||||
static void I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data);
|
|
||||||
static uint8_t I2C_RegisterRead(uint8_t address, uint8_t reg);
|
static bool Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
|
||||||
|
uint8_t *pData, uint16_t Size);
|
||||||
private:
|
static void Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
|
||||||
static I2C_HandleTypeDef *i2c;
|
uint8_t *pData, uint16_t Size);
|
||||||
static void I2C1_ClearBusyFlagErratum();
|
//Returns true if device ACK's being addressed
|
||||||
static SemaphoreHandle_t I2CSemaphore;
|
static bool probe(uint16_t DevAddress);
|
||||||
static StaticSemaphore_t xSemaphoreBuffer;
|
|
||||||
};
|
static void Transmit(uint16_t DevAddress, uint8_t *pData, uint16_t Size);
|
||||||
|
static void I2C_RegisterWrite(uint8_t address, uint8_t reg, uint8_t data);
|
||||||
#endif /* FRTOSI2C_HPP_ */
|
static uint8_t I2C_RegisterRead(uint8_t address, uint8_t reg);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void I2C_Unstick();
|
||||||
|
static SemaphoreHandle_t I2CSemaphore;
|
||||||
|
static StaticSemaphore_t xSemaphoreBuffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* FRTOSI2C_HPP_ */
|
||||||
52
workspace/TS100/Core/Drivers/LIS2DH12.cpp
Normal file
52
workspace/TS100/Core/Drivers/LIS2DH12.cpp
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* LIS2DH12.cpp
|
||||||
|
*
|
||||||
|
* Created on: 27Feb.,2018
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <array>
|
||||||
|
|
||||||
|
#include "LIS2DH12.hpp"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const uint8_t reg;
|
||||||
|
const uint8_t value;
|
||||||
|
} LIS_REG;
|
||||||
|
|
||||||
|
static const LIS_REG i2c_registers[] = { { LIS_CTRL_REG1, 0x17 }, // 25Hz
|
||||||
|
{ LIS_CTRL_REG2, 0b00001000 }, // Highpass filter off
|
||||||
|
{ LIS_CTRL_REG3, 0b01100000 }, // Setup interrupt pins
|
||||||
|
{ LIS_CTRL_REG4, 0b00001000 }, // Block update mode off, HR on
|
||||||
|
{ LIS_CTRL_REG5, 0b00000010 }, { LIS_CTRL_REG6, 0b01100010 },
|
||||||
|
//Basically setup the unit to run, and enable 4D orientation detection
|
||||||
|
{ LIS_INT2_CFG, 0b01111110 }, //setup for movement detection
|
||||||
|
{ LIS_INT2_THS, 0x28 }, { LIS_INT2_DURATION, 64 }, {
|
||||||
|
LIS_INT1_CFG, 0b01111110 }, { LIS_INT1_THS, 0x28 }, {
|
||||||
|
LIS_INT1_DURATION, 64 } };
|
||||||
|
|
||||||
|
void LIS2DH12::initalize() {
|
||||||
|
for (size_t index = 0;
|
||||||
|
index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]));
|
||||||
|
index++) {
|
||||||
|
FRToSI2C::I2C_RegisterWrite(LIS2DH_I2C_ADDRESS,
|
||||||
|
i2c_registers[index].reg, i2c_registers[index].value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LIS2DH12::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) {
|
||||||
|
std::array<int16_t, 3> sensorData;
|
||||||
|
|
||||||
|
FRToSI2C::Mem_Read(LIS2DH_I2C_ADDRESS, 0xA8,
|
||||||
|
reinterpret_cast<uint8_t*>(sensorData.begin()),
|
||||||
|
sensorData.size() * sizeof(int16_t));
|
||||||
|
|
||||||
|
x = sensorData[0];
|
||||||
|
y = sensorData[1];
|
||||||
|
z = sensorData[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LIS2DH12::detect() {
|
||||||
|
return FRToSI2C::probe(LIS2DH_I2C_ADDRESS);
|
||||||
|
}
|
||||||
@@ -1,42 +1,42 @@
|
|||||||
/*
|
/*
|
||||||
* LIS2DH12.hpp
|
* LIS2DH12.hpp
|
||||||
*
|
*
|
||||||
* Created on: 27Feb.,2018
|
* Created on: 27Feb.,2018
|
||||||
* Author: Ralim
|
* Author: Ralim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef LIS2DH12_HPP_
|
#ifndef LIS2DH12_HPP_
|
||||||
#define LIS2DH12_HPP_
|
#define LIS2DH12_HPP_
|
||||||
#include "stm32f1xx_hal.h"
|
#include "I2C_Wrapper.hpp"
|
||||||
#include "FRToSI2C.hpp"
|
#include "LIS2DH12_defines.hpp"
|
||||||
#include "LIS2DH12_defines.hpp"
|
#include "BSP.h"
|
||||||
#include "hardware.h"
|
|
||||||
|
class LIS2DH12 {
|
||||||
class LIS2DH12 {
|
public:
|
||||||
public:
|
static bool detect();
|
||||||
static void initalize();
|
static void initalize();
|
||||||
//1 = rh, 2,=lh, 8=flat
|
//1 = rh, 2,=lh, 8=flat
|
||||||
static Orientation getOrientation() {
|
static Orientation getOrientation() {
|
||||||
#ifdef MODEL_TS80
|
#ifdef LIS_ORI_FLIP
|
||||||
uint8_t val = (FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,
|
uint8_t val = (FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,
|
||||||
LIS_INT2_SRC) >> 2);
|
LIS_INT2_SRC) >> 2);
|
||||||
if (val == 8)
|
if (val == 8)
|
||||||
val = 3;
|
val = 3;
|
||||||
else if (val == 1)
|
else if (val == 1)
|
||||||
val = 1;
|
val = 1;
|
||||||
else if (val == 2)
|
else if (val == 2)
|
||||||
val = 0;
|
val = 0;
|
||||||
else
|
else
|
||||||
val = 3;
|
val = 3;
|
||||||
return static_cast<Orientation>(val);
|
return static_cast<Orientation>(val);
|
||||||
#endif
|
#endif
|
||||||
#ifdef MODEL_TS100
|
#ifdef MODEL_TS100
|
||||||
return static_cast<Orientation>((FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,LIS_INT2_SRC) >> 2) - 1);
|
return static_cast<Orientation>((FRToSI2C::I2C_RegisterRead(LIS2DH_I2C_ADDRESS,LIS_INT2_SRC) >> 2) - 1);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z);
|
static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* LIS2DH12_HPP_ */
|
#endif /* LIS2DH12_HPP_ */
|
||||||
@@ -1,28 +1,28 @@
|
|||||||
/*
|
/*
|
||||||
* LIS2DH12_defines.hpp
|
* LIS2DH12_defines.hpp
|
||||||
*
|
*
|
||||||
* Created on: 27Feb.,2018
|
* Created on: 27Feb.,2018
|
||||||
* Author: Ralim
|
* Author: Ralim
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef LIS2DH12_DEFINES_HPP_
|
#ifndef LIS2DH12_DEFINES_HPP_
|
||||||
#define LIS2DH12_DEFINES_HPP_
|
#define LIS2DH12_DEFINES_HPP_
|
||||||
|
|
||||||
|
|
||||||
#define LIS2DH_I2C_ADDRESS (25<<1)
|
#define LIS2DH_I2C_ADDRESS (25<<1)
|
||||||
|
|
||||||
#define LIS_CTRL_REG1 0x20|0x80
|
#define LIS_CTRL_REG1 0x20|0x80
|
||||||
#define LIS_CTRL_REG2 0x21|0x80
|
#define LIS_CTRL_REG2 0x21|0x80
|
||||||
#define LIS_CTRL_REG3 0x22|0x80
|
#define LIS_CTRL_REG3 0x22|0x80
|
||||||
#define LIS_CTRL_REG4 0x23|0x80
|
#define LIS_CTRL_REG4 0x23|0x80
|
||||||
#define LIS_CTRL_REG5 0x24|0x80
|
#define LIS_CTRL_REG5 0x24|0x80
|
||||||
#define LIS_CTRL_REG6 0x25|0x80
|
#define LIS_CTRL_REG6 0x25|0x80
|
||||||
#define LIS_INT1_CFG 0xB0|0x80
|
#define LIS_INT1_CFG 0xB0|0x80
|
||||||
#define LIS_INT2_CFG 0xB4|0x80
|
#define LIS_INT2_CFG 0xB4|0x80
|
||||||
#define LIS_INT1_DURATION 0x33|0x80
|
#define LIS_INT1_DURATION 0x33|0x80
|
||||||
#define LIS_INT1_THS 0x32|0x80
|
#define LIS_INT1_THS 0x32|0x80
|
||||||
#define LIS_INT1_SRC 0x31|0x80
|
#define LIS_INT1_SRC 0x31|0x80
|
||||||
#define LIS_INT2_DURATION 0x37|0x80
|
#define LIS_INT2_DURATION 0x37|0x80
|
||||||
#define LIS_INT2_THS 0x36|0x80
|
#define LIS_INT2_THS 0x36|0x80
|
||||||
#define LIS_INT2_SRC 0x35|0x80
|
#define LIS_INT2_SRC 0x35|0x80
|
||||||
#endif /* LIS2DH12_DEFINES_HPP_ */
|
#endif /* LIS2DH12_DEFINES_HPP_ */
|
||||||
@@ -1,78 +1,88 @@
|
|||||||
/*
|
/*
|
||||||
* MMA8652FC.cpp
|
* MMA8652FC.cpp
|
||||||
*
|
*
|
||||||
* Created on: 31Aug.,2017
|
* Created on: 31Aug.,2017
|
||||||
* Author: Ben V. Brown
|
* Author: Ben V. Brown
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
|
||||||
#include "MMA8652FC.hpp"
|
#include "MMA8652FC.hpp"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const uint8_t reg;
|
const uint8_t reg;
|
||||||
const uint8_t val;
|
const uint8_t val;
|
||||||
} MMA_REG;
|
} MMA_REG;
|
||||||
|
|
||||||
static const MMA_REG i2c_registers[] = { { CTRL_REG2, 0 }, //Normal mode
|
static const MMA_REG i2c_registers[] = { { CTRL_REG2, 0 }, //Normal mode
|
||||||
{ CTRL_REG2, 0x40 }, // Reset all registers to POR values
|
{ CTRL_REG2, 0x40 }, // Reset all registers to POR values
|
||||||
{ FF_MT_CFG_REG, 0x78 }, // Enable motion detection for X, Y, Z axis, latch disabled
|
{ FF_MT_CFG_REG, 0x78 }, // Enable motion detection for X, Y, Z axis, latch disabled
|
||||||
{ PL_CFG_REG, 0x40 }, //Enable the orientation detection
|
{ PL_CFG_REG, 0x40 }, //Enable the orientation detection
|
||||||
{ PL_COUNT_REG, 200 }, //200 count debounce
|
{ PL_COUNT_REG, 200 }, //200 count debounce
|
||||||
{ PL_BF_ZCOMP_REG, 0b01000111 }, //Set the threshold to 42 degrees
|
{ PL_BF_ZCOMP_REG, 0b01000111 }, //Set the threshold to 42 degrees
|
||||||
{ P_L_THS_REG, 0b10011100 }, //Up the trip angles
|
{ P_L_THS_REG, 0b10011100 }, //Up the trip angles
|
||||||
{ CTRL_REG4, 0x01 | (1 << 4) }, // Enable dataready interrupt & orientation interrupt
|
{ CTRL_REG4, 0x01 | (1 << 4) }, // Enable dataready interrupt & orientation interrupt
|
||||||
{ CTRL_REG5, 0x01 }, // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2
|
{ CTRL_REG5, 0x01 }, // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2
|
||||||
{ CTRL_REG2, 0x12 }, //Set maximum resolution oversampling
|
{ CTRL_REG2, 0x12 }, //Set maximum resolution oversampling
|
||||||
{ XYZ_DATA_CFG_REG, (1 << 4) }, //select high pass filtered data
|
{ XYZ_DATA_CFG_REG, (1 << 4) }, //select high pass filtered data
|
||||||
{ HP_FILTER_CUTOFF_REG, 0x03 }, //select high pass filtered data
|
{ HP_FILTER_CUTOFF_REG, 0x03 }, //select high pass filtered data
|
||||||
{ CTRL_REG1, 0x19 } // ODR=12 Hz, Active mode
|
{ CTRL_REG1, 0x19 } // ODR=12 Hz, Active mode
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void MMA8652FC::initalize() {
|
||||||
void MMA8652FC::initalize() {
|
size_t index = 0;
|
||||||
size_t index = 0;
|
|
||||||
|
//send all the init commands to the unit
|
||||||
//send all the init commands to the unit
|
|
||||||
|
FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS, i2c_registers[index].reg,
|
||||||
FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val);
|
i2c_registers[index].val);
|
||||||
index++;
|
index++;
|
||||||
FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val);
|
FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS, i2c_registers[index].reg,
|
||||||
index++;
|
i2c_registers[index].val);
|
||||||
|
index++;
|
||||||
HAL_Delay(2); // ~1ms delay
|
|
||||||
|
delay_ms(2); // ~1ms delay
|
||||||
while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) {
|
|
||||||
FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,i2c_registers[index].reg, i2c_registers[index].val);
|
while (index < (sizeof(i2c_registers) / sizeof(i2c_registers[0]))) {
|
||||||
index++;
|
FRToSI2C::I2C_RegisterWrite(MMA8652FC_I2C_ADDRESS,
|
||||||
}
|
i2c_registers[index].reg, i2c_registers[index].val);
|
||||||
}
|
index++;
|
||||||
|
}
|
||||||
Orientation MMA8652FC::getOrientation() {
|
}
|
||||||
//First read the PL_STATUS register
|
|
||||||
uint8_t plStatus = FRToSI2C::I2C_RegisterRead(MMA8652FC_I2C_ADDRESS,PL_STATUS_REG);
|
Orientation MMA8652FC::getOrientation() {
|
||||||
if ((plStatus & 0b10000000) == 0b10000000) {
|
//First read the PL_STATUS register
|
||||||
plStatus >>= 1; //We don't need the up/down bit
|
uint8_t plStatus = FRToSI2C::I2C_RegisterRead(MMA8652FC_I2C_ADDRESS,
|
||||||
plStatus &= 0x03; //mask to the two lower bits
|
PL_STATUS_REG);
|
||||||
|
if ((plStatus & 0b10000000) == 0b10000000) {
|
||||||
//0 == left handed
|
plStatus >>= 1; //We don't need the up/down bit
|
||||||
//1 == right handed
|
plStatus &= 0x03; //mask to the two lower bits
|
||||||
|
|
||||||
return static_cast<Orientation>(plStatus);
|
//0 == left handed
|
||||||
}
|
//1 == right handed
|
||||||
|
|
||||||
return ORIENTATION_FLAT;
|
return static_cast<Orientation>(plStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MMA8652FC::getAxisReadings(int16_t& x, int16_t& y, int16_t& z) {
|
return ORIENTATION_FLAT;
|
||||||
std::array<int16_t, 3> sensorData;
|
}
|
||||||
|
|
||||||
FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG, I2C_MEMADD_SIZE_8BIT,
|
void MMA8652FC::getAxisReadings(int16_t &x, int16_t &y, int16_t &z) {
|
||||||
reinterpret_cast<uint8_t*>(sensorData.begin()),
|
std::array<int16_t, 3> sensorData;
|
||||||
sensorData.size() * sizeof(int16_t));
|
|
||||||
|
FRToSI2C::Mem_Read(MMA8652FC_I2C_ADDRESS, OUT_X_MSB_REG,
|
||||||
x = static_cast<int16_t>(__builtin_bswap16(*reinterpret_cast<uint16_t*>(&sensorData[0])));
|
reinterpret_cast<uint8_t*>(sensorData.begin()),
|
||||||
y = static_cast<int16_t>(__builtin_bswap16(*reinterpret_cast<uint16_t*>(&sensorData[1])));
|
sensorData.size() * sizeof(int16_t));
|
||||||
z = static_cast<int16_t>(__builtin_bswap16(*reinterpret_cast<uint16_t*>(&sensorData[2])));
|
|
||||||
}
|
x = static_cast<int16_t>(__builtin_bswap16(
|
||||||
|
*reinterpret_cast<uint16_t*>(&sensorData[0])));
|
||||||
|
y = static_cast<int16_t>(__builtin_bswap16(
|
||||||
|
*reinterpret_cast<uint16_t*>(&sensorData[1])));
|
||||||
|
z = static_cast<int16_t>(__builtin_bswap16(
|
||||||
|
*reinterpret_cast<uint16_t*>(&sensorData[2])));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MMA8652FC::detect() {
|
||||||
|
return FRToSI2C::probe(MMA8652FC_I2C_ADDRESS);
|
||||||
|
}
|
||||||
27
workspace/TS100/Core/Drivers/MMA8652FC.hpp
Normal file
27
workspace/TS100/Core/Drivers/MMA8652FC.hpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* MMA8652FC.h
|
||||||
|
*
|
||||||
|
* Created on: 31Aug.,2017
|
||||||
|
* Author: Ben V. Brown
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MMA8652FC_HPP_
|
||||||
|
#define MMA8652FC_HPP_
|
||||||
|
#include "MMA8652FC_defines.h"
|
||||||
|
#include "I2C_Wrapper.hpp"
|
||||||
|
#include "BSP.h"
|
||||||
|
|
||||||
|
class MMA8652FC {
|
||||||
|
|
||||||
|
public:
|
||||||
|
//Returns true if this accelerometer is detected
|
||||||
|
static bool detect();
|
||||||
|
//Init any internal state
|
||||||
|
static void initalize();
|
||||||
|
static Orientation getOrientation(); // Reads the I2C register and returns the orientation (true == left)
|
||||||
|
static void getAxisReadings(int16_t &x, int16_t &y, int16_t &z);
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* MMA8652FC_HPP_ */
|
||||||
@@ -1,124 +1,124 @@
|
|||||||
/*
|
/*
|
||||||
* MMA8652FC_defines.h
|
* MMA8652FC_defines.h
|
||||||
*
|
*
|
||||||
* Created on: 31Aug.,2017
|
* Created on: 31Aug.,2017
|
||||||
* Author: Ben V. Brown
|
* Author: Ben V. Brown
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MMA8652FC_DEFINES_H_
|
#ifndef MMA8652FC_DEFINES_H_
|
||||||
#define MMA8652FC_DEFINES_H_
|
#define MMA8652FC_DEFINES_H_
|
||||||
|
|
||||||
//--------------MMA8652 Registers-------------------------------------------//
|
//--------------MMA8652 Registers-------------------------------------------//
|
||||||
|
|
||||||
#define STATUS_REG 0x00 // STATUS Register
|
#define STATUS_REG 0x00 // STATUS Register
|
||||||
|
|
||||||
#define OUT_X_MSB_REG 0x01 // [7:0] are 8 MSBs of the 14-bit X-axis sample
|
#define OUT_X_MSB_REG 0x01 // [7:0] are 8 MSBs of the 14-bit X-axis sample
|
||||||
#define OUT_X_LSB_REG 0x02 // [7:2] are the 6 LSB of 14-bit X-axis sample
|
#define OUT_X_LSB_REG 0x02 // [7:2] are the 6 LSB of 14-bit X-axis sample
|
||||||
#define OUT_Y_MSB_REG 0x03 // [7:0] are 8 MSBs of the 14-bit Y-axis sample
|
#define OUT_Y_MSB_REG 0x03 // [7:0] are 8 MSBs of the 14-bit Y-axis sample
|
||||||
#define OUT_Y_LSB_REG 0x04 // [7:2] are the 6 LSB of 14-bit Y-axis sample
|
#define OUT_Y_LSB_REG 0x04 // [7:2] are the 6 LSB of 14-bit Y-axis sample
|
||||||
#define OUT_Z_MSB_REG 0x05 // [7:0] are 8 MSBs of the 14-bit Z-axis sample
|
#define OUT_Z_MSB_REG 0x05 // [7:0] are 8 MSBs of the 14-bit Z-axis sample
|
||||||
#define OUT_Z_LSB_REG 0x06 // [7:2] are the 6 LSB of 14-bit Z-axis sample
|
#define OUT_Z_LSB_REG 0x06 // [7:2] are the 6 LSB of 14-bit Z-axis sample
|
||||||
|
|
||||||
#define F_SETUP_REG 0x09 // F_SETUP FIFO Setup Register
|
#define F_SETUP_REG 0x09 // F_SETUP FIFO Setup Register
|
||||||
#define TRIG_CFG_REG 0x0A // TRIG_CFG Map of FIFO data capture events
|
#define TRIG_CFG_REG 0x0A // TRIG_CFG Map of FIFO data capture events
|
||||||
#define SYSMOD_REG 0x0B // SYSMOD System Mode Register
|
#define SYSMOD_REG 0x0B // SYSMOD System Mode Register
|
||||||
#define INT_SOURCE_REG 0x0C // INT_SOURCE System Interrupt Status Register
|
#define INT_SOURCE_REG 0x0C // INT_SOURCE System Interrupt Status Register
|
||||||
#define WHO_AM_I_REG 0x0D // WHO_AM_I Device ID Register
|
#define WHO_AM_I_REG 0x0D // WHO_AM_I Device ID Register
|
||||||
#define XYZ_DATA_CFG_REG 0x0E // XYZ_DATA_CFG Sensor Data Configuration Register
|
#define XYZ_DATA_CFG_REG 0x0E // XYZ_DATA_CFG Sensor Data Configuration Register
|
||||||
#define HP_FILTER_CUTOFF_REG 0x0F // HP_FILTER_CUTOFF High Pass Filter Register
|
#define HP_FILTER_CUTOFF_REG 0x0F // HP_FILTER_CUTOFF High Pass Filter Register
|
||||||
|
|
||||||
#define PL_STATUS_REG 0x10 // PL_STATUS Portrait/Landscape Status Register
|
#define PL_STATUS_REG 0x10 // PL_STATUS Portrait/Landscape Status Register
|
||||||
#define PL_CFG_REG 0x11 // PL_CFG Portrait/Landscape Configuration Register
|
#define PL_CFG_REG 0x11 // PL_CFG Portrait/Landscape Configuration Register
|
||||||
#define PL_COUNT_REG 0x12 // PL_COUNT Portrait/Landscape Debounce Register
|
#define PL_COUNT_REG 0x12 // PL_COUNT Portrait/Landscape Debounce Register
|
||||||
#define PL_BF_ZCOMP_REG 0x13 // PL_BF_ZCOMP Back/Front and Z Compensation Register
|
#define PL_BF_ZCOMP_REG 0x13 // PL_BF_ZCOMP Back/Front and Z Compensation Register
|
||||||
#define P_L_THS_REG 0x14 // P_L_THS Portrait to Landscape Threshold Register
|
#define P_L_THS_REG 0x14 // P_L_THS Portrait to Landscape Threshold Register
|
||||||
|
|
||||||
#define FF_MT_CFG_REG 0x15 // FF_MT_CFG Freefall and Motion Configuration Register
|
#define FF_MT_CFG_REG 0x15 // FF_MT_CFG Freefall and Motion Configuration Register
|
||||||
#define FF_MT_SRC_REG 0x16 // FF_MT_SRC Freefall and Motion Source Register
|
#define FF_MT_SRC_REG 0x16 // FF_MT_SRC Freefall and Motion Source Register
|
||||||
#define FF_MT_THS_REG 0x17 // FF_MT_THS Freefall and Motion Threshold Register
|
#define FF_MT_THS_REG 0x17 // FF_MT_THS Freefall and Motion Threshold Register
|
||||||
#define FF_MT_COUNT_REG 0x18 // FF_MT_COUNT Freefall Motion Count Register
|
#define FF_MT_COUNT_REG 0x18 // FF_MT_COUNT Freefall Motion Count Register
|
||||||
|
|
||||||
#define TRANSIENT_CFG_REG 0x1D // TRANSIENT_CFG Transient Configuration Register
|
#define TRANSIENT_CFG_REG 0x1D // TRANSIENT_CFG Transient Configuration Register
|
||||||
#define TRANSIENT_SRC_REG 0x1E // TRANSIENT_SRC Transient Source Register
|
#define TRANSIENT_SRC_REG 0x1E // TRANSIENT_SRC Transient Source Register
|
||||||
#define TRANSIENT_THS_REG 0x1F // TRANSIENT_THS Transient Threshold Register
|
#define TRANSIENT_THS_REG 0x1F // TRANSIENT_THS Transient Threshold Register
|
||||||
#define TRANSIENT_COUNT_REG 0x20 // TRANSIENT_COUNT Transient Debounce Counter Register
|
#define TRANSIENT_COUNT_REG 0x20 // TRANSIENT_COUNT Transient Debounce Counter Register
|
||||||
|
|
||||||
#define PULSE_CFG_REG 0x21 // PULSE_CFG Pulse Configuration Register
|
#define PULSE_CFG_REG 0x21 // PULSE_CFG Pulse Configuration Register
|
||||||
#define PULSE_SRC_REG 0x22 // PULSE_SRC Pulse Source Register
|
#define PULSE_SRC_REG 0x22 // PULSE_SRC Pulse Source Register
|
||||||
#define PULSE_THSX_REG 0x23 // PULSE_THS XYZ Pulse Threshold Registers
|
#define PULSE_THSX_REG 0x23 // PULSE_THS XYZ Pulse Threshold Registers
|
||||||
#define PULSE_THSY_REG 0x24
|
#define PULSE_THSY_REG 0x24
|
||||||
#define PULSE_THSZ_REG 0x25
|
#define PULSE_THSZ_REG 0x25
|
||||||
#define PULSE_TMLT_REG 0x26 // PULSE_TMLT Pulse Time Window Register
|
#define PULSE_TMLT_REG 0x26 // PULSE_TMLT Pulse Time Window Register
|
||||||
#define PULSE_LTCY_REG 0x27 // PULSE_LTCY Pulse Latency Timer Register
|
#define PULSE_LTCY_REG 0x27 // PULSE_LTCY Pulse Latency Timer Register
|
||||||
#define PULSE_WIND_REG 0x28 // PULSE_WIND Second Pulse Time Window Register
|
#define PULSE_WIND_REG 0x28 // PULSE_WIND Second Pulse Time Window Register
|
||||||
|
|
||||||
#define ASLP_COUNT_REG 0x29 // ASLP_COUNT Auto Sleep Inactivity Timer Register
|
#define ASLP_COUNT_REG 0x29 // ASLP_COUNT Auto Sleep Inactivity Timer Register
|
||||||
|
|
||||||
#define CTRL_REG1 0x2A // CTRL_REG1 System Control 1 Register
|
#define CTRL_REG1 0x2A // CTRL_REG1 System Control 1 Register
|
||||||
#define CTRL_REG2 0x2B // CTRL_REG2 System Control 2 Register
|
#define CTRL_REG2 0x2B // CTRL_REG2 System Control 2 Register
|
||||||
#define CTRL_REG3 0x2C // CTRL_REG3 Interrupt Control Register
|
#define CTRL_REG3 0x2C // CTRL_REG3 Interrupt Control Register
|
||||||
#define CTRL_REG4 0x2D // CTRL_REG4 Interrupt Enable Register
|
#define CTRL_REG4 0x2D // CTRL_REG4 Interrupt Enable Register
|
||||||
#define CTRL_REG5 0x2E // CTRL_REG5 Interrupt Configuration Register
|
#define CTRL_REG5 0x2E // CTRL_REG5 Interrupt Configuration Register
|
||||||
|
|
||||||
#define OFF_X_REG 0x2F // XYZ Offset Correction Registers
|
#define OFF_X_REG 0x2F // XYZ Offset Correction Registers
|
||||||
#define OFF_Y_REG 0x30
|
#define OFF_Y_REG 0x30
|
||||||
#define OFF_Z_REG 0x31
|
#define OFF_Z_REG 0x31
|
||||||
|
|
||||||
//MMA8652FC 7-bit I2C address
|
//MMA8652FC 7-bit I2C address
|
||||||
|
|
||||||
#define MMA8652FC_I2C_ADDRESS (0x1D<<1)
|
#define MMA8652FC_I2C_ADDRESS (0x1D<<1)
|
||||||
|
|
||||||
//MMA8652FC Sensitivity
|
//MMA8652FC Sensitivity
|
||||||
|
|
||||||
#define SENSITIVITY_2G 1024
|
#define SENSITIVITY_2G 1024
|
||||||
#define SENSITIVITY_4G 512
|
#define SENSITIVITY_4G 512
|
||||||
#define SENSITIVITY_8G 256
|
#define SENSITIVITY_8G 256
|
||||||
|
|
||||||
#define STATUS_REG 0x00
|
#define STATUS_REG 0x00
|
||||||
#define X_MSB_REG 0X01
|
#define X_MSB_REG 0X01
|
||||||
#define X_LSB_REG 0X02
|
#define X_LSB_REG 0X02
|
||||||
#define Y_MSB_REG 0X03
|
#define Y_MSB_REG 0X03
|
||||||
#define Y_LSB_REG 0X04
|
#define Y_LSB_REG 0X04
|
||||||
#define Z_MSB_REG 0X05
|
#define Z_MSB_REG 0X05
|
||||||
#define Z_LSB_REG 0X06
|
#define Z_LSB_REG 0X06
|
||||||
|
|
||||||
#define TRIG_CFG 0X0A
|
#define TRIG_CFG 0X0A
|
||||||
#define SYSMOD 0X0B
|
#define SYSMOD 0X0B
|
||||||
#define INT_SOURCE 0X0C
|
#define INT_SOURCE 0X0C
|
||||||
#define DEVICE_ID 0X0D
|
#define DEVICE_ID 0X0D
|
||||||
|
|
||||||
//-----STATUS_REG(0X00)-----Bit Define----------------------------------------//
|
//-----STATUS_REG(0X00)-----Bit Define----------------------------------------//
|
||||||
#define ZYXDR_BIT 0X08
|
#define ZYXDR_BIT 0X08
|
||||||
//----XYZ_DATA_CFG_REG(0xE)-Bit Define----------------------------------------//
|
//----XYZ_DATA_CFG_REG(0xE)-Bit Define----------------------------------------//
|
||||||
#define FS_MASK 0x03
|
#define FS_MASK 0x03
|
||||||
#define FULL_SCALE_2G 0x00 //2g=0x0,4g=0x1,8g=0x2
|
#define FULL_SCALE_2G 0x00 //2g=0x0,4g=0x1,8g=0x2
|
||||||
#define FULL_SCALE_4G 0x01
|
#define FULL_SCALE_4G 0x01
|
||||||
#define FULL_SCALE_8G 0x02
|
#define FULL_SCALE_8G 0x02
|
||||||
//---------CTRL_REG1(0X2A)Bit Define------------------------------------------//
|
//---------CTRL_REG1(0X2A)Bit Define------------------------------------------//
|
||||||
#define ACTIVE_MASK 1<<0 //bit0
|
#define ACTIVE_MASK 1<<0 //bit0
|
||||||
#define DR_MASK 0x38 //bit D5,D4,D3
|
#define DR_MASK 0x38 //bit D5,D4,D3
|
||||||
#define FHZ800 0x0 //800hz
|
#define FHZ800 0x0 //800hz
|
||||||
#define FHZ400 0x1 //400hz
|
#define FHZ400 0x1 //400hz
|
||||||
#define FHZ200 0x2 //200hz
|
#define FHZ200 0x2 //200hz
|
||||||
#define FHZ100 0x3 //100hz
|
#define FHZ100 0x3 //100hz
|
||||||
#define FHZ50 0x4 //50hz
|
#define FHZ50 0x4 //50hz
|
||||||
#define FHZ2 0x5 //12.5hz
|
#define FHZ2 0x5 //12.5hz
|
||||||
#define FHZ1 0x6 //6.25hz
|
#define FHZ1 0x6 //6.25hz
|
||||||
#define FHZ0 0x7 //1.563hz
|
#define FHZ0 0x7 //1.563hz
|
||||||
|
|
||||||
//---------CTRL_REG2(0X2B)Bit Define------------------------------------------//
|
//---------CTRL_REG2(0X2B)Bit Define------------------------------------------//
|
||||||
#define MODS_MASK 0x03 //Oversampling Mode 4
|
#define MODS_MASK 0x03 //Oversampling Mode 4
|
||||||
#define Normal_Mode 0x0 //Normal=0,Low Noise Low Power MODS=1,
|
#define Normal_Mode 0x0 //Normal=0,Low Noise Low Power MODS=1,
|
||||||
//HI RESOLUTION=2,LOW POWER MODS = 11
|
//HI RESOLUTION=2,LOW POWER MODS = 11
|
||||||
//----CTRL_REG4---Interrupt Enable BIT ---------------------------------------//
|
//----CTRL_REG4---Interrupt Enable BIT ---------------------------------------//
|
||||||
//0 interrupt is disabled (default)
|
//0 interrupt is disabled (default)
|
||||||
//1 interrupt is enabled
|
//1 interrupt is enabled
|
||||||
#define INT_EN_ASLP 1<<7 //Auto-SLEEP/WAKE Interrupt Enable
|
#define INT_EN_ASLP 1<<7 //Auto-SLEEP/WAKE Interrupt Enable
|
||||||
#define INT_EN_FIFO 1<<6 //FIFO Interrupt Enable
|
#define INT_EN_FIFO 1<<6 //FIFO Interrupt Enable
|
||||||
#define INT_EN_TRANS 1<<5 //Transient Interrupt Enable
|
#define INT_EN_TRANS 1<<5 //Transient Interrupt Enable
|
||||||
#define INT_EN_LNDPRT 1<<4 //Orientation(Landscape/Portrait)Interrupt Enable
|
#define INT_EN_LNDPRT 1<<4 //Orientation(Landscape/Portrait)Interrupt Enable
|
||||||
#define INT_EN_PULSE 1<<3 //Pulse Detection Interrupt Enable
|
#define INT_EN_PULSE 1<<3 //Pulse Detection Interrupt Enable
|
||||||
#define INT_EN_FF_MT 1<<2 //Freefall/Motion Interrupt Enable
|
#define INT_EN_FF_MT 1<<2 //Freefall/Motion Interrupt Enable
|
||||||
#define INT_EN_DRDY 1<<0 //Data Ready Interrupt Enable
|
#define INT_EN_DRDY 1<<0 //Data Ready Interrupt Enable
|
||||||
|
|
||||||
#endif /* MMA8652FC_DEFINES_H_ */
|
#endif /* MMA8652FC_DEFINES_H_ */
|
||||||
@@ -63,7 +63,6 @@ uint8_t OLED_Setup_Array[] = {
|
|||||||
const uint8_t REFRESH_COMMANDS[17] = { 0x80, 0xAF, 0x80, 0x21, 0x80, 0x20, 0x80,
|
const uint8_t REFRESH_COMMANDS[17] = { 0x80, 0xAF, 0x80, 0x21, 0x80, 0x20, 0x80,
|
||||||
0x7F, 0x80, 0xC0, 0x80, 0x22, 0x80, 0x00, 0x80, 0x01, 0x40 };
|
0x7F, 0x80, 0xC0, 0x80, 0x22, 0x80, 0x00, 0x80, 0x01, 0x40 };
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Animation timing function that follows a bezier curve.
|
* Animation timing function that follows a bezier curve.
|
||||||
* @param t A given percentage value [0..<100]
|
* @param t A given percentage value [0..<100]
|
||||||
@@ -95,10 +94,6 @@ void OLED::initialize() {
|
|||||||
displayOffset = 0;
|
displayOffset = 0;
|
||||||
memcpy(&screenBuffer[0], &REFRESH_COMMANDS[0], sizeof(REFRESH_COMMANDS));
|
memcpy(&screenBuffer[0], &REFRESH_COMMANDS[0], sizeof(REFRESH_COMMANDS));
|
||||||
|
|
||||||
HAL_Delay(50);
|
|
||||||
HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET);
|
|
||||||
HAL_Delay(50);
|
|
||||||
|
|
||||||
// Set the display to be ON once the settings block is sent and send the
|
// Set the display to be ON once the settings block is sent and send the
|
||||||
// initialisation data to the OLED.
|
// initialisation data to the OLED.
|
||||||
|
|
||||||
@@ -148,10 +143,10 @@ void OLED::drawScrollIndicator(uint8_t y, uint8_t height) {
|
|||||||
uint16_t whole;
|
uint16_t whole;
|
||||||
uint8_t strips[2];
|
uint8_t strips[2];
|
||||||
} column;
|
} column;
|
||||||
|
|
||||||
column.whole = (1 << height) - 1;
|
column.whole = (1 << height) - 1;
|
||||||
column.whole <<= y;
|
column.whole <<= y;
|
||||||
|
|
||||||
// Draw a one pixel wide bar to the left with a single pixel as
|
// Draw a one pixel wide bar to the left with a single pixel as
|
||||||
// the scroll indicator.
|
// the scroll indicator.
|
||||||
fillArea(OLED_WIDTH - 1, 0, 1, 8, column.strips[0]);
|
fillArea(OLED_WIDTH - 1, 0, 1, 8, column.strips[0]);
|
||||||
@@ -195,11 +190,14 @@ void OLED::transitionSecondaryFramebuffer(bool forwardNavigation) {
|
|||||||
|
|
||||||
offset = progress;
|
offset = progress;
|
||||||
|
|
||||||
memmove(&firstStripPtr[oldStart], &firstStripPtr[oldPrevious], OLED_WIDTH - progress);
|
memmove(&firstStripPtr[oldStart], &firstStripPtr[oldPrevious],
|
||||||
memmove(&secondStripPtr[oldStart], &secondStripPtr[oldPrevious], OLED_WIDTH - progress);
|
OLED_WIDTH - progress);
|
||||||
|
memmove(&secondStripPtr[oldStart], &secondStripPtr[oldPrevious],
|
||||||
|
OLED_WIDTH - progress);
|
||||||
|
|
||||||
memmove(&firstStripPtr[newStart], &firstBackStripPtr[newEnd], progress);
|
memmove(&firstStripPtr[newStart], &firstBackStripPtr[newEnd], progress);
|
||||||
memmove(&secondStripPtr[newStart], &secondBackStripPtr[newEnd], progress);
|
memmove(&secondStripPtr[newStart], &secondBackStripPtr[newEnd],
|
||||||
|
progress);
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
osDelay(40);
|
osDelay(40);
|
||||||
@@ -275,7 +273,7 @@ uint8_t OLED::getFont() {
|
|||||||
inline void stripLeaderZeros(char *buffer, uint8_t places) {
|
inline void stripLeaderZeros(char *buffer, uint8_t places) {
|
||||||
//Removing the leading zero's by swapping them to SymbolSpace
|
//Removing the leading zero's by swapping them to SymbolSpace
|
||||||
// Stop 1 short so that we dont blank entire number if its zero
|
// Stop 1 short so that we dont blank entire number if its zero
|
||||||
for (int i = 0; i < (places-1); i++) {
|
for (int i = 0; i < (places - 1); i++) {
|
||||||
if (buffer[i] == 2) {
|
if (buffer[i] == 2) {
|
||||||
buffer[i] = SymbolSpace[0];
|
buffer[i] = SymbolSpace[0];
|
||||||
} else {
|
} else {
|
||||||
@@ -9,11 +9,10 @@
|
|||||||
|
|
||||||
#ifndef OLED_HPP_
|
#ifndef OLED_HPP_
|
||||||
#define OLED_HPP_
|
#define OLED_HPP_
|
||||||
#include <hardware.h>
|
#include <BSP.h>
|
||||||
#include "stm32f1xx_hal.h"
|
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "FRToSI2C.hpp"
|
#include "I2C_Wrapper.hpp"
|
||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -27,12 +26,11 @@ extern "C" {
|
|||||||
#define OLED_HEIGHT 16
|
#define OLED_HEIGHT 16
|
||||||
#define FRAMEBUFFER_START 17
|
#define FRAMEBUFFER_START 17
|
||||||
|
|
||||||
class OLED {
|
class OLED {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
enum DisplayState : bool {
|
enum DisplayState : bool {
|
||||||
OFF = false,
|
OFF = false, ON = true
|
||||||
ON = true
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void initialize(); // Startup the I2C coms (brings screen out of reset etc)
|
static void initialize(); // Startup the I2C coms (brings screen out of reset etc)
|
||||||
@@ -40,7 +38,7 @@ public:
|
|||||||
// Draw the buffer out to the LCD using the DMA Channel
|
// Draw the buffer out to the LCD using the DMA Channel
|
||||||
static void refresh() {
|
static void refresh() {
|
||||||
FRToSI2C::Transmit( DEVICEADDR_OLED, screenBuffer,
|
FRToSI2C::Transmit( DEVICEADDR_OLED, screenBuffer,
|
||||||
FRAMEBUFFER_START + (OLED_WIDTH * 2));
|
FRAMEBUFFER_START + (OLED_WIDTH * 2));
|
||||||
//DMA tx time is ~ 20mS Ensure after calling this you delay for at least 25ms
|
//DMA tx time is ~ 20mS Ensure after calling this you delay for at least 25ms
|
||||||
//or we need to goto double buffering
|
//or we need to goto double buffering
|
||||||
}
|
}
|
||||||
@@ -49,16 +47,16 @@ public:
|
|||||||
displayState = state;
|
displayState = state;
|
||||||
screenBuffer[1] = (state == ON) ? 0xAF : 0xAE;
|
screenBuffer[1] = (state == ON) ? 0xAF : 0xAE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setRotation(bool leftHanded); // Set the rotation for the screen
|
static void setRotation(bool leftHanded); // Set the rotation for the screen
|
||||||
// Get the current rotation of the LCD
|
// Get the current rotation of the LCD
|
||||||
static bool getRotation() {
|
static bool getRotation() {
|
||||||
return inLeftHandedMode;
|
return inLeftHandedMode;
|
||||||
}
|
}
|
||||||
static int16_t getCursorX() {
|
static int16_t getCursorX() {
|
||||||
return cursor_x;
|
return cursor_x;
|
||||||
}
|
}
|
||||||
static void print(const char* string);// Draw a string to the current location, with current font
|
static void print(const char *string);// Draw a string to the current location, with current font
|
||||||
// Set the cursor location by pixels
|
// Set the cursor location by pixels
|
||||||
static void setCursor(int16_t x, int16_t y) {
|
static void setCursor(int16_t x, int16_t y) {
|
||||||
cursor_x = x;
|
cursor_x = x;
|
||||||
@@ -71,11 +69,12 @@ public:
|
|||||||
}
|
}
|
||||||
static void setFont(uint8_t fontNumber); // (Future) Set the font that is being used
|
static void setFont(uint8_t fontNumber); // (Future) Set the font that is being used
|
||||||
static uint8_t getFont();
|
static uint8_t getFont();
|
||||||
static void drawImage(const uint8_t* buffer, uint8_t x, uint8_t width) {
|
static void drawImage(const uint8_t *buffer, uint8_t x, uint8_t width) {
|
||||||
drawArea(x, 0, width, 16, buffer);
|
drawArea(x, 0, width, 16, buffer);
|
||||||
}
|
}
|
||||||
// Draws an image to the buffer, at x offset from top to bottom (fixed height renders)
|
// Draws an image to the buffer, at x offset from top to bottom (fixed height renders)
|
||||||
static void printNumber(uint16_t number, uint8_t places,bool noLeaderZeros=true);
|
static void printNumber(uint16_t number, uint8_t places,
|
||||||
|
bool noLeaderZeros = true);
|
||||||
// Draws a number at the current cursor location
|
// Draws a number at the current cursor location
|
||||||
// Clears the buffer
|
// Clears the buffer
|
||||||
static void clearScreen() {
|
static void clearScreen() {
|
||||||
@@ -92,9 +91,9 @@ public:
|
|||||||
static void debugNumber(int32_t val);
|
static void debugNumber(int32_t val);
|
||||||
static void drawSymbol(uint8_t symbolID);//Used for drawing symbols of a predictable width
|
static void drawSymbol(uint8_t symbolID);//Used for drawing symbols of a predictable width
|
||||||
static void drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
|
static void drawArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
|
||||||
const uint8_t* ptr); //Draw an area, but y must be aligned on 0/8 offset
|
const uint8_t *ptr); //Draw an area, but y must be aligned on 0/8 offset
|
||||||
static void drawAreaSwapped(int16_t x, int8_t y, uint8_t wide, uint8_t height,
|
static void drawAreaSwapped(int16_t x, int8_t y, uint8_t wide,
|
||||||
const uint8_t* ptr); //Draw an area, but y must be aligned on 0/8 offset
|
uint8_t height, const uint8_t *ptr); //Draw an area, but y must be aligned on 0/8 offset
|
||||||
static void fillArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
|
static void fillArea(int16_t x, int8_t y, uint8_t wide, uint8_t height,
|
||||||
const uint8_t value); //Fill an area, but y must be aligned on 0/8 offset
|
const uint8_t value); //Fill an area, but y must be aligned on 0/8 offset
|
||||||
static void drawFilledRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1,
|
static void drawFilledRect(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1,
|
||||||
@@ -106,9 +105,9 @@ public:
|
|||||||
private:
|
private:
|
||||||
static void drawChar(char c); // Draw a character to a specific location
|
static void drawChar(char c); // Draw a character to a specific location
|
||||||
static void setFramebuffer(uint8_t *buffer);
|
static void setFramebuffer(uint8_t *buffer);
|
||||||
static const uint8_t* currentFont;// Pointer to the current font used for rendering to the buffer
|
static const uint8_t *currentFont; // Pointer to the current font used for rendering to the buffer
|
||||||
static uint8_t* firstStripPtr; // Pointers to the strips to allow for buffer having extra content
|
static uint8_t *firstStripPtr; // Pointers to the strips to allow for buffer having extra content
|
||||||
static uint8_t* secondStripPtr; //Pointers to the strips
|
static uint8_t *secondStripPtr; //Pointers to the strips
|
||||||
static bool inLeftHandedMode; // Whether the screen is in left or not (used for offsets in GRAM)
|
static bool inLeftHandedMode; // Whether the screen is in left or not (used for offsets in GRAM)
|
||||||
static DisplayState displayState;
|
static DisplayState displayState;
|
||||||
static uint8_t fontWidth, fontHeight;
|
static uint8_t fontWidth, fontHeight;
|
||||||
10
workspace/TS100/Core/Drivers/README.md
Normal file
10
workspace/TS100/Core/Drivers/README.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Drivers
|
||||||
|
|
||||||
|
Drivers are the classes used to represent physical hardware on the board in a more abstract way, that are more complex than just an IO
|
||||||
|
|
||||||
|
* OLED Display
|
||||||
|
* Accelerometers
|
||||||
|
* Button handling logic
|
||||||
|
* Tip thermo response modelling
|
||||||
|
|
||||||
|
All drivers should be written with minimal hardware assumptions, and defer hardware related logic to the BSP folder where possible
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "TipThermoModel.h"
|
#include "TipThermoModel.h"
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
#include "hardware.h"
|
#include "BSP.h"
|
||||||
#include "../../configuration.h"
|
#include "../../configuration.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
#ifndef SRC_TIPTHERMOMODEL_H_
|
#ifndef SRC_TIPTHERMOMODEL_H_
|
||||||
#define SRC_TIPTHERMOMODEL_H_
|
#define SRC_TIPTHERMOMODEL_H_
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
#include "hardware.h"
|
#include "BSP.h"
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
class TipThermoModel {
|
class TipThermoModel {
|
||||||
public:
|
public:
|
||||||
28
workspace/TS100/Core/Inc/FreeRTOSHooks.h
Normal file
28
workspace/TS100/Core/Inc/FreeRTOSHooks.h
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
* FreeRTOSHooks.h
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INC_FREERTOSHOOKS_H_
|
||||||
|
#define INC_FREERTOSHOOKS_H_
|
||||||
|
|
||||||
|
#include "FreeRTOS.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include "unit.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// RToS
|
||||||
|
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer,
|
||||||
|
StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize);
|
||||||
|
void vApplicationIdleHook(void);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* INC_FREERTOSHOOKS_H_ */
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
/*
|
|
||||||
* MMA8652FC.h
|
|
||||||
*
|
|
||||||
* Created on: 31Aug.,2017
|
|
||||||
* Author: Ben V. Brown
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MMA8652FC_HPP_
|
|
||||||
#define MMA8652FC_HPP_
|
|
||||||
#include "stm32f1xx_hal.h"
|
|
||||||
#include "MMA8652FC_defines.h"
|
|
||||||
#include "FRToSI2C.hpp"
|
|
||||||
#include "hardware.h"
|
|
||||||
|
|
||||||
class MMA8652FC {
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
|
|
||||||
static void initalize(); // Initalize the system
|
|
||||||
static Orientation getOrientation();// Reads the I2C register and returns the orientation (true == left)
|
|
||||||
static void getAxisReadings(int16_t& x, int16_t& y, int16_t& z);
|
|
||||||
|
|
||||||
private:
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* MMA8652FC_HPP_ */
|
|
||||||
21
workspace/TS100/Core/Inc/QC3.h
Normal file
21
workspace/TS100/Core/Inc/QC3.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* QC3.h
|
||||||
|
*
|
||||||
|
* Created on: 29 May 2020
|
||||||
|
* Author: Ralim
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef INC_QC3_H_
|
||||||
|
#define INC_QC3_H_
|
||||||
|
#include "stdint.h"
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
void seekQC(int16_t Vx10, uint16_t divisor);
|
||||||
|
void startQC(uint16_t divisor); // Tries to negotiate QC for highest voltage, must be run after
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* INC_QC3_H_ */
|
||||||
@@ -42,7 +42,7 @@ typedef struct {
|
|||||||
uint8_t temperatureInF :1; // Should the temp be in F or C (true is F)
|
uint8_t temperatureInF :1; // Should the temp be in F or C (true is F)
|
||||||
#endif
|
#endif
|
||||||
uint8_t descriptionScrollSpeed :1; // Description scroll speed
|
uint8_t descriptionScrollSpeed :1; // Description scroll speed
|
||||||
uint8_t KeepAwakePulse; // Keep Awake pulse power in 0.1 watts (10 = 1Watt)
|
uint8_t KeepAwakePulse; // Keep Awake pulse power in 0.1 watts (10 = 1Watt)
|
||||||
|
|
||||||
uint16_t voltageDiv; // Voltage divisor factor
|
uint16_t voltageDiv; // Voltage divisor factor
|
||||||
uint16_t BoostTemp; // Boost mode set point for the iron
|
uint16_t BoostTemp; // Boost mode set point for the iron
|
||||||
@@ -51,7 +51,7 @@ typedef struct {
|
|||||||
|
|
||||||
uint8_t powerLimitEnable; // Allow toggling of power limit without changing value
|
uint8_t powerLimitEnable; // Allow toggling of power limit without changing value
|
||||||
uint8_t powerLimit; // Maximum power iron allowed to output
|
uint8_t powerLimit; // Maximum power iron allowed to output
|
||||||
|
|
||||||
uint16_t TipGain; // uV/C * 10, it can be used to convert tip thermocouple voltage to temperateture TipV/TipGain = TipTemp
|
uint16_t TipGain; // uV/C * 10, it can be used to convert tip thermocouple voltage to temperateture TipV/TipGain = TipTemp
|
||||||
|
|
||||||
uint8_t ReverseButtonTempChangeEnabled; // Change the plus and minus button assigment
|
uint8_t ReverseButtonTempChangeEnabled; // Change the plus and minus button assigment
|
||||||
@@ -70,5 +70,5 @@ void saveSettings();
|
|||||||
bool restoreSettings();
|
bool restoreSettings();
|
||||||
uint8_t lookupVoltageLevel(uint8_t level);
|
uint8_t lookupVoltageLevel(uint8_t level);
|
||||||
void resetSettings();
|
void resetSettings();
|
||||||
bool showBootLogoIfavailable();
|
|
||||||
#endif /* SETTINGS_H_ */
|
#endif /* SETTINGS_H_ */
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
#ifndef TRANSLATION_H_
|
#ifndef TRANSLATION_H_
|
||||||
#define TRANSLATION_H_
|
#define TRANSLATION_H_
|
||||||
#include "stm32f1xx_hal.h"
|
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
|
#include "stdint.h"
|
||||||
enum ShortNameType {
|
enum ShortNameType {
|
||||||
SHORT_NAME_SINGLE_LINE = 1, SHORT_NAME_DOUBLE_LINE = 2,
|
SHORT_NAME_SINGLE_LINE = 1, SHORT_NAME_DOUBLE_LINE = 2,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,38 +1,38 @@
|
|||||||
/*
|
/*
|
||||||
* gui.h
|
* gui.h
|
||||||
*
|
*
|
||||||
* Created on: 3Sep.,2017
|
* Created on: 3Sep.,2017
|
||||||
* Author: Ben V. Brown
|
* Author: Ben V. Brown
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GUI_HPP_
|
#ifndef GUI_HPP_
|
||||||
#define GUI_HPP_
|
#define GUI_HPP_
|
||||||
#include "Translation.h"
|
#include "Translation.h"
|
||||||
#include "Settings.h"
|
#include "Settings.h"
|
||||||
#include "hardware.h"
|
#include "BSP.h"
|
||||||
|
|
||||||
#define PRESS_ACCEL_STEP 3
|
#define PRESS_ACCEL_STEP 3
|
||||||
#define PRESS_ACCEL_INTERVAL_MIN 10
|
#define PRESS_ACCEL_INTERVAL_MIN 10
|
||||||
#define PRESS_ACCEL_INTERVAL_MAX 30
|
#define PRESS_ACCEL_INTERVAL_MAX 30
|
||||||
|
|
||||||
|
//GUI holds the menu structure and all its methods for the menu itself
|
||||||
//GUI holds the menu structure and all its methods for the menu itself
|
|
||||||
|
//Declarations for all the methods for the settings menu (at end of this file)
|
||||||
//Declarations for all the methods for the settings menu (at end of this file)
|
|
||||||
|
//Wrapper for holding a function pointer
|
||||||
//Wrapper for holding a function pointer
|
typedef struct state_func_t {
|
||||||
typedef struct state_func_t {
|
void (*func)(void);
|
||||||
void (*func)(void);
|
} state_func;
|
||||||
} state_func;
|
|
||||||
|
//Struct for holding the function pointers and descriptions
|
||||||
//Struct for holding the function pointers and descriptions
|
typedef struct {
|
||||||
typedef struct {
|
const char *description;
|
||||||
const char *description;
|
const state_func incrementHandler;
|
||||||
const state_func incrementHandler;
|
const state_func draw;
|
||||||
const state_func draw;
|
} menuitem;
|
||||||
} menuitem;
|
|
||||||
|
void enterSettingsMenu();
|
||||||
void enterSettingsMenu();
|
void GUIDelay();
|
||||||
extern const menuitem rootSettingsMenu[];
|
extern const menuitem rootSettingsMenu[];
|
||||||
|
|
||||||
#endif /* GUI_HPP_ */
|
#endif /* GUI_HPP_ */
|
||||||
|
|||||||
@@ -1,31 +1,12 @@
|
|||||||
#ifndef __MAIN_H
|
#ifndef __MAIN_H
|
||||||
#define __MAIN_H
|
#define __MAIN_H
|
||||||
|
|
||||||
#include <MMA8652FC.hpp>
|
|
||||||
#include "OLED.hpp"
|
#include "OLED.hpp"
|
||||||
#include "Setup.h"
|
#include "Setup.h"
|
||||||
extern uint8_t PCBVersion;
|
extern uint8_t PCBVersion;
|
||||||
extern uint32_t currentTempTargetDegC;
|
extern uint32_t currentTempTargetDegC;
|
||||||
extern bool settingsWereReset;
|
extern bool settingsWereReset;
|
||||||
enum ButtonState {
|
|
||||||
BUTTON_NONE = 0, /* No buttons pressed / < filter time*/
|
|
||||||
BUTTON_F_SHORT = 1, /* User has pressed the front button*/
|
|
||||||
BUTTON_B_SHORT = 2, /* User has pressed the back button*/
|
|
||||||
BUTTON_F_LONG = 4, /* User is holding the front button*/
|
|
||||||
BUTTON_B_LONG = 8, /* User is holding the back button*/
|
|
||||||
BUTTON_BOTH = 16, /* User has pressed both buttons*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note:
|
|
||||||
* Pressed means press + release, we trigger on a full \__/ pulse
|
|
||||||
* holding means it has gone low, and been low for longer than filter time
|
|
||||||
*/
|
|
||||||
};
|
|
||||||
|
|
||||||
ButtonState getButtonState();
|
|
||||||
void waitForButtonPressOrTimeout(uint32_t timeout);
|
|
||||||
void waitForButtonPress();
|
|
||||||
void GUIDelay();
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -40,6 +21,13 @@ void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
|
|||||||
void vApplicationStackOverflowHook(xTaskHandle *pxTask,
|
void vApplicationStackOverflowHook(xTaskHandle *pxTask,
|
||||||
signed portCHAR *pcTaskName);
|
signed portCHAR *pcTaskName);
|
||||||
|
|
||||||
|
//Threads
|
||||||
|
void startGUITask(void const *argument);
|
||||||
|
void startPIDTask(void const *argument);
|
||||||
|
void startMOVTask(void const *argument);
|
||||||
|
extern TaskHandle_t pidTaskNotification;
|
||||||
|
extern uint8_t accelInit;
|
||||||
|
extern uint32_t lastMovementTime;
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
#include "stdint.h"
|
#include "stdint.h"
|
||||||
#include <history.hpp>
|
#include <history.hpp>
|
||||||
#include "hardware.h"
|
#include "BSP.h"
|
||||||
#include "expMovingAverage.h"
|
#include "expMovingAverage.h"
|
||||||
#ifndef POWER_HPP_
|
#ifndef POWER_HPP_
|
||||||
#define POWER_HPP_
|
#define POWER_HPP_
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user