AnsweredAssumed Answered

Should I use RTC +USART for my 7 segment, buzzer alarm?

Question asked by Md Mubdiul Hasan on Sep 26, 2016
Latest reply on Nov 10, 2016 by Md Mubdiul Hasan
Dear Sir,
In reference to this link, http://embedded-lab.com/blog/stm32s-internal-rtc/
, there is way to use rtc.
Take a look in this code,







#include "main.h"




GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART1_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;




char RxBuffer1[10]; 
uint8_t RxIndex1 = 0;
uint8_t led_number[4] = {0,0,0,0};
//uint8_t NbrOfDataToRead1 = 4;
uint8_t t;




void write_led_7_segment(__IO uint8_t number);
void write_digit(__IO uint8_t digit);




void GPIO_Configuration(void);
void EXTI_Configuration(void);
void USART_Configuration(void);




int main(void)
{
  GPIO_Configuration();
  EXTI_Configuration();
     USART_Configuration();
     
     SysTick_Config(SystemCoreClock / 1000);
     
  while(1)
  {  
          //USART_SendData(USART1, 'a');
     }
}








void GPIO_Configuration(){
     // Enable GPIOA & GPIOB Clock
     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
     
     // Cau hinh PA6,7,13-15 va PB0,1,3-7 la chan ket noi cac thanh LED, che do output push-pull.
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
     
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
     
     
     // Cau hinh PA0-2 la chan ket noi button, che do input floating.
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
     GPIO_Init(GPIOA, &GPIO_InitStructure);  
}












void USART_Configuration(){
     // Enable peripheral USART clock
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
     
     // Cau hinh AFConfig de thuc hien chuc nang thay the 
     // (neu k su dung AFConfig thi cac pin chi la GPIO ma k thuc hien chuc nang USART)
     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
     
//  // Cau hinh USART1 TX la chan output push - pull
//     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
//  GPIO_Init(GPIOA, &GPIO_InitStructure);
//     
//     // Cau hinh USART1 RX la chan input floating.
//     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
//     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
//     GPIO_Init(GPIOA, &GPIO_InitStructure);
     
     GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
     
     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
     
     // Cau hinh USART1
     USART1_InitStructure.USART_BaudRate = 115200;
  USART1_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART1_InitStructure.USART_StopBits = USART_StopBits_1;
  USART1_InitStructure.USART_Parity = USART_Parity_No;
  USART1_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART1_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
     USART_Init(USART1, &USART1_InitStructure);
     
     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
     //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
     
     // Enable UART1
     USART_Cmd(USART1, ENABLE);
}




void EXTI_Configuration(){
     // Enable SYSCFG clock 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  
  // Ket noi EXTI Line0,1 toi PA0,1
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);




  // Cau hinh EXTI0,1
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
     
  // Cau hinh uu tien ngat cho ngat EXTI
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
     
     
     EXTI_ClearITPendingBit(EXTI_Line0);
}




void SysTick_Handler(void)
{
     static uint32_t time = 0;
     time++;
     if ((time > 0) && (time <= 5)){
          write_digit(1);
          write_led_7_segment(led_number[0]);
     }
     if ((time > 5) && (time <= 10)){
          write_digit(2);
          write_led_7_segment(led_number[1]);
     }
     if ((time > 10) && (time <= 15)){
          write_digit(3);
          write_led_7_segment(led_number[2]);
     }
     if ((time > 15) && (time <= 20)){
          write_digit(4);
          write_led_7_segment(led_number[3]);
          if (time == 20){
               time = 0;
          }
     }
}




void EXTI0_1_IRQHandler(void)
{
     if(EXTI_GetITStatus(EXTI_Line0) != RESET)
     {          
          USART_SendData(USART1, 'S');
          EXTI_ClearITPendingBit(EXTI_Line0);
     }
}




