rotary and logic integrated, rotary not working good
This commit is contained in:
parent
209e1bd1c5
commit
56f96e5f26
@ -45,6 +45,12 @@
|
|||||||
#define LED_GPIO_Port GPIOC
|
#define LED_GPIO_Port GPIOC
|
||||||
#define ERROR_Pin GPIO_PIN_14
|
#define ERROR_Pin GPIO_PIN_14
|
||||||
#define ERROR_GPIO_Port GPIOC
|
#define ERROR_GPIO_Port GPIOC
|
||||||
|
#define ROTARY_B_Pin GPIO_PIN_3
|
||||||
|
#define ROTARY_B_GPIO_Port GPIOB
|
||||||
|
#define ROTARY_A_Pin GPIO_PIN_4
|
||||||
|
#define ROTARY_A_GPIO_Port GPIOB
|
||||||
|
#define SWITCH_Pin GPIO_PIN_5
|
||||||
|
#define SWITCH_GPIO_Port GPIOB
|
||||||
#define OLED_CS_Pin GPIO_PIN_7
|
#define OLED_CS_Pin GPIO_PIN_7
|
||||||
#define OLED_CS_GPIO_Port GPIOB
|
#define OLED_CS_GPIO_Port GPIOB
|
||||||
#define OLED_DC_Pin GPIO_PIN_8
|
#define OLED_DC_Pin GPIO_PIN_8
|
||||||
|
@ -54,6 +54,9 @@ void SVC_Handler(void);
|
|||||||
void DebugMon_Handler(void);
|
void DebugMon_Handler(void);
|
||||||
void PendSV_Handler(void);
|
void PendSV_Handler(void);
|
||||||
void SysTick_Handler(void);
|
void SysTick_Handler(void);
|
||||||
|
void EXTI3_IRQHandler(void);
|
||||||
|
void EXTI4_IRQHandler(void);
|
||||||
|
void EXTI9_5_IRQHandler(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -231,12 +231,28 @@ static void MX_GPIO_Init(void)
|
|||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : ROTARY_B_Pin ROTARY_A_Pin SWITCH_Pin */
|
||||||
|
GPIO_InitStruct.Pin = ROTARY_B_Pin|ROTARY_A_Pin|SWITCH_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
/*Configure GPIO pins : OLED_CS_Pin OLED_DC_Pin OLED_RST_Pin */
|
/*Configure GPIO pins : OLED_CS_Pin OLED_DC_Pin OLED_RST_Pin */
|
||||||
GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin;
|
GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
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);
|
||||||
|
|
||||||
|
/* EXTI interrupt init*/
|
||||||
|
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
|
||||||
|
|
||||||
|
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
|
||||||
|
|
||||||
|
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 4 */
|
/* USER CODE BEGIN 4 */
|
||||||
|
@ -183,6 +183,48 @@ void SysTick_Handler(void)
|
|||||||
/* please refer to the startup file (startup_stm32f1xx.s). */
|
/* please refer to the startup file (startup_stm32f1xx.s). */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles EXTI line3 interrupt.
|
||||||
|
*/
|
||||||
|
void EXTI3_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN EXTI3_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI3_IRQn 0 */
|
||||||
|
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
|
||||||
|
/* USER CODE BEGIN EXTI3_IRQn 1 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI3_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles EXTI line4 interrupt.
|
||||||
|
*/
|
||||||
|
void EXTI4_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN EXTI4_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI4_IRQn 0 */
|
||||||
|
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
|
||||||
|
/* USER CODE BEGIN EXTI4_IRQn 1 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI4_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles EXTI line[9:5] interrupts.
|
||||||
|
*/
|
||||||
|
void EXTI9_5_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN EXTI9_5_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI9_5_IRQn 0 */
|
||||||
|
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
|
||||||
|
/* USER CODE BEGIN EXTI9_5_IRQn 1 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI9_5_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 1 */
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
/* USER CODE END 1 */
|
/* USER CODE END 1 */
|
||||||
|
@ -27,9 +27,12 @@ Mcu.Name=STM32F103C(8-B)Tx
|
|||||||
Mcu.Package=LQFP48
|
Mcu.Package=LQFP48
|
||||||
Mcu.Pin0=PC13-TAMPER-RTC
|
Mcu.Pin0=PC13-TAMPER-RTC
|
||||||
Mcu.Pin1=PC14-OSC32_IN
|
Mcu.Pin1=PC14-OSC32_IN
|
||||||
Mcu.Pin10=PB8
|
Mcu.Pin10=PB4
|
||||||
Mcu.Pin11=PB9
|
Mcu.Pin11=PB5
|
||||||
Mcu.Pin12=VP_SYS_VS_Systick
|
Mcu.Pin12=PB7
|
||||||
|
Mcu.Pin13=PB8
|
||||||
|
Mcu.Pin14=PB9
|
||||||
|
Mcu.Pin15=VP_SYS_VS_Systick
|
||||||
Mcu.Pin2=PD0-OSC_IN
|
Mcu.Pin2=PD0-OSC_IN
|
||||||
Mcu.Pin3=PD1-OSC_OUT
|
Mcu.Pin3=PD1-OSC_OUT
|
||||||
Mcu.Pin4=PA0-WKUP
|
Mcu.Pin4=PA0-WKUP
|
||||||
@ -37,14 +40,17 @@ Mcu.Pin5=PA5
|
|||||||
Mcu.Pin6=PA7
|
Mcu.Pin6=PA7
|
||||||
Mcu.Pin7=PA13
|
Mcu.Pin7=PA13
|
||||||
Mcu.Pin8=PA14
|
Mcu.Pin8=PA14
|
||||||
Mcu.Pin9=PB7
|
Mcu.Pin9=PB3
|
||||||
Mcu.PinsNb=13
|
Mcu.PinsNb=16
|
||||||
Mcu.UserConstants=
|
Mcu.UserConstants=
|
||||||
Mcu.UserName=STM32F103C8Tx
|
Mcu.UserName=STM32F103C8Tx
|
||||||
MxCube.Version=4.16.1
|
MxCube.Version=4.16.1
|
||||||
MxDb.Version=DB.4.0.161
|
MxDb.Version=DB.4.0.161
|
||||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true
|
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true
|
||||||
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true
|
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true
|
||||||
|
NVIC.EXTI3_IRQn=true\:0\:0\:false\:false\:true
|
||||||
|
NVIC.EXTI4_IRQn=true\:0\:0\:false\:false\:true
|
||||||
|
NVIC.EXTI9_5_IRQn=true\:0\:0\:false\:false\:true
|
||||||
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true
|
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true
|
||||||
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true
|
NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true
|
||||||
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true
|
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true
|
||||||
@ -62,6 +68,24 @@ PA5.Mode=TX_Only_Simplex_Unidirect_Master
|
|||||||
PA5.Signal=SPI1_SCK
|
PA5.Signal=SPI1_SCK
|
||||||
PA7.Mode=TX_Only_Simplex_Unidirect_Master
|
PA7.Mode=TX_Only_Simplex_Unidirect_Master
|
||||||
PA7.Signal=SPI1_MOSI
|
PA7.Signal=SPI1_MOSI
|
||||||
|
PB3.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI
|
||||||
|
PB3.GPIO_Label=ROTARY_B
|
||||||
|
PB3.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING
|
||||||
|
PB3.GPIO_PuPd=GPIO_PULLUP
|
||||||
|
PB3.Locked=true
|
||||||
|
PB3.Signal=GPXTI3
|
||||||
|
PB4.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI
|
||||||
|
PB4.GPIO_Label=ROTARY_A
|
||||||
|
PB4.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING
|
||||||
|
PB4.GPIO_PuPd=GPIO_PULLUP
|
||||||
|
PB4.Locked=true
|
||||||
|
PB4.Signal=GPXTI4
|
||||||
|
PB5.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI
|
||||||
|
PB5.GPIO_Label=SWITCH
|
||||||
|
PB5.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING
|
||||||
|
PB5.GPIO_PuPd=GPIO_PULLUP
|
||||||
|
PB5.Locked=true
|
||||||
|
PB5.Signal=GPXTI5
|
||||||
PB7.GPIOParameters=GPIO_Label
|
PB7.GPIOParameters=GPIO_Label
|
||||||
PB7.GPIO_Label=OLED_CS
|
PB7.GPIO_Label=OLED_CS
|
||||||
PB7.Locked=true
|
PB7.Locked=true
|
||||||
@ -143,6 +167,12 @@ RCC.USBFreq_Value=72000000
|
|||||||
RCC.VCOOutput2Freq_Value=8000000
|
RCC.VCOOutput2Freq_Value=8000000
|
||||||
SH.ADCx_IN0.0=ADC1_IN0,IN0
|
SH.ADCx_IN0.0=ADC1_IN0,IN0
|
||||||
SH.ADCx_IN0.ConfNb=1
|
SH.ADCx_IN0.ConfNb=1
|
||||||
|
SH.GPXTI3.0=GPIO_EXTI3
|
||||||
|
SH.GPXTI3.ConfNb=1
|
||||||
|
SH.GPXTI4.0=GPIO_EXTI4
|
||||||
|
SH.GPXTI4.ConfNb=1
|
||||||
|
SH.GPXTI5.0=GPIO_EXTI5
|
||||||
|
SH.GPXTI5.ConfNb=1
|
||||||
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16
|
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16
|
||||||
SPI1.CLKPhase=SPI_PHASE_2EDGE
|
SPI1.CLKPhase=SPI_PHASE_2EDGE
|
||||||
SPI1.CLKPolarity=SPI_POLARITY_HIGH
|
SPI1.CLKPolarity=SPI_POLARITY_HIGH
|
||||||
|
@ -45,6 +45,12 @@
|
|||||||
#define LED_GPIO_Port GPIOC
|
#define LED_GPIO_Port GPIOC
|
||||||
#define ERROR_Pin GPIO_PIN_14
|
#define ERROR_Pin GPIO_PIN_14
|
||||||
#define ERROR_GPIO_Port GPIOC
|
#define ERROR_GPIO_Port GPIOC
|
||||||
|
#define ROTARY_B_Pin GPIO_PIN_3
|
||||||
|
#define ROTARY_B_GPIO_Port GPIOB
|
||||||
|
#define ROTARY_A_Pin GPIO_PIN_4
|
||||||
|
#define ROTARY_A_GPIO_Port GPIOB
|
||||||
|
#define SWITCH_Pin GPIO_PIN_5
|
||||||
|
#define SWITCH_GPIO_Port GPIOB
|
||||||
#define OLED_CS_Pin GPIO_PIN_7
|
#define OLED_CS_Pin GPIO_PIN_7
|
||||||
#define OLED_CS_GPIO_Port GPIOB
|
#define OLED_CS_GPIO_Port GPIOB
|
||||||
#define OLED_DC_Pin GPIO_PIN_8
|
#define OLED_DC_Pin GPIO_PIN_8
|
||||||
|
@ -54,6 +54,9 @@ void SVC_Handler(void);
|
|||||||
void DebugMon_Handler(void);
|
void DebugMon_Handler(void);
|
||||||
void PendSV_Handler(void);
|
void PendSV_Handler(void);
|
||||||
void SysTick_Handler(void);
|
void SysTick_Handler(void);
|
||||||
|
void EXTI3_IRQHandler(void);
|
||||||
|
void EXTI4_IRQHandler(void);
|
||||||
|
void EXTI9_5_IRQHandler(void);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
134
my_src/display.c
Normal file
134
my_src/display.c
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* display.c
|
||||||
|
*
|
||||||
|
* Created on: May 31, 2017
|
||||||
|
* Author: wn
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "display.h"
|
||||||
|
#include <PontCoopScheduler.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
volatile tDisplay display = {
|
||||||
|
.toggle = 0, .setModeTemperature = 0, .setModeTime = 0,
|
||||||
|
.timerState = IDLE,
|
||||||
|
.toggleModeState = 1,
|
||||||
|
.targetTemperature = 80, .currentTemperature = 75,
|
||||||
|
.targetTime = 120, .currentTime = 0,
|
||||||
|
.overrunTime = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void updateDisplay(void *handle) {
|
||||||
|
tDisplay *lDisplay = (tDisplay*) handle;
|
||||||
|
lDisplay->toggle ^= 0x01;
|
||||||
|
char buf[32];
|
||||||
|
|
||||||
|
sprintf(buf, "ThermometerTeaTimer");
|
||||||
|
LED_P6x8Str(0, 0, buf);
|
||||||
|
|
||||||
|
if (lDisplay->setModeTemperature && lDisplay->toggle) {
|
||||||
|
sprintf(buf, " %3d'C", lDisplay->currentTemperature);
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "%3d'C %3d'C", lDisplay->targetTemperature, lDisplay->currentTemperature);
|
||||||
|
}
|
||||||
|
LED_P8x16Str(0, 2, buf);
|
||||||
|
|
||||||
|
if (lDisplay->setModeTime && lDisplay->toggle) {
|
||||||
|
sprintf(buf, " %3ds", lDisplay->currentTime);
|
||||||
|
} else {
|
||||||
|
sprintf(buf, "%3ds %3ds", lDisplay->targetTime, lDisplay->currentTime);
|
||||||
|
}
|
||||||
|
LED_P8x16Str(0, 4, buf);
|
||||||
|
|
||||||
|
sprintf(buf, " %5ds", lDisplay->overrunTime);
|
||||||
|
LED_P8x16Str(0, 6, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearSetMode(void *handle) {
|
||||||
|
tDisplay *lDisplay = (tDisplay*) handle;
|
||||||
|
lDisplay->setModeTemperature = 0;
|
||||||
|
lDisplay->setModeTime = 0;
|
||||||
|
lDisplay->toggleModeState = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void disableSetModeTimer() {
|
||||||
|
schDel(clearSetMode, (void*)&display);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void reEnableSetModeTimer() {
|
||||||
|
schDel(clearSetMode, (void*)&display);
|
||||||
|
schAdd(clearSetMode, (void*)&display, 10000, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void toggleSetMode() {
|
||||||
|
switch (display.toggleModeState) {
|
||||||
|
default:
|
||||||
|
case 0:
|
||||||
|
disableSetModeTimer();
|
||||||
|
display.setModeTemperature = 0;
|
||||||
|
display.setModeTime = 0;
|
||||||
|
display.toggleModeState = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
reEnableSetModeTimer();
|
||||||
|
display.setModeTemperature = 1;
|
||||||
|
display.setModeTime = 0;
|
||||||
|
display.toggleModeState = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
reEnableSetModeTimer();
|
||||||
|
display.setModeTemperature = 0;
|
||||||
|
display.setModeTime = 1;
|
||||||
|
display.toggleModeState = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayIncValue() {
|
||||||
|
if (display.setModeTemperature == 1) {
|
||||||
|
reEnableSetModeTimer();
|
||||||
|
if (display.targetTemperature < 100) {
|
||||||
|
display.targetTemperature++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (display.setModeTime == 1) {
|
||||||
|
reEnableSetModeTimer();
|
||||||
|
if (display.targetTime < 999) {
|
||||||
|
display.targetTime += 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void displayDecValue() {
|
||||||
|
if (display.setModeTemperature == 1) {
|
||||||
|
reEnableSetModeTimer();
|
||||||
|
if (display.targetTemperature > 0) {
|
||||||
|
display.targetTemperature--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (display.setModeTime == 1) {
|
||||||
|
reEnableSetModeTimer();
|
||||||
|
if (display.targetTime >= 10) {
|
||||||
|
display.targetTime -= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void buttonShort() {
|
||||||
|
if (display.setModeTemperature == 1 || display.setModeTime == 1) {
|
||||||
|
toggleSetMode();
|
||||||
|
} else if (display.timerState == IDLE) {
|
||||||
|
startTimer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void buttonLong() {
|
||||||
|
if (display.timerState == IDLE) {
|
||||||
|
toggleSetMode();
|
||||||
|
}
|
||||||
|
}
|
35
my_src/display.h
Normal file
35
my_src/display.h
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* display.h
|
||||||
|
*
|
||||||
|
* Created on: May 31, 2017
|
||||||
|
* Author: wn
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DISPLAY_H_
|
||||||
|
#define DISPLAY_H_
|
||||||
|
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t toggle;
|
||||||
|
uint8_t setModeTemperature;
|
||||||
|
uint8_t setModeTime;
|
||||||
|
tTimerState timerState;
|
||||||
|
uint8_t toggleModeState;
|
||||||
|
uint32_t targetTemperature;
|
||||||
|
uint32_t currentTemperature;
|
||||||
|
uint32_t targetTime;
|
||||||
|
uint32_t currentTime;
|
||||||
|
uint32_t overrunTime;
|
||||||
|
} tDisplay;
|
||||||
|
|
||||||
|
void updateDisplay(void *handle);
|
||||||
|
void displayToggleSetMode();
|
||||||
|
void displayDecValue();
|
||||||
|
void displayIncValue();
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* DISPLAY_H_ */
|
@ -21,83 +21,10 @@
|
|||||||
#include "stm32f1xx_hal.h"
|
#include "stm32f1xx_hal.h"
|
||||||
|
|
||||||
#include "oled.h"
|
#include "oled.h"
|
||||||
|
#include "timer.h"
|
||||||
|
#include "display.h"
|
||||||
|
|
||||||
typedef enum {
|
extern tDisplay display;
|
||||||
IDLE = 0,
|
|
||||||
STARTED = 1,
|
|
||||||
RUNNING = 2,
|
|
||||||
OVERRUN = 3
|
|
||||||
} tTimerState;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t toggle;
|
|
||||||
uint8_t setModeTemperature;
|
|
||||||
uint8_t setModeTime;
|
|
||||||
tTimerState timerState;
|
|
||||||
uint32_t targetTemperature;
|
|
||||||
uint32_t currentTemperature;
|
|
||||||
uint32_t targetTime;
|
|
||||||
uint32_t currentTime;
|
|
||||||
uint32_t overrunTime;
|
|
||||||
} tDisplay;
|
|
||||||
|
|
||||||
|
|
||||||
tDisplay display = {
|
|
||||||
.toggle = 0, .setModeTemperature = 0, .setModeTime = 0,
|
|
||||||
.timerState = IDLE,
|
|
||||||
.targetTemperature = 80, .currentTemperature = 75,
|
|
||||||
.targetTime = 180, .currentTime = 175,
|
|
||||||
.overrunTime = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
void updateDisplay(void *handle) {
|
|
||||||
tDisplay *lDisplay = (tDisplay*) handle;
|
|
||||||
lDisplay->toggle ^= 0x01;
|
|
||||||
char buf[32];
|
|
||||||
|
|
||||||
sprintf(buf, "ThermometerTeaTimer");
|
|
||||||
LED_P6x8Str(0, 0, buf);
|
|
||||||
|
|
||||||
if (lDisplay->setModeTemperature && lDisplay->toggle) {
|
|
||||||
sprintf(buf, " %3d'C", lDisplay->currentTemperature);
|
|
||||||
} else {
|
|
||||||
sprintf(buf, "%3d'C %3d'C", lDisplay->targetTemperature, lDisplay->currentTemperature);
|
|
||||||
}
|
|
||||||
LED_P8x16Str(0, 2, buf);
|
|
||||||
|
|
||||||
if (lDisplay->setModeTime && lDisplay->toggle) {
|
|
||||||
sprintf(buf, " %3ds", lDisplay->currentTime);
|
|
||||||
} else {
|
|
||||||
sprintf(buf, "%3ds %3ds", lDisplay->targetTime, lDisplay->currentTime);
|
|
||||||
}
|
|
||||||
LED_P8x16Str(0, 4, buf);
|
|
||||||
|
|
||||||
sprintf(buf, " %5ds", lDisplay->overrunTime);
|
|
||||||
LED_P8x16Str(0, 6, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
void secondTick(void *handle) {
|
|
||||||
tDisplay *lDisplay = (tDisplay*) handle;
|
|
||||||
|
|
||||||
switch (lDisplay->timerState) {
|
|
||||||
case STARTED:
|
|
||||||
lDisplay->currentTime = lDisplay->targetTime;
|
|
||||||
lDisplay->timerState = RUNNING;
|
|
||||||
break;
|
|
||||||
case RUNNING:
|
|
||||||
lDisplay->currentTime -= 1;
|
|
||||||
if (lDisplay->currentTime == 0) {
|
|
||||||
lDisplay->timerState = OVERRUN;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case OVERRUN:
|
|
||||||
lDisplay->overrunTime += 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void blink(void *handle) {
|
void blink(void *handle) {
|
||||||
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
|
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
|
||||||
@ -105,11 +32,9 @@ void blink(void *handle) {
|
|||||||
|
|
||||||
void my_setup_1() {
|
void my_setup_1() {
|
||||||
schInit();
|
schInit();
|
||||||
schAdd(blink, NULL, 0, 100);
|
// schAdd(blink, NULL, 0, 100);
|
||||||
schAdd(updateDisplay, &display, 0, 250);
|
schAdd(updateDisplay, &display, 0, 250);
|
||||||
schAdd(secondTick, &display, 0, 1000);
|
schAdd(secondTick, &display, 0, 1000);
|
||||||
|
|
||||||
display.timerState = STARTED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void my_loop() {
|
void my_loop() {
|
||||||
@ -120,13 +45,13 @@ void HAL_SYSTICK_Callback() {
|
|||||||
schUpdate();
|
schUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void my_errorHandler() {
|
void my_errorHandler() {
|
||||||
HAL_GPIO_WritePin(ERROR_GPIO_Port, ERROR_Pin, GPIO_PIN_SET);
|
HAL_GPIO_WritePin(ERROR_GPIO_Port, ERROR_Pin, GPIO_PIN_SET);
|
||||||
}
|
}
|
||||||
|
|
||||||
void my_setup_2() {
|
void my_setup_2() {
|
||||||
LED_Init();
|
LED_Init();
|
||||||
LED_P6x8Str(0,0,"welcome to");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
119
my_src/switches.c
Normal file
119
my_src/switches.c
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* switches.c
|
||||||
|
*
|
||||||
|
* Created on: May 31, 2017
|
||||||
|
* Author: wn
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "stm32f1xx_hal.h"
|
||||||
|
#include "switches.h"
|
||||||
|
#include "display.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern tDisplay display;
|
||||||
|
volatile uint32_t lastEvent = 0;
|
||||||
|
|
||||||
|
|
||||||
|
void switch_interrupt() {
|
||||||
|
static uint8_t state = 0;
|
||||||
|
uint32_t currentEvent = HAL_GetTick();
|
||||||
|
|
||||||
|
uint16_t line = HAL_GPIO_ReadPin(SWITCH_GPIO_Port, SWITCH_Pin);
|
||||||
|
|
||||||
|
switch (state) {
|
||||||
|
case 0:
|
||||||
|
if (line == RESET) {
|
||||||
|
lastEvent = currentEvent;
|
||||||
|
state = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (line != RESET) {
|
||||||
|
if (lastEvent + LONG_BUTTON_TIME + DEBOUNCING_DEAD_TIME < currentEvent) {
|
||||||
|
lastEvent = currentEvent;
|
||||||
|
buttonLong();
|
||||||
|
state = 0;
|
||||||
|
} else if (lastEvent + DEBOUNCING_DEAD_TIME < currentEvent) {
|
||||||
|
lastEvent = currentEvent;
|
||||||
|
buttonShort();
|
||||||
|
state = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
state = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int myDigitalRead(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
|
||||||
|
int16_t r = 0;
|
||||||
|
for (uint32_t i = 0; i < DEBOUNCING_REPEAT; i++) {
|
||||||
|
if (HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) != RESET) {
|
||||||
|
r++;
|
||||||
|
} else {
|
||||||
|
r--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int res = -1;
|
||||||
|
if (r >= (((int32_t)DEBOUNCING_REPEAT) / 2)) {
|
||||||
|
res = 1;
|
||||||
|
} else if (r <= -1 * (((int32_t)DEBOUNCING_REPEAT) / 2)) {
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void rotary_a_interrupt() {
|
||||||
|
uint32_t currentEvent = HAL_GetTick();
|
||||||
|
|
||||||
|
if ((lastEvent == 0) || (lastEvent + DEBOUNCING_DEAD_TIME < currentEvent)) {
|
||||||
|
lastEvent = currentEvent;
|
||||||
|
|
||||||
|
int a = myDigitalRead(ROTARY_A_GPIO_Port, ROTARY_A_Pin);;
|
||||||
|
int b = myDigitalRead(ROTARY_B_GPIO_Port, ROTARY_B_Pin);;
|
||||||
|
|
||||||
|
if (((a != -1) && (b != -1))) {
|
||||||
|
if (a == b) {
|
||||||
|
displayIncValue();
|
||||||
|
} else {
|
||||||
|
displayDecValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void rotary_b_interrupt() {
|
||||||
|
uint32_t currentEvent = HAL_GetTick();
|
||||||
|
|
||||||
|
if ((lastEvent == 0) || (lastEvent + DEBOUNCING_DEAD_TIME < currentEvent)) {
|
||||||
|
lastEvent = currentEvent;
|
||||||
|
|
||||||
|
int a = myDigitalRead(ROTARY_A_GPIO_Port, ROTARY_A_Pin);;
|
||||||
|
int b = myDigitalRead(ROTARY_B_GPIO_Port, ROTARY_B_Pin);;
|
||||||
|
|
||||||
|
if (((a != -1) && (b != -1))) {
|
||||||
|
if (a == b) {
|
||||||
|
displayDecValue();
|
||||||
|
} else {
|
||||||
|
displayIncValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
|
||||||
|
if (GPIO_Pin == GPIO_PIN_5) {
|
||||||
|
switch_interrupt();
|
||||||
|
}
|
||||||
|
if (GPIO_Pin == GPIO_PIN_3) {
|
||||||
|
rotary_a_interrupt();
|
||||||
|
}
|
||||||
|
if (GPIO_Pin == GPIO_PIN_4) {
|
||||||
|
rotary_b_interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
18
my_src/switches.h
Normal file
18
my_src/switches.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* switches.h
|
||||||
|
*
|
||||||
|
* Created on: May 31, 2017
|
||||||
|
* Author: wn
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SWITCHES_H_
|
||||||
|
#define SWITCHES_H_
|
||||||
|
|
||||||
|
const uint32_t DEBOUNCING_DEAD_TIME = 100;
|
||||||
|
const uint32_t DEBOUNCING_REPEAT = 20;
|
||||||
|
const uint32_t LONG_BUTTON_TIME = 1000;
|
||||||
|
|
||||||
|
void buttonShort();
|
||||||
|
void buttonLong();
|
||||||
|
|
||||||
|
#endif /* SWITCHES_H_ */
|
38
my_src/timer.c
Normal file
38
my_src/timer.c
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* timer.c
|
||||||
|
*
|
||||||
|
* Created on: May 31, 2017
|
||||||
|
* Author: wn
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "timer.h"
|
||||||
|
#include "display.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern tDisplay display;
|
||||||
|
|
||||||
|
void startTimer() {
|
||||||
|
display.timerState = STARTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void secondTick(void *handle) {
|
||||||
|
tDisplay *lDisplay = (tDisplay*) handle;
|
||||||
|
|
||||||
|
switch (lDisplay->timerState) {
|
||||||
|
case STARTED:
|
||||||
|
lDisplay->currentTime = lDisplay->targetTime;
|
||||||
|
lDisplay->timerState = RUNNING;
|
||||||
|
break;
|
||||||
|
case RUNNING:
|
||||||
|
lDisplay->currentTime -= 1;
|
||||||
|
if (lDisplay->currentTime == 0) {
|
||||||
|
lDisplay->timerState = OVERRUN;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case OVERRUN:
|
||||||
|
lDisplay->overrunTime += 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
;
|
||||||
|
}
|
||||||
|
}
|
21
my_src/timer.h
Normal file
21
my_src/timer.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* timer.h
|
||||||
|
*
|
||||||
|
* Created on: May 31, 2017
|
||||||
|
* Author: wn
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TIMER_H_
|
||||||
|
#define TIMER_H_
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
IDLE = 0,
|
||||||
|
STARTED = 1,
|
||||||
|
RUNNING = 2,
|
||||||
|
OVERRUN = 3
|
||||||
|
} tTimerState;
|
||||||
|
|
||||||
|
void secondTick(void *handle);
|
||||||
|
void startTimer();
|
||||||
|
|
||||||
|
#endif /* TIMER_H_ */
|
16
src/main.c
16
src/main.c
@ -235,12 +235,28 @@ static void MX_GPIO_Init(void)
|
|||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : ROTARY_B_Pin ROTARY_A_Pin SWITCH_Pin */
|
||||||
|
GPIO_InitStruct.Pin = ROTARY_B_Pin|ROTARY_A_Pin|SWITCH_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
/*Configure GPIO pins : OLED_CS_Pin OLED_DC_Pin OLED_RST_Pin */
|
/*Configure GPIO pins : OLED_CS_Pin OLED_DC_Pin OLED_RST_Pin */
|
||||||
GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin;
|
GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
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);
|
||||||
|
|
||||||
|
/* EXTI interrupt init*/
|
||||||
|
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
|
||||||
|
|
||||||
|
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
|
||||||
|
|
||||||
|
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 4 */
|
/* USER CODE BEGIN 4 */
|
||||||
|
@ -231,12 +231,28 @@ static void MX_GPIO_Init(void)
|
|||||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
|
||||||
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
|
||||||
|
|
||||||
|
/*Configure GPIO pins : ROTARY_B_Pin ROTARY_A_Pin SWITCH_Pin */
|
||||||
|
GPIO_InitStruct.Pin = ROTARY_B_Pin|ROTARY_A_Pin|SWITCH_Pin;
|
||||||
|
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
|
||||||
|
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
||||||
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
/*Configure GPIO pins : OLED_CS_Pin OLED_DC_Pin OLED_RST_Pin */
|
/*Configure GPIO pins : OLED_CS_Pin OLED_DC_Pin OLED_RST_Pin */
|
||||||
GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin;
|
GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin;
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
||||||
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);
|
||||||
|
|
||||||
|
/* EXTI interrupt init*/
|
||||||
|
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
|
||||||
|
|
||||||
|
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
|
||||||
|
|
||||||
|
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
|
||||||
|
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 4 */
|
/* USER CODE BEGIN 4 */
|
||||||
|
@ -183,6 +183,48 @@ void SysTick_Handler(void)
|
|||||||
/* please refer to the startup file (startup_stm32f1xx.s). */
|
/* please refer to the startup file (startup_stm32f1xx.s). */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles EXTI line3 interrupt.
|
||||||
|
*/
|
||||||
|
void EXTI3_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN EXTI3_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI3_IRQn 0 */
|
||||||
|
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
|
||||||
|
/* USER CODE BEGIN EXTI3_IRQn 1 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI3_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles EXTI line4 interrupt.
|
||||||
|
*/
|
||||||
|
void EXTI4_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN EXTI4_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI4_IRQn 0 */
|
||||||
|
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
|
||||||
|
/* USER CODE BEGIN EXTI4_IRQn 1 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI4_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function handles EXTI line[9:5] interrupts.
|
||||||
|
*/
|
||||||
|
void EXTI9_5_IRQHandler(void)
|
||||||
|
{
|
||||||
|
/* USER CODE BEGIN EXTI9_5_IRQn 0 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI9_5_IRQn 0 */
|
||||||
|
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
|
||||||
|
/* USER CODE BEGIN EXTI9_5_IRQn 1 */
|
||||||
|
|
||||||
|
/* USER CODE END EXTI9_5_IRQn 1 */
|
||||||
|
}
|
||||||
|
|
||||||
/* USER CODE BEGIN 1 */
|
/* USER CODE BEGIN 1 */
|
||||||
|
|
||||||
/* USER CODE END 1 */
|
/* USER CODE END 1 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user