diff --git a/cube/output/ttt2/Inc/mxconstants.h b/cube/output/ttt2/Inc/mxconstants.h index dfdc0e6..365bd91 100644 --- a/cube/output/ttt2/Inc/mxconstants.h +++ b/cube/output/ttt2/Inc/mxconstants.h @@ -45,6 +45,8 @@ #define LED_GPIO_Port GPIOC #define ERROR_Pin GPIO_PIN_14 #define ERROR_GPIO_Port GPIOC +#define BUZZER_Pin GPIO_PIN_8 +#define BUZZER_GPIO_Port GPIOA #define ROTARY_B_Pin GPIO_PIN_3 #define ROTARY_B_GPIO_Port GPIOB #define ROTARY_A_Pin GPIO_PIN_4 diff --git a/cube/output/ttt2/Inc/stm32f1xx_hal_conf.h b/cube/output/ttt2/Inc/stm32f1xx_hal_conf.h index 21d3f49..31f1dd2 100644 --- a/cube/output/ttt2/Inc/stm32f1xx_hal_conf.h +++ b/cube/output/ttt2/Inc/stm32f1xx_hal_conf.h @@ -77,7 +77,7 @@ /*#define HAL_SMARTCARD_MODULE_ENABLED */ #define HAL_SPI_MODULE_ENABLED /*#define HAL_SRAM_MODULE_ENABLED */ -/*#define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED /*#define HAL_UART_MODULE_ENABLED */ /*#define HAL_USART_MODULE_ENABLED */ /*#define HAL_WWDG_MODULE_ENABLED */ diff --git a/cube/output/ttt2/Src/main.c b/cube/output/ttt2/Src/main.c index 5c6ecbe..75ccf74 100644 --- a/cube/output/ttt2/Src/main.c +++ b/cube/output/ttt2/Src/main.c @@ -42,6 +42,8 @@ ADC_HandleTypeDef hadc1; SPI_HandleTypeDef hspi1; +TIM_HandleTypeDef htim1; + /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ @@ -53,6 +55,10 @@ void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_ADC1_Init(void); static void MX_SPI1_Init(void); +static void MX_TIM1_Init(void); + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ @@ -82,6 +88,7 @@ int main(void) MX_GPIO_Init(); MX_ADC1_Init(); MX_SPI1_Init(); + MX_TIM1_Init(); /* USER CODE BEGIN 2 */ @@ -201,6 +208,72 @@ static void MX_SPI1_Init(void) } +/* TIM1 init function */ +static void MX_TIM1_Init(void) +{ + + TIM_ClockConfigTypeDef sClockSourceConfig; + TIM_MasterConfigTypeDef sMasterConfig; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; + TIM_OC_InitTypeDef sConfigOC; + + htim1.Instance = TIM1; + htim1.Init.Prescaler = 36; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 1000; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + if (HAL_TIM_Base_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_OC_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + + 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) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_TOGGLE; + sConfigOC.Pulse = 10000; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_OC_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim1); + +} + /** Configure pins as * Analog * Input diff --git a/cube/output/ttt2/Src/stm32f1xx_hal_msp.c b/cube/output/ttt2/Src/stm32f1xx_hal_msp.c index f46cf68..79c7c37 100644 --- a/cube/output/ttt2/Src/stm32f1xx_hal_msp.c +++ b/cube/output/ttt2/Src/stm32f1xx_hal_msp.c @@ -185,6 +185,65 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) } +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + + if(htim_base->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspInit 0 */ + + /* USER CODE END TIM1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM1_CLK_ENABLE(); + /* USER CODE BEGIN TIM1_MspInit 1 */ + + /* USER CODE END TIM1_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(htim->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspPostInit 0 */ + + /* USER CODE END TIM1_MspPostInit 0 */ + + /**TIM1 GPIO Configuration + PA8 ------> TIM1_CH1 + */ + GPIO_InitStruct.Pin = BUZZER_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(BUZZER_GPIO_Port, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM1_MspPostInit 1 */ + + /* USER CODE END TIM1_MspPostInit 1 */ + } + +} + +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + + if(htim_base->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspDeInit 0 */ + + /* USER CODE END TIM1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM1_CLK_DISABLE(); + } + /* USER CODE BEGIN TIM1_MspDeInit 1 */ + + /* USER CODE END TIM1_MspDeInit 1 */ + +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/cube/output/ttt2/ttt2.ioc b/cube/output/ttt2/ttt2.ioc index 2c7a510..74988cb 100644 --- a/cube/output/ttt2/ttt2.ioc +++ b/cube/output/ttt2/ttt2.ioc @@ -22,28 +22,31 @@ Mcu.IP1=NVIC Mcu.IP2=RCC Mcu.IP3=SPI1 Mcu.IP4=SYS -Mcu.IPNb=5 +Mcu.IP5=TIM1 +Mcu.IPNb=6 Mcu.Name=STM32F103C(8-B)Tx Mcu.Package=LQFP48 Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin1=PC14-OSC32_IN -Mcu.Pin10=PB3 -Mcu.Pin11=PB4 -Mcu.Pin12=PB5 -Mcu.Pin13=PB6 -Mcu.Pin14=PB7 -Mcu.Pin15=PB8 -Mcu.Pin16=PB9 -Mcu.Pin17=VP_SYS_VS_Systick +Mcu.Pin10=PA14 +Mcu.Pin11=PB3 +Mcu.Pin12=PB4 +Mcu.Pin13=PB5 +Mcu.Pin14=PB6 +Mcu.Pin15=PB7 +Mcu.Pin16=PB8 +Mcu.Pin17=PB9 +Mcu.Pin18=VP_SYS_VS_Systick +Mcu.Pin19=VP_TIM1_VS_ClockSourceINT Mcu.Pin2=PD0-OSC_IN Mcu.Pin3=PD1-OSC_OUT Mcu.Pin4=PA0-WKUP Mcu.Pin5=PA5 Mcu.Pin6=PA6 Mcu.Pin7=PA7 -Mcu.Pin8=PA13 -Mcu.Pin9=PA14 -Mcu.PinsNb=18 +Mcu.Pin8=PA8 +Mcu.Pin9=PA13 +Mcu.PinsNb=20 Mcu.UserConstants= Mcu.UserName=STM32F103C8Tx MxCube.Version=4.16.1 @@ -72,6 +75,9 @@ PA6.Mode=Full_Duplex_Master PA6.Signal=SPI1_MISO PA7.Mode=Full_Duplex_Master PA7.Signal=SPI1_MOSI +PA8.GPIOParameters=GPIO_Label +PA8.GPIO_Label=BUZZER +PA8.Signal=S_TIM1_CH1 PB3.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI PB3.GPIO_Label=ROTARY_B PB3.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING @@ -152,7 +158,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=SW4STM32 ProjectManager.ToolChainLocation=/home/wn/workspace-stm32/ttt2/cube/output/ttt2 ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_ADC1_Init-ADC1-false,3-MX_SPI1_Init-SPI1-false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false,2-MX_ADC1_Init-ADC1-false,3-MX_SPI1_Init-SPI1-false,4-MX_TIM1_Init-TIM1-false RCC.ADCFreqValue=12000000 RCC.ADCPresc=RCC_ADCPCLK2_DIV6 RCC.AHBFreq_Value=72000000 @@ -184,12 +190,21 @@ SH.GPXTI4.0=GPIO_EXTI4 SH.GPXTI4.ConfNb=1 SH.GPXTI5.0=GPIO_EXTI5 SH.GPXTI5.ConfNb=1 +SH.S_TIM1_CH1.0=TIM1_CH1,Output Compare1 CH1 +SH.S_TIM1_CH1.ConfNb=1 SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 SPI1.CLKPhase=SPI_PHASE_2EDGE SPI1.CLKPolarity=SPI_POLARITY_HIGH SPI1.CalculateBaudRate=4.5 MBits/s SPI1.IPParameters=Mode,CalculateBaudRate,BaudRatePrescaler,CLKPolarity,CLKPhase SPI1.Mode=SPI_MODE_MASTER +TIM1.IPParameters=OCMode_1,Pulse-Output Compare1 CH1,Prescaler,Period +TIM1.OCMode_1=TIM_OCMODE_TOGGLE +TIM1.Period=1000 +TIM1.Prescaler=36 +TIM1.Pulse-Output\ Compare1\ CH1=10000 VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM1_VS_ClockSourceINT.Mode=Internal +VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT board=ttt2 diff --git a/include/mxconstants.h b/include/mxconstants.h index dfdc0e6..365bd91 100644 --- a/include/mxconstants.h +++ b/include/mxconstants.h @@ -45,6 +45,8 @@ #define LED_GPIO_Port GPIOC #define ERROR_Pin GPIO_PIN_14 #define ERROR_GPIO_Port GPIOC +#define BUZZER_Pin GPIO_PIN_8 +#define BUZZER_GPIO_Port GPIOA #define ROTARY_B_Pin GPIO_PIN_3 #define ROTARY_B_GPIO_Port GPIOB #define ROTARY_A_Pin GPIO_PIN_4 diff --git a/include/stm32f1xx_hal_conf.h b/include/stm32f1xx_hal_conf.h index 21d3f49..31f1dd2 100644 --- a/include/stm32f1xx_hal_conf.h +++ b/include/stm32f1xx_hal_conf.h @@ -77,7 +77,7 @@ /*#define HAL_SMARTCARD_MODULE_ENABLED */ #define HAL_SPI_MODULE_ENABLED /*#define HAL_SRAM_MODULE_ENABLED */ -/*#define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED /*#define HAL_UART_MODULE_ENABLED */ /*#define HAL_USART_MODULE_ENABLED */ /*#define HAL_WWDG_MODULE_ENABLED */ diff --git a/my_src/alarm.c b/my_src/alarm.c index c51ed85..883c7bc 100644 --- a/my_src/alarm.c +++ b/my_src/alarm.c @@ -7,6 +7,72 @@ #include "stm32f1xx_hal.h" +#include +#include "alarm.h" + + +extern TIM_HandleTypeDef htim1; + + +typedef struct { + uint16_t f; + uint8_t inUse; +} tBuzzerHandle; + +tBuzzerHandle buzzerHandle; + + +static void startBuzzer(uint16_t f) { + HAL_TIM_OC_Stop(&htim1, TIM_CHANNEL_1); + __HAL_TIM_SET_COUNTER(&htim1, 0); + __HAL_TIM_SET_AUTORELOAD(&htim1, f); + HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1); +} + +static void stopBuzzer() { + HAL_TIM_OC_Stop(&htim1, TIM_CHANNEL_1); +} + + + +void buzzerTest(void *handle) { + static enum {BUZZER_OFF, BUZZER_LOW, BUZZER_HIGH} state = BUZZER_OFF; + + switch (state) { + case BUZZER_OFF: + HAL_TIM_OC_Stop(&htim1, TIM_CHANNEL_1); + state = BUZZER_LOW; + break; + case BUZZER_LOW: + HAL_TIM_OC_Stop(&htim1, TIM_CHANNEL_1); + __HAL_TIM_SET_COUNTER(&htim1, 0); + __HAL_TIM_SET_AUTORELOAD(&htim1, 2000); + HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1); + state = BUZZER_HIGH; + break; + case BUZZER_HIGH: + HAL_TIM_OC_Stop(&htim1, TIM_CHANNEL_1); + __HAL_TIM_SET_COUNTER(&htim1, 0); + __HAL_TIM_SET_AUTORELOAD(&htim1, 1000); + HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1); + state = BUZZER_OFF; + break; + } +} + +void stopBuzzing(void *handle) { + stopBuzzer(); +} + +void buzz(void *handle) { + tBuzzerHandle *lBuzzerHandle = (tBuzzerHandle*) handle; + startBuzzer(lBuzzerHandle->f); + schAdd(stopBuzzing, NULL, 100, 0); +} + +void alarmInit() { +// schAdd(buzzerTest, NULL, 0, 5000); +} void blink(void *handle) { @@ -14,11 +80,24 @@ void blink(void *handle) { } -void enableAlarm() { + +void enableAlarm(tAlarmType alarmType) { schAdd(blink, NULL, 0, 100); + + uint16_t f; + if (alarmType == TIME_ALARM) { + buzzerHandle.f = 4000; + } else { + buzzerHandle.f = 2000; + } + if (buzzerHandle.inUse == 0) { + buzzerHandle.inUse = 1; + schAdd(buzz, &buzzerHandle, 0, 10000); + } } void disableAlarm() { schDel(blink, NULL); HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, RESET); + schDel(buzz, &buzzerHandle); } diff --git a/my_src/alarm.h b/my_src/alarm.h index 389663f..d17f0b7 100644 --- a/my_src/alarm.h +++ b/my_src/alarm.h @@ -9,7 +9,13 @@ #define ALARM_H_ -void enableAlarm(); +typedef enum { + TIME_ALARM, + TEMPERATURE_ALARM +} tAlarmType; + +void alarmInit(); +void enableAlarm(tAlarmType alarmType); void disableAlarm(); diff --git a/my_src/eeprom.c b/my_src/eeprom.c index c3e389c..d0fb9fb 100644 --- a/my_src/eeprom.c +++ b/my_src/eeprom.c @@ -82,7 +82,7 @@ void eepromWrite(uint16_t addr, uint8_t *buf, uint8_t len) { eepromWren(); __EEPROM_CS(LOW); - HAL_SPI_Transmit(&hspi1, &msg, ((uint16_t)(len+3)), HAL_MAX_DELAY); + HAL_SPI_Transmit(&hspi1, &msg, ((uint16_t)(len+3+1)), HAL_MAX_DELAY); __EEPROM_CS(HIGH); } @@ -98,7 +98,7 @@ void eepromRead(uint16_t addr, uint8_t *buf, uint8_t len) { rxMsg; __EEPROM_CS(LOW); - HAL_SPI_TransmitReceive(&hspi1, &txMsg, &rxMsg, ((uint16_t)(len+3)), HAL_MAX_DELAY); + HAL_SPI_TransmitReceive(&hspi1, &txMsg, &rxMsg, ((uint16_t)(len+3+1)), HAL_MAX_DELAY); __EEPROM_CS(HIGH); memcpy(buf, rxMsg.data, len); diff --git a/my_src/eeprom.h b/my_src/eeprom.h index 9b246e6..e9884ec 100644 --- a/my_src/eeprom.h +++ b/my_src/eeprom.h @@ -11,7 +11,7 @@ #include "stm32f1xx_hal.h" -#define STORAGE_ADDRESS 0x10 +#define STORAGE_ADDRESS 0x20 void eepromWrite(uint16_t addr, uint8_t *buf, uint8_t len); void eepromRead(uint16_t addr, uint8_t *buf, uint8_t len); diff --git a/my_src/hmi.c b/my_src/hmi.c index 045a20e..8d212eb 100644 --- a/my_src/hmi.c +++ b/my_src/hmi.c @@ -15,7 +15,8 @@ -const uint32_t STORAGE_MAGIC = 0xaffe0002; +const uint32_t STORAGE_MAGIC = 0xaffe000a; + @@ -65,7 +66,7 @@ void updateDisplay(void *handle) { // sprintf(buf, "%d %d %d", c, i, i-h); // h = i; // c++; -// LED_P8x16Str(0, 6, buf); + LED_P8x16Str(0, 6, buf); } @@ -76,13 +77,16 @@ void hmiInit() { display.targetTime = storage.savedTime; } else { storage.magic = STORAGE_MAGIC; - storage.savedTemperature = 0; - storage.savedTime = 0; + storage.savedTemperature = 80; + storage.savedTime = 90; eepromWrite(STORAGE_ADDRESS, &storage, sizeof(storage)); + +// eepromRead(STORAGE_ADDRESS, &storage, sizeof(storage)); + display.targetTemperature = storage.savedTemperature; + display.targetTime = storage.savedTime; } schAdd(updateDisplay, &display, 0, 250); - } void clearSetMode(void *handle) { diff --git a/my_src/main2.c b/my_src/main2.c index 067b90f..3cb51d2 100644 --- a/my_src/main2.c +++ b/my_src/main2.c @@ -23,7 +23,7 @@ #include "oled.h" #include "timer.h" - +#include "alarm.h" void my_setup_1() { @@ -47,7 +47,7 @@ void my_setup_2() { hmiInit(); timerInit(); oledInit(); - + alarmInit(); } diff --git a/my_src/timer.c b/my_src/timer.c index a6bff03..90eecfa 100644 --- a/my_src/timer.c +++ b/my_src/timer.c @@ -5,9 +5,11 @@ * Author: wn */ -#include +#include "hmi.h" #include "timer.h" #include "alarm.h" +#include + extern tDisplay display; @@ -32,7 +34,7 @@ void secondTick(void *handle) { case RUNNING: lDisplay->currentTime -= 1; if (lDisplay->currentTime == 0) { - enableAlarm(); + enableAlarm(TIME_ALARM); lDisplay->timerState = OVERRUN; } break;