임베디드/펌웨어 기초

cdc 2

twoweeks-within 2025. 1. 5. 22:24

uint32_t rx_in =0;

uint32_t rx_out =0;

uint32_t rx_len =512;

uint8_t rx_buf[512];

 

 

 

uint32_t cdcAvailable(void)

{

uint32_t ret;

 

ret= (rx_in - rx_out) % rx_len;

 

return ret;

}

 

rx_len 나머지 연산으로 오버플로우 예방 ( MAX 512까지만 나오도록)

 

uint32_t cdcWrite(uint8_t * p_data, uint32_t length)

{

uint32_t pre_time;

uint8_t ret;

 

pre_time = millis();

while(1)

{

ret= CDC_Transmit_FS(p_data, length);

 

if(ret == USBD_OK)

{

return length;

}

else if( ret == USBD_FAIL)

{

return 0;

}

 

if(millis()-pre_time >=100)

{

break;

}

}

 

 

pre_time 에 현재 시간(HAL_tick) 을넣고 > 초기 시간

 

if문에 오는 현재 시간 - 초기시간= 동작time 

  > 타임아웃을 안주면 while문에서 평생 대기함

 

static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)

for(int i=0; i<*Len; i++)

{

cdcDataIn(buf[i]);

}

 

Len 을 포인터 값으로 해서 문자열 길이 수만큼 for문을 돌게함

------------------------------------------------------------------------------------------

while(1)

{

ledToggle(_DEF_LED1);

delay(500);

 

while 문 안에서 다른 함수랑 겹치지 않게 ledToggle 할때만 딜레이주는법

>>

uint32_t pre_time;

 

pre_time = millis();  // 초기시간

 

while(1)

{

if(millis()-pre_time >= 500)  // 500m 일때 if문 돌도록

{

pre_time = millis(); // 다음을위해 현재시간으로 초기화노

ledToggle(_DEF_LED1);

}

'임베디드 > 펌웨어 기초' 카테고리의 다른 글

reset  (0) 2025.01.08
USB CDC  (0) 2025.01.04
stm32 mx >LED  (1) 2025.01.03
초기설정  (0) 2025.01.02