TAB키 자동완성 기능 (2021. 05. 17)
TAB키를 누르면 알맞은 커맨드가 자동완성되는 기능을 만들었다.
필요한 기능들은 전부 구현한 것 같다. 하지만 코드들이 전부 그때그때 추가한 것들 이어서 어떻게 해석해야 할지 잘 모르겠다.....
나중에 다시 만들어야겠다.
======================================================
UART RX DMA 사용 버전 (2021. 05. 16)
UART 받는 부분을 DMA로 처리한 방식이다.
다른 코드가 작동하는 중에 키보드를 입력하면 입력한 키가 버퍼에 들어가 CLI 처리 함수에서 한 번에 처리한다.
그 외의 부분은 똑같다.

추가적으로 UART RX DMA 설정에서 Circular 모드로 코드를 생성한다.
======================================================
UART RX Interrupt 사용 버전
https://ddtxrx.tistory.com/entry/STM32-CLI-%EA%B8%B0%EB%B3%B8-%EB%BC%88%EB%8C%80
[STM32] CLI Basic - (0)
수정 (2021. 05. 13) 값을 입력받아서 사용할 수 있게 코드를 만들었다. cli_function.c 파일을 보면 쉽게 이해할 수 있다. ======================================= 수정 (2021. 05. 01) 스페이스로 CLI명령..
ddtxrx.tistory.com
이전에 작성한 CLI 코드를 작성하면서 수정된 내용이 쓰여있는 글이다.
CubeMX 설정은 UART, Interrupt, DMA설정을 해주면 되며 위의 글과 똑같이 해주면 된다.
코드 - (0)
초기화 코드 ... (0)
| 1 2 3 4 5 6 7 8 9 10 11 | PRINTF_INIT(USART1, DMA2, LL_DMA_STREAM_7); CLI_BLOCK_INIT(); TERMINAL_INIT(USART1,"TEST","START APP"); while (1){     TERMINAL_CONTROL_CLI(); } | cs | 
main.c에서 while(1) 무한루프에 들어가기 전에 설정해주는 함수들이다.
PRINTF() 함수를 사용하기 위해 초기화해주는 PRINTF_INIT 함수가 있고
CLI_BLOCK_INIT() 함수를 사용하여 사용할 명령어를 초기화한다.
TERMINAL_INIT() 함수의 경우 어떤 UART를 사용하는지와 현재 프로그램의 이름, 처음 시작하면 나오는 메시지를 설정할 수 있다.
while(1) 문 내부의 TERMINAL_CONTROL_CLI() 함수는 CLI를 작동하는 코드이다.
CLI BLOCK 생성 ... (1)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | DEF_CLI(sum,"sum VV VV"){     uint8_t x[10]={0,};     uint8_t y[10]={0,};     uint8_t i=0;     int X,Y;     CLI_GET_ARG(x,0);     CLI_GET_ARG(y,1);     for(i=0;i<10;i++){         PRINTF("0x%02X ",x[i]);     }     PRINTF("\r\n");     for(i=0;i<10;i++){         PRINTF("0x%02X ",y[i]);     }     PRINTF("\r\n");     X=atoi(x);     Y=atoi(y);     PRINTF("SUM1: %d\r\n",X+Y); } void CLI_BLOCK_INIT(){     ADD_CLI(test1,"aaa");     ADD_CLI(test2,"bbb");     ADD_CLI(test3,"ccc  aaa");     ADD_CLI(test4,"arg test VV");     ADD_CLI(test5,"arg2 test VV and VV");     ADD_CLI(test6,"arg3 VV VV");     ////////////////////////////     ADD_CLI(sum,"sum VV VV");     ////////////////////////////     ADD_CLI(sum2,"sum VV VV VV");     ADD_CLI(sum3, "sum3 VV VV VV"); } | cs | 
cli_function.c 파일을 보면 어떻게 명령어를 만들고 초기화하는지 나와있다.
DEF_CLI()와 ADD_CLI() 매크로를 사용하여 CLI명령어를 만든다.
추가로 CLI_GET_ARG() 함수는 명령어에서 'VV'에 해당하는 부분의 문자열을 읽어오는 함수이다.
예를 들어 sum 3 5 라고 입력하면 CLI_GET_ARG(x,0)은 x에 "3" 문자열을 복사한다.

실제 명령어를 실행하면 이런 식으로 출력된다.
INTERRUPT ... (2)
| 1 2 3 4 5 6 7 8 9 10 | void USART1_IRQHandler(void) {     ////////////////////////////////////////////////// CLI     TERMINAL_UART_IRQ();     //////////////////////////////////////////////////     PRINTF_UART_IRQ(); } | cs | 
작성한 코드는 기본적으로 UART Interrupt를 사용한다.
TERMINAL_UART_IRQ() 함수는 UART를 통해 키보드 입력을 받을 때 실행된다.
PRINTF_UART_IRQ() 함수는 PRINTF() 함수를 사용하기 위해 사용한다.
INLINE ... (3)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | static inline uint32_t TERMINAL_IDLE_IS_ACTIVE_FLAG(USART_TypeDef* UART){     return LL_USART_IsActiveFlag_IDLE(UART); } static inline void TERMINAL_IDLE_CLEAR_FLAG(USART_TypeDef* UART){     LL_USART_ClearFlag_IDLE(UART); } static inline uint32_t TERMINAL_RX_IS_ACTIVE_FLAG(USART_TypeDef* UART){     return LL_USART_IsActiveFlag_RXNE(UART); } static inline void TERMINAL_RX_CLEAR_FLAG(USART_TypeDef* UART){     LL_USART_ClearFlag_RXNE(UART); } static inline void TERMINAL_INTERRUPT_INIT(USART_TypeDef* UART){     LL_USART_EnableIT_RXNE(UART);     LL_USART_EnableIT_IDLE(UART); } static inline uint8_t TERMINAL_RECEIVEDATA(USART_TypeDef* UART){     return LL_USART_ReceiveData8(UART); } | cs | 
작성한 CLI 코드는 LL 드라이버를 기반으로 작성돼있다. 따라서 MCU에 따라 코드가 달라질 수 있다.
PRINTF() 코드 또한 코드가 달라지는 부분이 있다.
코드를 쉽게 변경하도록 LL 드라이버에 의존성이 있는 부분을 static inline 함수로 만들었다.
예를 들어 STM32F303RE MCU의 경우 LL_USART_ClearFlag_RXNE(); 코드를 사용하지 않아도 Flag가 Clear 되어 해당 부분을 주석 처리해서 사용했다.
결과 - (1)

실제 작동하는 모습이다. 위에 sum 명령어를 작동한 내용도 있으니 참고하면 된다.
TAB 키를 누르면 명령어를 보여주고 방향키 아래, 위를 누르면 조금 전에 사용했던 명령어들을 다시 불러올 수 있다.
-
CLI BLOCK 생성, TAB키, 명령어 불러오는 기능을 만들었다.
TAB키를 사용하여 명령어 자동완성 기능만 만들면 될 것 같다.
'임베디드 > STM32' 카테고리의 다른 글
| [STM32] CLI Basic - (0) (2) | 2021.03.20 | 
|---|---|
| [STM32] Circular Buffer printf (0) | 2021.03.16 | 
| [STM32] STM32cubeMX linux (0) | 2021.02.23 | 
| [STM32] 간단한 ICM20948 쿼터니언 (0) | 2020.09.18 | 
| [STM32] LL 드라이버 - MS5611 (0) | 2020.08.28 | 









