embeded/Cortex-M3 STM2024. 12. 13. 14:13

PWM 이랑 거의 비슷하다

TIM2를 사용할 거고, clock source - internal clock

prescaler는 6MHz로 작동해서 6000 으로 하여 1msec 주기의 tick을 사용한다.

Counter Period는 1000 으로 해서 1000 번의 tick이 모이면 (= 1초) timer interrupt가 발생하게 한다.

 

NVIC Settings에서 TIM2 global interrupt를 발생시키게 하고 프로젝트 갱신하고

 

아래의 함수들을 추가하면 끝

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static int pwm_val = 0;
    static int dir = 1;

    if(dir)
    {
        if(pwm_val < 10)
        {
            pwm_val++;
        }
        else
        {
            dir = 0;
            pwm_val--;
        }
    }
    else
    {
        if(pwm_val > 0)
        {
            pwm_val--;
        }
        else
        {
            dir = 1;
            pwm_val++;
        }
    }
    // printf("pwm_val[%d] dir[%d]\n", pwm_val, dir);
    htim3.Instance->CCR1 = pwm_val;
    htim3.Instance->CCR2 = pwm_val;
}

int main(void)
{
    /* USER CODE BEGIN 2 */
    HAL_TIM_Base_Start_IT(&htim2);
    /* USER CODE END 2 */
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        /* USER CODE END WHILE */
        /* USER CODE BEGIN 3 */
        HAL_Delay(10);
    }
    /* USER CODE END 3 */
}

