본문 바로가기

인터럽트13

Interrupt Nesting & SW Priorization [공개] 관련문서 https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html C28x Interrupt Nesting In most cases a system will only require one or two interrupts to be nested. This is easily handled by the example shown previously. There is, however, an example provided by which covers possibilities for every single interrupt in the group. This example software-dl.ti.com PIE 그룹과 채널 디폴트 우선순.. 2023. 2. 25.
TMS320F28388D ] getTick 구현 ISR에서 사용할 volatile msTick변수와 getTick함수는 모든 HW드라이버파일이 사용할 수 있는 헤더 extern 해둠 volatile uint32_t msTick; uint32_t getTick(void) { return msTick; } main.c 사용 예 timerOpen(TIMER_CH1, 1000, &timer0ISR); //... for(;;) { if(getTick()-timeBefore > 1000) { timeBefore = getTick(); print("\r\nHello World!"); } } timerOpen함수는 함수포인터로 받아서 콜백함수 등록 __interrupt void timer0ISR(void) { msTick++; // Acknowledge this i.. 2023. 2. 21.
STM32 ] CAN Interrupt CAN 통신 송수신 이전글 : 2023.01.29 - [DSP, MCU/STM32 (ARM Cortex-M)] - STM32 ] CAN 송수신 STM32 ] CAN 송수신 CAN 통신 설정 이전글 : 2023.01.27 - [DSP, MCU/STM32 (ARM Cortex-M)] - STM32 ] CAN 통신 설정 (bxCAN peripheral) STM32 ] CAN 통신 설정 (bxCAN peripheral) HTML 삽입 미리보기할 수 없는 소스 STM32F4xx 시리즈에는 bxCAN이라고 eteo.tistory.com bxCAN 의 interrupt source 1. Transmit Request Completed 2. Frame is received in RX FIFO0 3. Frame is r.. 2023. 1. 31.
TMS320F28388D ] IPC 사용하여 CPU1과 CPU2 타이머 Tick 값 Synchronization CPU1 코드 // ... IPC_clearFlagLtoR(IPC_CPU1_L_CPU2_R, IPC_FLAG_ALL); IPC_sync(IPC_CPU1_L_CPU2_R, IPC_FLAG31); msTick = 0; CPUTimer_startTimer(CPUTIMER0_BASE); // ... CPU2 코드 // ... IPC_clearFlagLtoR(IPC_CPU2_L_CPU1_R, IPC_FLAG_ALL); IPC_sync(IPC_CPU2_L_CPU1_R, IPC_FLAG31); msTick = 0; CPUTimer_startTimer(CPUTIMER0_BASE); // ... 두 코어간 동기화를 위한 API인 IPC_Sync() 함수 내부는 다음과 같다. //! Synchronises the two .. 2023. 1. 26.
STM32 ] 인터럽트 처리 과정 인터럽트 처리과정 프로세스 수행 도중 인터럽트가 발생하면 하던일을 멈추고 인터럽트 벡터 테이블에 저장된 ISR을 호출하게 된다. ISR에서 수행되는 내용은 다음과 같다 . 1. 더 이상 인터럽트가 걸리지 않도록 인터럽트를 disable해둔다. 2. 현재의 레지스터 상태를 모두 stack 메모리에 저장해둔다. 3. 인터럽트를 처리한다. 4. stack 메모리에 저장해두었던 레지스터 값을 복구한다. 5. 다시 인터럽트가 걸릴 수 있도록 Interrupt Source 를 클리어한다. 다시 원래의 프로세스로 복귀한다. startup_stm32f429zitx.s 파일에 정의된 인터럽트 벡터 테이블. 인터럽트에 걸리면 벡터 테이블에 할당된 주소로 뛰게 되는데 Code generation 을 통해 stm32f4xx_.. 2022. 12. 22.
TMS320F28388D ] 타이머, Timer Interrupt 사용하기 TMS320F28388D 모델에는 32bit Timer가 CPU당 각 3개씩 총 6개가 있다. 특이한 것은 Timer1,2 인터럽트는 각각 INT13, INT14에 연결되어 있고 Timer0는 PIE Interrupt Group 1의 7번째로 자리잡고 있다. 매뉴얼 153페이지 벡터 테이블 CPU0 TIMER가 higher priority를 가지고 그 다음이 CPU1 TIMER 그리고 CPU2 TIMER 이다. CPU 타이머 레지스터는 다음과 같다. 먼저 카운터 레지스터의 설명을 살펴보자. TIM 레지스터는 SYSCLOCK 을 Prescaler값(TDDR+1)으로 분주한 clock cycle 에 따라 감소하고 그러다 0에 도달하면 Period 레지스터(PRD)에 있는 값으로 reload 되며 타이머 인터.. 2022. 12. 5.
STM32 ] FreeRTOS + Semaphore ISR 사용 예제 추가설명 되지 않은 기타 설정은 이전 글과 동일하다. 2022.08.08 - [MCU/STM32 (ARM Cortex-M)] - STM32 ] FreeRTOS 사용해보기 STM32 ] FreeRTOS 사용해보기 정의 RTOS는 실시간 시스템을 위해 개발된 운영체제로, 멀티태스킹 환경에서 Task 처리시간을 일관되게 유지하기 위한 용도로 사용한다. RTOS는 시분할 시스템 하에서 우선순위 기반 스케줄링을 통 eteo.tistory.com 예제 코드 출처 : https://m.blog.naver.com/eziya76/220951244572 Mutex는 ISR(Interrupt Service Routine)에서 신호를 보내는게 불가능한데 세마포어는 ISR에서 신호를 보낼 수 있다. Task 중 세마포어를 대기.. 2022. 8. 8.
STM32 ] Timer 인터럽트를 사용하여 ADC 값 받기 + 그래프 보면서 디버깅하는 팁 ADC : Analogue to Digital Converter, 아날로그 신호를 디지털 신호로 변환하는 것으로 샘플링(Sampling), 양자화(Quantizing), 부호화(Coding) 과정을 거친다. 샘플링 : 아날로그 파형을 디지털 형태로 변환하기 위해 표본을 취하는 것 양자화 : 표본화된 각 점을 어느 정도 resolution 으로 표현할지 정해 변환하는 것. 예를들어 8비트면 256단계로 세분화 부호화 : 앞의 단계를 거친 디지털 정보를 2진수로 표현하는 것 ADC를 인터럽트방식으로 사용하면 끊임없이 인터럽트가 트리거되어 다른 부분에 문제를 일으킨다. Timer 인터럽트와 ADC 폴링방식을 사용하여 ADC의 샘플링 주기를 조절하는 방법을 소개한다. 먼저 테스트를 위해 사용할 것은 아두이노에 .. 2022. 6. 17.
STM32 , RTC 와 FND 로 시계 만들기 + UART로 시간 제어 (FND 라이브러리 공유) RTC를 사용하기 위해서 외부에 장착된 32.768KHz의 LSE 클락소스를 사용한다. 먼저 CubeMX 설정 RTC (Real Time Clock) 설정 위와같이 Activate 하고 일단 알람기능은 사용하지 않는다. Hourformat 12를 선택하면 12:00:00 부터 11:59:59 까지 표시되며 AM/PM value를 갖는다. Hourformat 24를 선택하면 12:00:00 부터 23:59:59 까지 표시되는 것 같다. Data Format은 BIN 와 BCD 중에 선택할 수 있는데 BCD를 선택했다. 그리고 UART 커맨드로 시간을 재설정해줄 예정이기 때문에 보드에 업로드시 적용되는 초기 시간값은 크게 신경쓰지 않았다. + usart3 인터럽트모드로 설정해준다. main.c의 전역변수 구.. 2022. 6. 9.
STM32 , UART 통신으로 4 digit 7 segment FND 실시간 제어하기 1편 ( 2가지 방법 ) UART 수신 인터럽트를 통한 4자리의 FND 실시간 제어 명령어 예시 FND38 : 3번째 FND에 숫자 8을 켠다. FNDA4 : 모든 FND를 4로 켠다. FND4X : 0-9 값이 아닌 다른 값을 입력하면 4번째 FND가 꺼진다. 이 글에 나오는 다른 함수는 이전글과 동일하다. 이전글 : 2022.06.02 - [MCU/STM32 (ARM Cortex-M)] - STM32 , 74HC595 시프트 레지스터로 FND 제어하기 , 카운터 / 시계 ( SysTick 타이머 사용) 테라텀 설정 New connection으로 포트를 제대로 잡은 후 보드레이트 115200으로 잡아주고 Setup - Terminal 설정에서 new-line 시 라인피드(\n)가 전송될 수 있도록 하고 내가 터미널에 친 글자가.. 2022. 6. 3.
STM32 , 난수 발생 회로 프로그래밍으로 구현 ( EXTI 사용 ) D플립플롭을 4개 연결한 시프트 레지스터이고 이전의 디지털 금고와는 달리 같은 클락펄스가 들어간다. 프리셋 기능은 EXTI (외부 인터럽트)를 사용했다. 회로는 이전 글의 디지털 금고할때 쓰던 회로를 그대로 사용했는데 실제 사용하는건 왼쪽부터 LED 4개와 맨 아래의 버튼 1개 뿐이다. 15부터 시작해 무작위로 보이는 순서로 변화함 위의 상태도와 일치하게 순환한다. PG3과 연결된 버튼은 풀다운저항이고 Rising Edge 인터럽트로 설정한 버튼이 눌려 인터럽트 발생시, 각 플립플롭의 출력 Q값이 다 1111로 초기화된다. 소스코드 main.h 내 구조체 정의 typedef struct { uint8_t Q; uint8_t clockbefore; }JKFF; main.c 전역변수 선언 및 초기화 /* U.. 2022. 5. 25.
STM32 , Timer Interrupt 타이머 인터럽트 사용하기 (TIM2) 이전의 동기식 / 비동기식 카운터 프로그래밍으로 구현하기 글에서 이어진다. 2022.05.23 - [MCU/STM32 (ARM Cortex-M)] - STM32 , 동기식 / 비동기식 카운터 프로그래밍으로 구현하기 ( + Timer 사용 방법 ) STM32 , 동기식 / 비동기식 카운터 프로그래밍으로 구현하기 ( + Timer 사용 방법 ) 4비트 상향 카운터 4비트 하향 카운터 main.h 먼저 main.h 에 플립플롭에 필요한 변수들을 묶어 구조체로 정의해주었다. 함수에 매개변수를 여러개 둘 필요없이 보다 간략하게 짤 수 있다. /* USER CODE eteo.tistory.com 프로젝트 파일은 위 글 똑같고 while문 내에서 지역변수를 토글시키며 HAL_Delay(500) 한 이전버전과 달리 T.. 2022. 5. 25.
STM32 , 외부 인터럽트 ( EXTI ) 사용하기 EXTI는 External Interrupt의 약자로 인터럽트 Interrupt란 CPU(프로세스)가 프로그램을 실행하고 있을 때 입출력 하드웨어 등의 장치 등에서 예외상항이 발생하여 처리가 필요한 경우 프로세서에게 알려 처리할 수 있도록 하는 기능이다. 결과물 첫번째 스위치를 누르면 오른쪽으로 점멸하며 이동 두번째 스위치를 누르면 왼쪽으로 점멸하며 이동 세번째 스위치를 누르면 전체 점등 네번째 스위치를 누르면 전체 꺼짐 STM32F42시리즈는 다음과 같은 EXTI 구조를 가지고 있다. 각각의 PA0~PH0 핀이 EXTI0 에 연결되고 PA1~PH1이 EXTI1에 연결되는 식이다. 따라서 PD0번과 PC0번을 동시에 EXTI 용도로 설정할 수 없다. 위 사진에 보이듯이 EXTI0 - EXIT4 는 개별 .. 2022. 5. 22.