Share/STM32

[STM32F]Basic, UART

Jimmy.B 2020. 9. 1. 20:52

 

*MHive님의 기초강좌를 바탕으로 기록하였습니다. 

 

 

 

2-1 UART

소스코드(main only)

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART3_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);

  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  	  uint8_t a ='c';
  while (1)
  {
	  //HAL_Delay(1000);
	  if(HAL_UART_Receive(&huart3, &a, 1, 10) == HAL_OK){
		  HAL_UART_Transmit(&huart3, &a, 1, 10);
	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

공부내용

  • 소스코드는 간단 
  • UART받으면 다시 송신할거야 ~ 
  • 매개변수로는 (huart3주소로, a라는 값(실제로는 주소), 1바이트, 10ms)안에 보낼꺼야~

느낀점

  • while문안에서 polling 한다는 의미를 좀더 깊게 이해해야 된다 -> 추후 interrupt과 관련이 있을듯 
  • HAL_OK 등 UART 핀설정후 뿌려주는 함수(or 매개변수) 에 대해서 좀더 파해쳐 볼 필요가 있다.
  • 그냥 함수를 가져다만 쓰니깐, 매개변수에 무엇이 와야되는지, 필요한지는 개념이 없다면 알수가없다. 

 

2-2. UART로 printf

 

  • 개발 중 어떤 변수의 값을 확인하고싶다. 
  • 그런데 디스플레이도 없고, 어쩔까.
  • 보통 uart로 디버깅,확인을 한다. 
  • printf는 출력대상이 표준출력장치 이기때문에,
  • printf를 MCU에 맞게 변경 해야한다. (complier마다 다름) 
  • trueStudio에서 변경하는 방법을 위주로 기술 

 

TIP) cubeMX 와 cubeIDE 파일 관리/ 폴더 버전업 하는 방법 

  • 먼저 cubeMX파일만 폴더 밖으로뺀다
  • 그 파일을 열어서 핀정보가 바뀐다면 수정하고 아니라면 save as를 해서 새로운 폴더를 만든다. (미리만들어서 over write도 가능)
  • 새롭게 파일(파일트리)가 생기고 successfully ~ 창이 뜸. 
  • 끝 

 

Key)

  • printf 함수는 우리가 만든 _write 함수를 통해 출력 된다. 
  • printf 함수의 library 인 stdio.h를 include 해야된다. 

 

아래 아주 정리가 잘된 블로그가 있어 참고! 

 

www.plainy.co.kr/bbs/board.php?bo_table=stm32_lecture&wr_id=21 

 

printf를 사용하여 USART로 문자열 출력

제품 개발 중 현재 상태를 표시하기 위한 메시지 또는 디버깅 메시지를 출력하기 위해 printf를 사용합니다.PC프로그램을 개발하는 경우 printf는 기본적으로 모니터에 출력됩니다.반면 STM32를 비롯

www.plainy.co.kr:443

ezcircuits.net/zbxe/CORTEX_M3/52012

 

Cortex-M3 진행게시판 - TrueStudio STM32F 개발환경 만들기 #5 - Printf 사용하기

TrueStudio STM32F 개발환경 만들기 #1 - TrueStudio 설치         -- 링크 : http://ezcircuits.net/zbxe/51806 TrueStudio STM32F 개발환경 만들기 #2 - CubeMx 설치             -- 링크 : http://ezcircuits.net/zbxe/51831 이��

ezcircuits.net

 

 

 