void USART1_IRQHandler(void)
{  // co the su dung static cho bien RxIndex1 de co the reset bien nay ve 0
     //static uint8_t RxIndex1 = 0;
     uint8_t i = 0;
     
//     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // Received characters modify string
//          {
//               if(USART_ReceiveData(USART1)== '1')
//               USART_SendData(USART1, 'a');
//          }
//     USART_ClearITPendingBit(USART1, USART_IT_RXNE);




     if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // Received characters modify string
          {
               //RxBuffer1[RxIndex1] = USART_ReceiveData(USART1);
               //USART_SendData(USART1, RxBuffer1[RxIndex1]);
               //USART_SendData(USART1, RxBuffer1[0]);
               //led_number[RxIndex1] = (uint8_t)(RxBuffer1[RxIndex1]);
//               //USART_SendData(USART1, 'a');
               led_number[RxIndex1] = USART_ReceiveData(USART1);
               USART_SendData(USART1, led_number[RxIndex1]);
               RxIndex1++;
//               if (RxIndex1 >= 4){
//                    USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
//                    RxIndex1 = 0;
//               }
          }
          
//     for (i = 0; i < 4; i++){
//          led_number[i] = (uint8_t)RxBuffer1[i];
//          USART_SendData(USART1, led_number[i]); 
//     }
     
     //RxIndex1 = 0; // Khi su dung RxIndex1 = 0 khi RxIndex1 khong phai la bien static-> Du lieu moi luon duoc gan vao RxBuffer1[0]
     if (RxIndex1 == 4){
//          for (i = 0; i < 4; i++)
//          {
//               led_number[i] = (uint8_t)RxBuffer1[i];
//               USART_SendData(USART1, led_number[i]);
//          }
          RxIndex1 = 0;
     }
     USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}




void write_digit(__IO uint8_t digit){
     if (digit == 1){
          // digit 1 xuat 1; digit 2, 3, 4 xuat 0
          GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(1)); // digit 1
          GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(0)); // digit 2
          GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(0)); // digit 3
          GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(0)); // digit 4
     }
     if (digit == 2){
          // digit 2 xuat 1; digit 1, 3, 4 xuat 0
          GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(0)); // digit 1
          GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(1)); // digit 2
          GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(0)); // digit 3
          GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(0)); // digit 4
     }
     if (digit == 3){
          // digit 3 xuat 1; digit 1, 2, 4 xuat 0
          GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(0)); // digit 1
          GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(0)); // digit 2
          GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(1)); // digit 3
          GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(0)); // digit 4
     }
     if (digit == 4){
          // digit 4 xuat 1; digit 1, 2, 3 xuat 0
          GPIO_WriteBit(GPIOB, GPIO_Pin_1, (BitAction)(0)); // digit 1
          GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)(0)); // digit 2
          GPIO_WriteBit(GPIOA, GPIO_Pin_7, (BitAction)(0)); // digit 3
          GPIO_WriteBit(GPIOA, GPIO_Pin_6, (BitAction)(1)); // digit 4
     }
}




void write_led_7_segment(__IO uint8_t number){
     
     // Muc logic 0 -> led sang, muc logic 1 -> led toi
     if (number == 0){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(0)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(0)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(0)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(0)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(0)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(1)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 1){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(1)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(0)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(1)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(1)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(1)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(1)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 2){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(0)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(0)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(1)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(0)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(0)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(1)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(0)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 3){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(0)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(0)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(0)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(1)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(1)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(0)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 4){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(1)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(0)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(1)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(1)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(0)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(0)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 5){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(0)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(1)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(0)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(1)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(0)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(0)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 6){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(0)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(1)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(0)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(0)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(0)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(0)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 7){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(0)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(0)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(1)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(1)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(1)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(1)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 8){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(0)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(0)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(0)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(0)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(0)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(0)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
     if (number == 9){
          GPIO_WriteBit(GPIOA, GPIO_Pin_12, (BitAction)(0)); // led A
          GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(0)); // led B
          GPIO_WriteBit(GPIOA, GPIO_Pin_15, (BitAction)(0)); // led C
          GPIO_WriteBit(GPIOB, GPIO_Pin_6, (BitAction)(0)); // led D
          GPIO_WriteBit(GPIOB, GPIO_Pin_7, (BitAction)(1)); // led E
          GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(0)); // led F
          GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(0)); // led G
          GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1)); // led DP
     }
}












#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(uint8_t* file, uint32_t 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




/**
  * @}
  */


My question is, 
1. To display my 7 segment for spi data, how would I configure data steam in case of connect with USART.
Take a look my temperature sensor,

void MAX31855_chipUnselect()
  {
    HAL_GPIO_WritePin(GPIOB, GPIO_TEMP_SO, GPIO_TEMP_/CS);
  }


  void MAX31855_chipSelect()
  {
    HAL_GPIO_WritePin(GPIOB,GPIO_TEMP_/CS, GPIO_PIN_RESET);
  }


  uint32_t MAX31855_readData()
  {
    uint8_t pDataRx[4] = { };


    MAX31855_chipSelect();
    HAL_SPI_Receive(&hspi1, (uint8_t*) pDataRx, 4, 1000);
    MAX31855_chipUnselect();


    return (pDataRx[i] << 24) | (pDataRx[i] << 16) | (pDataRx[i] << 8) | pDataRx[i];


  }
2. From the datasheet of  MAX31855, how I can make a scale for receiving 
digital data?

Kindly help me.

Attachments

Outcomes