/* -> NON ATOMIC OPERATION
__set_PRIMASK(1);
rGPIOD->ODR = rGPIOD -> ODR ^ (0X1 << 13);
__set_PRIMASK(0);
*/
// -> ATOMIC OPERATION
bGPIOD_ODR_13 = 1;
bGPIOD_ODR_13 = 0;
위 코드는 main문에서 실행되는 코드
non alias 메모리를 통해서 작동하기 위해서는 __set_PRIMASK 로 임계영역을 설정해줘야 함
alias 메모리를 사용하면, 임계영역 설정해주지 않아도 됨
// priority of irq6
*(char *) 0xE000E406 = 0x30;
// priority of irq23
*(char *) 0xE000E417 = 0x40;
// priority of irq15
*(char *) 0xE000E428 = 0x50;
__set_BASEPRI(0x40);
위 코드에서 시스템 우선순위의 값이 4로 설정 되어있기 때문에 (하위 네비트는 사용안하므로 4번쨰 인덱스부터 값 할당)
우선순위가 3인 irq6만 실행되고 나머지 두 동작은 pending됨.
main 에서의 sfr접근 동작을 PRIMASK 조정을 통해 제어
systic interrupt 동작을 못하도록 막아줘 문제를 해결하는 방법
'FW 심화 과정 > [2] STM32심화실습' 카테고리의 다른 글
0808 까지 main 코드 백업 (0) | 2022.08.09 |
---|---|
0809 함수 및 라이브러리 생성 (0) | 2022.08.09 |
keil 미리 구현된 함수 찾고 사용하는 방법 (0) | 2022.08.08 |
0805 인터럽트 실습 코드 (0) | 2022.08.06 |
0804 인터럽트 실습 완성 코드 (0) | 2022.08.04 |
0804 인터럽트 ** (0) | 2022.08.04 |