초보의 아웅다웅 설계하기/STM32 94

STM32L432KC - TOUCH

STM32L476 TOUCH 예제를 STM32L432KC에 적용해보았습니다. 사용해본 MCU 중에서 터치 제품은 CYPRESS 의 PSOC 시리즈가 제일 좋고 편하네요. TSC_HandleTypeDef TscHandle; TSC_IOConfigTypeDef IoConfig; #define TSCx TSC #define TSCx_CLK_ENABLE() __HAL_RCC_TSC_CLK_ENABLE() #define TSCx_TS1_IO_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() #define TSCx_SHIELD_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() #define TSCx_TS1_CAPACITOR_GPIO_CLK_ENAB..

STM32 USB CDC-ACM(Virtual Com Port) 리눅스 확인

STM32 USB CDC-ACM(Virtual Com Port)을 올린 후 윈도우에서는 STM에서 제공하는 VCP 드라이버를 깔고 터미널 프로그램을 사용하면 통신을 할 수 있다는 것을 알고 있습니다. 하지만 윈도우만 사용해보았던 개발자들은 리눅스에서는 어떻게 확인할 수 있지라는 생각을 하게 됩니다. 네 접니다..... USB로 시리얼로 읽을 수 있는 방식은 기본적으로 USB CDC-ACM이고 리눅스에서 확인해보면 ttyACMx라고 나오게 됩니다. 보레이트까지 나올 줄은 몰랐는데... 리눅스 터미널 프로그램인 minicom을 깔고 minicom에서 dmesg를 통하여 확인한 ttyACMx를 Serial Device에 설정 후 확인을 하면 됩니다. 저는 echo로 프로그램을 짜서 확인하였습니다.

GPIO로 딜레이를 사용하여 Uart TX 출력 - Soft Uart

작번에는 GPIO와 타이머를 사용하여 Uart TX를 출력하였지만 타이머 패리패럴을 사용하지 못하는 경우가 있었습니다. 그래서 딜레이를 사용하여 Uart TX 출력을 만들었습니다. 8Bit 마이컴때는 어셈으로 TX, RX를 만들어서 사용하는 경우도 제법있었는데 요즘은 메모리가 많이 커져서 그런 경우가 없었던 것 같습니다. 딜레이 함수는 맞춰서 값을 변경해주면 되는데 최적화되면서 값이 자꾸 바뀔 수 있어서 그 부분을 잘 확인하여야 합니다.(STM으로 카테고리를 정했지만 사실 Core는 Arm Core 가 아닙니다.) #include "gpio.h" #define SU_TRUE 1 #define SU_FALSE 0 // 1 Startbit, 8 Databits, 1 Stopbit = 10 Bits/Frame..

STM32L496 Unique ID 확인하기

Unique ID는 시리즈마다 다른 위치에 있습니다. 선언되지 않았다면 Referance Manual 에서 주소를 확인하고 사용하여야 합니다. /*===============stm32l496xx.h에 선언된 부분 ==================*/ #define PACKAGE_BASE ((uint32_t)0x1FFF7500U) #define UID_BASE ((uint32_t)0x1FFF7590U) #define FLASHSIZE_BASE ((uint32_t)0x1FFF75E0U) /* Debug MCU registers base address */ #define DBGMCU_BASE ((uint32_t)0xE0042000U) #define DBGMCU ((DBGMCU_TypeDef *) DBGMCU_..

SW6STM에서 고정위치에 바이너리 라이팅하기

고정할 바이너리 파일 unsigned char _FixedData[1024UL + 1] __attribute__ ((section(".mfc_array"))) = { 0x8D, 0x43, 0xF2, 0x3D, 0x71, 0x3F, 0xF8, 0x12, 0x5D, 0x85, 0x96, 0x9F, 0x2A, 0x52, 0xE7, 0x50, 0xB4, 0x43, 0xDE, 0xE6, 0xBB, 0xC8, 0x6A, 0xC1, 0xD4, 0xBD, 0x83, 0xE6, 0x13, 0xAF, 0x5B, 0xE0, 0x06, 0x4B, 0x07, 0x4A, 0x1B, 0x68, 0x93, 0x42, .... 중략 .... }; STM32Fxxxx_FLASH.ld 파일 /* Entry Point */ ENTRY(Re..

인터럽트 벡터 위치 확인과 변경

정식으로 드라이버와 데이터 시트를 받지 못했을 경우 인터럽트 벡터 위치를 직접 확인해서 넣어야하는 경우가 있습니다. 그럴때 다소 귀찮긴 하지만 하나씩 인터럽트 벡터를 살린 후 데이터가 들어오는 인터럽트 벡터 번호를 찾아서 매핑해주면 사용할 수 있습니다. Uart0번의 벡터를 체크한 부분입니다. 인터럽트와 별도로 Uart 설정은 따로 해주어야 합니다. void INT_All_Enable(void) { int Interrupt_Vector_Num = 0; DEBUGPRINT("\r\n NORMAL MODE TEST"); for( Interrupt_Vector_Num= 0; Interrupt_Vector_Num < 239; Interrupt_Vector_Num++){ NVIC_ClearPendingIRQ(In..

STM32 PID 제어

ADC로 전류값을 읽어온 후 180mA로 타겟값을 맞췄습니다. (미제어시 125mA ~ 170mA 정도 소요) => arm에서 제공하는 arm_cortexMxxx_math.lib를 사용 #define TAGET_ADC 1000 void PID_ADC(uint8_t *chpADC, uint8_t chSize) { Get_RAWADC(s_chpBuf[s_ADCpointer++]); PID_CurrentControl(Average(s_chpBuf, ADCCNT, 1), TAGET_ADC); if(s_ADCpointer >= ADCCNT){ s_ADCpointer = 0; } } /*************************************************************************..