반응형 전자/임베디드 시스템164 UART 사용할 때 흔한 버그 (펌웨어 디버깅) 몇 개월 동안 잘 동작하던 보드를 오늘 파워을 켜는데 부팅이 제대로 되지 않았다. UART 디버그 포트를 꽃아 확인을 하려 하니 정상적으로 부팅되었다. UART 디버그 포트를 빼면 부팅이 되지 않고 UART 디버그 포트르 꽂으면 정상 부팅되었다. 몇 개월 동안 계속해서 UART 디버그 포트를 연결하고 시험하여 UART 디버그 포트를 빼고 부팅을 해보지 않았다. UART 입력이 인터럽터를 발생시키는데 UART 입력에 풀업이 되어 있지 않았다. 그래서, 부팅시 인터럽터가 계속 발생하여 제대로 동작하지 않은 것 같다. MCU 내부 풀업 저항을 Enable 시키니 문제가 해결되었다. UART에 풀업을 하지 않아 발생하는 문제는 원인을 찾기가 생각보다 까다롭다. 몇 년 전에도 UART에 풀업을 하지 않아 발생한 .. 2023. 2. 22. 르네사스 SH MCU 르네사스(Renesas)의 SH(SuperH) MCU는 1990년대에 개발되었다. 르네사스의 이전 이름은 히타치 반도체이다. SH는 32비트 MCU이지만 명령어는 16비트이다. 그 당시에는 히타치에서 처음 시도한 방식으로 프로그램 크기가 작은 장점이 있다. 이러한 방식은 ARM의 Thumb 명령어에 사용되었다. 현재 모든 SH 시리즈는 단종되었다. 2015년 특허가 만료되었고 SH와 호환되는 오프소스 하드웨어 J2가 만들어졌다. 2023. 1. 29. 임베디드 시스템 프로그래밍 언어 순위 (2023) 2023년 기준 임베디드 시스템 프로그래밍 언어 순위는 다음과 같다. 순위 언어 1 C 2 C++ 3 Python 4 Java 5 Ada 6 Assembly 7 Rust 8 Lua 9 Verilog 임베디드 시스템에서 C와 C++이 절대적으로 높은 비중을 차지한다. 2023. 1. 26. 라즈베리파이 CMake 설치 방법 라즈베리파이에서 CMake를 설치하는 방법은 다음과 같다. sudo apt install sudo apt install -y cmake 다음으로 확인한다. cmake --version 다음 명령으로 빌드한다. cmake --build . 위 명령으로 Error: could not load cache 에러가 뜬다면 다음을 실행한다. cmake . cmake --build ./ 2022. 11. 14. 스택 포인터 구하는 C 코드 스택 포인터 구하는 C 코드는 다음과 같다. void print_stack_pointer() { void* p = NULL; printf("%p", (void*)&p); } 함수가 실행되어 지역변수가 선언되면 void 포인터 p가 스택에 저장된다. &p는 포인터가 저장된 주소이다. 즉, 포인터 p가 저장된 스택의 주소이다. 위와 같은 코드는 MCU 종류와 상관없이 사용할 수 있다. 보통 스택 포인터를 구하기 위해 asm 문으로 sp 레지스터를 읽는데, 위와 같은 코드는 훨씬 쉽고 간결하게 스택 포인터를 구할 수 있다. 2022. 10. 24. 임베디드 보드 이더넷 통신 구현 임베디드 보드에 이더넷 통신은 다음과 같은 방법으로 구현할 수 있다. 1. MAC 내장 MCU 사용 - TCP/IP 스택을 올려야 함(MCU 제조사에서 제공하는 경우가 많음) - lwIP나 uIP와 같은 Open stack이 있음 - TCP/IP 스택을 올리는데 처음에는 시간이 걸림 - 외부 PHY와 트랜스 회로 설계 필요 2. TCP/IP 내장 IC를 외부에 설치 - MCU에서 SPI 등으로 제어 - 트랜스 (또는 PHY) 회로 설계 필요 3. TCP-Serial 변환 보드 사용 - UART 등으로 제어 - 외부 회로 설계 필요 없음 MAC 내장 MCU를 사용하는 것이 가격이나 통신 속도면에서 가장 유리하지만 해야할 소프트웨어와 하드웨어 작업이 많다. 2022. 10. 15. 이더넷 통신 IC W5100 W5100는 Wiznet의 이더넷 통신 IC이다. (W5100 홈페이지) W5100는 PHY와 MAC과 TCP/IP가 내장된 IC이다. MCU와는 SPI나 버스로 연결한다. MCU에 내장된 이더넷 컨롤러가 MAC가 내장되어 다른 것은 별도로 구현해야 하는 것에 비해 매우 편리한다. 가격은 8천원 정도이다. 2022. 10. 15. AT91SAM7X256 스펙 ATmel의 AT91SAM7X256 AT91SAM7X256 스펙은 다음과 같다. Ethernet Controller가 내장되어 있다. 구분 상세 코어 ARM7 속도 55MHz Flash 256kB RAM 64kB SPI 2 UART 3 Ethernet 10/100 Base-TX USB 1 CAN 1 ADC 8 ch 2022. 10. 14. STM32 이더넷 설정 (PHY Address) STM32에서 이더넷을 설정할 때 아래의 PHY Address는 PHY 칩의 주소로 0~31까지 설정할 수 있다. PHY Address는 PHY 칩과 같도록 맞춰야 한다. 초기 값은 1로 되어 있는데 보드에 따라 0인 보드도 있고 1인 보드도 있는 등 PHY Address가 조금씩 다르다. DP83848 PHY 칩을 사용하고 PHY Address 설정핀에 아무것도 연결하지 않으면 내부 풀업/풀다운 저항에 의해 PHY Address는 1이 된다. 2022. 10. 5. STM3210C-EVAL 보드 STM3210C-EVAL 보드는 STM32F107VCT를 사용한 평가보드이다. 현재는 단종되었다. STM3210C-EVAL 보드에는 이더넷 회로가 있다. 2022. 10. 2. 라즈베리파이 SD 카드 복사 라즈베리파이 SD 카드를 복사하는 방법에는 몇가지가 있다. 그 중 윈도우에서 SD 카드를 복사하는 방법은 다음과 같다. 1. 여기에서 Win32 Disk Imager를 설치한다., 2. Win32 Disk Imager를 실행한다. 3. 원복 SD 카드를 넣고 SD 카드 이미지를 읽어서 파일을 하드에 저장한다. 4. 새 SD 카드를 넣고 저장된 파일을 라이팅한다. 2022. 9. 27. STM32 HAL UART 인터럽터 함수 1) UART 인터럽터 함수 STM32 HAL의 UART 인터럽터 함수는 stm32f1xx_it.c 파일에 다음과 같이 정의되어 있다. void USART1_IRQHandler(void) { /* USER CODE BEGIN USART1_IRQn 0 */ /* USER CODE END USART1_IRQn 0 */ HAL_UART_IRQHandler(&huart1); /* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */ } HAL_UART_IRQHandler 함수는 stm32f1xx_hal_uart.c 파일에 정의되어 있다. HAL_UART_IRQHandler 함수는 huart1 구조체 변수를 사용한다. UART 초기화 함수에서 hu.. 2022. 9. 27. STM32 Flash 지우기/쓰기 STM32에서 Flash에 데이터를 쓰고 지우는 방법은 다음과 같다. 쓰고 지우기 전에 Unlock을 먼저 해야 한다. 1. Flash 데이터 지우기 static FLASH_EraseInitTypeDef EraseInitStruct; HAL_FLASH_Unlock(); EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.PageAddress = ADDRESS_START; EraseInitStruct.NbPages = (ADDRESS_END - ADDRESS_START)/FLASH_PAGE_SIZE; if (HAL_FLASHEx_Erase(&EraseInitStruct, &i) != HAL_OK) { } HAL_FLASH_Lock(); 2.. 2022. 9. 26. 실시간 시스템 뜻 실시간(Real-time) 시스템이란 정해진 시간이내에 태스크를 수행하는 시스템이다. 이 정해진 시간을 Deadline이라고 한다. 예를들면, 비행기에서 1ms 주기로 비행기 데이터 신호를 입력받은 후 신호를 처리하여 비행기 제어명령을 주는 비행 제어시스템이 있다고 가정한다. 만약 태스크가 Deadline인 1ms을 넘어간다면 비행기는 정상적으로 제어되지 못하고 추락할 수 있다. 실시간 시스템은 처리가 빠른지 느린지로 정의되는 것이 아니고 정해진 시간 이내에 태스크를 항상 처리할 수 있는지로 정의되는 시스템이다. 어떤 태스크를 실행하는데 1초가 걸리더라도 태스크를 항상 1초 이하로 실행한다면 그것은 실시간 시스템이다. MS 윈도우는 매우 고속으로 데이터를 처리하지만 가끔 백그라운드 프로그램이 실행되면 몇.. 2022. 9. 9. MCU 리셋 회로 STM32의 Reset 회로는 다음과 같다. 45k옴 풀업 저항이 내장되어 있어 외부 풀업 저항이 필요없다. 데이트시트에는 104 캐패시터와 리셋 스위치를 연결하라고 나와 있다. 하지만, 이러한 회로는 리셋 스위치를 눌렸을 때 캐패시터 충전전류가 순간적으로 방전되는 문제가 있다. ☞ 스위치에 캐패시터 사용시 주의사항 2022. 9. 7. 캘릭터 LCD 초기화 및 사용법 캘릭터 LCD 명령어는 다음과 같다. 캘릭터 LCD 초기화 4비트 인터페이스일 때 초기화 루틴은 다음과 같다. 8비트 인터페이스일 때 초기화 루틴은 다음과 같다. 글자 표시 DDRAM에 데이터를 쓰면 LCD 화면에 글자가 표시된다. 2라인 LCD의 DDRAM 주소는 00~0F와 40~4F이다. 글자를 표시하는 방법은 다음과 같다. 1. Set DDRAM Address 명령어로 글자를 표시할 위치의 주소를 쓴다. 2. Write Data to RAM 명령어로 글자 데이터를 쓴다. 3. Read Busy Flag and Address를 읽은 완료 여부를 확인한다. CGRAM는 캘릭터 폰트가 저장된는 메모리로 사용자가 폰트를 만들어 사용할 수 있다. 기본 폰트는 CGROM에 저장되어 있다. ☞ Vishay L.. 2022. 8. 24. 여러 MPU/MCU 사이의 통신 방법 한 제품 내에 여러 MPU/MCU가 있을 때 서로 데이터 교환을 위한 통신 방법은 다음과 같다. I2C/SPI/UART 통신 - 저속이며 신뢰성이 낮지만 가장 저가로 구현 가능 - I2C는 원래 보드 내부의 IC 사이 통신을 위해 만들어 졌으며 멀티 마스터가 가능 CAN 통신 - 1Mbps 이하 - 신뢰성 높은 시리얼 통신 DPRAM - 고속 데이터 전송이 가능 Backplane - PCI, VMEbus, Serial Backplane 등 ☞ VMEbus ☞ Arbiter ☞ I2C 통신 2022. 8. 7. 마이크로 마우스 80196 MCU 인텔의 80196은 2000년 전후 마이크로 마우스에 많이 사용되었다. 인텔에서 MCS-96 계열의 다수의 MCU를 생산했다. MCS-96을 흔히 8xC196 또는 80196이라고도 한다. MCS-96은 2007년 단종되었다. MCS-96 계열 MCU 중 많이 사용된 모델은 80C196이다. 80C196KC을 이용한 마이크로 마우스 회로도는 다음과 같다. 2022. 8. 3. 인텔 i960 마이크로프로세서 인텔의 i960은 80960이라고도 한다. i960은 1990년대초 많이 사용된 인텔에서 만든 RISC 마이크로프로세서이다. i960은 1990년대 많이 팔리고 성공했지만 인텔이 StrongARM을 생산하면서 1990년대말 마케팅을 중단한다. i960는 원래 80286이나 i386와 같이 범용 컴퓨터에 사용하려고 했지만 성공하지 못하고 대신 고성능 임베디드 시장에서 성공하게 된다. i960의 동작클럭은 모델에 따라 10~100MHz이다. i960가 사용된 곳은 다음과 같다. - 미국 F-22 전투기 - 한국 KA-1 훈련기 2022. 8. 1. 마이크로프로세서 교육 커리큘럼 마이크로프로세서 교육 과정의 일반적인 커리큘럼은 다음과 같다. 1. 마이크로프로세서 개요 2. 컴파일러 사용법 3. GPIO 포트 - LED On/Off 출력 - 스위치 입력 4. 인터럽터 5. 타이머/카운터 - Free-running timer - PWM 출력 - 펄스 카운터 6. UART 통신 7. A/D 변환 8. LCD 제어 9. 키패드 제어 인터럽터는 타이머/카운터나 UART 등에서 모두 사용하고 매우 중요하기 때문에 빨리 배우는 것이 좋다. 2022. 7. 28. TempTale 온도 데이터로그 TempTale 온도 데이터로그는 온도를 일정 주기로 내부 메모리에 저장하고 USB에 연결하여 PC에서 확인할 수 있는 장치이다. 일정한 온도를 유지해야 하는 상품을 운송할 때 운송 중 온도가 규정치를 벗어났는지를 확인할 수 있다. 이 장치는 1회용으로 Start 버턴을 한번만 누를 수 있다. 이 제품은 1회용으로 배터리가 납땜으로 고정되어 있고 교환할 수 없다. 2022. 7. 10. 산업용 무선 리모콘 산업용 무선 리모콘의 수신기 내부 보드는 다음과 같다. MCU는 Atmel의 ATmega328P를 사용하고 RF 칩은 TI의 CC1120을 사용했다. 2022. 7. 9. ST-Link V2의 내부 구조 ST-Link V2는 ST에서 나오는 MCU 디버깅에 사용하는 에뮬레이터이다. ST-Link V2를 분해한 내부 보드는 다음과 같다. 내부에 STM32F103C8이 내장되어 있다. STM32F103에는 USB 컨트롤러가 내장되어 있기 때문에 USB에 직접 연결할 수 있다. 2022. 7. 9. STM32 타이머의 Preload 뜻 STM32의 타이머 구조는 다음과 같다. 위 그림의 아래에 다음과 같이 적혀있다. 사각형에 그림자가 있는 ARR(Auto Reload Register) 레지스터와 CC(Capture/Compare) 1/2/3/4 레지스터와 REO 레지스터는 레지스터에 값을 쓸때 바로 적용되지 않고 Update 일때 쓴 값이 적용된다. 위 레지스터에 값을 쓰면 Preload 레지스터에 먼저 쓰지고 Update일 때 Preload 레지스터에서 실제 레지스터로 전송된다. ARR 레지스터는 타이머의 CR1 레지스터의 ARPE에 따라 바로 적용될수도 있고 Update일 때 적용될 수도 있다. CC 레지스터는 OCxPE에 따라 바로 적용될수도 있고 Update일 때 적용될 수도 있다. PWM 모드에서는 OCxPE는 1이 되어야 한다. 2022. 7. 6. Free Running Timer 이란? 프리러닝 타이머(Free Running Timer)란 타이머 값이 변경되거나 멈추는 일 없이 계속해서 돌아가는 타이머를 의미한다. 타이머가 Overflow 되면 0에서 다시 시작한다. 프리러닝 타이머는 일정주기의 인터럽터 발생, 시간 딜레이 등에 사용된다. 주파수가 1MHz일때 16비트 타이머의 최대시간은 65.535ms이고 32비트 타이머의 최대시간은 1시간 11분이다. 2022. 7. 3. STM32 HAL_TIM_IRQHandler 함수 분석 STM32에서 타이머 인터럽터가 걸렸을 실행되는 HAL_TIM_IRQHandler 함수는 다음과 같다. if 문으로 타이머 인터럽터의 종류를 판단한다. 채널 1에서 Capture Compare 인터럽터(CC1 인터럽터)가 발생했을 때는 다음이 실행된다. 타이머의 SR 레지스터에서 CC1 flag이 1 인지를 검사하고 1 이라면 clear 하고 callback 함수를 호출한다. 타이머의 SR 레지스터는 다음과 같다. 0비트의 UIF가 TIM_FLAG_UPDATE이고 1비트의 CC1IF이 TIM_FLAG_CC1이다. 매크로 함수 __HAL_TIM_CLEAR_IT는 다음과 같다. Flag을 clear하려면 해당 비트에 0을 쓰면 된다. 1을 쓰도 1이 되지 않고 무시된다. 2022. 6. 30. STM32 타이머 PWM 출력 STM32 타이머에서 Edge-aligned PMW 모드에서 출력은 다음과 같다. 위에서 타이머 레지스터 값은 다음과 같다. ARR = 8 CCR = 4 CNT = 0~8 타이머의 PWM 출력 주파수는 CNT 주파수에서 (ARR+1)로 나눈 값이다. 타이머는 CNT와 CCR을 비교하여 CNT>=CCR이면 출력을 낸다. 2022. 6. 29. STM32 Ethernet 통신 STM32F1 시리즈 중에서 STM32F105와 STM32F107에만 Ethernet이 내장 되어 있다. STM32F107에는 10/100 Ethernet 통신모듈이 내장되어 있다. STM32CubeIDE에 lwIP TCP/IP 스택이 있다. ☞ lwIP 스택 2022. 6. 26. STM32 중국 짝퉁 칩 중국의 GigaDevice에서 STM32와 비슷한 칩을 판매한다. 모델명이 STM 대신 GD로 시작한다. STM32와 거의 같지만 속도와 플래시 크기가 다르다. 아래 사진은 중국의 모터 드라이버에 사용된 GD32F103C8T6이다. 2022. 6. 14. STM32에서 MPU-6050 사용하기 초기화 STM32에서 MPU-6050을 초기화하는 코드는 다음과 같다. #define MPU6050_I2C_ADDRESS 0x68 #define MPU6050_ACCEL_XOUT_H 0x3B #define MPU6050_PWR_MGMT_1 0x6B #define MPU6050_PWR_MGMT_2 0x6C #define MPU6050_WHO_AM_I 0x75 #define MPU6050_CONFIG 0x1A #define MPU6050_GYRO_CONFIG 0x1B #define MPU6050_ACCEL_CONFIG 0x1C union accel_t_gyro_union { struct { byte x_accel_h; byte x_accel_l; byte y_accel_h; byte y_accel_l; by.. 2022. 6. 9. 이전 1 2 3 4 5 6 다음 반응형