uint8_t a=0;
  float f=1.234;
  while (1)
  {
	  printf("Hello\n %d %f",a++,f);
	  HAL_Delay(1000);
  • printf 자체가 시간딜레이가 커서 잘 사용하지 않는다. 
  • Thus, tiny printf 를 STM에서 지원함.

 

 

2-2 끝. 

 

 

2-3. 수신 인터럽트 

폴링(polling)방식과 반대되는 개념 

 

  • STM IDE 에서 interrupt 활성화 시킴 
  •  

 

 

 

 

 

stm32fxx_it.c 

파일에 usart3_irqhandler 함수가 생겨있음. 

 

__weak -> 사용자가 알아서 바꿔써라 

 

 

수신인터럽트를 사용하려면 

while 문들어가기전에 선언을 해줘야된다. 

동일코드 그대로인느낌. 

 

코드상에서 인터럽트가 걸리는 구조와 원리를 좀 파해쳐야된다. 

스탠다드 패리티 란? 

 

 

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart->Instance == USART3){
	  HAL_UART_Receive_IT(&huart3, &rx3_data, 1);
	  HAL_UART_Transmit(&huart, &rx3_data, 1, 10);
  }
}

 

-> 에코로 확인 

 

 

 

 

*여전히 파일 구조(HAL부터 main까지), 함수 내 함수 등 서로 콜하는 구조. 

눈에 안보이고 어떤원리로 하는지......안보이네 

main에 함수가 무조건 잇어야되는게아니네..메인엔 아무코드도 엄씀

이 코드 구조 원리가 뭘까. 

 

 

 

일단 keep going 


2-3 End 

 

질문올림.....

더보기

안녕하세요

강의 너무나도 잘 보고있습니다. 감사합니다.

빨리 무료강좌(STM32F 기초)를 끝내고 자작드론으로 넘어가려고 했는데, 이제 UART부분까지 실습해보고있네요.

다름이 아니라 다음과 같이 질문을 정리 해봤습니다.

UART 강좌까지 지나가고 있는데, 여전히 폴더 트리라던지, 파일구조가 눈에 들어오지 않습니다. ㅠㅠ

1. STM IDE가 코드를 뿌려주는데, 파일구조, 함수구조는 어떻게 생겨나는것인지.

- 현재 강좌랑 조금 다른 부분이 있기는 하지만, 결론적으로 IDE에서 뿌려주는 함수나 파일구조가 아직 와닿지가 않습니다.

main.c stm32f4xx_it.c 등 interrupt이 있을때 생겨난 파일 이라고 직감적으로는 알수있겠습니다만,

인터럽을 위해 어떤 특정 함수(HAL_UART_RXCpltCallback() ) 를 건들어야 하는 "이유/근거" 는 어떻게 알수있나요?

datasheetf를 보고 추론 해야되는건가요..?

- 또한, main.c 에서 uart interrupt을 위해 함수를 작성하는데 왜 user code begin 4 사이에만 넣어야 하는건가요? 다른 곳 user code begin에 넣지않는 이유가 있는가요?

2. mcu구동에 있어서 스타트업 파일 및 메모리 설정등 많은 이야기가 필요한것으로 아주 대략알고있는데, 그러한 기초적인 개념과 실제 뿌려진 폴더구조가 매칭이 안되니, 실제 main함수에서 어떻게 코드가 구동이 되는지 감이 안잡힙니다.

예를들어,

STM32F 구동에 있어서,

1) cubeMX에서 핀설정 - I/O 기능설정 을 하면, (편리하게도) 알아서 각 기능 및 핀 관련된 메모리 등 매핑을 해주는 코드를 뿌려준다.

2) generated 된 코드는 STM32FIDE 로 열린다.

3) core 폴더 내 src 내 main.c 에서 주로 작업을 한다.

그 main.c함수 내에서도 while 문 안에서만 작업을 하는게 아니라 프로토타입 같은 함수들 (인터럽트) 로 구현을 하고있다.......

결론은, STM IDE를 사용하는데 있어서 실행코드의 개괄적인 구조가 궁금합니다.

질문이 좀 난해하실것같아 최대한 자세히 적어보았습니다. 혹시나 답변이 가능하시다면 부탁드립니당..ㅠ

어떠한 조언이라도 감사합니다.

계속 정주행 해서 꼭 드론까지 완성시켜보겠습니당.

감사합니다 !