Setting up TIM1 for WS2812

This commit is contained in:
Ben V. Brown
2021-05-02 17:42:41 +10:00
parent 1ad00aa8b2
commit 2e0279b36a
6 changed files with 468 additions and 458 deletions

View File

@@ -12,427 +12,402 @@
#include "main.hpp" #include "main.hpp"
#include <IRQ.h> #include <IRQ.h>
volatile uint16_t PWMSafetyTimer = 0; volatile uint16_t PWMSafetyTimer = 0;
volatile uint8_t pendingPWM = 0; volatile uint8_t pendingPWM = 0;
uint16_t totalPWM = 255; uint16_t totalPWM = 255;
const uint16_t powerPWM = 255; const uint16_t powerPWM = 255;
history<uint16_t, PID_TIM_HZ> rawTempFilter = { { 0 }, 0, 0 }; history<uint16_t, PID_TIM_HZ> rawTempFilter = {{0}, 0, 0};
void resetWatchdog() { void resetWatchdog() { HAL_IWDG_Refresh(&hiwdg); }
HAL_IWDG_Refresh(&hiwdg);
}
#ifdef TEMP_NTC #ifdef TEMP_NTC
// Lookup table for the NTC // Lookup table for the NTC
// Stored as ADCReading,Temp in degC // Stored as ADCReading,Temp in degC
static const uint16_t NTCHandleLookup[] = { static const uint16_t NTCHandleLookup[] = {
// ADC Reading , Temp in Cx10 // ADC Reading , Temp in Cx10
808, 1600, // 808, 1600, //
832, 1590, // 832, 1590, //
848, 1580, // 848, 1580, //
872, 1570, // 872, 1570, //
888, 1560, // 888, 1560, //
912, 1550, // 912, 1550, //
936, 1540, // 936, 1540, //
960, 1530, // 960, 1530, //
984, 1520, // 984, 1520, //
1008, 1510, // 1008, 1510, //
1032, 1500, // 1032, 1500, //
1056, 1490, // 1056, 1490, //
1080, 1480, // 1080, 1480, //
1112, 1470, // 1112, 1470, //
1136, 1460, // 1136, 1460, //
1168, 1450, // 1168, 1450, //
1200, 1440, // 1200, 1440, //
1224, 1430, // 1224, 1430, //
1256, 1420, // 1256, 1420, //
1288, 1410, // 1288, 1410, //
1328, 1400, // 1328, 1400, //
1360, 1390, // 1360, 1390, //
1392, 1380, // 1392, 1380, //
1432, 1370, // 1432, 1370, //
1464, 1360, // 1464, 1360, //
1504, 1350, // 1504, 1350, //
1544, 1340, // 1544, 1340, //
1584, 1330, // 1584, 1330, //
1632, 1320, // 1632, 1320, //
1672, 1310, // 1672, 1310, //
1720, 1300, // 1720, 1300, //
1760, 1290, // 1760, 1290, //
1808, 1280, // 1808, 1280, //
1856, 1270, // 1856, 1270, //
1912, 1260, // 1912, 1260, //
1960, 1250, // 1960, 1250, //
2016, 1240, // 2016, 1240, //
2072, 1230, // 2072, 1230, //
2128, 1220, // 2128, 1220, //
2184, 1210, // 2184, 1210, //
2248, 1200, // 2248, 1200, //
2304, 1190, // 2304, 1190, //
2368, 1180, // 2368, 1180, //
2440, 1170, // 2440, 1170, //
2504, 1160, // 2504, 1160, //
2576, 1150, // 2576, 1150, //
2648, 1140, // 2648, 1140, //
2720, 1130, // 2720, 1130, //
2792, 1120, // 2792, 1120, //
2872, 1110, // 2872, 1110, //
2952, 1100, // 2952, 1100, //
3040, 1090, // 3040, 1090, //
3128, 1080, // 3128, 1080, //
3216, 1070, // 3216, 1070, //
3304, 1060, // 3304, 1060, //
3400, 1050, // 3400, 1050, //
3496, 1040, // 3496, 1040, //
3592, 1030, // 3592, 1030, //
3696, 1020, // 3696, 1020, //
3800, 1010, // 3800, 1010, //
3912, 1000, // 3912, 1000, //
4024, 990, // 4024, 990, //
4136, 980, // 4136, 980, //
4256, 970, // 4256, 970, //
4376, 960, // 4376, 960, //
4504, 950, // 4504, 950, //
4632, 940, // 4632, 940, //
4768, 930, // 4768, 930, //
4904, 920, // 4904, 920, //
5048, 910, // 5048, 910, //
5192, 900, // 5192, 900, //
5336, 890, // 5336, 890, //
5488, 880, // 5488, 880, //
5648, 870, // 5648, 870, //
5808, 860, // 5808, 860, //
5976, 850, // 5976, 850, //
6144, 840, // 6144, 840, //
6320, 830, // 6320, 830, //
6504, 820, // 6504, 820, //
6688, 810, // 6688, 810, //
6872, 800, // 6872, 800, //
7072, 790, // 7072, 790, //
7264, 780, // 7264, 780, //
7472, 770, // 7472, 770, //
7680, 760, // 7680, 760, //
7896, 750, // 7896, 750, //
8112, 740, // 8112, 740, //
8336, 730, // 8336, 730, //
8568, 720, // 8568, 720, //
8800, 710, // 8800, 710, //
9040, 700, // 9040, 700, //
9288, 690, // 9288, 690, //
9536, 680, // 9536, 680, //
9792, 670, // 9792, 670, //
10056, 660, // 10056, 660, //
10320, 650, // 10320, 650, //
10592, 640, // 10592, 640, //
10872, 630, // 10872, 630, //
11152, 620, // 11152, 620, //
11440, 610, // 11440, 610, //
11728, 600, // 11728, 600, //
12024, 590, // 12024, 590, //
12320, 580, // 12320, 580, //
12632, 570, // 12632, 570, //
12936, 560, // 12936, 560, //
13248, 550, // 13248, 550, //
13568, 540, // 13568, 540, //
13888, 530, // 13888, 530, //
14216, 520, // 14216, 520, //
14544, 510, // 14544, 510, //
14880, 500, // 14880, 500, //
15216, 490, // 15216, 490, //
15552, 480, // 15552, 480, //
15888, 470, // 15888, 470, //
16232, 460, // 16232, 460, //
16576, 450, // 16576, 450, //
16920, 440, // 16920, 440, //
17272, 430, // 17272, 430, //
17616, 420, // 17616, 420, //
17968, 410, // 17968, 410, //
18320, 400, // 18320, 400, //
18664, 390, // 18664, 390, //
19016, 380, // 19016, 380, //
19368, 370, // 19368, 370, //
19712, 360, // 19712, 360, //
20064, 350, // 20064, 350, //
20408, 340, // 20408, 340, //
20752, 330, // 20752, 330, //
21088, 320, // 21088, 320, //
21432, 310, // 21432, 310, //
21768, 300, // 21768, 300, //
22096, 290, // 22096, 290, //
22424, 280, // 22424, 280, //
22752, 270, // 22752, 270, //
23072, 260, // 23072, 260, //
23392, 250, // 23392, 250, //
23704, 240, // 23704, 240, //
24008, 230, // 24008, 230, //
24312, 220, // 24312, 220, //
24608, 210, // 24608, 210, //
24904, 200, // 24904, 200, //
25192, 190, // 25192, 190, //
25472, 180, // 25472, 180, //
25744, 170, // 25744, 170, //
26016, 160, // 26016, 160, //
26280, 150, // 26280, 150, //
26536, 140, // 26536, 140, //
26784, 130, // 26784, 130, //
27024, 120, // 27024, 120, //
27264, 110, // 27264, 110, //
27496, 100, // 27496, 100, //
27720, 90, // 27720, 90, //
27936, 80, // 27936, 80, //
28144, 70, // 28144, 70, //
28352, 60, // 28352, 60, //
28544, 50, // 28544, 50, //
28736, 40, // 28736, 40, //
28920, 30, // 28920, 30, //
29104, 20, // 29104, 20, //
29272, 10, // 29272, 10, //
}; };
const int NTCHandleLookupItems = sizeof(NTCHandleLookup) const int NTCHandleLookupItems = sizeof(NTCHandleLookup) / (2 * sizeof(uint16_t));
/ (2 * sizeof(uint16_t));
#endif #endif
// These are called by the HAL after the corresponding events from the system // These are called by the HAL after the corresponding events from the system
// timers. // timers.
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
// Period has elapsed // Period has elapsed
if (htim->Instance == TIM1) { if (htim->Instance == TIM4) {
// STM uses this for internal functions as a counter for timeouts // STM uses this for internal functions as a counter for timeouts
HAL_IncTick(); HAL_IncTick();
} }
} }
uint16_t getHandleTemperature() { uint16_t getHandleTemperature() {
int32_t result = getADC(0); int32_t result = getADC(0);
return Utils::InterpolateLookupTable(NTCHandleLookup, NTCHandleLookupItems, return Utils::InterpolateLookupTable(NTCHandleLookup, NTCHandleLookupItems, result);
result);
} }
uint16_t getTipInstantTemperature() { uint16_t getTipInstantTemperature() { return getADC(2); }
return getADC(2);
}
uint16_t getTipRawTemp(uint8_t refresh) { uint16_t getTipRawTemp(uint8_t refresh) {
if (refresh) { if (refresh) {
uint16_t lastSample = getTipInstantTemperature(); uint16_t lastSample = getTipInstantTemperature();
rawTempFilter.update(lastSample); rawTempFilter.update(lastSample);
return lastSample; return lastSample;
} else { } else {
return rawTempFilter.average(); return rawTempFilter.average();
} }
} }
uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) { uint16_t getInputVoltageX10(uint16_t divisor, uint8_t sample) {
// ADC maximum is 32767 == 3.3V at input == 28.05V at VIN // ADC maximum is 32767 == 3.3V at input == 28.05V at VIN
// Therefore we can divide down from there // Therefore we can divide down from there
// Multiplying ADC max by 4 for additional calibration options, // Multiplying ADC max by 4 for additional calibration options,
// ideal term is 467 // ideal term is 467
static uint8_t preFillneeded = 10; static uint8_t preFillneeded = 10;
static uint32_t samples[BATTFILTERDEPTH]; static uint32_t samples[BATTFILTERDEPTH];
static uint8_t index = 0; static uint8_t index = 0;
if (preFillneeded) { if (preFillneeded) {
for (uint8_t i = 0; i < BATTFILTERDEPTH; i++) for (uint8_t i = 0; i < BATTFILTERDEPTH; i++)
samples[i] = getADC(1); samples[i] = getADC(1);
preFillneeded--; preFillneeded--;
} }
if (sample) { if (sample) {
samples[index] = getADC(1); samples[index] = getADC(1);
index = (index + 1) % BATTFILTERDEPTH; index = (index + 1) % BATTFILTERDEPTH;
} }
uint32_t sum = 0; uint32_t sum = 0;
for (uint8_t i = 0; i < BATTFILTERDEPTH; i++) for (uint8_t i = 0; i < BATTFILTERDEPTH; i++)
sum += samples[i]; sum += samples[i];
sum /= BATTFILTERDEPTH; sum /= BATTFILTERDEPTH;
if (divisor == 0) { if (divisor == 0) {
divisor = 1; divisor = 1;
} }
return sum * 4 / divisor; return sum * 4 / divisor;
} }
bool tryBetterPWM(uint8_t pwm) { bool tryBetterPWM(uint8_t pwm) {
// We dont need this for the MHP30 // We dont need this for the MHP30
return false; return false;
} }
void setTipPWM(uint8_t pulse) { void setTipPWM(uint8_t pulse) {
// We can just set the timer directly // We can just set the timer directly
htim3.Instance->CCR1 = pulse; htim3.Instance->CCR1 = pulse;
} }
void unstick_I2C() { void unstick_I2C() {
GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitTypeDef GPIO_InitStruct;
int timeout = 100; int timeout = 100;
int timeout_cnt = 0; int timeout_cnt = 0;
// 1. Clear PE bit. // 1. Clear PE bit.
hi2c1.Instance->CR1 &= ~(0x0001); hi2c1.Instance->CR1 &= ~(0x0001);
/**I2C1 GPIO Configuration /**I2C1 GPIO Configuration
PB6 ------> I2C1_SCL PB6 ------> I2C1_SCL
PB7 ------> I2C1_SDA PB7 ------> I2C1_SDA
*/ */
// 2. Configure the SCL and SDA I/Os as General Purpose Output Open-Drain, High level (Write 1 to GPIOx_ODR). // 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.Mode = GPIO_MODE_OUTPUT_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;
GPIO_InitStruct.Pin = SCL_Pin; GPIO_InitStruct.Pin = SCL_Pin;
HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = SDA_Pin; GPIO_InitStruct.Pin = SDA_Pin;
HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET);
while (GPIO_PIN_SET != HAL_GPIO_ReadPin(SDA_GPIO_Port, SDA_Pin)) { while (GPIO_PIN_SET != HAL_GPIO_ReadPin(SDA_GPIO_Port, SDA_Pin)) {
// Move clock to release I2C // Move clock to release I2C
HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_RESET);
asm("nop"); asm("nop");
asm("nop"); asm("nop");
asm("nop"); asm("nop");
asm("nop"); asm("nop");
HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
timeout_cnt++; timeout_cnt++;
if (timeout_cnt > timeout) if (timeout_cnt > timeout)
return; return;
} }
// 12. Configure the SCL and SDA I/Os as Alternate function Open-Drain. // 12. Configure the SCL and SDA I/Os as Alternate function Open-Drain.
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;
GPIO_InitStruct.Pin = SCL_Pin; GPIO_InitStruct.Pin = SCL_Pin;
HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(SCL_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = SDA_Pin; GPIO_InitStruct.Pin = SDA_Pin;
HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(SDA_GPIO_Port, &GPIO_InitStruct);
HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(SCL_GPIO_Port, SCL_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(SDA_GPIO_Port, SDA_Pin, GPIO_PIN_SET);
// 13. Set SWRST bit in I2Cx_CR1 register. // 13. Set SWRST bit in I2Cx_CR1 register.
hi2c1.Instance->CR1 |= 0x8000; hi2c1.Instance->CR1 |= 0x8000;
asm("nop"); asm("nop");
// 14. Clear SWRST bit in I2Cx_CR1 register. // 14. Clear SWRST bit in I2Cx_CR1 register.
hi2c1.Instance->CR1 &= ~0x8000; hi2c1.Instance->CR1 &= ~0x8000;
asm("nop"); asm("nop");
// 15. Enable the I2C peripheral by setting the PE bit in I2Cx_CR1 register // 15. Enable the I2C peripheral by setting the PE bit in I2Cx_CR1 register
hi2c1.Instance->CR1 |= 0x0001; hi2c1.Instance->CR1 |= 0x0001;
// Call initialization function. // Call initialization function.
HAL_I2C_Init(&hi2c1); HAL_I2C_Init(&hi2c1);
} }
uint8_t getButtonA() { uint8_t getButtonA() { return HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ? 1 : 0; }
return HAL_GPIO_ReadPin(KEY_A_GPIO_Port, KEY_A_Pin) == GPIO_PIN_RESET ? uint8_t getButtonB() { return HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ? 1 : 0; }
1 : 0;
}
uint8_t getButtonB() {
return HAL_GPIO_ReadPin(KEY_B_GPIO_Port, KEY_B_Pin) == GPIO_PIN_RESET ?
1 : 0;
}
void BSPInit(void) { void BSPInit(void) {}
}
void reboot() { void reboot() { NVIC_SystemReset(); }
NVIC_SystemReset();
}
void delay_ms(uint16_t count) { void delay_ms(uint16_t count) { HAL_Delay(count); }
HAL_Delay(count);
}
void setPlatePullup(bool pullingUp) { void setPlatePullup(bool pullingUp) {
GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Pin = PLATE_SENSOR_PULLUP_Pin; GPIO_InitStruct.Pin = PLATE_SENSOR_PULLUP_Pin;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
if (pullingUp) { if (pullingUp) {
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_WritePin(PLATE_SENSOR_PULLUP_GPIO_Port, HAL_GPIO_WritePin(PLATE_SENSOR_PULLUP_GPIO_Port, PLATE_SENSOR_PULLUP_Pin, GPIO_PIN_SET);
PLATE_SENSOR_PULLUP_Pin, GPIO_PIN_SET); } else {
} else { // Hi-z
// Hi-z GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; HAL_GPIO_WritePin(PLATE_SENSOR_PULLUP_GPIO_Port, PLATE_SENSOR_PULLUP_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(PLATE_SENSOR_PULLUP_GPIO_Port, }
PLATE_SENSOR_PULLUP_Pin, GPIO_PIN_RESET); HAL_GPIO_Init(PLATE_SENSOR_PULLUP_GPIO_Port, &GPIO_InitStruct);
}
HAL_GPIO_Init(PLATE_SENSOR_PULLUP_GPIO_Port, &GPIO_InitStruct);
} }
uint16_t tipSenseResistancex10Ohms = 0; uint16_t tipSenseResistancex10Ohms = 0;
bool isTipDisconnected() { bool isTipDisconnected() {
static bool lastTipDisconnectedState = true; static bool lastTipDisconnectedState = true;
static uint16_t adcReadingPD1Set = 0; static uint16_t adcReadingPD1Set = 0;
static TickType_t lastMeas = 0; static TickType_t lastMeas = 0;
// For the MHP30 we want to include a little extra logic in here // For the MHP30 we want to include a little extra logic in here
// As when the tip is first connected we want to measure the ~100 ohm resistor on the base of the tip // As when the tip is first connected we want to measure the ~100 ohm resistor on the base of the tip
// And likewise if its removed we want to clear that measurement // And likewise if its removed we want to clear that measurement
/* /*
* plate_sensor_res = ((adc5_value_PD1_set - adc5_value_PD1_cleared) / (adc5_value_PD1_cleared + 4096 - adc5_value_PD1_set)) * 1000.0; * plate_sensor_res = ((adc5_value_PD1_set - adc5_value_PD1_cleared) / (adc5_value_PD1_cleared + 4096 - adc5_value_PD1_set)) * 1000.0;
* */ * */
bool tipDisconnected = getADC(2) > 4090; bool tipDisconnected = getADC(2) > 4090;
// We have to handle here that this ^ will trip while measuring the gain resistor // We have to handle here that this ^ will trip while measuring the gain resistor
if (xTaskGetTickCount() - lastMeas if (xTaskGetTickCount() - lastMeas < (TICKS_100MS * 2 + (TICKS_100MS / 2))) {
< (TICKS_100MS * 2 + (TICKS_100MS / 2))) { tipDisconnected = false;
tipDisconnected = false; }
}
if (tipDisconnected != lastTipDisconnectedState) { if (tipDisconnected != lastTipDisconnectedState) {
if (tipDisconnected) { if (tipDisconnected) {
// Tip is now disconnected // Tip is now disconnected
tipSenseResistancex10Ohms = 0; // zero out the resistance tipSenseResistancex10Ohms = 0; // zero out the resistance
adcReadingPD1Set = 0; adcReadingPD1Set = 0;
lastMeas = 0; lastMeas = 0;
} }
lastTipDisconnectedState = tipDisconnected; lastTipDisconnectedState = tipDisconnected;
} }
if (!tipDisconnected) { if (!tipDisconnected) {
if (tipSenseResistancex10Ohms == 0) { if (tipSenseResistancex10Ohms == 0) {
if (lastMeas == 0) { if (lastMeas == 0) {
lastMeas = xTaskGetTickCount(); lastMeas = xTaskGetTickCount();
setPlatePullup(true); setPlatePullup(true);
} else if (xTaskGetTickCount() - lastMeas > (TICKS_100MS)) { } else if (xTaskGetTickCount() - lastMeas > (TICKS_100MS)) {
lastMeas = xTaskGetTickCount(); lastMeas = xTaskGetTickCount();
// We are sensing the resistance // We are sensing the resistance
if (adcReadingPD1Set == 0) { if (adcReadingPD1Set == 0) {
// We will record the reading for PD1 being set // We will record the reading for PD1 being set
adcReadingPD1Set = getADC(3); adcReadingPD1Set = getADC(3);
setPlatePullup(false); setPlatePullup(false);
} else { } else {
// We have taken reading one // We have taken reading one
uint16_t adcReadingPD1Cleared = getADC(3); uint16_t adcReadingPD1Cleared = getADC(3);
uint32_t a = ((int) adcReadingPD1Set uint32_t a = ((int)adcReadingPD1Set - (int)adcReadingPD1Cleared);
- (int) adcReadingPD1Cleared); a *= 10000;
a *= 10000; uint32_t b = ((int)adcReadingPD1Cleared + (32768 - (int)adcReadingPD1Set));
uint32_t b = ((int) adcReadingPD1Cleared if (b) {
+ (32768 - (int) adcReadingPD1Set)); tipSenseResistancex10Ohms = a / b;
if (b) { } else {
tipSenseResistancex10Ohms = a / b; tipSenseResistancex10Ohms = adcReadingPD1Set = lastMeas = 0;
} else { }
tipSenseResistancex10Ohms = adcReadingPD1Set = if (tipSenseResistancex10Ohms > 1100 || tipSenseResistancex10Ohms < 900) {
lastMeas = 0; tipSenseResistancex10Ohms = 0; // out of range
} adcReadingPD1Set = 0;
if (tipSenseResistancex10Ohms > 1100 lastMeas = 0;
|| tipSenseResistancex10Ohms < 900) { }
tipSenseResistancex10Ohms = 0; // out of range }
adcReadingPD1Set = 0; }
lastMeas = 0; return true; // we fake tip being disconnected until this is measured
} }
} }
}
return true; // we fake tip being disconnected until this is measured
}
}
return tipDisconnected; return tipDisconnected;
} }
void setStatusLED(const enum StatusLED state) { void setStatusLED(const enum StatusLED state) {}
}

View File

@@ -50,4 +50,7 @@
#define PLATE_SENSOR_GPIO_Port GPIOA #define PLATE_SENSOR_GPIO_Port GPIOA
#define PLATE_SENSOR_ADC1_CHANNEL ADC_CHANNEL_5 #define PLATE_SENSOR_ADC1_CHANNEL ADC_CHANNEL_5
#define PLATE_SENSOR_ADC2_CHANNEL ADC_CHANNEL_5 #define PLATE_SENSOR_ADC2_CHANNEL ADC_CHANNEL_5
#define WS2812_Pin GPIO_PIN_3
#define WS2812_GPIO_Port GPIOA
#endif /* BSP_MINIWARE_PINS_H_ */ #endif /* BSP_MINIWARE_PINS_H_ */

View File

@@ -16,6 +16,8 @@ DMA_HandleTypeDef hdma_i2c1_rx;
DMA_HandleTypeDef hdma_i2c1_tx; DMA_HandleTypeDef hdma_i2c1_tx;
IWDG_HandleTypeDef hiwdg; IWDG_HandleTypeDef hiwdg;
TIM_HandleTypeDef htim1;
DMA_HandleTypeDef hdma_tim1_ch2;
TIM_HandleTypeDef htim2; TIM_HandleTypeDef htim2;
TIM_HandleTypeDef htim3; TIM_HandleTypeDef htim3;
#define ADC_CHANNELS 4 #define ADC_CHANNELS 4
@@ -29,6 +31,7 @@ static void MX_I2C1_Init(void);
static void MX_IWDG_Init(void); static void MX_IWDG_Init(void);
static void MX_TIM3_Init(void); static void MX_TIM3_Init(void);
static void MX_TIM2_Init(void); static void MX_TIM2_Init(void);
static void MX_TIM1_Init(void);
static void MX_DMA_Init(void); static void MX_DMA_Init(void);
static void MX_GPIO_Init(void); static void MX_GPIO_Init(void);
static void MX_ADC2_Init(void); static void MX_ADC2_Init(void);
@@ -44,12 +47,13 @@ void Setup_HAL() {
MX_ADC2_Init(); MX_ADC2_Init();
MX_TIM3_Init(); MX_TIM3_Init();
MX_TIM2_Init(); MX_TIM2_Init();
MX_TIM1_Init();
MX_IWDG_Init(); MX_IWDG_Init();
HAL_ADC_Start(&hadc2); HAL_ADC_Start(&hadc2);
HAL_ADCEx_MultiModeStart_DMA(&hadc1, ADCReadings, HAL_ADCEx_MultiModeStart_DMA(&hadc1, ADCReadings,
(ADC_SAMPLES * ADC_CHANNELS)); // start DMA of normal readings (ADC_SAMPLES * ADC_CHANNELS)); // 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, 2-> tip // channel 0 -> temperature sensor, 1-> VIN, 2-> tip
@@ -218,6 +222,65 @@ static void MX_IWDG_Init(void) {
#endif #endif
} }
/* TIM1 init function */
void MX_TIM1_Init(void) {
/* USER CODE BEGIN TIM1_Init 0 */
/* USER CODE END TIM1_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM1_Init 1 */
/* USER CODE END TIM1_Init 1 */
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 104;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim1) != HAL_OK) {}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) {}
if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) {}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) {}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) {}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) {}
/* USER CODE BEGIN TIM1_Init 2 */
/* USER CODE END TIM1_Init 2 */
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
/**TIM1 GPIO Configuration
PA9 ------> TIM1_CH2
*/
GPIO_InitStruct.Pin = WS2812_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(WS2812_GPIO_Port, &GPIO_InitStruct);
}
/* TIM3 init function */ /* TIM3 init function */
static void MX_TIM3_Init(void) { static void MX_TIM3_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig; TIM_ClockConfigTypeDef sClockSourceConfig;
@@ -312,8 +375,11 @@ static void MX_DMA_Init(void) {
/* DMA interrupt init */ /* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */ /* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 5, 0); HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 10, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 6, 0); // DMA 1 ch3 is used from TIM CH2 for WS2812
HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
/* DMA1_Channel6_IRQn interrupt configuration */ /* DMA1_Channel6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 5, 0); HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn); HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);

View File

@@ -24,6 +24,8 @@ extern I2C_HandleTypeDef hi2c1;
extern IWDG_HandleTypeDef hiwdg; extern IWDG_HandleTypeDef hiwdg;
extern TIM_HandleTypeDef htim1;
extern DMA_HandleTypeDef hdma_tim1_ch2;
extern TIM_HandleTypeDef htim2; extern TIM_HandleTypeDef htim2;
extern TIM_HandleTypeDef htim3; extern TIM_HandleTypeDef htim3;
void Setup_HAL(); void Setup_HAL();

View File

@@ -125,11 +125,22 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) {
} }
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim_base) { void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim_base) {
if (htim_base->Instance == TIM3) {
/* Peripheral clock enable */ if (htim_base->Instance == TIM1) {
__HAL_RCC_TIM1_CLK_ENABLE();
hdma_tim1_ch2.Instance = DMA1_Channel3;
hdma_tim1_ch2.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_tim1_ch2.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim1_ch2.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim1_ch2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_tim1_ch2.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_tim1_ch2.Init.Mode = DMA_CIRCULAR;
hdma_tim1_ch2.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_tim1_ch2) != HAL_OK) {}
__HAL_LINKDMA(htim_base, hdma[TIM_DMA_ID_CC2], hdma_tim1_ch2);
} else if (htim_base->Instance == TIM3) {
__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 */
__HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_TIM2_CLK_ENABLE();
} }
} }

