목록MCU (60)
Brise
STM32를 사용하여 펌웨어를 작성할 때에 태스크 코드에서 printf를 수행할 때 특정 경우에 오류가 발생하는 것을 볼 수 있다. 또는 malloc을 사용하여 큰 용량의 데이터를 Heap에서 확보하고자 할때 오류가 발생한다. malloc에서 보았다시피 이 문제는 FreeRTOS 때문에 생기는 문제다.(정확히는 FreeRTOS와 STM32에서 기본적으로 제공하는 newlib의 Heap이 충돌하는 문제이다. 둘 모두 ST마이크로에서 제공하는 코드인 것은 함정) 자세히 내용을 설명하자면 newlib에서는 printf를 수행하거나 malloc을 수행할 때 특정 경우에 한하여 더 큰 메모리를 요구하여 메모리 영역을 확보하는 코드인 _sbrk함수를 호출한다. 기본적인 펌웨어에서는 힙이 스택을 침해하는 것을 막기 ..
AVR(특히 atmega8/32/128) 을 프로그래밍하는 툴은 여러가지가 있지만 그 중에서 가장 저렴하게 구할 수 있는 것이 USB ASP이다.(ebay에서 거의 단돈 1달러에 구매 가능하다) 사실 usbasp의 경우 IDE와 연동하여 활용하기 힘들어 보통은 STK600과 같은 다른 USB ISP들을 사용하지만저렴한 USB ASP를 다르게 활용할만한 점이 하나 있다. (https://www.fischl.de/usbasp/) 바로 USB 장치로 활용하는 것이다. usbasp는 usb로 컴퓨터와 연결되어 펌웨어를 받아 IDC케이블로 다른 기기를 플래싱하는 장치인데이 때문에 USB회로와 외부 플래싱 가능한 회로가 있다. 재미있는 점 중 하나는 다른 MCU를 프로그래밍하는 포트를 통해서 기기를 프로그래밍할 수..
파일 소스에서 #include 를 참조해서 printf를 사용 ${Project_Name} -> 마우스 오른쪽 버튼 -> Option 클릭 General Option - Library Configuration 탭에서 Library low-level interface implementation의 stdout/stderr를 Via SWO로 변경 Debug-> Setup에서 ST-LINK로 설정 디버그 중 왼쪽 상단 바의 SWO 아이콘을 클릭 오른쪽 ITM Stimulus Ports에서 Enabled ports 0와 To Terminal I/O Windows 0를 체크 View -> Terminal I/O 창을 활성화 http://rodneyhuh.tistory.com/11
STK500기반의 AVR ISP 프로그래머를 사용하는 사람들은 최근에 Atmel(Microchips)에서 나오는 Atmel Studio를 사용할 수 없다. 이는 IDE에서 해당 ISP를 지원하지 않기 때문이다. 게다가 Atmel Studio는 Visual Studio 기반의 개발 툴로 단축키 맵이 이클립스 기반의 툴과 다른 점들이 있어 이클립스 기반으로 개발하던 사람들이 사용하기에 어렵기도 하다. 궁여지책으로 Atmel Studio 이전에 사용하던 AVR Studio 4.19버전을 사용하는 사람들이 많은데, 윈도우 10에서는 윈도우 업데이트를 꼭 하여야 설치가 가능한 단점이 있으며, AVR Studio 자체의 에디팅 기능도 그리 좋지 않아 사용하기 난해한 점이 있었다. 필자도 이러한 부분에 필요성을 느껴..
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816..
1234567891011121314151617181920212223242526272829303132333435363738394041#include "stm32f4xx.h" __IO uint16_t verti;__IO float v = 0.0f; int main(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE); GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GP..
123456789101112131415161718192021222324252627#include "stm32f4xx.h" __IO uint16_t verti;__IO float v = 0.0f; int main(void) { RCC->AHB1ENR |= RCC_AHB1Periph_GPIOA; GPIOA->MODER |= 0x3 CCR &= ~ADC_CCR_ADCPRE; ADC->CCR |= (ADC_CCR_ADCPRE_1 | ADC_CCR_ADCPRE_0); ADC1->SQR1 &= ~ADC_SQR1_L; ADC1->SMPR2 &= ~ADC_SMPR2_SMP1; ADC1->SQR3 &= ~ADC_SQR3_SQ1; ADC1->SQR3 |= ADC_SQR3_SQ1_0; ADC1->CR2 |= ADC_CR2_..
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100#include #include "stm32f4xx.h" void UART2_init(){ GPIO_InitTypeDef GPIO_InitStruct; GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_..