CH32V003J4M6는 8핀 패키지로 핀수가 적다 보니 8번핀에 UART-TX 와 SWD 핀이 겹쳐 있다. UART 사용으로 설정한 펌웨어를 다운로드 하고나면 다음부터 인식이 안되는 현상이 발생한다.
해결 방법은 WCH-LinkUtility 프로그램에서 “Clear All Code Flash-By Power off” 로 지우면 다시 접속할 수 있다. 왜 하필 많이 사용하는 UART TX핀에 할당이 되어 있을까… 잘 사용하지 않는 다른핀도 있는데… 아쉽다. UART 디버깅을 하려면 이 프로그램으로 자주 지웠다 다시 살리는 형태로 불편하게 개발 해야 할것 같다.
또 한가지 해결책으로 리맵을 이용하여 PD6으로 할당 하면 될것 같다.
리맵으로 PD6을 TXD로 할당하면 정상적으로 동작 하는것을 확인 할 수 있다.
void USART_Printf_Init(uint32_t baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap2_USART1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
printf 함수를 사용해야 한다면 debug.h 파일을 수정해 주면 된다.
/* UART Printf Definition */
#define DEBUG_UART1_NoRemap 1 //Tx-PD5
#define DEBUG_UART1_Remap1 2 //Tx-PD0
#define DEBUG_UART1_Remap2 3 //Tx-PD6
#define DEBUG_UART1_Remap3 4 //Tx-PC0
/* DEBUG UATR Definition */
#ifndef DEBUG
//#define DEBUG DEBUG_UART1_NoRemap
#define DEBUG DEBUG_UART1_Remap2
#endif
반응형