View File

@@ -1,78 +1,42 @@
/* USER CODE BEGIN Header */
/** /**
****************************************************************************** ******************************************************************************
* @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 * @attention
* that are not between comment pairs USER CODE BEGIN and
* USER CODE END. Other portions of this file, whether
* inserted by the user or by software development tools
* are owned by their respective copyright owners.
* *
* Copyright (c) 2017 STMicroelectronics International N.V. * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
* All rights reserved. * All rights reserved.</center></h2>
* *
* Redistribution and use in source and binary forms, with or without * This software component is licensed by ST under BSD 3-Clause license,
* modification, are permitted, provided that the following conditions are met: * the "License"; You may not use this file except in compliance with the
* * License. You may obtain a copy of the License at:
* 1. Redistribution of source code must retain the above copyright notice, * opensource.org/licenses/BSD-3-Clause
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of other
* contributors to this software may be used to endorse or promote products
* derived from this software without specific written permission.
* 4. This software, including modifications and/or derivative works of this
* software, must execute solely and exclusively on microcontroller or
* microprocessor devices manufactured by or for STMicroelectronics.
* 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.
*
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
* SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
****************************************************************************** ******************************************************************************
*/ */
/* USER CODE END Header */
/* 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 HAL_TimeBase
* @{
*/
/* Private typedef -----------------------------------------------------------*/ /* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim4;
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 TIM4 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 priority.
* @retval HAL status * @retval HAL status
*/ */
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
@@ -80,41 +44,38 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
uint32_t uwTimclock = 0; uint32_t uwTimclock = 0;
uint32_t uwPrescalerValue = 0; uint32_t uwPrescalerValue = 0;
uint32_t pFLatency; uint32_t pFLatency;
/*Configure the TIM4 IRQ priority */
HAL_NVIC_SetPriority(TIM4_IRQn, TickPriority, 0);
/*Configure the TIM1 IRQ priority */ /* Enable the TIM4 global Interrupt */
HAL_NVIC_SetPriority(TIM1_UP_IRQn, TickPriority, 0); HAL_NVIC_EnableIRQ(TIM4_IRQn);
/* Enable TIM4 clock */
/* Enable the TIM1 global Interrupt */ __HAL_RCC_TIM4_CLK_ENABLE();
HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
/* Enable TIM1 clock */
__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 TIM4 clock */
uwTimclock = HAL_RCC_GetPCLK2Freq(); uwTimclock = 2 * HAL_RCC_GetPCLK1Freq();
/* Compute the prescaler value to have TIM4 counter clock equal to 1MHz */
uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U);
/* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ /* Initialize TIM4 */
uwPrescalerValue = (uint32_t)((uwTimclock / 1000000) - 1); htim4.Instance = TIM4;
/* Initialize 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 = [(TIM4CLK/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; htim4.Init.Period = (1000000U / 1000U) - 1U;
htim1.Init.Prescaler = uwPrescalerValue; htim4.Init.Prescaler = uwPrescalerValue;
htim1.Init.ClockDivision = 0; htim4.Init.ClockDivision = 0;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
if (HAL_TIM_Base_Init(&htim1) == HAL_OK) { if (HAL_TIM_Base_Init(&htim4) == 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(&htim4);
} }
/* Return function status */ /* Return function status */
@@ -123,32 +84,24 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
/** /**
* @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 TIM4 update interrupt.
* @param None * @param None
* @retval None * @retval None
*/ */
void HAL_SuspendTick(void) { void HAL_SuspendTick(void) {
/* Disable TIM1 update Interrupt */ /* Disable TIM4 update Interrupt */
__HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); __HAL_TIM_DISABLE_IT(&htim4, 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 TIM4 update interrupt.
* @param None * @param None
* @retval None * @retval None
*/ */
void HAL_ResumeTick(void) { void HAL_ResumeTick(void) {
/* Enable TIM1 Update interrupt */ /* Enable TIM4 Update interrupt */
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); __HAL_TIM_ENABLE_IT(&htim4, TIM_IT_UPDATE);
} }
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/