woodong11 / Firmware_mini_project_bundle

STM32와 Renesas의 Eval Board로 Firmware를 개발한 예제들입니다.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

STM32_Firmware_mini_project_bundle

STM32와 Renesas의 Eval Board로 Firmware를 개발한 미니 프로젝트입니다.

Require

사용한 개발 보드: Nucleo-F103RB, ST사 제작

뉴클레오

MCU 이름 : STM32F103RB
MCU 정보 : ARM Cortex-M3 계열, 72MHz

  • RAM size : 20KB SRAM
  • Flash size : 128KB flash memory

사용한 개발 보드: FPB-RA6E1, 르네사스 제작



MCU 이름 : R7FA6E10F2CFP
MCU 정보 : ARM Cortex - M33 계열, 200MHz

  • RAM size : 256KB SRAM
  • Flash size : 1MB flash memory

Nucleo_LED_and_Swtich

Bread Board에 버튼 2개와 LED3개를 연결하고,
버튼1 누르면 LED1 → LED2 → LED3 → LED1 → …
버튼2 누르면 LED3 → LED2 → LED1 → LED3 → …
로 동작하는 예제입니다.

Video Label

Pinout MAP

PC5, PC6, PC8을 LED1, LED2, LED3로 설정
PA11, PA12를 BTN1, BTN2로 설정하고 GPIO설정에서 pull up으로 설정



how to run

main.c 대신 해당 코드를 복붙하고 디버그 실행

Nucleo_UART_LED_Blink

Bread Board 에 LED 3개를 연결하고, PC에서 입력한 숫자만큼 LED1, LED2, LED3를 깜빡이는 예제입니다.
ex) 숫자 4를 입력하면 LED 전체가 4번 깜빡임
도전4

Video Label

Pinout MAP

PC5, PC6, PC8을 LED1, LED2, LED3로 설정



how to run

main.c 대신 해당 코드를 복붙하고 디버그 실행

Nucleo_LED_Interrupt.c

LED와 Switch를 이용해 인터럽트를 제작해보는 예제입니다.

  1. 버튼1 누르면, LED1 무한 blink
  2. 버튼2 누르면, LED2 무한 blink 코드를 수정하여 우선순위 변경 가능


how to run

main.c 대신 해당 코드를 복붙하고 디버그 실행

Necleo_LED_timmer_interrupt.c

LED 3개를 Timer 설정과 UART를 이용해 PC에 출력하는 예제입니다.

  1. LED1 : 0.5s 에 한번 blink
  2. LED2 : 0.3s 에 한번 blink
  3. LED3 : 0.7s 에 한번 blink



Pinout MAP

PC6, PC8, PA11: LED1, LED2, LED3
PC9, PA12: BTN1, BTN2
clock configuration: Prescaler를 8000-1, Counter Period를 10-1로 설정


how to run

main.c 대신 해당 코드를 복붙하고 디버그 실행

Nucleo_ADC_visualization

뉴클레오 보드에서 ADC가변저항을 조절해, UART로 PC에 데이터를 보내 ADC Value 와 Volt 그래프를 시각화하는 예제입니다.




how to run

main.c 대신 해당 c 코드를 복붙하고 디버그 실행

PC에서 python adc_visual.py 로 실행

Renesas_Air_mouse

BSP : heap 0x100

Renesas_LED_Interrupt

Switch 2개와 LED 4개를 사용하고, 인터럽트와 재귀호출을 사용해 xxxx 부터 oooo 까지 모든 조합을 LED로 보여주는 예제입니다.

  1. 0.3초에 한번씩 LED 4개로 표현합니다.
    모든 조합을 보여주었다면, 아무것도 하지 않고 버튼 눌리기를 대기합니다.

  2. Switch 1 : Play를 처음부터 다시 시작합니다.
  3. Switch 2 : 즉시 일시정지를 한다. 한번 더 누르면 재개합니다.

Pinout MAP

P409, P302: usr_SW1, usr_SW2(IRQ6, IRQ5)
p113, p303, p105, p107: usr_LED1, usr_LED2, usr_LED3, usr_LED4

image

how to run

hal_entry.c 대신 해당 코드를 복붙하고 디버그 실행

troubleshooting

  1. 기본 설정으로 스위치가 동작하지 않을 때, 보드에서 직접 풀업 회로를 구성하고 irq setting의 Triger에 Falling으로 체크해 해결할 수 있습니다. + 인터럽트 우선순위는 IRQ마다 다르게 해야 합니다.

  2. 임베디드 MCU에선 flag같은 전역변수를 사용할 때 꼭 volatile로 선언해주어야 합니다.
    volatile로 선언하게 되면 해당 변수를 읽고 쓸 때 무조건 특정 메모리를 사용하게 됩니다.
    ex) 선언하지 않았을 때: 컴파일러가 코드를 최적화하여, cpu가 해당 변수를 자주 쓰는 변수로 인식해 캐쉬에 저장하게 되면,
    inturrupt가 동작해 어떤 함수에서 flag를 바꾸는 작업을 할때 cpu는 캐쉬에서만 읽게 되어 내가 원하는 동작을 하지 않을 수 있습니다.

  3. 버튼을 눌렀을때 잘 동작하지 않을 시, bounce로 발생하는 채터링 현상 때문일 수 있습니다.
    SW적으로 해결할려면, 처음 신호와 약 100ms 이후의 신호의 종류가 같을때 High 또는 Low로 판별하는 코드를 추가할 수 있습니다.

  4. IRQ를 같은 종류로만 사용해야 합니다.
    ex) IRQ1_DS와 IRQ2는 동시 사용 불가

About

STM32와 Renesas의 Eval Board로 Firmware를 개발한 예제들입니다.


Languages

Language:C 92.7%Language:Python 7.3%