LockStm8BF/4_EXT_INT_1PORT/user/main.c
2022-05-30 16:40:47 +07:00

252 lines
8.5 KiB
C

//===============> 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 <string.h>
#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