STM32F130C8T6 (feat.TDCR1050M FND)
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);
}