Microprocessor/STM32 STM32F130C8T6 (feat.TDCR1050M FND)
  • 728x90
    ๋ฐ˜์‘ํ˜•

     

    STM32F130C8T6(Cortex-M0)

     

     

    (feat. TDCR1050M FND)


     

    ๋ชฉ์ฐจ

       

       

      STM32F10xxx & TDCR1050M Datasheet

      STM32F130C8T6 & Keil Start

      ๐Ÿ“Œ SEGGER ์—์„œ ๋งŒ๋“  J-LINK EDU๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽŒ์›จ์–ด ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

       

       

      ๋ณด๋“œ์™€์˜ ์—ฐ๊ฒฐ์€ SWDIO, SWCLK, RESET, VCC, GND ํ•€๋งŒ์„ ์—ฐ๊ฒฐํ•˜์˜€๋‹ค.

      ์•„๋ž˜ J-LINK Pin map ์ฐธ์กฐ.

       

      Keil uVison V5.17.0.0 ์„ ์‚ฌ์šฉํ•˜์˜€์œผ๋ฉฐ Target ์˜ต์…˜์—์„œ Debug ํƒญ ์˜ต์…˜์„ ์•„๋ž˜์™€ ๊ฐ™์ด J-LINK PORT๋ฅผ SW๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.

       

       

      Flash Download ์˜ต์…˜์—์„œ๋Š” ๋‹ค์šด๋กœ๋“œ ํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ ๋™์ž‘์‹œํ‚ฌ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” Reset and Run ์˜ต์…˜์„ ์ฒดํฌํ•œ๋‹ค. 

       

       

       

       

      FND(TDCR1050M) ์—ฐ๋™์šฉ GPIO ์—ฐ๊ฒฐ

      ๐Ÿ“Œ GPIO ์‚ฌ์šฉ ํ•€์€ PB0~PB7 ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ FND์˜ A~DP์— ์—ฐ๊ฒฐ ํ•˜๊ณ , PB12~PB15 ๊นŒ์ง€ ์ฐจ๋ก€๋Œ€๋กœ FND D1~D4 ๊นŒ์ง€ ์—ฐ๊ฒฐํ•˜์˜€๋‹ค.

       

       

      STM32F130 Pinout

       

      TDCR1050M Pinout

       

       

      FND(TDCR1050M) ์—ฐ๋™์šฉ GPIO ์ดˆ๊ธฐํ™”

      ๐Ÿ“Œ GPIO ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ณ  FND๋ฅผ ์ปจํŠธ๋กค ํ•˜๋ ค๋‹ค ๋ณด๋‹ˆ D, E ํ•€๋งŒ ์‹ ํ˜ธ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค.

      ์ด์œ ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ FND D, E ํ•€์— ์—ฐ๊ฒฐ ๋˜์–ด ์žˆ๋Š” PB3, PB4 ํ•€์€ JTAG์˜ Debug์™€ ๊ด€๋ จ๋œ ํ•€์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์—ˆ๋‹ค.

       

       

       

      PB3, PB4 ํ•€์„ GPIO ํ•€์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ์†Œ์Šค์™€ ๊ฐ™์ด GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•€์„ ๋ฆฌ๋งต์‹œํ‚จ๋‹ค.

      ํ•€๋ฆฌ๋งต์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” RCC_APB2Peripg_AFIOํ™œ์„ฑํ™”๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

       

      gpio.c

       

      ๊ธฐ๋ณธ์ ์œผ๋กœ LOW ์‹ ํ˜ธ์— FND๊ฐ€ ๋™์ž‘ํ•˜๋ฉฐ D1~D4 ๋Š” FND์˜ ์ž๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

      A~DP๋Š” ์ˆซ์ž๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ ๋ณ€์„ ์˜๋ฏธํ•œ๋‹ค. ์•„๋ž˜๋ฅผ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ .

       

       

      TDCR1050M FND๋ฅผ ์ œ์–ดํ•˜๋Š” ์†Œ์Šค์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

      FND_write(ENUM_DIGIT digit, uint32_t value)ํ•จ์ˆ˜์— ์ž๋ฆฌ ์œ„์น˜์™€ ๊ฐ’์„ ์ธ์ž๋กœ ์ฃผ๋ฉด ๋™์ž‘ํ•œ๋‹ค.

       

       

      TDCR1050M.h

      #ifndef __TDCR1050M_H__
      #define __TDCR1050M_H__
      
      #ifdef __cplusplus
       extern "C" {
      #endif
      #include "stm32f10x.h"                  /* Device header */
      
      typedef enum
      { 
          DIGIT_1 = 1,
          DIGIT_2,
          DIGIT_3,
          DIGIT_4
      }ENUM_DIGIT;
      
      
      /* FND LED NUMBER POSITION */
      #define D1      0x1000
      #define D2      0x2000
      #define D3      0x4000
      #define D4      0x8000
      
      #define FND_A   0x0001      /* TOP          */
      #define FND_B   0x0002      /* TOP RIGHT    */
      #define FND_C   0x0004      /* BOTTOM RIGHT */
      #define FND_D   0x0008      /* BOTTOM       */
      #define FND_E   0x0010      /* BOTTOM LEFT  */
      #define FND_F   0x0020      /* TOP LEFT     */
      #define FND_G   0x0040      /* MID          */
      #define FND_DP  0x0080      /* BOTTOM DOT   */
      #define FND_ALL (FND_A|FND_B|FND_C|FND_D|FND_E|FND_F|FND_G)
      
      void FND_Init(void);
      void FND_Write(ENUM_DIGIT digit, uint32_t value);
      
      #ifdef __cplusplus
      }
      #endif
      
      #endif /* __TDCR1050M_H__ */
       

       

      TDCR1050M.c

      #include "TDCR1050M.h"
      #include "stm32f10x_gpio.h"             /* Keil::Device:StdPeriph Drivers:GPIO */
      
      static void FND_WriteNum(uint32_t value);
      
      void FND_Init(void)
      {
          GPIO_WriteBit(GPIOB, D1, Bit_SET);
          GPIO_WriteBit(GPIOB, D2, Bit_SET);
          GPIO_WriteBit(GPIOB, D3, Bit_SET);
          GPIO_WriteBit(GPIOB, D4, Bit_SET);  
      }
      
      void FND_Write(ENUM_DIGIT digit, uint32_t value)
      {
          FND_Init();
          switch(digit)
          {
              case DIGIT_1:
                  GPIO_WriteBit(GPIOB, D1, Bit_RESET);
                  break;
      
              case DIGIT_2:
                  GPIO_WriteBit(GPIOB, D2, Bit_RESET);
                  break;
      
              case DIGIT_3:
                  GPIO_WriteBit(GPIOB, D3, Bit_RESET);
                  break;
      
              case DIGIT_4:
                  GPIO_WriteBit(GPIOB, D4, Bit_RESET);
                  break;
      
              default: break;
          }   
      
          FND_WriteNum(value);
          
          return ;
      }
      
      static void FND_WriteNum(uint32_t value)
      {
          GPIO_WriteBit(GPIOB, FND_ALL, Bit_SET);
          
          switch(value)
          {
              case 0:
                  GPIO_WriteBit(GPIOB, FND_A | FND_B | FND_C | FND_D | FND_E | FND_F, Bit_RESET);
                  break;
                  
              case 1:
                  GPIO_WriteBit(GPIOB, FND_B | FND_C, Bit_RESET);
                  break;
      
              case 2:
                  GPIO_WriteBit(GPIOB, FND_A | FND_B | FND_D | FND_E | FND_G, Bit_RESET);
                  break;
      
              case 3:
                  GPIO_WriteBit(GPIOB, FND_A | FND_B | FND_C | FND_D | FND_G, Bit_RESET);
                  break;
      
              case 4:
                  GPIO_WriteBit(GPIOB, FND_B | FND_C | FND_F | FND_G, Bit_RESET);
                  break;
      
              case 5:
                  GPIO_WriteBit(GPIOB, FND_A | FND_C | FND_D | FND_F | FND_G, Bit_RESET);
                  break;
      
              case 6:
                  GPIO_WriteBit(GPIOB, FND_A | FND_C | FND_D | FND_E | FND_F | FND_G, Bit_RESET);
                  break;
      
              case 7:
                  GPIO_WriteBit(GPIOB, FND_A | FND_B | FND_C | FND_F, Bit_RESET);
                  break;
      
              case 8:
                  GPIO_WriteBit(GPIOB, FND_A | FND_B | FND_C | FND_D | FND_E | FND_F | FND_G, Bit_RESET);
                  break;
      
              case 9:
                  GPIO_WriteBit(GPIOB, FND_A | FND_B | FND_C | FND_F | FND_G, Bit_RESET);
                  break;
      
              default: break;
          }  
      }

       

      FND์˜ ํŠน์„ฑ์ƒ ํ•œ์ž๋ฆฌ์”ฉ ๋ฐ˜๋ณตํ•ด์„œ ํ‘œํ˜„ํ•ด์•ผ ํ•จ์œผ๋กœ ๋ณ„๋„์˜ Thread๋ฅผ ๋งŒ๋“ค์–ด 4์ž๋ฆฌ์˜ ์ˆซ์ž๋ฅผ ๊ฐ ์ž๋ฆฌ์ˆ˜ ๋ณ„๋กœ ๋ฐ˜๋ณตํ•ด์„œ ํ‘œํ˜„ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

      Keil5์—์„œ Thread๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Manage Run ์—์„œ CMSIS < RTOS(API) < Keil RTX๋ฅผ ํ™œ์„ฑํ™” ํ•ด์ค€๋‹ค.

       

       

      Thread ์ „์ฒด ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

       

      Thread.h

      #ifndef __THTREAD_H__
      #define __THTREAD_H__
      
      #ifdef __cplusplus
       extern "C" {
      #endif
      
      int Init_Thread(void);
      
      #ifdef __cplusplus
      }
      #endif
      
      #endif /* __THTREAD_H__ */

       

      Thread.c

      #include "thread.h"
      #include "cmsis_os.h"                   // ARM::CMSIS:RTOS:Keil RTX
      #include "TDCR1050M.h"
      
      uint32_t timeValue;
      
      void Thread_FND(void const *argument);                 // thread function
      osThreadId tid_Thread_FND;                                    // thread id
      osThreadDef(Thread_FND, osPriorityNormal, 1, 0);        // thread object
      
      int Init_Thread(void)
      {
          tid_Thread_FND = osThreadCreate(osThread(Thread_FND), NULL);
          if (!tid_Thread_FND) return(-1);  
      
          return (0);
      }
      
      void Thread_FND(void const *argument) 
      {
          uint32_t temp = 0;
          uint32_t timeValueTemp = 0;
          volatile uint32_t delay = 0;
          
          while(1) 
          {
              timeValueTemp = timeValue;
              
              osSignalWait(1U, 0);    // Wait for signal
              
              temp = timeValueTemp / 1000;        
              FND_Write(DIGIT_1, temp);
              osDelay(1);
              
              timeValueTemp %= 1000;
              temp = timeValueTemp / 100;        
              FND_Write(DIGIT_2, temp);
              osDelay(1);
              
              timeValueTemp %= 100;
              temp = timeValueTemp / 10;          
              FND_Write(DIGIT_3, temp);        
              osDelay(1);
              
              timeValueTemp %= 10;
              FND_Write(DIGIT_4, timeValueTemp);
              osDelay(1);
          }
      }
       

       

       

      ์Šค์œ„์น˜ ์ธํ„ฐ๋ŸฝํŠธ ํ™œ์„ฑํ™”

      ๐Ÿ“Œ FND STOP, START, RESET ์ปจํŠธ๋กค์„ ์œ„ํ•ด ์Šค์œ„์น˜๋ฅผ PA5~PA7ํ•€์— ๊ฐ๊ฐ ์—ฐ๊ฒฐํ•˜์˜€๋‹ค.

       

      gpio.c

       

       

      main() ํ•จ์ˆ˜์™€ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ

      ๐Ÿ“Œ main()ํ•จ์ˆ˜์—์„œ๋Š” ์ปค๋„ ๋ฐ Thread ์ดˆ๊ธฐํ™”, PORTA, PORTB๋ฅผ ์ดˆ๊ธฐํ™”๋ฅผ ์‹œํ‚จํ›„ ์™ธ๋ถ€ ์ธํ„ฐ๋ŸฝํŠธ์—์˜ํ•ด ๋ณ€ํ™”๋˜๋Š” ์ „์—ญ๋ณ€์ˆ˜ ๊ฐ’์—๋”ฐ๋ผ FND ๊ฐ’์„ 0~9999๊นŒ์ง€ 1์ดˆ๋งˆ๋‹ค ์นด์šดํŒ…ํ•˜๊ฑฐ๋‚˜ RESET ๋˜๋Š” STOPํ•˜๋Š” ๋™์ž‘์„ ํ•œ๋‹ค.

       

      #include <stdio.h>
      #include "stm32f10x.h"                  /* Device header */
      #include "stm32f10x_exti.h"             /* Keil::Device:StdPeriph Drivers:EXTI      */
      #include "gpio.h"
      #include "thread.h"
      #include "cmsis_os.h"                   /* ARM::CMSIS:RTOS:Keil RTX */
      #include "TDCR1050M.h"
      
      #define STOP    3
      
      extern osThreadId tid_Thread_FND;
      extern uint32_t timeValue;
      char irq_Status;
      
      void EXTI9_5_IRQHandler(void);
      
      void EXTI9_5_IRQHandler(void)
      {
          if(EXTI_GetITStatus(EXTI_Line5) != RESET) {         /* STOP  */
              irq_Status = STOP;
              EXTI_ClearITPendingBit(EXTI_Line5);
          }
          else if(EXTI_GetITStatus(EXTI_Line6) != RESET) {    /* START */
              irq_Status = SET;         
              EXTI_ClearITPendingBit(EXTI_Line6);
          }
          else if(EXTI_GetITStatus(EXTI_Line7) != RESET) {    /* RESET */
              irq_Status = RESET;              
              EXTI_ClearITPendingBit(EXTI_Line7);
          }   
      }
      
      int32_t main(void)
      {
          timeValue = 0;
          irq_Status = RESET;
          
          osKernelInitialize();
          Init_Thread();
          PORTA_Init();
          PORTB_Init();
          FND_Init();
          osKernelStart();                           
      
          SysTick_Config(SystemCoreClock / 1000);
          
          while(1) 
          {               
              if(irq_Status == SET) {
                  osSignalSet(tid_Thread_FND, 1U);  
                  osDelay(1000);
                  if(timeValue < 9999) {
                      timeValue++;  
                  }
                  else {
                      timeValue = 0;
                  }
              }
              else if(irq_Status == RESET) {
                  timeValue = 0;  
                  osDelay(1);
              }
              else {
                  osDelay(1);
              }
          }
      
          return (0);
      }
       

       

       

       

       

       

       

       

       

      728x90
      ๋ฐ˜์‘ํ˜•
    ์ƒ๋‹จ์œผ๋กœ