mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Setting up TIM1 for WS2812
This commit is contained in:
@@ -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) {}
|
||||||
}
|
|
||||||
|
|||||||
@@ -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_ */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>© 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****/
|
||||||
|
|||||||
Reference in New Issue
Block a user