Microprocessor/STM32

STM32F130C8T6 (feat.TDCR1050M FND)

Dexter_- 2018. 11. 19. 17:37
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
    λ°˜μ‘ν˜•