[링크 : https://eteo.tistory.com/73]

Posted by 구차니
embeded/Cortex-M3 STM2024. 12. 13. 12:39

STM32F103RETx 에서 구현 함.

 

CubeIDE 에서 클럭은 12MHz XTAL로 들어오고 있고

TIM3를 사용해야 하니까 APB1 의 클럭을 보면 된다.

TIM1/TIM8은 APB2에 있네

 

APB1 Timer clocks는 6MHz

 

핀에서 TIM3_CH1 / TIM3_CH2 로 할당하고

Timers - TIM3 에 가서

clock source를 internal clock 으로 바꾸고

channel 1과 channel 2를 PWM Generation CH1/2로 지정해 준다.

그리고 prescaler를 5999 (6000-1) 으로 해주면 6MHz / 6000 이니 1msec 를 1tick으로 쓰고

counter Period를 0~9 까지 10을 묶어서 10msec 마다 1번의 pwm을 발생하게 한다

※ 다르게 표현하면 100Hz PWM clock 으로 지정된다.

그리고 PWM Generation Channel 1/2 에서 Pulse (16 bits value) 에는

counter Period 값을 분모로 하는 값을 지정하면 되고 "Pulse / Counter Period"로 Duty Rate이 지정된다.

 

그러면 50% duty로 100Hz의 PWM 파형이 생성된다.

 

약간의 꽁수로(?) 아래와 같이 해주면

50ms 마다 1씩 변화되어 20번의 증감을 통해 1초 주기로 점멸하는 LED가 생성된다.

50ms 마다 바꾸는 것도 다른 타이머를 이용하면 메인 쓰레드에서 안해도 되니 정확한 타이밍이 될 듯.

    static int pwm_val = 0;
    static int dir = 1;

    if(dir)
    {
      if(pwm_val < 10) pwm_val++;
      else
      {
        dir = 0;
        pwm_val--;
      }
    }
    else
    {
      if(pwm_val > 0) pwm_val--;
      else
      {
        dir = 1;
        pwm_val++;
      }
    }
    // printf("pwm_val[%d] dir[%d]\n", pwm_val, dir);
    htim3.Instance->CCR1 = pwm_val;
    htim3.Instance->CCR2 = pwm_val;
    HAL_Delay(50);

 

[링크 : https://pilimage.tistory.com/23]

'embeded > Cortex-M3 STM' 카테고리의 다른 글

STM32 timer 사용하기  (0) 2024.12.13
stm32 gpio ext interrupt 모드  (0) 2024.11.04
stm32f103 adc + dma  (0) 2024.11.04
stm32 adc 읽기(1개로 여러 개 채널)  (0) 2024.10.30
stm32 tim output compare(OC) mode  (0) 2024.07.12
Posted by 구차니
embeded/i2c2024. 12. 11. 10:37

i2cget은 하나의 주소를 읽고 쓰는데 방해

i2cdump는 하나의 칩에 대해서 전체를 읽어서 출력해준다.

 

가장 마지막 b는 byte 단위로 읽기를 의미한다.

아래는 PTN5110 usb pd tcpc 칩의 덤프

# i2cdump -y 3 0x50 b
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: c9 1f 10 51 04 00 12 00 11 30 10 20 00 00 00 00    ???Q?.?.?0? ....
10: 03 02 00 00 ff ff ff ff 60 01 0b 00 38 18 0d 81    ??......`??.8???
20: 00 00 00 00 df 7e c7 37 06 40 00 00 00 00 02 00    ....?~?7?@....?.
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
70: cf 00 8c 00 20 00 07 01 8c 00 00 00 00 00 00 00    ?.?. .???.......
80: 01 a1 00 00 00 00 00 00 1f 00 00 00 00 00 60 00    ??......?.....`.
90: 00 00 03 00 38 00 49 00 00 08 00 13 02 1c 11 00    ..?.8.I..?.????.
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

 

w는 2byte(word) 단위

# i2cdump -y 3 0x50 w
     0,8  1,9  2,a  3,b  4,c  5,d  6,e  7,f
00: 1fc9 001f 5110 0051 0004 0000 0012 0000 
08: 3011 0030 2010 0020 0000 0000 0000 0000 
10: 0203 0002 0000 0000 00ff 00ff 00ff 00ff 
18: 0060 0001 000b 0000 0038 0018 000d 0081 
20: 0000 0000 0000 0000 7edf 007e 37c7 0037 
28: 0006 0040 0000 0000 0000 0000 0002 0000 
30: 0000 0000 0000 0000 0000 0000 0000 0000 
38: 0000 0000 0000 0000 0000 0000 0000 0000 
40: 0000 0000 0000 0000 0000 0000 0000 0000 
48: 0000 0000 0000 0000 0000 0000 0000 0000 
50: 0000 0000 0000 0000 0000 0000 0000 0000 
58: 0000 0000 0000 0000 0000 0000 0000 0000 
60: 0000 0000 0000 0000 0000 0000 0000 0000 
68: 0000 0000 0000 0000 0000 0000 0000 0000 
70: 00ce 0000 008c 0000 0020 0000 0107 0001 
78: 008c 0000 0000 0000 0000 0000 0000 0000 
80: a101 00a1 0000 0000 0000 0000 0000 0000 
88: 001f 0000 0000 0000 0000 0000 0060 0000 
90: 0000 0000 0003 0000 0038 0000 0049 0000 
98: 0000 0008 0000 0013 0002 001c 0011 0000 
a0: 0000 0000 0000 0000 0000 0000 0000 0000 
a8: 0000 0000 0000 0000 0000 0000 0000 0000 
b0: 0000 0000 0000 0000 0000 0000 0000 0000 
b8: 0000 0000 0000 0000 0000 0000 0000 0000 
c0: 0000 0000 0000 0000 0000 0000 0000 0000 
c8: 0000 0000 0000 0000 0000 0000 0000 0000 
d0: 0000 0000 0000 0000 0000 0000 0000 0000 
d8: 0000 0000 0000 0000 0000 0000 0000 0000 
e0: 0000 0000 0000 0000 0000 0000 0000 0000 
e8: 0000 0000 0000 0000 0000 0000 0000 0000 
f0: 0000 0000 0000 0000 0000 0000 0000 0000 
f8: 0000 0000 0000 0000 0000 0000 0000 0000

[링크 : https://m.blog.naver.com/emperonics/221836125173]

'embeded > i2c' 카테고리의 다른 글

linux i2c 예제  (0) 2022.12.27
i2c 자료  (0) 2018.04.26
i2c mode - tm4c  (0) 2018.04.26
i2c BUS에 pull-up, pull-down  (0) 2018.04.26
i2c bank switching  (0) 2015.09.02
Posted by 구차니
embeded/Cortex-M3 STM2024. 11. 4. 22:48

왜 안되나 했더니.. 다른 칩에서 계속 pull down 하고 있어서 버튼을 눌러도 올라가지 않았던...

 

cubeide 에서 특정 핀을 GPIO_EXT로 설정하고

 

External Interrupt Mode with ... 로 시작하는 녀석을 고른다.

필요하다면 falling edge 혹은 rising edge에서만도 잡을 수 있는데

 

둘 다 해두면 어떤 이벤트에서 인터럽트가 발생하는지 모르니, 결국에는 인터럽트 핸들러에서

해당 핀의 상태를 읽어서  판별을 해야하나? 조금 복잡한 문제가 발생할 듯 하다.

[링크 : https://blog.naver.com/micomcore/223281042436?]

 

그리고 NVIC 탭에서 해당 인터럽트를 활성화 해준다.

 

아래의 _weak 함수를 재정의 해서 사용하면 끝

GPIO_Pin은 핀 번호 별로 올라오니, 다른 포트의 같은 핀은 구분이 되지 않으니 유의

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  printf("GPIO_Pin[%d]\n", GPIO_Pin);
}

'embeded > Cortex-M3 STM' 카테고리의 다른 글

STM32 timer 사용하기  (0) 2024.12.13
STM32 PWM 으로 LED 점진적으로 깜박이기  (0) 2024.12.13
stm32f103 adc + dma  (0) 2024.11.04
stm32 adc 읽기(1개로 여러 개 채널)  (0) 2024.10.30
stm32 tim output compare(OC) mode  (0) 2024.07.12
Posted by 구차니
embeded/Cortex-M3 STM2024. 11. 4. 14:12

4개의 아날로그 값을 읽어야 해서 고군분투(?) 했는데 

(설정은 아래대로)

 

+ 2024.11.06

Sampling time이 1.5Cycle로 할 경우 다른 채널이 막 섞이는 것 처럼 보인다.

71.5cycle로 하고(@12MHz) 문제없이 작동 확인

+

 

 

의외로 삽질을 한 부분은... "Continuous Conversion Mode"

이걸 켜고 4개 rank에 대해서 dma로 읽으니

1 2 3 4

2 3 4 1

3 4 1 2

식으로 데이터가 하나씩 (조금은 랜덤하게) 밀리는 현상이 발생한다.

 

Sampling Time은 어느 문서에서는 86cycle 이런식으로 길게 하라는데

혹시나 해서 시스템 클럭을 낮게 했는데도 1.5Cycle에서 큰 문제가 없어 보이니, 장기적으로 테스트 해봐야 알 듯.

 

 

[링크 : https://www.st.com/content/dam/kms/Contents/Reflibrary/ADC_Firmware_guide_Mode_and_Feature.pdf]

[링크 : https://www.st.com/content/dam/kms/Contents/Reflibrary/ADC_Firmware_guide_Timer_and_ADC.pdf]

 

84 cycle

[링크 : https://m.blog.naver.com/kiss103007/223043132332]

[링크 : https://blog.naver.com/nextstone/223369997849]

 

+

STM32F4 시리즈는 F1 과는 또 다른 듯?

[링크 : https://m.blog.naver.com/eziya76/221473392732]

 

[링크 : https://www.st.com/resource/en/application_note/an3116-stm32s-adc-modes-and-their-applications-stmicroelectronics.pdf]

Posted by 구차니
embeded/Cortex-M3 STM2024. 10. 30. 19:35

ADC는 3개인데

읽을 핀은 4개라서 어떻게 해야 하나

 

[링크 : https://m.blog.naver.com/gauya/220232257331]

[링크 : https://github.com/sweesineng/STM32_ADC_MultiCh_SingleConv_Polling?tab=readme-ov-file]

 

'embeded > Cortex-M3 STM' 카테고리의 다른 글

stm32 gpio ext interrupt 모드  (0) 2024.11.04
stm32f103 adc + dma  (0) 2024.11.04
stm32 tim output compare(OC) mode  (0) 2024.07.12
stm32 reset 없이 JTAG 붙이기  (0) 2023.07.19
STM32H/STM32G 시리즈 시리얼 포트 데이터 order  (0) 2022.08.29
Posted by 구차니
embeded/arduino(genuino)2024. 10. 18. 14:25

부품 보다가 가격이 나쁘진 않은데 먼가 해서 보는데

sd 카드가 있는 녀석과 없는 녀석이 존재한다.

별 이야기는 없지만 color LCD 인것 같고

SDcard에서 파일을 읽어서 LCD로 출력도 된다니까

i2c인지 SDIO인지 나중에 봐야 할 듯.

 

[링크 : https://randomnerdtutorials.com/guide-to-1-8-tft-display-with-arduino/]

'embeded > arduino(genuino)' 카테고리의 다른 글

아두이노 FFB 휠 소스코드  (0) 2024.10.11
rfid 12.5M / 125k  (0) 2024.07.25
arducam esp8266 https post 예제  (0) 2024.01.31
433MHz RF 통신  (0) 2023.12.07
mcp2515 can  (0) 2023.10.30
Posted by 구차니
embeded/arduino(genuino)2024. 10. 11. 11:45

흐음.. 되어있는걸로 하는게 더 편하려나?

[링크 : https://github.com/ranenbg/Arduino-FFB-wheel]

'embeded > arduino(genuino)' 카테고리의 다른 글

1.8인치 TFT LCD with SDcard  (0) 2024.10.18
rfid 12.5M / 125k  (0) 2024.07.25
arducam esp8266 https post 예제  (0) 2024.01.31
433MHz RF 통신  (0) 2023.12.07
mcp2515 can  (0) 2023.10.30
Posted by 구차니
embeded/Cortex-M7 STM2024. 10. 10. 12:38

modbus poll 에서 뜬금없이 crc error로 띄워서 헤맸는데

 

03이나 04 명령어 처럼 multiple byte의 경우에는 아래의 형태로 구성되는데

station_id / cmd / length / data(word) / crc 

 

01의 경우는 아래의 형태로 고정된다.

station_id / cmd / length / data(byte) / crc

 

그러다 보니 modbud poll 에서도 고정된 length에서 하드코딩될수 밖에 없고

0x01 0x01 0x02 0x00 0x00 L_CRC M_CRC 로 응답하면

CRC 부분을 보고 읽는게 아니라

0x00 L_CRC 두개를 CRC로 해석하니 mismatch로 잘못 에러를 출력한다.

 

 

어우.. 별거 아닌데 하루를 날리게 하다니..

'embeded > Cortex-M7 STM' 카테고리의 다른 글

stm32 __weak  (0) 2024.10.08
stm32 modbus  (0) 2024.09.26
SPI NSS, NSSP mode  (0) 2024.09.11
FDE CIE  (0) 2024.09.06
code alignement factor?  (0) 2024.09.06
Posted by 구차니
embeded/Cortex-M7 STM2024. 10. 8. 10:27

인터럽트 핸들러의 경우 __WEAK가 앞에 붙어있는데

c 언어라면 동일한 함수명은 사용이 불가능한게 상식인데

새로 정의하면 새로 정의된 함수가 사용되고 기존에 정의된 함수는 사용되지 않는 신기한 녀석이다

그래서 이 기회에서 찾아보는 중

 

cmsis_armcc.h 에서 아래와 같이 정의되어 있다.

#ifndef   __WEAK
  #define __WEAK                                 __attribute__((weak))
#endif

 

링크 시간에 strong symbol은 weak symbol을 override 한다. 라고 되어있는데

컴파일러가 아니라 링커가 연결해주는거라니 신기하다.

__attribute__((weak)) variable attribute
Generates a weak symbol for a variable, rather than the default symbol.

Syntax

__attribute__((weak)) <type> <variable>;
Parameters
None.

Operation
At link time, strong symbols override weak symbols. This attribute replaces a weak symbol with a strong symbol, by choosing a particular combination of object files to link.

Example

__attribute__((weak)) int foo;

[링크 : https://developer.arm.com/documentation/101754/0622/armclang-Reference/Compiler-specific-Function--Variable--and-Type-Attributes/--attribute----weak---variable-attribute]

 

[링크 : https://blog.naver.com/22wowow22/220825653093]

[링크 : https://gangsanilee.tistory.com/2874]

[링크 : https://tigershin-shinhyeonkyu.tistory.com/8]

[링크 : https://engineering-agit.tistory.com/25]

 

 

'embeded > Cortex-M7 STM' 카테고리의 다른 글

modbus rtu coil read  (0) 2024.10.10
stm32 modbus  (0) 2024.09.26
SPI NSS, NSSP mode  (0) 2024.09.11
FDE CIE  (0) 2024.09.06
code alignement factor?  (0) 2024.09.06
Posted by 구차니