작성
·
256
답변 2
0
답변 감사드립니다!
몇가지 궁금점 해소가 안된것이 있어서 질문드립니다.
1.gyro 함수는 <<쉬프트연산을 하는데 temp함수는 unsigned char*형태로 형변환하기 때문에
<<쉬프트연산이 필요 없다는 말씀이시죠?
2.unsigned char*변수가 주소를 증가시키며 데이터를 수신하는것은 알겠으나
장치주소는 서로 다른데 한번만 써도 되는지 궁금합니다!
Readbytes함수를 써도 장치주소 Sendbyte는 한번만 쓰여있어서 궁금하여 여쭤봅니다!ㅎㅎ
도움이 됐다니 다행입니다!
네 맞습니다. 저도 좀 찾아보니 STM32 byte order는 Little endian만을 지원하는 것 같고, ARM Cortex M계열은 Dynamic endianness switching 을 지원하지 않는다고 어떤 분이 글을 올려놓은게 있네요. 이 경우 칩 제조사의 Endian 방식을 따르라고 되어있다고 합니다.
https://electronics.stackexchange.com/questions/183021/stm32f103c8xx-big-or-small-endian
STM32는 Little endian을 지원하는 것 같고, 보통 대부분의 MCU의 경우 Little endian을 따릅니다. 저도 아직 Big endian 포맷을 따르는 MCU는 본적이 없고요.
그럼 앞으로도 계속 궁금해하시고 공부하시면서 개발하시기 바랍니다~
https://stackoverflow.com/questions/41194895/how-to-change-endianess-settings-in-cortex-m3
이것도 한번 보시면 좋을 것 같습니다.
M3와 M4 는 또 다를 수 있기 때문에, 가장 확실한 건 칩 제조사의 스펙매뉴얼을 확인해보는것 같네요~
0
안녕하세요!
1. temperature 변수는 int16_t* 포인터 변수이고 ReadBytes() 함수의 세번째 매개변수는 unsigned char* 포인터 변수입니다. 형태가 다르기 때문에 형변환을 해주어야 에러없이 빌드됩니다.
2. ReadBytes 내부에서 unsigned char* 변수가 가리키는 주소를 1씩 증가시키면서 데이터를 수신하도록 되어있기 때문에 시작주소를 전달합니다.
해당 질문은 C언어의 포인터와 함수, 배열에 관한 내용이므로 자세한 내용은 C언어의 해당 파트를 공부하시면 도움이 됩니다!
1. icm-20602 수신 함수는 쉬프트 연산을 하지만 lps22hh 함수는 쉬프트 연산을 하지 않고도 순서대로 저장되는 이유는 (정확히 말씀드리면) 데이터 저장 순서가 달라서 그렇습니다.
리틀엔디언과 빅엔디언의 차이인데, icm-20602는 빅엔디언으로 데이터를 보내주기 때문에, 낮은번지부터 순서대로 받으면 high 바이트와 low 바이트 순서가 뒤바뀌어 있습니다. 따라서 비트연산등을 통해 그 엇갈려있는 순서를 원래대로 바꿔서 저장해주어야 합니다. (리틀엔디언으로 저장해야 하기 때문)
lps22hh는 데이터를 보내줄 때부터 리틀엔디언으로 보내주기 때문에 바이트 순서를 바꿔줄 필요 없이 순차적으로 읽어와서 저장해주면 됩니다.
※ 포인터와 리틀엔디언, 빅엔디언을 공부하시면 도움이 될 겁니다.
2. 레지스터 주소를 증가시키며 데이터를 수신하기 위해서는 레지스터의 주소가 연속되어있어야 합니다.
TEMP_OUT_L 0x2B부터 연속적으로 두바이트를 읽어오는 것과, TEMP_OUT_L 과 TEMP_OUT_H를 따로따로 한바이트씩 읽어오는것은 같은 효과겠지요. (두 레지스터의 주소가 연속되어있기 때문)
이와 마찬가지로 자이로 데이터 레지스터의 주소도 연속되어있기 때문에 시작주소부터 순차적으로 6바이트를 읽어오면 3축 자이로의 값을 모두 읽어오는 것과 같습니다.