//===============> Version lockBF version 1.0 26/5/2022 stm8s Suported by Thaonv <=====================// #include "stm8s.h" #include "stdbool.h" #include "stm8s_uart2.h" #include "stdio.h" #include "uart.h" #include #define relay GPIOD,GPIO_PIN_2 //Set Relay 1 Pin #define relay_2 GPIOD,GPIO_PIN_3 //Set Relay 1 Pin #define Light GPIOD,GPIO_PIN_4 //Set light 1 Pin #define button GPIOC,GPIO_PIN_5 //set button pin #define button_2 GPIOA,GPIO_PIN_3 //set button pin uint16_t time_delay =2000; char input; char rx_indx; char rx_buffer[10]; char str3[]="tdoor"; int t1; // char c[10]; char t[2]; /* Private defines -----------------------------------------------------------*/ bool relay_stt = false; bool relay_stt2 = false; bool test2 = false; void delay_timer1(uint16_t time_delay2); void Delayms_timer4(uint16_t time_delay); void CLK_Cofiguration(void); void GPIO_Configuration(void); void Exint_Cofiguration(void); void control(void); void onled(void); void offled(void); char Serial_read_char(void); char Serial_print (char string[]); //void S erial_print_string (char string[]) void Serial_print_string (char[]); void Serial_print_int (int number) ; void UART_Configuration(void); void UARTPrintf(char *message); void uart_isr(void); void empty_buffer(uint8_t *buffer,uint16_t size); void test1(void); void gets_UART1(unsigned char *string); void test(void); /* Private functions -- -------------------------------------------------------*/ INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5) { GPIO_WriteHigh(relay); Serial_print_string("open_1\n\r"); relay_stt=true; } INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3) { GPIO_WriteHigh(relay_2); Serial_print_string("open_2\n\r"); relay_stt2=true; } INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) { input=Serial_read_char(); if(input=='\n') { rx_buffer[rx_indx] = '\0'; rx_indx = 0; // Serial_print_string(rx_buffer); if(strcmp(rx_buffer,"1")==0){ GPIO_WriteHigh(GPIOD,GPIO_PIN_2); // on relay1 Serial_print_string("open_1\n\r"); relay_stt=true; }else if(strcmp(rx_buffer,"2")==0){ GPIO_WriteHigh(GPIOD,GPIO_PIN_3); // on relay2 Serial_print_string("open_2\n\r"); relay_stt2=true; }else if(strcmp(rx_buffer,"3")==0){ Serial_print_string("open_3\n\r"); // on led onled(); }else if(strcmp(rx_buffer,"4")==0){ Serial_print_string("open_4\n\r"); offled(); // off led } else if(strncmp(rx_buffer,str3,5)==0){ strncpy( t, rx_buffer+6, 2 ); t[2]='\0'; // Serial_print_string(t); t1 = atoi(t); time_delay=t1*1000; // Serial_print_int(time_delay); } } else { rx_buffer[rx_indx]=input; rx_indx++; } } void Serial_print_int (int number) //Funtion to print int value to serial monitor { char count = 0; char digit[5] = ""; while (number != 0) //split the int to char array { digit[count] = number%10; count++; number = number/10; } while (count !=0) //print char array in correct direction { UART1_SendData8(digit[count-1] + 0x30); while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); //wait for sending count--; } } char Serial_read_char(void) { while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET) UART1_ClearFlag(UART1_FLAG_RXNE); return (UART1_ReceiveData8()); } void Serial_print_string (char string[]) { char i=0; while (string[i] != 0x00) { UART1_SendData8(string[i]); while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); i++; } } void onled(){ GPIO_WriteHigh(Light); } void offled(){ GPIO_WriteLow(Light); } void main(void) { CLK_Cofiguration(); GPIO_Configuration(); Exint_Cofiguration(); UART_Configuration(); while (1) { test(); control(); } } void control(){ if(relay_stt==true){ Delayms_timer4(time_delay); GPIO_WriteLow(relay); relay_stt = false; } else if(relay_stt2==true){ Delayms_timer4(time_delay); GPIO_WriteLow(relay_2); relay_stt2 = false; } } void test(){ GPIO_WriteHigh(GPIOD,GPIO_PIN_3); Delayms_timer4(1000); GPIO_WriteLow(GPIOD,GPIO_PIN_3); Delayms_timer4(1000); } void CLK_Cofiguration(void) { CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); } void GPIO_Configuration(void) { GPIO_DeInit(GPIOD); // reset all register port D GPIO_Init(relay, GPIO_MODE_OUT_PP_LOW_FAST); //config pin PD2 of portD with mode push pull speed 2Mhz GPIO_Init(relay_2, GPIO_MODE_OUT_PP_LOW_FAST);//config pin PD3 of portD with mode push pull speed 2Mhz GPIO_Init(Light, GPIO_MODE_OUT_PP_LOW_FAST); } void Exint_Cofiguration(void) { GPIO_DeInit(GPIOC); GPIO_DeInit(GPIOA); // reset all register port c GPIO_Init(button, GPIO_MODE_IN_PU_IT); // config pin PC5 is input, pull up , interupt GPIO_DeInit(GPIOA); // reset all register port A GPIO_Init(button_2, GPIO_MODE_IN_PU_IT); // config pin PA3 is input, pull up , interupt EXTI_DeInit(); // reset all register interupt EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC,EXTI_SENSITIVITY_RISE_ONLY); // set interupt is edge up or edge down EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA,EXTI_SENSITIVITY_RISE_ONLY); // set interupt is edge up or edge down enableInterrupts(); // Enable interrupt. } void UART_Configuration(void) { UART1_DeInit(); // reset lai toan bo thanh ghi trong uart UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // cai dat toc do baund la , 1bit stop, k su dung nit chan le, khong su dung chan clock, su dung ca 2 chan Tx,Rx UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); // cau hinh la ngat nhan UART UART1_Cmd(ENABLE); // cho phep chay UART. enableInterrupts(); // cho phep ngat toan cuc } void Delayms_timer4(uint16_t time_delay) { /* Init TIMER 4 */ Serial_print_string("start \n"); CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE); // enable clock timer 4 TIM4_TimeBaseInit(TIM4_PRESCALER_64, 250); // set frequence timer 4 la 16*10^6/64/250 = 1000Hz TIM4_SetCounter(0); // set counter value = 0 //set counter ve gia tri ban dau =0 TIM4_ClearFlag(TIM4_FLAG_UPDATE); // clear flag update timer4(when over timer = 1) clear 0 TIM4_Cmd(ENABLE); // enable timer // enable timer hoat dong while(time_delay--) // tan so la 1000Hz -> khi lap lai 1000 lan la 1Hz = 1s { while(TIM4_GetFlagStatus(TIM4_FLAG_UPDATE)== 0) ; // watting over timer exit whiles TIM4_ClearFlag(TIM4_FLAG_UPDATE); // clear timer for next counter } Serial_print_string("end \n"); /* Disable Counter */ TIM4_Cmd(DISABLE); // sau khi delay xong, disable timer. CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);// Disable clock for timer when finish delay } void delay_timer1(uint16_t time_delay2){ TIM1_DeInit(); // reset all resgister timer1 CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1, ENABLE); // provide clock for timer1 TIM1_TimeBaseInit(15999,TIM1_COUNTERMODE_UP, 1000,0); // config frequency interrupt PSC= 15999+1 =16000, ARR = 1000 -> F_interrupt = 16*10^6 / 16000/1000 = 1Hz = 1s TIM1_ARRPreloadConfig(ENABLE); // enable register auto reload active - over counter -> reset counter TIM1_ITConfig(TIM1_IT_UPDATE,ENABLE); // ennable over inerrupt TIM1_ClearFlag(TIM1_FLAG_UPDATE); while(time_delay2--) // tan so la 1000Hz -> khi lap lai 1000 lan la 1Hz = 1s { while(TIM1_GetFlagStatus(TIM1_FLAG_UPDATE)== 0) ; // watting over timer exit whiles TIM4_ClearFlag(TIM1_FLAG_UPDATE); // clear timer for next counter } TIM1_Cmd(ENABLE); // enable timer active enableInterrupts(); } #ifdef USE_FULL_ASSERT /** * @brief Reports the name of the source file and the source line number * where the assert_param error has occurred. * @param file: pointer to the source file name * @param line: assert_param error line source number * @retval : None */ void assert_failed(u8* file, u32 line) { /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif