hong.com
Final
2025-08-06
2025-08-07
2025-08-08
2025-08-11
2025-08-12
2025-08-13
2025-08-14
2025-08-18
2025-08-19
Project
C Language
game instructions
FFT
game instructions
Study
C Language
ARM System Programming
C Programming - Challenges
C programming
Linux
Day1
Day2
Day3
Day4
Day5
Day6
Day7
Day8
SKIN_Project copy
SKIN_Project
perceptron
System Verilog
Day1
Day2
Day3
VLSI Circuits Design
Day1
Subsubcategory 1
Subsubcategory 2
example
Home
Contact
Copyright ยฉ 2024 |
Yankos
Home
>
Study
>
C Language
> ARM System Programming
๐ ๆ้ใขใค (โโขแดโขโ)โก โง*ใ
ARM System Programming
[ex46] #8 ์ธํฐ๋ฝํธ ๊ธฐ๋ฐ ๋ฉ๋ก๋ ์ฌ์ ๋ฐ ์ค์๊ฐ PWM LED ์ ์ด ์ค์ต
๋ฌธ์ ์ค๋ช ํ์ด๋จธ ์ธํฐ๋ฝํธ๋ฅผ ํ์ฉํ์ฌ ๋ฉ๋ก๋(song1)๋ฅผ ์์ฐจ ์ฌ์ํ๊ณ , UART ์์ ์ธํฐ๋ฝํธ๋ฅผ ํตํด LED ๋ฐ๊ธฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ์ดํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. TIM2 ์ธํฐ๋ฝํธ๋ฅผ ํตํด ์ํ ํ ๊ฐ์ ์ฐ์ฃผ๊ฐ ๋๋๋ฉด ๋ค์ ์ํ๋ฅผ ์๋ ์ฌ์ TIM3์ ์ฃผํ์ ๋ฐ์์ฉ ํ์ด๋จธ๋ก ๋ถ์ ์ ์ถ๋ ฅ์ ์ฌ์ฉ๋จ USART1 ์ธํฐ๋ฝํธ๋ก ์์ ํ ์ซ์(1~9)๋ PWM ๋ํฐ๋น๋ก ์ค์ ๋์ด LED ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ํ๊ณ , 0์ PWM ์ถ๋ ฅ์ ์ค๋จํจ ๋ ์ธํฐ๋ฝํธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ฉฐ, ๋ฉ๋ก๋ ์ฌ์๊ณผ LED ์ ์ด๋ฅผ ๋์์ ์ํํจ ์ ๋ต ์ฝ๋ //stm32f10x_it.c volatile int Uart1_Rx_In = 0; volatile int Uart1_Rx_Data = 0; void USART1_IRQHandler(void) { Uart1_Rx_Data = (unsigned char)USART1->DR; Uart1_Send_Byte(Uart1_Rx_Data); Uart1_Rx_In = 1; NVIC_ClearPendingIRQ(37); } volatile int note_end = 0; void TIM2_IRQHandler(void) { Macro_Clear_Bit(TIM2->SR, 0); NVIC_ClearPendingIRQ(28); note_end = 1; } //main.c #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); SCB->VTOR = 0x08003000; SCB->SHCSR = 0; } #define BASE (500) //msec enum key{C1, C1_, D1, D1_, E1, F1, F1_, G1, G1_, A1, A1_, B1, C2, C2_, D2, D2_, E2, F2, F2_, G2, G2_, A2, A2_, B2}; enum note{N16=BASE/4, N8=BASE/2, N4=BASE, N2=BASE*2, N1=BASE*4}; const int song1[][2] = { {G1,N4},{G1,N4},{E1,N8},{F1,N8},{G1,N4},{A1,N4},{A1,N4},{G1,N2},{G1,N4},{C2,N4},{E2,N4},{D2,N8},{C2,N8},{D2,N2} }; static void Buzzer_Beep(unsigned char tone, int duration) { const static unsigned short tone_value[] = {261,277,293,311,329,349,369,391,415,440,466,493,523,554,587,622,659,698,739,783,830,880,932,987}; TIM3_Out_Freq_Generation(tone_value[tone]); TIM2_Delay(duration); } extern volatile int Uart1_Rx_In; extern volatile int Uart1_Rx_Data; extern volatile int note_end; void Main(void) { Sys_Init(); TIM4_Out_Init(); TIM3_Out_Init(); Uart1_RX_Interrupt_Enable(1); static int timer_run = 0; volatile int i = 0; Buzzer_Beep(song1[i][0], song1[i][1]); for(;;) { if (Uart1_Rx_In) { Uart1_Rx_Data = Uart1_Rx_Data - '0'; if (Uart1_Rx_Data == 0) { TIM4_Out_Stop(); timer_run = 0; } else { if (timer_run == 0) { TIM4_Out_PWM_Generation(1000, Uart1_Rx_Data); timer_run = 1; } else { TIM4_Change_Duty(Uart1_Rx_Data); } } Uart1_Rx_In = 0; } if (note_end) { TIM3_Out_Stop(); i++; if (i >= sizeof(song1)/sizeof(song1[0])) { i = 0; } Buzzer_Beep(song1[i][0], song1[i][1]); note_end = 0; } } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex45] #7 ๋ฉ๋ก๋ ๋ฐ๋ณต ์ฌ์ ๋ฐ UART ๊ธฐ๋ฐ LED PWM ์ ์ด ์ค์ต
๋ฌธ์ ์ค๋ช ๋ถ์ ๋ฅผ ํตํด ๋ฏธ๋ฆฌ ์ ์๋ ๋ฉ๋ก๋(song1)๋ฅผ ๋ฐ๋ณต ์ฌ์ํ๊ณ , UART ์์ ์ธํฐ๋ฝํธ๋ฅผ ํตํด LED ๋ฐ๊ธฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ์ดํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. main ๋ฃจํ์์๋ TIM3๊ณผ TIM2๋ฅผ ์ด์ฉํ์ฌ ์๊ณ ์ฃผํ์ ๋ฐ ์ง์์๊ฐ์ ๋ฐ๋ผ ๋ฉ๋ก๋๋ฅผ ์ฌ์ USART1 ์ธํฐ๋ฝํธ์์ UART๋ก ์์ ๋ ๊ฐ(1~9)์ TIM4์ PWM ๋ํฐ๋น๋ก ์ ์ฉ๋์ด LED ๋ฐ๊ธฐ๋ฅผ ์กฐ์ UART๋ก 0์ด ์ ๋ ฅ๋๋ฉด PWM ์ถ๋ ฅ์ ์ค๋จํ์ฌ LED๋ฅผ ๋ ๋ฉ๋ก๋ ์ฌ์๊ณผ LED ์ ์ด๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ ์ ๋ต ์ฝ๋ //stm32f10x_it.c void USART1_IRQHandler(void) { unsigned char c = (unsigned char)USART1->DR; Uart1_Send_Byte(c); TIM4_Out_Init(); static int timer_run = 0; int n = c - '0'; if (n == 0) { TIM4_Out_Stop(); timer_run = 0; } else { if (timer_run == 0) { TIM4_Out_PWM_Generation(1000, n); timer_run = 1; } else { TIM4_Change_Duty(n); } } NVIC_ClearPendingIRQ(37); } //main.c #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); SCB->VTOR = 0x08003000; SCB->SHCSR = 0; } #define BASE (500) //msec static void Buzzer_Beep(unsigned char tone, int duration) { const static unsigned short tone_value[] = {261,277,293,311,329,349,369,391,415,440,466,493,523,554,587,622,659,698,739,783,830,880,932,987}; TIM3_Out_Freq_Generation(tone_value[tone]); TIM2_Delay(duration); TIM3_Out_Stop(); } void Main(void) { Sys_Init(); // NVIC USART1 Pending clear NVIC_ClearPendingIRQ(37); // USART1 RX interrupt enable Macro_Set_Bit(USART1->CR1, 5); // NVIC USART1 interrupt enable NVIC_EnableIRQ(37); int i; enum key{C1, C1_, D1, D1_, E1, F1, F1_, G1, G1_, A1, A1_, B1, C2, C2_, D2, D2_, E2, F2, F2_, G2, G2_, A2, A2_, B2}; enum note{N16=BASE/4, N8=BASE/2, N4=BASE, N2=BASE*2, N1=BASE*4}; const int song1[][2] = { {G1,N4},{G1,N4},{E1,N8},{F1,N8},{G1,N4},{A1,N4},{A1,N4},{G1,N2},{G1,N4},{C2,N4},{E2,N4},{D2,N8},{C2,N8},{D2,N2} }; //const char * note_name[] = {"C1", "C1#", "D1", "D1#", "E1", "F1", "F1#", "G1", "G1#", "A1", "A1#", "B1", "C2", "C2#", "D2", "D2#", "E2", "F2", "F2#", "G2", "G2#", "A2", "A2#", "B2"}; TIM3_Out_Init(); Uart1_Printf("\nSong Play\n"); for(;;) { for(i=0; i<(sizeof(song1)/sizeof(song1[0])); i++) { //Uart1_Printf("%s ", note_name[song1[i][0]]); Buzzer_Beep(song1[i][0], song1[i][1]); } } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex44] #6 PWM ๊ธฐ๋ฐ LED ๋ฐ๊ธฐ ์ ์ด ๋ฐ ๋ฉ๋ก๋ ์ฐ์ฃผ ํตํฉ ์ค์ต
๋ฌธ์ ์ค๋ช PWM์ ์ด์ฉํด LED ๋ฐ๊ธฐ๋ฅผ ์ ์ดํ๊ณ , ๋์์ ๋ฏธ๋ฆฌ ์ ์๋ ์๊ณ ๋ฐฐ์ด(song1)์ ๋ฐ๋ผ ๋ถ์ ๋ก ์์ ์ ์ฐ์ฃผํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. TIM4๋ PWM ์ถ๋ ฅ์ ์์ฑํ๋ฉฐ, UART๋ก ์ ๋ ฅ๋ ๊ฐ(1~9)์ ๋ฐ๋ผ ๋ํฐ๋น๋ฅผ ์กฐ์ ํด LED ๋ฐ๊ธฐ๋ฅผ ๋ณ๊ฒฝ ์ ๋ ฅ๊ฐ 0์ด ๋ค์ด์ค๋ฉด PWM ์ถ๋ ฅ์ ์ค๋จํ์ฌ LED๋ฅผ ๋ TIM3๊ณผ TIM2๋ฅผ ์ด์ฉํด ์๊ณ ์ฃผํ์์ ์ํ ๊ธธ์ด์ ๋ฐ๋ผ ๋ฉ๋ก๋๋ฅผ ๋ฐ๋ณต ์ฌ์ ์ฐ์ฃผ๋๋ ์์ UART๋ฅผ ํตํด ์๊ณ ์ด๋ฆ์ผ๋ก ์ถ๋ ฅ๋จ ์ ๋ต ์ฝ๋ #include "device_driver.h" #define BASE (500) static void Buzzer_Beep(unsigned char tone, int duration) { const static unsigned short tone_value[] = { 261,277,293,311,329,349,369,391,415,440,466,493, 523,554,587,622,659,698,739,783,830,880,932,987 }; TIM3_Out_Freq_Generation(tone_value[tone]); TIM2_Delay(duration - 20); TIM3_Out_Stop(); TIM2_Delay(20); } static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); } void Main(void) { Sys_Init(); TIM4_Out_Init(); TIM4_Out_Freq_Generation(1000, 0); TIM3_Out_Init(); Uart1_Printf("HomeWork (Verilog 6)\n"); char x; int i = 0; int state = 0; enum key { C1, C1_, D1, D1_, E1, F1, F1_, G1, G1_, A1, A1_, B1, C2, C2_, D2, D2_, E2, F2, F2_, G2, G2_, A2, A2_, B2 }; enum note { N16 = BASE/4, N8 = BASE/2, N4 = BASE, N2 = BASE*2, N1 = BASE*4 }; const int song1[][2] = { {G1,N4},{G1,N4},{E1,N8},{F1,N8},{G1,N4}, {A1,N4},{A1,N4},{G1,N2},{G1,N4},{C2,N4}, {E2,N4},{D2,N8},{C2,N8},{D2,N2} }; const char * note_name[] = { "C1", "C1#", "D1", "D1#", "E1", "F1", "F1#", "G1", "G1#", "A1", "A1#", "B1", "C2", "C2#", "D2", "D2#", "E2", "F2", "F2#", "G2", "G2#", "A2", "A2#", "B2" }; for(;;) { if(i == sizeof(song1)/ sizeof(song1[0])){ i = 0; } if(state == 0) { x = Uart1_Get_Pressed(); if (x != 0) { Uart1_Printf("Input: %d\n", x - '0'); if (x == '0') { TIM4->CCR3 = TIM4->ARR; } else { TIM4_Change_Duty_Rate(x - '0'); } } } Uart1_Printf("%s ", note_name[song1[i][0]]); Buzzer_Beep(song1[i][0], song1[i][1]); i++; } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex43] #5 UART ์ ๋ ฅ ๊ธฐ๋ฐ PWM LED ๋ฐ๊ธฐ ์ ์ด ์ค์ต
๋ฌธ์ ์ค๋ช TIM4 ํ์ด๋จธ๋ฅผ ์ด์ฉํ์ฌ PWM ์ ํธ๋ฅผ ์์ฑํ๊ณ , UART๋ก ์ ๋ ฅ๋ ์ซ์(0~9)์ ๋ฐ๋ผ LED ๋ฐ๊ธฐ๋ฅผ ์ ์ดํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. TIM4 ์ฑ๋์ ์ฌ์ฉํ์ฌ PWM ํํ ์ถ๋ ฅ ์ ๋ ฅ๊ฐ 1~9๋ ๋ํฐ๋น๋ก ์ ์ฉ๋์ด LED ๋ฐ๊ธฐ๋ฅผ ๋ณ๊ฒฝ ์ ๋ ฅ๊ฐ 0์ PWM ์ถ๋ ฅ์ ์ ์ง์์ผ LED๋ฅผ ๋ UART ์ ๋ ฅ์ ํตํด ์ฌ์ฉ์์ ์ํธ์์ฉํ๋ฉฐ, ํ์ฌ ์ ๋ ฅ๊ฐ์ UART๋ก ๋ค์ ์ถ๋ ฅํจ ์ ๋ต ์ฝ๋ // timer.c #define TIM4_FREQ (1000000) // 1MHz #define TIM4_TICK (1000000/TIM4_FREQ) // usec #define TIME4_PLS_OF_1ms (1000/TIM4_TICK) void TIM4_Out_Init(void) { Macro_Set_Bit(RCC->APB1ENR, 2); // tim4 Macro_Set_Bit(RCC->APB2ENR, 3); // b port Macro_Write_Block(GPIOB->CRH, 0xF, 0xE, 0); //1110 open drain Macro_Write_Block(TIM4->CCMR2, 0xFF, 0x68, 0); TIM4->CCER = (0<<9)|(1<<8); } void TIM4_Out_PWM_Generation(unsigned int freq, unsigned int duty) { // Down Counter, Repeat Mode TIM4->CR1 = (1<<4)|(0<<3); // Timer ์ฃผํ์๊ฐ TIM4_FREQ๊ฐ ๋๋๋ก PSC ์ค์ TIM4->PSC = (unsigned int)((TIMXCLK / (double)TIM4_FREQ) + 0.5) - 1; // 1KHz // ์์ฒญํ ์ฃผํ์๊ฐ ๋๋๋ก ARR ์ค์ TIM4->ARR = (int)((double)TIM4_FREQ/freq + 0.5) - 1; // Duty Rate 50%๊ฐ ๋๋๋ก CCR3 ์ค์ TIM4->CCR3 = (int)(TIM4->ARR * (duty / 10.)); // Manual Update(UG ๋ฐ์) Macro_Set_Bit(TIM4->EGR, 0); // Timer Start Macro_Set_Bit(TIM4->CR1, 0); } void TIM4_Out_Stop(void) { Macro_Clear_Bit(TIM4->CR1, 0); } void TIM4_Change_Duty(unsigned int duty) { TIM4->CCR3 = (int)(TIM4->ARR * (duty / 10.)); } // main.c #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); } void Main(void) { Sys_Init(); TIM4_Out_Init(); char x; int timer_run = 0; TIM4_Out_PWM_Generation(1000, 0); for(;;) { x = Uart1_Get_Pressed(); if (x != 0) { int n = x - '0'; Uart1_Printf("%d", n); if (n == 0) { TIM4_Out_Stop(); timer_run = 0; } else { if (timer_run == 0) { TIM4_Out_PWM_Generation(1000, n); timer_run = 1; } else { TIM4_Change_Duty(n); } } } } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex42] #4 ๋์ผ ํ์ด๋จธ ๊ธฐ๋ฐ LED ๊น๋นก์ ์ ์ด ๋ฐ UART ์ฃผ๊ธฐ ์ถ๋ ฅ ์ค์ต
๋ฌธ์ ์ค๋ช UART๋ก ์ ๋ ฅ๋ ์ซ์(1~9)๋ฅผ ์ด์ฉํ์ฌ LED ๊น๋นก์ ์๋๋ฅผ ์กฐ์ ํ๊ณ , ์ผ์ ์ฃผ๊ธฐ๋ก UART๋ฅผ ํตํด ์ (.)์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ์ซ์ 1~9 ์ ๋ ฅ ์ TIM4 ํ์ด๋จธ์ ์ฃผ๊ธฐ๋ฅผ ์กฐ์ ํ์ฌ LED ๊น๋นก์ ์๋ ๋ณ๊ฒฝ ์ซ์ 0 ์ ๋ ฅ ์ LED ๊น๋นก์์ ๋ฉ์ถค TIM2๋ฅผ ์ด์ฉํด ์ผ์ ์ฃผ๊ธฐ๋ก UART์ ์ (.) ์ถ๋ ฅ ๋ ํ์ด๋จธ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ฉฐ, ๊น๋นก์๊ณผ ์ถ๋ ฅ์ด ๋์์ ์ด๋ฃจ์ด์ง ์ ๋ต ์ฝ๋ void Main(void) { Sys_Init(); char x; int n; int timer_run = 0; int led = 0; TIM4_Repeat(10); TIM2_Repeat(100); for(;;) { x = Uart1_Get_Pressed(); if(x != 0) { n = x - '0'; Uart1_Printf("%d", n); // 0? timer_run = 0; if (n==0) { timer_run = 0; } // 1~9? TIM4_Change_Value(n * 10); timer_run = 1 else { TIM4_Change_Value(n * 10); timer_run = 1; } } if(TIM4_Check_Timeout() && timer_run == 1) { //LED๋ฐ์ LED_Display(led ^= 1); } if(TIM2_Check_Timeout()) { Uart1_Printf("."); } } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex41] #3 UART ์ซ์ ์ ๋ ฅ ๋ฐ ๋ฌธ์์ด โ ์ ์ ๋ณํ ํจ์ ์ค์ต
๋ฌธ์ ์ค๋ช UART๋ฅผ ํตํด ์ต๋ 4์๋ฆฌ๊น์ง์ ์ซ์ ๋ฌธ์์ด์ ์ ๋ ฅ๋ฐ๊ณ , ์ด๋ฅผ ์ ์๋ก ๋ณํํ์ฌ ๋ฐํํ๋ ํจ์๋ฅผ ์์ฑํ๋ผ. ์ ๋ ฅ ๋ฌธ์๋ ํ ๊ธ์์ฉ UART ์์ ๋ ์ง์คํฐ์์ ์ฝ์ ์์ ๋ ๋ฌธ์๋ ์ฆ์ ์์ฝ(๋๋๋ ค ์ถ๋ ฅ) ์ฒ๋ฆฌ ์ ๋ ฅ์ด \r (Enter)์ผ ๊ฒฝ์ฐ ์ฆ์ ์ ๋ ฅ ์ข ๋ฃ ํ ์ ์ ๋ฐํ ์ซ์ ์ด์ธ ๋ฌธ์๋ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉฐ, ์ต๋ 4์๋ฆฌ๊น์ง๋ง ์ ๋ ฅ ๊ฐ๋ฅ ์ ๋ต ์ฝ๋ int Uart_Get_Int_Num(void) { char s[10]; int i; int num = 0; for (i=0;i<4;i++) { while (!Macro_Check_Bit_Set(USART1->SR, 5)); s[i] = USART1->DR; while (!Macro_Check_Bit_Set(USART1->SR, 7)); USART1->DR = s[i]; if (s[i] == '\r') { return num; } num = num * 10 + (s[i] - '0'); } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex40] #2 ์ธํฐ๋ฝ ๋ฐฉ์์ ๋ฒํผ ์ ๋ ฅ ๊ธฐ๋ฐ LED ํ ๊ธ ์ค์ต
๋ฌธ์ ์ค๋ช PA3 ํ์ ์ฐ๊ฒฐ๋ ๋ฒํผ ์ ๋ ฅ์ ๊ฐ์งํ์ฌ, ๋ฒํผ์ด ๋๋ฆด ๋๋ง๋ค PA2์ ์ฐ๊ฒฐ๋ LED์ ์ํ๋ฅผ ๋ฐ์ ์ํค๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ๋ฒํผ ์ ๋ ฅ์ ํ์ ์ค์ ๋ PA3 ํ์ ํตํด ์ฝ์ LED๋ PA2 ํ์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ, ๋ฒํผ์ด ๋๋ฆด ๋๋ง๋ค ํ ๊ธ๋จ ๋๋ฐ์ด์ฑ ํจ๊ณผ๋ฅผ ์ํด ์ธํฐ๋ฝ(interlock) ๋ฐฉ์ ์ฌ์ฉ ์ ๋ต ์ฝ๋ #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); } void Main(void) { Sys_Init(); Uart_Printf("PA3 Switch Input Toggling for LED on PA2\n"); Macro_Write_Block(GPIOA->CRL, 0xF, 0x8, 12); Macro_Write_Block(GPIOA->CRL, 0xF, 0x6, 8); Macro_Set_Bit(GPIOA->ODR, 3); int interlock = 0; for (;;) { if ((interlock == 0) && Macro_Check_Bit_Clear(GPIOA->IDR, 3)) { Macro_Invert_Bit(GPIOA->ODR, 2); interlock = 1; } else if ((interlock == 1) && Macro_Check_Bit_Set(GPIOA->IDR, 3)) { interlock = 0; } } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex39] #1 CMSIS ์ง์ ์ ๊ทผ์ ํตํ GPIOA LED ์ ๋ฉธ ์ค์ต
๋ฌธ์ ์ค๋ช CMSIS ๊ธฐ๋ฐ ๋ ์ง์คํฐ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ GPIOA ํ์ ์ง์ ์ ์ดํ๋ LED ์ ๋ฉธ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. RCC ๋ ์ง์คํฐ๋ฅผ ์ด์ฉํด ํฌํธ A ํด๋ญ์ ํ์ฑํ GPIOA์ CRL, ODR ๋ ์ง์คํฐ๋ฅผ ์ง์ ์ค์ ํ์ฌ LED ON/OFF ๊ตฌํ LED ์ํ๋ฅผ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ํ ๊ธํ์ฌ ๊น๋นก์ด๋๋ก ํจ ์ ๋ต ์ฝ๋ #include "device_driver.h" void Main(void) { volatile int i; Uart_Init(115200); Uart_Printf("CMSIS Based Register Define\n"); // ์ด ๋ถ๋ถ์ ์์ ํ์ง ๋ง ๊ฒ RCC->APB2ENR |= (1<<2); // LED Pin์ ์ถ๋ ฅ์ผ๋ก ์ค์ GPIOA->CRL = 0x600; for(;;) { // LED ๋ชจ๋ ON GPIOA->ODR = 0x0; for(i=0; i<0x40000; i++); // LED ๋ชจ๋ OFF GPIOA->ODR = 0x4; for(i=0; i<0x40000; i++); } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex38] SYSTEM_SERVICE
๋ฌธ์ ์ค๋ช .global _SVC_Handler .type _SVC_Handler, %function _SVC_Handler: .extern SVC_FUNC @ SVC ํธ๋ค๋ฌ ์ค๊ณ ์ ๋ต ์ฝ๋ .global _SVC_Handler .type _SVC_Handler, %function _SVC_Handler: .extern SVC_FUNC PUSH {r4, lr} MRS r4, PSP LDR lr, [r4, #0x18] LDR lr, [lr, #-2] AND lr, lr, #0xFF LDR r12, =SVC_FUNC LDR r12, [r12, lr, lsl #2] BLX r12 STR r0, [r4] STR r1, [r4, #4] POP {r4, pc} ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex37] FAULT_HANDLER
๋ฌธ์ ์ค๋ช .syntax unified .thumb .text .extern MemManage_Handler .extern BusFault_Handler .extern UsageFault_Handler .global _HardFault_Handler .type _HardFault_Handler, %function _HardFault_Handler: @ ์ฝ๋ ์์ฑ .global _MemManage_Handler .type _MemManage_Handler, %function _MemManage_Handler: @ ์ฝ๋ ์์ฑ .global _BusFault_Handler .type _BusFault_Handler, %function _BusFault_Handler: @ ์ฝ๋ ์์ฑ .global _UsageFault_Handler .type _UsageFault_Handler, %function _UsageFault_Handler: @ ์ฝ๋ ์์ฑ .end ์ ๋ต ์ฝ๋ .syntax unified .thumb .text .extern HardFault_Handler .extern MemManage_Handler .extern BusFault_Handler .extern UsageFault_Handler .global _HardFault_Handler .type _HardFault_Handler, %function _HardFault_Handler: MOV R0, SP MOV R1, LR MRS R2, PSP B HardFault_Handler .global _MemManage_Handler .type _MemManage_Handler, %function _MemManage_Handler: MOV R0, SP MOV R1, LR MRS R2, PSP B MemManage_Handler .global _BusFault_Handler .type _BusFault_Handler, %function _BusFault_Handler: MOV R0, SP MOV R1, LR MRS R2, PSP B BusFault_Handler .global _UsageFault_Handler .type _UsageFault_Handler, %function _UsageFault_Handler: MOV R0, SP MOV R1, LR MRS R2, PSP B UsageFault_Handler .end ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex36] BASIC_HANDLER
๋ฌธ์ ์ค๋ช void Invalid_ISR(void) { /* ์ฝ๋ ์ค๊ณ */ Uart1_Printf("Invalid_Exception: %d!\n", ); Uart1_Printf("Invalid_ISR: %d!\n", ); for(;;); } void MemManage_Handler(void) { Uart1_Printf("Memory Management Fault\n"); /* ์ฝ๋ ์ค๊ณ */ for(;;); } void BusFault_Handler(void) { Uart1_Printf("Bus Fault\n"); /* ์ฝ๋ ์ค๊ณ */ for(;;); } void UsageFault_Handler(void) { Uart1_Printf("Usage Fault\n"); /* ์ฝ๋ ์ค๊ณ */ for(;;); } void HardFault_Handler(void) { Uart1_Printf("Hard Fault\n"); /* ์ฝ๋ ์ค๊ณ */ for(;;); } ์ ๋ต ์ฝ๋ void Invalid_ISR(void) { Uart1_Printf("Invalid_Exception: %d!\n", Macro_Extract_Area(SCB->ICSR, 0x1ff, 0)); Uart1_Printf("Invalid_ISR: %d!\n", Macro_Extract_Area(SCB->ICSR, 0x1ff, 0) - 16); for(;;); } void MemManage_Handler(void) { Uart1_Printf("Memory Management Fault\n"); Uart1_Printf("SHCSR: 0x%.8X\n", SCB->SHCSR); Uart1_Printf("ICSR: 0x%.8X\n", SCB->ICSR); Uart1_Printf("CFSR: 0x%.8X\n", SCB->CFSR); Uart1_Printf("MMFAR: 0x%.8X\n", SCB->MMFAR); for(;;); } void BusFault_Handler(void) { Uart1_Printf("Bus Fault\n"); Uart1_Printf("SHCSR: 0x%.8X\n", SCB->SHCSR); Uart1_Printf("ICSR: 0x%.8X\n", SCB->ICSR); Uart1_Printf("CFSR: 0x%.8X\n", SCB->CFSR); Uart1_Printf("BFAR: 0x%.8X\n", SCB->BFAR); for(;;); } void UsageFault_Handler(void) { Uart1_Printf("Usage Fault\n"); Uart1_Printf("SHCSR: 0x%.8X\n", SCB->SHCSR); Uart1_Printf("ICSR: 0x%.8X\n", SCB->ICSR); Uart1_Printf("CFSR: 0x%.8X\n", SCB->CFSR); for(;;); } void HardFault_Handler(void) { Uart1_Printf("Hard Fault\n"); Uart1_Printf("SHCSR: 0x%.8X\n", SCB->SHCSR); Uart1_Printf("ICSR: 0x%.8X\n", SCB->ICSR); Uart1_Printf("HFSR: 0x%.8X\n", SCB->HFSR); Uart1_Printf("CFSR: 0x%.8X\n", SCB->CFSR); Uart1_Printf("BFAR: 0x%.8X\n", SCB->BFAR); Uart1_Printf("MMFAR: 0x%.8X\n", SCB->MMFAR); for(;;); } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex35] AAPCS_C์ธก ์ ์ญ๋ณ์ ๊ณต์ ํจ์ 2
๋ฌธ์ ์ค๋ช @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ void Asm_Var_Access(void); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern a .extern p .extern x .global Asm_Var_Access .type Asm_Var_Access, %function Asm_Var_Access: ์ ๋ต ์ฝ๋ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ void Asm_Var_Access(void); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern a .extern p .extern x .global Asm_Var_Access .type Asm_Var_Access, %function Asm_Var_Access: ldr r0, =a ldr r1, [r0] add r1, r1, #1 str r1, [r0] ldr r0, =p ldr r0, [r0] ldr r1, [r0] add r1, r1, #1 str r1, [r0] mov r2, #4 ldr r0, =x 1: ldr r1, [r0] add r1, r1, #1 str r1, [r0], #4 subs r2, r2, #1 bgt 1b bx lr ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex34] AAPCS_C์ธก ์ ์ญ๋ณ์ ๊ณต์ ํจ์ 1
๋ฌธ์ ์ค๋ช @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ void Asm_Var_Signed_Char(void); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern sc .global Asm_Var_Signed_Char .type Asm_Var_Signed_Char, %function Asm_Var_Signed_Char: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ void Asm_Var_Unsigned_Short(void); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern us .global Asm_Var_Unsigned_Short .type Asm_Var_Unsigned_Short, %function Asm_Var_Unsigned_Short: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ void Asm_Var_Signed_Short(void); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern ss .global Asm_Var_Signed_Short .type Asm_Var_Signed_Short, %function Asm_Var_Signed_Short: ์ ๋ต ์ฝ๋ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ void Asm_Var_Signed_Char(void); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern sc .global Asm_Var_Signed_Char .type Asm_Var_Signed_Char, %function Asm_Var_Signed_Char: ldr r1, =sc ldrsb r0, [r1] add r0, r0, #1 strb r0, [r1] bx lr @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ void Asm_Var_Unsigned_Short(void); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern us .global Asm_Var_Unsigned_Short .type Asm_Var_Unsigned_Short, %function Asm_Var_Unsigned_Short: ldr r1, =us ldrh r0, [r1] add r0, r0, #1 strh r0, [r1] bx lr @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ void Asm_Var_Signed_Short(void); @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern ss .global Asm_Var_Signed_Short .type Asm_Var_Signed_Short, %function Asm_Var_Signed_Short: ldr r1, =ss ldrsh r0, [r1] add r0, r0, #1 strh r0, [r1] bx lr ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex33] AAPCS_Asm_Add_Sqr ํจ์
๋ฌธ์ ์ค๋ช @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ int Asm_Add_Sqr(int a, int b); @ Sqr์ ํธ์ถํ๋ฉด r0-r3,r12๋ ๋ณํ ๊ฐ๋ฅ์ฑ์ด ์์ @ ํ๊ดด ์ฐ๋ ค๊ฐ ์๋ ๋ณ์๋ ๋ํผ์ํด @ leaf function์ด ์๋๋ฏ๋ก lr์ ์ ์ฅํ๋ค @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern Sqr .global Asm_Add_Sqr .type Asm_Add_Sqr, %function Asm_Add_Sqr: @ int Asm_Add_Sqr(int a, int b); @ { @ return (Sqr(a)+Sqr(b)); @ } @ C์ ํจ์์ธ Sqr()์ ์ด์ฉ ์ ๋ต ์ฝ๋ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ int Asm_Add_Sqr(int a, int b); @ Sqr์ ํธ์ถํ๋ฉด r0-r3,r12๋ ๋ณํ ๊ฐ๋ฅ์ฑ์ด ์์ @ ํ๊ดด ์ฐ๋ ค๊ฐ ์๋ ๋ณ์๋ ๋ํผ์ํด @ leaf function์ด ์๋๋ฏ๋ก lr์ ์ ์ฅํ๋ค @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .extern Sqr .global Asm_Add_Sqr .type Asm_Add_Sqr, %function Asm_Add_Sqr: @ int Asm_Add_Sqr(int a, int b); @ { @ return (Sqr(a)+Sqr(b)); @ } @ C์ ํจ์์ธ Sqr()์ ์ด์ฉ push {r4-r6, lr} mov r4, r1 bl Sqr mov r5, r0 mov r0, r4 bl Sqr add r0, r0, r5 pop {r4-r6, pc} ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex32] BOOT_CODE
๋ฌธ์ ์ค๋ช .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .extern __RO_LIMIT__ .extern __RW_base__ .extern __ZI_base__ .extern __ZI_LIMIT__ ldr r0, =__RO_LIMIT__ ldr r1, =__RW_base__ ldr r3, =__ZI_base__ cmp r0, r1 beq 2f 1: @ RW ๋ณต์ฌ ์ฝ๋ ์์ฑ 2: ldr r1, =__ZI_LIMIT__ mov r2, #0x0 3: @ BSS ์ด๊ธฐํ ์ฝ๋ ์์ฑ .extern Main bl Main b . .end ์ ๋ต ์ฝ๋ .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .extern __RO_LIMIT__ .extern __RW_BASE__ .extern __ZI_BASE__ .extern __ZI_LIMIT__ ldr r0, =__RO_LIMIT__ ldr r1, =__RW_BASE__ ldr r3, =__ZI_BASE__ cmp r0, r1 beq 2f 1: cmp r1, r3 ittt lo ldrlo r2, [r0], #4 strlo r2, [r1], #4 blo 1b 2: ldr r1, =__ZI_LIMIT__ mov r2, #0x0 3: cmp r3, r1 itt lo strlo r2, [r3], #4 blo 3b .extern Main bl Main b . .end ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex31] ASM_TOGGLING - 5ํ
๋ฌธ์ ์ค๋ช .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .equ GPIOB_CRH, 0x40010C04 .equ GPIOB_ODR, 0x40010C0C .equ APB2ENR, 0x40021018 @ ์ด๋ถ๋ถ์ ์์ ํ์ง ๋ง ๊ฒ @ LDR r0, =APB2ENR LDR r1, =0x8 STR r1, [r0] @ ์ด๊ธฐ LED ๋ชจ๋ OFF @ LDR r0, =GPIOB_CRH LDR r1, [r0] BIC r1, r1, #0xFF<<0 ORR r1, r1, #0x66<<0 STR r1, [r0] LDR r0, =GPIOB_ODR LDR r1, [r0] ORR r1, r1, #0x3<<8 STR r1, [r0] @ ์ฌ๊ธฐ๋ถํฐ ์ฝ๋ ์์ฑ @ b . .end ์ ๋ต ์ฝ๋ .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .equ GPIOB_CRH, 0x40010C04 .equ GPIOB_ODR, 0x40010C0C .equ APB2ENR, 0x40021018 LDR r0, =APB2ENR LDR r1, =0x8 STR r1, [r0] LDR r0, =GPIOB_CRH LDR r1, [r0] BIC r1, r1, #0xFF<<0 ORR r1, r1, #0x66<<0 STR r1, [r0] LDR r0, =GPIOB_ODR LDR r1, [r0] ORR r1, r1, #0x3<<8 STR r1, [r0] MOV r4, #10 1: LDR r3, =0xFFFFF 2: SUBS r3, r3, #1 BHI 2b LDR r1, [r0] EOR r1, r1, #0x3<<8 STR r1, [r0] SUBS r4, r4, #1 BHI 1b b . .end ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex30] ASM_TOGGLING
๋ฌธ์ ์ค๋ช .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .equ GPIOB_CRH, 0x40010C04 .equ GPIOB_ODR, 0x40010C0C .equ APB2ENR, 0x40021018 @ ์ด๋ถ๋ถ์ ์์ ํ์ง ๋ง ๊ฒ @ LDR r0, =APB2ENR LDR r1, =0x8 STR r1, [r0] @ ์ด๊ธฐ LED ๋ชจ๋ OFF @ LDR r0, =GPIOB_CRH LDR r1, [r0] BIC r1, r1, #0xFF<<0 ORR r1, r1, #0x66<<0 STR r1, [r0] LDR r0, =GPIOB_ODR LDR r1, [r0] ORR r1, r1, #0x3<<8 STR r1, [r0] @ ์ฌ๊ธฐ๋ถํฐ ์ฝ๋ ์์ฑ @ b . .end ์ ๋ต ์ฝ๋ .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .equ GPIOB_CRH, 0x40010C04 .equ GPIOB_ODR, 0x40010C0C .equ APB2ENR, 0x40021018 LDR r0, =APB2ENR LDR r1, =0x8 STR r1, [r0] LDR r0, =GPIOB_CRH LDR r1, [r0] BIC r1, r1, #0xFF<<0 ORR r1, r1, #0x66<<0 STR r1, [r0] LDR r0, =GPIOB_ODR LDR r1, [r0] ORR r1, r1, #0x3<<8 STR r1, [r0] 1: LDR r3, =0xFFFFF 2: SUBS r3, r3, #1 BHI 2b LDR r1, [r0] EOR r1, r1, #0x3<<8 STR r1, [r0] B 1b .end ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex29] ASM_BIT_OP
๋ฌธ์ ์ค๋ช .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .equ GPIOB_CRH, 0x40010C04 .equ GPIOB_ODR, 0x40010C0C .equ APB2ENR, 0x40021018 @ ์ด๋ถ๋ถ์ ์์ ํ์ง ๋ง ๊ฒ @ LDR r0, =APB2ENR LDR r1, =0x8 STR r1, [r0] @ ์ฌ๊ธฐ๋ถํฐ ์ฝ๋ ์์ฑ @ b . .end ์ ๋ต ์ฝ๋ .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .equ GPIOB_CRH, 0x40010C04 .equ GPIOB_ODR, 0x40010C0C .equ APB2ENR, 0x40021018 LDR r0, =APB2ENR LDR r1, =0x8 STR r1, [r0] LDR r0, =GPIOB_CRH LDR r1, [r0] BIC r1, r1, #0xFF<<0 ORR r1, r1, #0x66<<0 STR r1, [r0] LDR r0, =GPIOB_ODR LDR r1, [r0] BIC r1, r1, #0x3<<8 ORR r1, r1, #0x2<<8 STR r1, [r0] b . .end ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex28] ASM_LED_ON
๋ฌธ์ ์ค๋ช .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .equ GPIOB_CRH, 0x40010C04 .equ GPIOB_ODR, 0x40010C0C .equ APB2ENR, 0x40021018 @ ์ด๋ถ๋ถ์ ์์ ํ์ง ๋ง ๊ฒ @ LDR r0, =APB2ENR LDR r1, =0x8 STR r1, [r0] @ ์ฌ๊ธฐ๋ถํฐ ์ฝ๋ ์์ฑ @ b . .end ์ ๋ต ์ฝ๋ .syntax unified .thumb .text .word 0x20005000 .word __start .global __start .type __start, %function __start: .equ GPIOB_CRH, 0x40010C04 .equ GPIOB_ODR, 0x40010C0C .equ APB2ENR, 0x40021018 LDR r0, =APB2ENR LDR r1, =0x8 STR r1, [r0] LDR r0, =GPIOB_CRH LDR r1, =0x66 STR r1, [r0] LDR r0, =GPIOB_ODR LDR r1, =0x0100 STR r1, [r0] b . .end ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex27] ๋ก๋ด ์ด๋ ์๊ฐ ์ธก์
๋ฌธ์ ์ค๋ช ๋ค์ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ๋ง์กฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ [์๊ตฌ ์ฌํญ] ๋ก๋ด์ด ์ด๋์ ์์ํ ๋ KEY0๊ฐ ๋๋ฆฌ๊ณ ๋ชฉ์ ์ง์ ๋๋ฌํ๋ฉด KEY1์ด ๋๋ฆฐ๋ค๊ณ ๊ฐ์ ํ์ KEY0๋ฅผ ๋๋ฅด๊ณ KEY1์ ๋๋ฅด๋ฉด ๊ทธ ๊ฐ๊ฒฉ ์๊ฐ์ UART๋ก ์ธ์ํ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ ๋ค๋ง, KEY0๋ฅผ ๋๋ฅธ ์ํ์์ ๋ค์ KEY0๋ฅผ ๋๋ฅด๋๊ฑด ๋ฌด์ํ๋ค. ์ฆ KEY0๋ฅผ ๋๋ฆฐ ๋ค ๊ทธ ๋๋ถํฐ KEY0๊ฐ ์ฌ๋ฌ๋ฒ ๋๋ ค๋ KEY1์ด ๋๋ฆด๋ ๊น์ง ์๊ฐ๋ง ์ธก์ ๋๋ฉด ๋๋ค ์๊ฐ์ 100msec ๋จ์(์ฆ, 0.1์ด ๋จ์๋ก ์ธก์ ํ๋ฉฐ ๋ฐ์ฌ๋ฆผํ๊ฑฐ๋ ๋ฒ๋ฆผํ๋ ๊ฒ์ ๋ฌด๋ฐฉํ๋ค)๋ก ์ธก์ ํ๋ค. (์๋ฅผ ๋ค์ด ์ค์ ์๊ฐ์ด 3.45์ด ์ผ ๊ฒฝ์ฐ ์ธ์ ๊ฒฐ๊ณผ๊ฐ 3.4 ๋๋ 3.5 ์ด๋ค ๊ฐ์ด๋ ๋ค ์๊ด์๋ค) ์ต๋ ์ธก์ ๊ฐ๋ฅ ์๊ฐ์ ๊ฑฐ์ ๋ฌด์ ํ์ผ๋ก ๋ณธ๋ค ๋ก์ง์๋ ๋ผ์ด์ ธ๋ฅผ KEY0์ KEY1์ ์ฐ๊ฒฐํ์ฌ ์ค์์น ๋๋ฆฐ ์ฌ์ด ์๊ฐ์ ํ์ธํ ์ ์๋๋ก ์ฐ๊ฒฐํ๋ค. [์ ์ถ ์๋ น] ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฐ๋์ ๋์ ํ์ธ์ ๋ฐ์ํ ๊ฐ์ฌ ์ง์์ ์ํ์ฌ ์ฝ๋๋ฅผ ์ ๋ก๋ํด์ผ ํจ ์์๋ก ์ฝ๋ ์ ์ถ์ ํด๋น ๋ฌธํญ 0์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฃผ์ ๋ฐ๋ ๋ค๋ฅธ ํ์ผ์ ์๋ ์์ ๋ ์ ๊ณต ๋๋ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ๋ณต์ฌํ์ฌ ์ ์ถํ ํ์ ์์ (์) LED_Display ํจ์ ๋ฑ ์์ฑ ๋๋ ๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝํ ํ์ผ์ ๋ด์ฉ(์ด ๋ฌธ์ ์ ๊ด๋ จํ ์ฝ๋ ๋ถ๋ถ๋ง)์ ๋ชจ๋ ๋ณต์ฌํ์ฌ ์ ์ถํด์ผ ํ๋ค. ์ ์ถ์์๋ main.c ๋ด์ฉ์ ์ ์ผ ์์ ๋๊ณ ๊ทธ ์๋์ ๋ค๋ฅธ ํ์ผ์ ์ฝ๋๋ฅผ ์ ์ถํ๋ main.c ์ด์ธ ํ์ผ์ ๋ฐ๋์ ํ์ผ๋ช ์ ์ฝ๋ ์์ ์ ๊ณ ๋ณต์ฌํ์ฌ ์ ์ถํ ๊ฒ ์ ๋ต ์ฝ๋ #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); SCB->VTOR = 0x08003000; SCB->SHCSR = 0; } extern volatile int Key_Value; extern volatile int TIM4_Expired; # if 1 void Main(void) { Sys_Init(); Key_ISR_Enable(1); int state = 0; double t = 0; for(;;) { if ((state == 0) && (Key_Value == 1)) { TIM4_Repeat_Interrupt_Enable(1, 100); state = 1; } if ((state == 1) && TIM4_Expired) { t += 0.1; TIM4_Expired = 0; } if ((state == 1) && (Key_Value == 2)) { TIM4_Stop(); Uart1_Printf("%.1f\n", t); state = 0; Key_Value = 0; break; } } } # endif ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex26] ํ์์
๋ฌธ์ ์ค๋ช ๋ค์ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ๋ง์กฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ [์๊ตฌ ์ฌํญ] 3์ด ๋์์ KEY0๊ฐ ๋๋ฆฐ ํ์๋ฅผ ๊ตฌํ์ฌ UART๋ก ์ธ์ํ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ. Chattering ๋ฌธ์ ๋ ๊ณ ๋ คํ ํ์๊ฐ ์์ผ๋ฉฐ ํ๋ก๊ทธ๋จ์ด ์์๋ ํ ์ฒ์ KEY0๊ฐ ๋๋ฆฐ ์์ ๋ถํฐ 3์ด ์ธก์ ์ ์์ํ๋ฉฐ 3์ด๊ฐ ์ข ๋ฃ๋๋ฉด ๊ทธ๋๊น์ง ๋๋ฆฐ KEY0 ํ์๋ฅผ ์ธ์ํ๋ค. ๋จ, KEY0๊ฐ ํ๋ฒ ๋๋ฆฌ๋ฉด ํ๋ฒ๋ง Count ๋์ด์ผ ํ๋ค. ์ฆ, ์ค๋ ๋๋ฆฌ๊ณ ์์ด๋ ํ๋ฒ์ผ๋ก ์ธ์ ๋์ด์ผ ํ๋ค. ์ธํฐ๋ฝํธ ์ฌ์ฉ ์ฌ๋ถ๋ ๋ฌด๋ฐฉํ๋ฉฐ ๋์ ๊ฒ์ฌ๋ฅผ ๋ฐ์ ํ ์ฝ๋๋ฅผ Bash ์ธ์ด๋ก ์ ์ถํ๋ค. [์ ์ถ ์๋ น] ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฐ๋์ ๋์ ํ์ธ์ ๋ฐ์ํ ๊ฐ์ฌ ์ง์์ ์ํ์ฌ ์ฝ๋๋ฅผ ์ ๋ก๋ํด์ผ ํจ ์์๋ก ์ฝ๋ ์ ์ถ์ ํด๋น ๋ฌธํญ 0์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฃผ์ ๋ฐ๋ ๋ค๋ฅธ ํ์ผ์ ์๋ ์์ ๋ ์ ๊ณต ๋๋ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ๋ณต์ฌํ์ฌ ์ ์ถํ ํ์ ์์ (์) LED_Display ํจ์ ๋ฑ ์์ฑ ๋๋ ๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝํ ํ์ผ์ ๋ด์ฉ(์ด ๋ฌธ์ ์ ๊ด๋ จํ ์ฝ๋ ๋ถ๋ถ๋ง)์ ๋ชจ๋ ๋ณต์ฌํ์ฌ ์ ์ถํด์ผ ํ๋ค. ์ ์ถ์์๋ main.c ๋ด์ฉ์ ์ ์ผ ์์ ๋๊ณ ๊ทธ ์๋์ ๋ค๋ฅธ ํ์ผ์ ์ฝ๋๋ฅผ ์ ์ถํ๋ main.c ์ด์ธ ํ์ผ์ ๋ฐ๋์ ํ์ผ๋ช ์ ์ฝ๋ ์์ ์ ๊ณ ๋ณต์ฌํ์ฌ ์ ์ถํ ๊ฒ ์ ๋ต ์ฝ๋ // main.c #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); SCB->VTOR = 0x08003000; SCB->SHCSR = 0; } extern volatile int Key_Value; extern volatile int TIM4_Expired; void Main(void) { Sys_Init(); Key_ISR_Enable(1); int cnt = 0; int state = 0; int pls_state = 0; for(;;) { if (Key_Value) { if (state == 0) { TIM4_Repeat_Interrupt_Enable(1, 1000); state = 1; cnt = 1; } else { cnt++; } Key_Value = 0; } if (TIM4_Expired) { pls_state++; if (pls_state >= 3) { TIM4_Stop(); state = 0; Uart1_Printf("%d\n", cnt); pls_state = 0; } TIM4_Expired = 0; } } } // stm32f10x_it.c volatile int Key_Value = 0; void EXTI9_5_IRQHandler(void) { Key_Value = Macro_Extract_Area(EXTI->PR, 0x1, 6); EXTI->PR = 0x1<<6; NVIC_ClearPendingIRQ(23); } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex25] 3๋จ ๋ฐ๊ธฐ ์กฐ์ ๋จํ
๋ฌธ์ ์ค๋ช ๋ค์ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ๋ง์กฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ [์๊ตฌ ์ฌํญ] ์ฝ๋๊ฐ ์คํ๋๋ฉด PA3์ duty 50%, 1khz ํ์ค๊ฐ ๊ณ์ ์ถ๋ ฅ๋๋ค. KEY0๋ฅผ ๋๋ฅด๋ฉด duty 20%๋ก ๋๊ณ KEY1์ ๋๋ฅด๋ฉด duty 80%๋ก ๋๋ค. ๋จ, duty 20% ์ํ์์ ๋ค์ KEY0๋ฅผ ๋๋ฅด๋ฉด duty๋ 50%๋ก ๋ณต๊ทํด์ผํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก duty 80% ์ํ์์ ๋ค์ KEY1์ ๋๋ฅด๋ฉด duty 50%๋ก ๋ณต๊ทํด์ผํ๋ค. ๋ก์ง์๋ ๋ผ์ด์ ์ PA3์ ์ฐ๊ฒฐํ์ฌ ํํ์ ํ์ธํ๋ค. (์ฃผ์) ํ์ํ ์ฃผ๋ณ์ฅ์น ํด๋ก์ ์์์ Enableํด์ผํ๋ค. [์ ์ถ ์๋ น] ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฐ๋์ ๋์ ํ์ธ์ ๋ฐ์ํ ๊ฐ์ฌ ์ง์์ ์ํ์ฌ ์ฝ๋๋ฅผ ์ ๋ก๋ํด์ผ ํจ ์์๋ก ์ฝ๋ ์ ์ถ์ ํด๋น ๋ฌธํญ 0์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฃผ์ ๋ฐ๋ ๋ค๋ฅธ ํ์ผ์ ์๋ ์์ ๋ ์ ๊ณต ๋๋ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ๋ณต์ฌํ์ฌ ์ ์ถํ ํ์ ์์ (์) LED_Display ํจ์ ๋ฑ ์์ฑ ๋๋ ๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝํ ํ์ผ์ ๋ด์ฉ(์ด ๋ฌธ์ ์ ๊ด๋ จํ ์ฝ๋ ๋ถ๋ถ๋ง)์ ๋ชจ๋ ๋ณต์ฌํ์ฌ ์ ์ถํด์ผ ํ๋ค. ์ ์ถ์์๋ main.c ๋ด์ฉ์ ์ ์ผ ์์ ๋๊ณ ๊ทธ ์๋์ ๋ค๋ฅธ ํ์ผ์ ์ฝ๋๋ฅผ ์ ์ถํ๋ main.c ์ด์ธ ํ์ผ์ ๋ฐ๋์ ํ์ผ๋ช ์ ์ฝ๋ ์์ ์ ๊ณ ๋ณต์ฌํ์ฌ ์ ์ถํ ๊ฒ ์ ๋ต ์ฝ๋ #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); SCB->VTOR = 0x08003000; SCB->SHCSR = 0; } extern volatile int Key_Value; void Main(void) { Sys_Init(); TIM2_Out_Init(); Key_ISR_Enable(1); TIM2_Out_PWM_Generation(1000, 5); int state_key0 = 0; int state_key1 = 0; for(;;) { if (Key_Value) { if (Key_Value == 1) { if (state_key0 == 0) { TIM2_Change_Duty(2); state_key0 = 1; } else { TIM2_Change_Duty(5); state_key0 = 0; } state_key1 = 0; } if (Key_Value == 2) { if (state_key1 == 0) { TIM2_Change_Duty(8); state_key1 = 1; } else { TIM2_Change_Duty(5); state_key1 = 0; } state_key0 = 0; } Key_Value = 0; } } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex24] ๋์งํธ ํผ์๋ ธ
๋ฌธ์ ์ค๋ช ๋ค์ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ๋ง์กฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ [์๊ตฌ ์ฌํญ] PC ํฐ๋ฏธ๋ ํ๋ก๊ทธ๋จ์์ ํค๋ณด๋๋ก 1,2,3,4,5,6,7,8 ์ ๋๋ฅด๋ฉด ๋ ๋ถํฐ ๋์ ๋๊น์ง ์์ 4๋ถ ์ํ๋ก ์ฐ์ฃผํ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ 1์ ๋ 2๋ ๋ 3์ ๋ฏธ โฆ 8์ ๋์ ๋๊ฐ 4๋ถ ์ํ ๊ธธ์ด(500msec) ์ฐ์ฃผ๋์ด์ผ ํ๋ค. ํ๋์ ์์ด ์ฐ์ฃผ๋๋ ๋์ ํค๋ณด๋ ์ ๋ ฅ์ด ์๋ ๊ฒฝ์ฐ ๋ฌด์ํ๋ฉด ๋๋ค. ์ธํฐ๋ฝํธ ์ฌ์ฉ ์ฌ๋ถ๋ ๋ฌด๊ดํ๋ฉฐ ์ฌ๋ฌ ํ์ผ์ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒฝ์ฐ ์์ฑํ ์ฝ๋ ๋ชจ๋ ๋ณต์ฌํ์ฌ Bash ์ธ์ด๋ก ์ ์ถํด์ผ ํ๋ค. [์ ์ถ ์๋ น] ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฐ๋์ ๋์ ํ์ธ์ ๋ฐ์ํ ๊ฐ์ฌ ์ง์์ ์ํ์ฌ ์ฝ๋๋ฅผ ์ ๋ก๋ํด์ผ ํจ ์์๋ก ์ฝ๋ ์ ์ถ์ ํด๋น ๋ฌธํญ 0์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฃผ์ ๋ฐ๋ ๋ค๋ฅธ ํ์ผ์ ์๋ ์์ ๋ ์ ๊ณต ๋๋ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ๋ณต์ฌํ์ฌ ์ ์ถํ ํ์ ์์ (์) LED_Display ํจ์ ๋ฑ ์์ฑ ๋๋ ๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝํ ํ์ผ์ ๋ด์ฉ(์ด ๋ฌธ์ ์ ๊ด๋ จํ ์ฝ๋ ๋ถ๋ถ๋ง)์ ๋ชจ๋ ๋ณต์ฌํ์ฌ ์ ์ถํด์ผ ํ๋ค. ์ ์ถ์์๋ main.c ๋ด์ฉ์ ์ ์ผ ์์ ๋๊ณ ๊ทธ ์๋์ ๋ค๋ฅธ ํ์ผ์ ์ฝ๋๋ฅผ ์ ์ถํ๋ main.c ์ด์ธ ํ์ผ์ ๋ฐ๋์ ํ์ผ๋ช ์ ์ฝ๋ ์์ ์ ๊ณ ๋ณต์ฌํ์ฌ ์ ์ถํ ๊ฒ ์ ๋ต ์ฝ๋ # if 1 // main.c #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); } #define BASE (500) // 4๋ถ ์ํ = 500ms static void Play_Tone(unsigned short freq) { TIM3_Out_Freq_Generation(freq); // PWM ์ถ๋ ฅ ์์ TIM2_Delay(BASE); // 500ms ์ ์ง TIM3_Out_Stop(); } volatile char dummy; void Flush_UART_Buffer(void) { while (Macro_Check_Bit_Set(USART1->SR, 5)) { dummy = USART1->DR; } } void Main(void) { const unsigned short tone_value[] = {261, 293, 329, 349, 392, 440, 493, 523}; char input; Sys_Init(); TIM3_Out_Init(); Uart1_Printf("[8323] C9\n"); while (1) { input = Uart1_Get_Char(); // ์ ๋ ฅ ๋๊ธฐ if (input >= '1' && input <= '8') { int index = input - '1'; Play_Tone(tone_value[index]); Flush_UART_Buffer(); } } } # endif # if 1 // timer.c #define TIM3_FREQ 8000000 #define TIM3_TICK (1000000 / TIM3_FREQ) #define TIME3_PLS_OF_1ms (1000 / TIM3_TICK) #define TIM2_TICK 20 #define TIM2_FREQ (1000000 / TIM2_TICK) #define TIME2_PLS_OF_1ms (1000 / TIM2_TICK) void TIM3_Out_Init(void) { Macro_Set_Bit(RCC->APB1ENR, 1); // TIM3 enable Macro_Set_Bit(RCC->APB2ENR, 3); // GPIOB enable Macro_Write_Block(GPIOB->CRL, 0xf, 0xb, 0); // PB0: Alternate function output Macro_Write_Block(TIM3->CCMR2, 0x7, 0x6, 4); // PWM mode 1 TIM3->CCER = (0 << 9) | (1 << 8); // Output enable } void TIM3_Out_Freq_Generation(unsigned short freq) { TIM3->PSC = (unsigned int)((TIMXCLK / (double)TIM3_FREQ) + 0.5) - 1; TIM3->ARR = (unsigned int)((double)TIM3_FREQ / freq) - 1; TIM3->CCR3 = TIM3->ARR / 2; Macro_Set_Bit(TIM3->EGR, 0); TIM3->CR1 = (1 << 4) | (0 << 3) | (0 << 1) | (1 << 0); } void TIM3_Out_Stop(void) { Macro_Clear_Bit(TIM3->CR1, 0); Macro_Clear_Bit(TIM3->DIER, 0); } void TIM2_Delay(int time_ms) { Macro_Set_Bit(RCC->APB1ENR, 0); TIM2->PSC = (unsigned int)((TIMXCLK / (double)TIM2_FREQ) + 0.5) - 1; TIM2->ARR = TIME2_PLS_OF_1ms * time_ms; Macro_Set_Bit(TIM2->EGR, 0); Macro_Clear_Bit(TIM2->SR, 0); Macro_Set_Bit(TIM2->DIER, 0); Macro_Set_Bit(TIM2->CR1, 0); while (Macro_Check_Bit_Clear(TIM2->SR, 0)); Macro_Clear_Bit(TIM2->CR1, 0); Macro_Clear_Bit(TIM2->DIER, 0); } # endif ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex23] UART Echo-Back ํ๋ฉด์ LED ๊น๋ฐ์ด๊ธฐ
๋ฌธ์ ์ค๋ช ๋ค์ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ๋ง์กฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ [์๊ตฌ ์ฌํญ] UART1์ ํตํ์ฌ PC๋ก๋ถํฐ ์ ๋ ฅ ๋ฐ์ ๊ธ์๋ฅผ ๋ค์ PC๋ก ์ ์กํ๋ค. ํ์ด๋จธ๋ฅผ ์ด์ฉํ์ฌ LED0๋ฅผ 1์ด ON, 1์ด OFF๋ฅผ ๊ณ์ ๋ฐ๋ณตํ๋๋ก ํ๋ค. ํด๋ง ๋ฐ ์ธํฐ๋ฝํธ ์ฌ์ฉ์ฌ๋ถ๋ ๋ฌด๊ดํ๋ค. ๋จ, UART์ ์ ์ถ๋ ฅ ๋์์ LED ๋์๊ณผ ๋ฌด๊ดํ๊ฒ ์ง์ฐ์์ด ๋์๋์ด์ผ ํ๋ค. [์ ์ถ ์๋ น] ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฐ๋์ ๋์ ํ์ธ์ ๋ฐ์ํ ๊ฐ์ฌ ์ง์์ ์ํ์ฌ ์ฝ๋๋ฅผ ์ ๋ก๋ํด์ผ ํจ ์์๋ก ์ฝ๋ ์ ์ถ์ ํด๋น ๋ฌธํญ 0์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฃผ์ ๋ฐ๋ ๋ค๋ฅธ ํ์ผ์ ์๋ ์์ ๋ ์ ๊ณต ๋๋ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ๋ณต์ฌํ์ฌ ์ ์ถํ ํ์ ์์ (์) LED_Display ํจ์ ๋ฑ ์์ฑ ๋๋ ๊ธฐ์กด ์ฝ๋ ๋ณ๊ฒฝํ ํ์ผ์ ๋ด์ฉ(์ด ๋ฌธ์ ์ ๊ด๋ จํ ์ฝ๋ ๋ถ๋ถ๋ง)์ ๋ชจ๋ ๋ณต์ฌํ์ฌ ์ ์ถํด์ผ ํ๋ค. ์ ์ถ์์๋ main.c ๋ด์ฉ์ ์ ์ผ ์์ ๋๊ณ ๊ทธ ์๋์ ๋ค๋ฅธ ํ์ผ์ ์ฝ๋๋ฅผ ์ ์ถํ๋ main.c ์ด์ธ ํ์ผ์ ๋ฐ๋์ ํ์ผ๋ช ์ ์ฝ๋ ์์ ์ ๊ณ ๋ณต์ฌํ์ฌ ์ ์ถํ ๊ฒ ์ ๋ต ์ฝ๋ // main.c #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); SCB->VTOR = 0x08003000; SCB->SHCSR = 0; } void Main(void) { Sys_Init(); Uart1_Printf("UART Echo Mode\n"); Macro_Set_Bit(USART1->CR1, 5); // UART1 ์ธํฐ๋ฝํธ ํ์ฉ NVIC_ClearPendingIRQ(USART1_IRQn); NVIC_EnableIRQ(USART1_IRQn); while (1) { LED_Display(1); TIM2_Delay(1000); LED_Display(0); TIM2_Delay(1000); } } // stm32f10x_it.c void USART1_IRQHandler(void) { if (USART1->SR & (1 << 5)) { char ch = USART1->DR; while (!(USART1->SR & (1 << 7))); USART1->DR = ch; } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex22] ๋นํธ ๊ณ์ฐ AI
๋ฌธ์ ์ค๋ช ๋ค์ ์ฃผ์ด์ง ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ func ํจ์๋ฅผ ์ค๊ณํ๋ผ. ๋จ, func ํจ์ ์ด์ธ ๋ค๋ฅธ ์ฝ๋๋ ์ ๋ ์์ ํ๋ฉด ์๋๋ค. [์๊ตฌ ์ฌํญ] ํจ์ func๋ ์ ์ x๋ฅผ ์ ๋ ฅ ๋ฐ๊ณ ์ ์๋ฅผ ๋ฆฌํดํ๋ค. x์ 0๋ฒ ๋นํธ๋ฅผ 0์ผ๋ก ๋ง๋ ๋ค. x์ 4,5,6,7๋ฒ ๋นํธ๋ฅผ 1๋ก ๋ง๋ ๋ค. x์ 23๋ฒ ๋นํธ๋ฅผ ๋ฐ์ ์ํจ๋ค. ๋ค๋ฅธ ๋นํธ๋ ์๋ ๊ฐ์ ์ ์งํด์ผํ๋ค. ๋ณ๊ฒฝ๋ x๊ฐ์ ๋ฆฌํดํ๋ค. ๋จ, ์ฝ๋๊ฐ ์ ์์ ์ด๋ผ๋ฉด ์๋์ ๊ฐ์ ๊ฐ์ด ์ธ์ ๋์ด์ผ ํ๋ค. #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); Uart_Init(115200); } unsigned int func(unsigned int x) { // ์ฝ๋ ๊ตฌํ return x; } void Main(void) { Sys_Init(); Uart_Printf("0x%.8X\n", func(0xFFFFFFFFu)); Uart_Printf("0x%.8X\n", func(0x00000000u)); Uart_Printf("0x%.8X\n", func(0x55555555u)); Uart_Printf("0x%.8X\n", func(0xCCCCCCCCu)); Uart_Printf("0x%.8X\n", func(0xAAAAAAAAu)); Uart_Printf("0x%.8X\n", func(0x33333333u)); } [์ถ๋ ฅ๊ฐ] 0xFF7FFFFE 0x008000F0 0x55D555F4 0xCC4CCCFC 0xAA2AAAFA 0x33B333F2 [์ ์ถ ์๋ น] ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฐ๋์ ๋์ ํ์ธ์ ๋ฐ์ํ ๊ฐ์ฌ ์ง์์ ์ํ์ฌ ์ฝ๋๋ฅผ ์ ๋ก๋ํด์ผํจ ์์๋ก ์ฝ๋ ์ ์ถ์ ํด๋น ๋ฌธํญ 0์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฃผ์ ๋ฐ๋ ์ ์ฝ๋๋ฅผ main.c์ ๋ณต์ฌํ์ฌ ์์ฑํ ๊ฒ ๋ค๋ฅธ ํ์ผ์ ์๋ ์์ ๋ ์ฌ์ฉํ ์ฝ๋ ๋ฑ์ ํธ์ถํ์ฌ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋์ ์ด๋ํ์ฌ ์ฌ์ฉํ ๊ฒ ์ฝ๋๋ main.c์ ์ ์ฒด๋ฅผ ๋ณต์ฌํ์ฌ ์ ์ถํ ๊ฒ ์ ๋ต ์ฝ๋ #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); Uart_Init(115200); } unsigned int func(unsigned int x) { Macro_Clear_Bit(x, 0); Macro_Write_Block(x, 0xf, 0xf, 4); Macro_Invert_Bit(x, 23); return x; } void Main(void) { Sys_Init(); Uart_Printf("0x%.8X\n", func(0xFFFFFFFFu)); Uart_Printf("0x%.8X\n", func(0x00000000u)); Uart_Printf("0x%.8X\n", func(0x55555555u)); Uart_Printf("0x%.8X\n", func(0xCCCCCCCCu)); Uart_Printf("0x%.8X\n", func(0xAAAAAAAAu)); Uart_Printf("0x%.8X\n", func(0x33333333u)); } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex21] ํ๊ฐ๋ฌธ์ 2
๋ฌธ์ ์ค๋ช ๋ค์ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ๋ง์กฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ [์๊ตฌ ์ฌํญ] ๋ณด๋์ KEY0๋ฅผ ๋๋ฅด๋ฉด B Port 0๋ฒ ํ(PB0)์ 1๋ก KEY0๋ฅผ ๋ผ๋ฉด PPB0๋ฅผ 0์ผ๋ก ์ถ๋ ฅํ๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ ๋ก์ง์๋ ๋ผ์ด์ ธ ์์์ ์ฑ๋์ KEY0 ์ ํธ์ PB0๋ฅผ ์ฐ๊ฒฐํ๋ค KEY0 ์ ํธ๋ฅผ Falling Edge Trigger๋ก ์ค์ ํ ํ KEY0์ PB0 ํํ์ ํ์ธํ ์ ์๋๋ก ํด์ผ ํ๋ค. (์ฃผ์) B ํฌํธ์ ํด๋ก์ด ํ์ฑํ(์ ์ ์ธ๊ฐ)๋์ด์ผ ํ๋ฏ๋ก ๋ค์ ์ฝ๋๋ฅผ ๊ผญ ์์๋ถ๋ถ์ ์ถ๊ฐํ๋ค. RCC_APB2ENR |= (1<<3); [์ ์ถ ์๋ น] ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฐ๋์ ๋์ ํ์ธ์ ๋ฐ์ํ ๊ฐ์ฌ ์ง์์ ์ํ์ฌ ์ฝ๋๋ฅผ ์ ๋ก๋ํด์ผํจ ์์๋ก ์ฝ๋ ์ ์ถ์ ํด๋น ๋ฌธํญ 0์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฃผ์ ๋ฐ๋ ๋ชจ๋ ์ฝ๋๋ main.c ํ๋์ ํ์ผ์๋ง ์์ฑํ ๊ฒ ๋ค๋ฅธ ํ์ผ์ ์๋ ์์ ๋ ์ ๊ณต ๋๋ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ๋ณต์ฌํ์ฌ ์ ์ถํ ํ์ ์์ (์) LED_Display ํจ์ ๋ฑ ์ฝ๋๋ ์์ฑํ main.c์ ์ ์ฒด๋ฅผ ๋ณต์ฌํ์ฌ ์ ์ถํ ๊ฒ (๋ค๋ง ์์ฑ ์ฝ๋์ ๋ฌด๊ดํ ๊ธฐ์กด ์ฝ๋๋ ์ ๊ฑฐํ ๊ฒ) ์ ๋ต ์ฝ๋ #include "device_driver.h" void Key_Init(void) { Macro_Write_Block(GPIOB->CRL, 0xf, 0x8, 24); Macro_Set_Bit(GPIOB->ODR, 6); } void LED_Init(void) { Macro_Write_Block(GPIOB->CRL, 0xf, 0x2, 0); Macro_Clear_Bit(GPIOB->ODR, 0); } #define N 10000 int Key_Get_Pressed(void) { int cnt = 0; int before = Macro_Extract_Area(GPIOB->IDR, 0x1, 6); while (1) { int after = Macro_Extract_Area(GPIOB->IDR, 0x1, 6); if (after == before) { cnt++; if (cnt >= N) return after == 0 ? 1 : 0; } else { cnt = 0; before = after; } } } static void Sys_Init(void) { Key_Init(); LED_Init(); Uart_Init(115200); } void Main(void) { Macro_Set_Bit(RCC->APB2ENR, 3); Sys_Init(); int interlock = 0; for (;;) { if ((interlock == 0) && (Key_Get_Pressed() == 1)) { Macro_Set_Bit(GPIOB->ODR, 0); interlock = 1; } else if ((interlock == 1) && (Key_Get_Pressed() == 0)) { Macro_Clear_Bit(GPIOB->ODR, 0); interlock = 0; } } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex20] ํ๊ฐ๋ฌธ์ 1
๋ฌธ์ ์ค๋ช ๋ค์ ์๊ตฌํ๋ ๊ธฐ๋ฅ์ ๋ง์กฑํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ผ [์๊ตฌ ์ฌํญ] LCD ๋ณด๋์ ๋ฐฉํฅํค(JOG)์ DOWN Key๋ PB5๋ฒ์ ์ฐ๊ฒฐ๋์ด ์๋ค. ๋จ, ์ด KEY๋ Pullup ์ ํญ์ ์ฐ๊ฒฐํ์ง ์์ ์ํ๋ผ ๋๋ฅด๋ฉด GND์ ์ฐ๊ฒฐ๋์ด 0์ด์ง๋ง ๋ผ๋ฉด Floating ์ํ๊ฐ ๋๋ค. ์ด JOG์ DWON Key๋ฅผ ๋๋ฅด๋ฉด LED0์ด ON๋๊ณ ๋ผ๋ฉด OFF๊ฐ ๋๋ ์ฝ๋๋ฅผ ๊ตฌํํ๋ผ (์ฃผ์) ์ธ๋ถ์ Pullup ์ ํญ์ด ์์ผ๋ฏ๋ก ๋ง์ด์ปด ๋ด๋ถ์ Pullup ์ ํญ์ ์ฌ์ฉํ๋๋ก ์ค์ ํ์ฌ์ผ ํ๋ค. ๋ด๋ถ Pullup ์ฌ์ฉ์ ๊ต์ฌ 221 ํ์ด์ง ํ๋ฅผ ์ฐธ๊ณ ํ๋ผ (Input Pullup, Pulldown ๋ชจ๋ 1000์ผ๋ก ์ค์ ํ๋ ODR ๋ ์ง์คํฐ์ ํด๋น ๋นํธ๋ฅผ 0์ผ๋ก ํ๋ฉด Pull-down, 1๋กํ๋ฉด Pull-up ์ฌ์ฉ์ด enable ๋๋ค.) (์ฃผ์) B ํฌํธ์ ํด๋ก์ด ํ์ฑํ(์ ์ ์ธ๊ฐ)๋์ด์ผ ํ๋ฏ๋ก ๋ค์ ์ฝ๋๋ฅผ ๊ผญ ์์๋ถ๋ถ์ ์ถ๊ฐํ๋ค. RCC_APB2ENR |= (1<<3); [์ ์ถ ์๋ น] ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฐ๋์ ๋์ ํ์ธ์ ๋ฐ์ํ ๊ฐ์ฌ ์ง์์ ์ํ์ฌ ์ฝ๋๋ฅผ ์ ๋ก๋ํด์ผ ํจ ์์๋ก ์ฝ๋ ์ ์ถ์ ํด๋น ๋ฌธํญ 0์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ฃผ์ ๋ฐ๋ ๋ชจ๋ ์ฝ๋๋ main.c ํ๋์ ํ์ผ์๋ง ์์ฑํ ๊ฒ ๋ค๋ฅธ ํ์ผ์ ์๋ ์์ ๋ ์ ๊ณต ๋๋ ์์ฑํ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ ๋ณต์ฌํ์ฌ ์ ์ถํ ํ์ ์์ (์) LED_Display ํจ์ ๋ฑ ์ฝ๋๋ ์์ฑํ main.c์ ์ ์ฒด๋ฅผ ๋ณต์ฌํ์ฌ ์ ์ถํ ๊ฒ (๋ค๋ง ์์ฑ ์ฝ๋์ ๋ฌด๊ดํ ๊ธฐ์กด ์ฝ๋๋ ์ ๊ฑฐํ ๊ฒ) ์ ๋ต ์ฝ๋ #include "device_driver.h" void Main(void) { Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRL, 0xf, 0x8, 20); Macro_Set_Bit(GPIOB->ODR, 5); Macro_Write_Block(GPIOB->CRH, 0xf, 0x6, 0); Macro_Set_Bit(GPIOB->ODR, 8); while (1) { if (Macro_Check_Bit_Clear(GPIOB->IDR, 5)) Macro_Clear_Bit(GPIOB->ODR, 8); else Macro_Set_Bit(GPIOB->ODR, 8); } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex19] TIMER_EVENT_LAB
๋ฌธ์ ์ค๋ช // timer.c void TIM4_Repeat_Interrupt_Enable(int en, int time) { if(en) { Macro_Set_Bit(RCC->APB1ENR, 2); TIM4->CR1 = (1<<4)|(0<<3); TIM4->PSC = (unsigned int)(TIMXCLK/(double)TIM4_FREQ + 0.5)-1; TIM4->ARR = TIME4_PLS_OF_1ms * time; Macro_Set_Bit(TIM4->EGR,0); // TIM4->SR ๋ ์ง์คํฐ์์ Timer Pending Clear // NVIC์์ 30๋ฒ ์ธํฐ๋ฝํธ Pending Clear => NVIC์ฉ Macro ์ฌ์ฉ // TIM4->DIER ๋ ์ง์คํฐ์์ Timer ์ธํฐ๋ฝํธ ํ์ฉ // NVIC์์ 30๋ฒ ์ธํฐ๋ฝํธ๋ฅผ ํ์ฉ์ผ๋ก ์ค์ => NVIC์ฉ Macro ์ฌ์ฉ // TIM4 Start } else { NVIC_DisableIRQ(30); Macro_Clear_Bit(TIM4->CR1, 0); Macro_Clear_Bit(TIM4->DIER, 0); } } ์ ๋ต ์ฝ๋ void TIM4_Repeat_Interrupt_Enable(int en, int time) { if(en) { Macro_Set_Bit(RCC->APB1ENR, 2); TIM4->CR1 = (1<<4)|(0<<3); TIM4->PSC = (unsigned int)(TIMXCLK/(double)TIM4_FREQ + 0.5)-1; TIM4->ARR = TIME4_PLS_OF_1ms * time; Macro_Set_Bit(TIM4->EGR,0); Macro_Clear_Bit(TIM4->SR, 0); NVIC_ClearPendingIRQ(30); Macro_Set_Bit(TIM4->DIER, 0); NVIC_EnableIRQ(30); Macro_Set_Bit(TIM4->CR1, 0); } else { NVIC_DisableIRQ(30); Macro_Clear_Bit(TIM4->CR1, 0); Macro_Clear_Bit(TIM4->DIER, 0); } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex18] EXTI_IRQ_LAB
๋ฌธ์ ์ค๋ช // main.c #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); SCB->VTOR = 0x08003000; SCB->SHCSR = 0; } void Main(void) { Sys_Init(); Uart1_Printf("EXTI Test\n"); // AFIO, Port-B Clock Enable // PB[7:6]์ ์ ๋ ฅ์ผ๋ก ์ ์ธ // PB[7:6]์ EXTI ์์ค๋ก ์ค์ ํ๊ณ Falling edge ์ ํ, EXTI[7:6] ์ธํฐ๋ฝํธ ํ์ฉ // EXTI[7:6] Pending Clear ๋ฐ NVIC์ ์ธํฐ๋ฝํธ Pending clear // EXTI9_5 ์ธํฐ๋ฝํธ ํ์ฉ for(;;) { LED_Display(1); TIM2_Delay(500); LED_Display(2); TIM2_Delay(500); } } // stm32f10x_it.c void EXTI9_5_IRQHandler(void) { // EXTI Pending์ ํ์ธํ์ฌ ๋๋ฆฐํค์ ๋ฒํธ๋ฅผ UART๋ก ์ถ๋ ฅํ๋ค // EXTI[7:6] pending ๋ฐ IRQ(EXTI9_5)์ pending clear } ์ ๋ต ์ฝ๋ /* stm32f10x_it.c */ void EXTI9_5_IRQHandler(void) { int x = Macro_Extract_Area(EXTI->PR, 0x3, 6); Uart1_Printf("%d\n", x); EXTI->PR = 0x3 << 6; NVIC_ClearPendingIRQ(23); } /* main.c */ void Main(void) { Sys_Init(); Uart1_Printf("EXTI Test\n"); Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Set_Bit(RCC->APB2ENR, 0); Macro_Write_Block(GPIOB->CRL, 0xFF, 0x44, 24); Macro_Write_Block(AFIO->EXTICR[1], 0xFF, 0x11, 8); Macro_Set_Area(EXTI->FTSR, 0x3, 6); EXTI->PR = 0x3 << 6; Macro_Set_Area(EXTI->IMR, 0x3, 6); NVIC_ClearPendingIRQ(23); NVIC_EnableIRQ(23); for(;;) { LED_Display(1); TIM2_Delay(500); LED_Display(2); TIM2_Delay(500); } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex17] TIMER_OUTPUT_LAB
๋ฌธ์ ์ค๋ช // timer.c #define TIM3_FREQ (8000000) // Hz #define TIM3_TICK (1000000/TIM3_FREQ) // usec #define TIME3_PLS_OF_1ms (1000/TIM3_TICK) void TIM3_Out_Init(void) { Macro_Set_Bit(RCC->APB1ENR, 1); Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRL,0xf,0xb,0); Macro_Write_Block(TIM3->CCMR2,0x7,0x6,4); TIM3->CCER = (0<<9)|(1<<8); } void TIM3_Out_Freq_Generation(unsigned short freq) { // Timer ์ฃผํ์๊ฐ TIM3_FREQ๊ฐ ๋๋๋ก PSC ์ค์ // ์์ฒญํ ์ฃผํ์๊ฐ ๋๋๋ก ARR ์ค์ // Duty Rate 50%๊ฐ ๋๋๋ก CCR3 ์ค์ // Manual Update(UG ๋ฐ์) // Down Counter, Repeat Mode, Timer Start } void TIM3_Out_Stop(void) { Macro_Clear_Bit(TIM3->CR1, 0); Macro_Clear_Bit(TIM3->DIER, 0); } ์ ๋ต ์ฝ๋ #define TIM3_FREQ (8000000) // Hz #define TIM3_TICK (1000000/TIM3_FREQ) // usec #define TIME3_PLS_OF_1ms (1000/TIM3_TICK) void TIM3_Out_Init(void) { Macro_Set_Bit(RCC->APB1ENR, 1); Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRL,0xf,0xb,0); Macro_Write_Block(TIM3->CCMR2,0x7,0x6,4); TIM3->CCER = (0<<9)|(1<<8); } void TIM3_Out_Freq_Generation(unsigned short freq) { TIM3->PSC = (unsigned int)(TIMXCLK/(double)TIM3_FREQ + 0.5)-1; TIM3->ARR = (double)TIM3_FREQ/freq-1; TIM3->CCR3 = TIM3->ARR/2; Macro_Set_Bit(TIM3->EGR,0); TIM3->CR1 = (1<<4)|(0<<3)|(0<<1)|(1<<0); } void TIM3_Out_Stop(void) { Macro_Clear_Bit(TIM3->CR1, 0); Macro_Clear_Bit(TIM3->DIER, 0); } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex16] TIMER_DRIVER_LAB #3 TIM4 repeat timeout test
๋ฌธ์ ์ค๋ช // timer.c void TIM4_Repeat(int time) { Macro_Set_Bit(RCC->APB1ENR, 2); // TIM4 CR1: ARPE=0, down counter, repeat mode // PSC(50KHz), ARR(reload์ ๊ฐ) ์ค์ // UG ์ด๋ฒคํธ ๋ฐ์ // Update Interrupt Pending Clear // Update Interrupt Enable // TIM4 start } int TIM4_Check_Timeout(void) { // ํ์ด๋จธ๊ฐ timeout ์ด๋ฉด 1 ๋ฆฌํด, ์๋๋ฉด 0 ๋ฆฌํด } void TIM4_Stop(void) { Macro_Clear_Bit(TIM4->CR1, 0); Macro_Clear_Bit(TIM4->DIER, 0); Macro_Clear_Bit(RCC->APB1ENR, 2); } ์ ๋ต ์ฝ๋ #include "device_driver.h" #define TIM2_TICK (20) // usec #define TIM2_FREQ (1000000/TIM2_TICK) // Hz #define TIME2_PLS_OF_1ms (1000/TIM2_TICK) #define TIM2_MAX (0xffffu) #define TIM4_TICK (20) // usec #define TIM4_FREQ (1000000/TIM4_TICK) // Hz #define TIME4_PLS_OF_1ms (1000/TIM4_TICK) #define TIM4_MAX (0xffffu) void TIM2_Stopwatch_Start(void) { Macro_Set_Bit(RCC->APB1ENR, 0); TIM2->CR1 = (1<<4)|(1<<3); TIM2->PSC = (unsigned int)(TIMXCLK/50000.0 + 0.5)-1; TIM2->ARR = TIM2_MAX; Macro_Set_Bit(TIM2->EGR,0); Macro_Set_Bit(TIM2->CR1, 0); } unsigned int TIM2_Stopwatch_Stop(void) { unsigned int time; Macro_Clear_Bit(TIM2->CR1, 0); time = (TIM2_MAX - TIM2->CNT) * TIM2_TICK; return time; } /* Delay Time Max = 65536 * 20use = 1.3sec */ #if 0 void TIM2_Delay(int time) { Macro_Set_Bit(RCC->APB1ENR, 0); TIM2->CR1 = (1<<4)|(1<<3); TIM2->PSC = (unsigned int)(TIMXCLK/(double)TIM2_FREQ + 0.5)-1; TIM2->ARR = TIME2_PLS_OF_1ms * time; Macro_Set_Bit(TIM2->EGR,0); Macro_Clear_Bit(TIM2->SR, 0); Macro_Set_Bit(TIM2->DIER, 0); Macro_Set_Bit(TIM2->CR1, 0); while(Macro_Check_Bit_Clear(TIM2->SR, 0)); Macro_Clear_Bit(TIM2->CR1, 0); Macro_Clear_Bit(TIM2->DIER, 0); } #else /* Delay Time Extended */ void TIM2_Delay(int time) { int i; unsigned int t = TIME2_PLS_OF_1ms * time; Macro_Set_Bit(RCC->APB1ENR, 0); TIM2->PSC = (unsigned int)(TIMXCLK/(double)TIM2_FREQ + 0.5)-1; TIM2->CR1 = (1<<4)|(1<<3); TIM2->ARR = 0xffff; Macro_Set_Bit(TIM2->EGR,0); Macro_Set_Bit(TIM2->DIER, 0); for(i=0; i<(t/0xffffu); i++) { Macro_Set_Bit(TIM2->EGR,0); Macro_Clear_Bit(TIM2->SR, 0); Macro_Set_Bit(TIM2->CR1, 0); while(Macro_Check_Bit_Clear(TIM2->SR, 0)); } TIM2->ARR = t % 0xffffu; Macro_Set_Bit(TIM2->EGR,0); Macro_Clear_Bit(TIM2->SR, 0); Macro_Set_Bit(TIM2->CR1, 0); while (Macro_Check_Bit_Clear(TIM2->SR, 0)); Macro_Clear_Bit(TIM2->CR1, 0); Macro_Clear_Bit(TIM2->DIER, 0); } #endif void TIM4_Repeat(int time) { Macro_Set_Bit(RCC->APB1ENR, 2); TIM4->CR1 = (1<<4)|(0<<3); TIM4->PSC = (unsigned int)(TIMXCLK/(double)TIM4_FREQ + 0.5)-1; TIM4->ARR = TIME4_PLS_OF_1ms * time - 1; Macro_Set_Bit(TIM4->EGR,0); Macro_Clear_Bit(TIM4->SR, 0); Macro_Set_Bit(TIM4->DIER, 0); Macro_Set_Bit(TIM4->CR1, 0); } int TIM4_Check_Timeout(void) { if(Macro_Check_Bit_Set(TIM4->SR, 0)) { Macro_Clear_Bit(TIM4->SR, 0); return 1; } else { return 0; } } void TIM4_Stop(void) { Macro_Clear_Bit(TIM4->CR1, 0); Macro_Clear_Bit(TIM4->DIER, 0); } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex15] TIMER_DRIVER_LAB #2 TIM2 delay test
๋ฌธ์ ์ค๋ช // timer.c void TIM2_Delay(int time) { Macro_Set_Bit(RCC->APB1ENR, 0); // TIM2 CR1 ์ค์ : down count, one pulse // PSC ์ด๊ธฐ๊ฐ ์ค์ => 20usec tick์ด ๋๋๋ก ์ค๊ณ (50KHz) // ARR ์ด๊ธฐ๊ฐ ์ค์ => ์์ฒญํ time msec์ ํด๋นํ๋ ์ด๊ธฐ๊ฐ ์ค์ // UG ์ด๋ฒคํธ ๋ฐ์ // Update Interrupt Pending Clear // Update Interrupt Enable // TIM2 start // Wait timeout // Stop and Power off Macro_Clear_Bit(TIM2->CR1, 0); Macro_Clear_Bit(TIM2->DIER, 0); } ์ ๋ต ์ฝ๋ #include "device_driver.h" #define TIM2_TICK (20) // usec #define TIM2_FREQ (1000000/TIM2_TICK) // Hz #define TIME2_PLS_OF_1ms (1000/TIM2_TICK) #define TIM2_MAX (0xffffu) #define TIM4_TICK (20) // usec #define TIM4_FREQ (1000000/TIM4_TICK) // Hz #define TIME4_PLS_OF_1ms (1000/TIM4_TICK) #define TIM4_MAX (0xffffu) void TIM2_Stopwatch_Start(void) { Macro_Set_Bit(RCC->APB1ENR, 0); TIM2->CR1 = (1<<4)|(1<<3); TIM2->PSC = (unsigned int)(TIMXCLK/50000.0 + 0.5)-1; TIM2->ARR = TIM2_MAX; Macro_Set_Bit(TIM2->EGR,0); Macro_Set_Bit(TIM2->CR1, 0); } unsigned int TIM2_Stopwatch_Stop(void) { unsigned int time; Macro_Clear_Bit(TIM2->CR1, 0); time = (TIM2_MAX - TIM2->CNT) * TIM2_TICK; return time; } #if 1 /* Delay Time Max = 65536 * 20use = 1.3sec */ void TIM2_Delay(int time) { Macro_Set_Bit(RCC->APB1ENR, 0); TIM2->CR1 = (1<<4)|(1<<3); TIM2->PSC = (unsigned int)(TIMXCLK/(double)TIM2_FREQ + 0.5)-1; TIM2->ARR = TIME2_PLS_OF_1ms * time; Macro_Set_Bit(TIM2->EGR,0); Macro_Clear_Bit(TIM2->SR, 0); Macro_Set_Bit(TIM2->DIER, 0); Macro_Set_Bit(TIM2->CR1, 0); while(Macro_Check_Bit_Clear(TIM2->SR, 0)); Macro_Clear_Bit(TIM2->CR1, 0); Macro_Clear_Bit(TIM2->DIER, 0); } #endif #if 0 /* Delay Time Extended */ void TIM2_Delay(int time) { int i; unsigned int t = TIME2_PLS_OF_1ms * time; Macro_Set_Bit(RCC->APB1ENR, 0); TIM2->PSC = (unsigned int)(TIMXCLK/(double)TIM2_FREQ + 0.5)-1; TIM2->CR1 = (1<<4)|(1<<3); TIM2->ARR = 0xffff; Macro_Set_Bit(TIM2->EGR,0); Macro_Set_Bit(TIM2->DIER, 0); for(i=0; i<(t/0xffffu); i++) { Macro_Set_Bit(TIM2->EGR,0); Macro_Clear_Bit(TIM2->SR, 0); Macro_Set_Bit(TIM2->CR1, 0); while(Macro_Check_Bit_Clear(TIM2->SR, 0)); } TIM2->ARR = t % 0xffffu; Macro_Set_Bit(TIM2->EGR,0); Macro_Clear_Bit(TIM2->SR, 0); Macro_Set_Bit(TIM2->CR1, 0); while (Macro_Check_Bit_Clear(TIM2->SR, 0)); Macro_Clear_Bit(TIM2->CR1, 0); Macro_Clear_Bit(TIM2->DIER, 0); } #endif ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex14] TIMER_DRIVER_LAB #1 TIM2 stopwatch test
๋ฌธ์ ์ค๋ช // timer.c void TIM2_Stopwatch_Start(void) { Macro_Set_Bit(RCC->APB1ENR, 0); // TIM2 CR1 ์ค์ : down count, one pulse // PSC ์ด๊ธฐ๊ฐ ์ค์ => 20usec tick์ด ๋๋๋ก ์ค๊ณ (50KHz) // ARR ์ด๊ธฐ๊ฐ ์ค์ => ์ต๋๊ฐ 0xFFFF ์ค์ // UG ์ด๋ฒคํธ ๋ฐ์ // TIM2 start } unsigned int TIM2_Stopwatch_Stop(void) { unsigned int time; // TIM2 stop // CNT ์ด๊ธฐ ์ค์ ๊ฐ (0xffff)์ ํ์ฌ CNT์ ํ์ค์ ์ฐจ์ด๋ฅผ ๊ตฌํ๊ณ // ๊ทธ ํ์ค์ ํ๋๊ฐ 20usec์ด๋ฏ๋ก 20์ ๊ณฑํ๊ฐ์ time์ ์ ์ฅ // ๊ณ์ฐ๋ time ๊ฐ์ ๋ฆฌํด(๋จ์๋ usec) } ์ ๋ต ์ฝ๋ #define TIM2_TICK 20 // usec #define TIM2_FREQ (1000000./TIM2_TICK) // Hz #define TIM2_CNT_MAX 0xFFFF void TIM2_Stopwatch_Start(void) { Macro_Set_Bit(RCC->APB1ENR, 0); // TIM2 CR1 ์ค์ : down count, one pulse TIM2->CR1 = (0x3<<3); // PSC ์ด๊ธฐ๊ฐ ์ค์ => 20usec tick์ด ๋๋๋ก ์ค๊ณ (50KHz) TIM2->PSC = (int)((TIMXCLK / TIM2_FREQ) + 0.5) - 1; // ARR ์ด๊ธฐ๊ฐ ์ค์ => ์ต๋๊ฐ 0xFFFF ์ค์ TIM2->ARR = TIM2_CNT_MAX; // UG ์ด๋ฒคํธ ๋ฐ์ Macro_Set_Bit(TIM2->EGR, 0); // TIM2 start Macro_Set_Bit(TIM2->CR1, 0); } unsigned int TIM2_Stopwatch_Stop(void) { unsigned int time; // TIM2 stop Macro_Clear_Bit(TIM2->CR1, 0); // CNT ์ด๊ธฐ ์ค์ ๊ฐ (0xffff)์ ํ์ฌ CNT์ ํ์ค์ ์ฐจ์ด๋ฅผ ๊ตฌํ๊ณ // ๊ทธ ํ์ค์ ํ๋๊ฐ 20usec์ด๋ฏ๋ก 20์ ๊ณฑํ๊ฐ์ time์ ์ ์ฅ time = (TIM2->ARR - TIM2->CNT) * TIM2_TICK; // ๊ณ์ฐ๋ time ๊ฐ์ ๋ฆฌํด(๋จ์๋ usec) return time; } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex13] SYSTICK_TIMER_LAB
๋ฌธ์ ์ค๋ช // systick.c #include "device_driver.h" void SysTick_Run(unsigned int msec) { // Timer ์ค์ : ์ธํฐ๋ฝํธ ๋ฐ์ ์ํจ, clock source๋ HCLK/8, Timer ์ ์ง // ์ฃผ์ด์ง msec ๊ฐ ๋งํผ์ msec๋ฅผ countํ๋ ์ด๊ธฐ๊ฐ ์ค์ (LOAD) // VAL ๋ ์ง์คํฐ ๊ฐ ์ด๊ธฐํ(0) ๋ฐ COUNTFLAG Clear // Timer Start (์์์ด ๋๋ฉด ์๋์ผ๋ก LOAD์ ๊ฐ์ VAL๋ก ๊ฐ์ ธ๊ฐ๋ค) } int SysTick_Check_Timeout(void) { // Timer์ Timeout์ด ๋ฐ์ํ๋ฉด ์ฐธ(1)๋ฆฌํด, ์๋๋ฉด ๊ฑฐ์ง(0) ๋ฆฌํด } unsigned int SysTick_Get_Time(void) { // Timer์ ํ์ฌ count ๊ฐ ๋ฆฌํด } unsigned int SysTick_Get_Load_Time(void) { // Timer์ ์ค์ ๋ ์ด๊ธฐ๊ฐ์ ๋ฆฌํด } void SysTick_Stop(void) { // Timer Stop } ์ ๋ต ์ฝ๋ #include "device_driver.h" void SysTick_Run(unsigned int msec) { SysTick->CTRL = (0<<2)+(0<<1)+(0<<0); SysTick->LOAD = (unsigned int)((HCLK/(8.*1000.))*msec+0.5); SysTick->VAL = 0; Macro_Set_Bit(SysTick->CTRL, 0); } int SysTick_Check_Timeout(void) { return ((SysTick->CTRL >> 16) & 0x1); } unsigned int SysTick_Get_Time(void) { return SysTick->VAL; } unsigned int SysTick_Get_Load_Time(void) { return SysTick->LOAD; } void SysTick_Stop(void) { SysTick->CTRL = 0<<0; } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex12] UART_DRIVER_LAB
๋ฌธ์ ์ค๋ช // uart.c #include "device_driver.h" #include <stdio.h> #include <stdarg.h> #include <string.h> #include <stdlib.h> #include <ctype.h> void Uart1_Init(int baud) { double div; unsigned int mant; unsigned int frac; Macro_Set_Bit(RCC->APB2ENR, 2); Macro_Set_Bit(RCC->APB2ENR, 14); Macro_Write_Block(GPIOA->CRH, 0xff, 0x8a, 4); Macro_Set_Bit(GPIOA->ODR, 10); div = PCLK2/(16. * baud); mant = (int)div; frac = (int)((div - mant) * 16. + 0.5); mant += frac >> 4; frac &= 0xf; USART1->BRR = (mant<<4)+(frac<<0); USART1->CR1 = (1<<13)|(0<<12)|(0<<10)|(1<<3)|(1<<2); USART1->CR2 = 0<<12; USART1->CR3 = 0; } void Uart1_Send_Byte(char data) { if(data=='\n') { while(Macro_Check_Bit_Clear(USART1->SR, 7)); USART1->DR = 0x0d; } while(Macro_Check_Bit_Clear(USART1->SR, 7)); USART1->DR = data; } void Uart1_Send_String(char *pt) { while(*pt!=0) { Uart1_Send_Byte(*pt++); } } void Uart1_Printf(char *fmt,...) { va_list ap; char string[256]; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart1_Send_String(string); va_end(ap); } char Uart1_Get_Pressed(void) { // ๊ธ์๊ฐ ์ ๋ ฅ์ด ๋์์ผ๋ฉด ์ ๋ ฅ๋ ๊ธ์๋ฅผ ๋ฆฌํด // ๊ธ์ ์ ๋ ฅ์ด ์์ผ๋ฉด 0 ๋ฆฌํด } char Uart1_Get_Char(void) { // ๊ธ์ ์ ๋ ฅ์ด ์์ผ๋ฉด ๋ฌดํ ๋๊ธฐ, ๊ธ์๊ฐ ๋ค์ด์ค๋ฉด ๋ฐ์ ๊ธ์ ๋ฆฌํด } ์ ๋ต ์ฝ๋ #include "device_driver.h" #include <stdio.h> #include <stdarg.h> #include <string.h> #include <stdlib.h> #include <ctype.h> void Uart1_Init(int baud) { double div; unsigned int mant; unsigned int frac; Macro_Set_Bit(RCC->APB2ENR, 2); Macro_Set_Bit(RCC->APB2ENR, 14); Macro_Write_Block(GPIOA->CRH, 0xff, 0x8a, 4); Macro_Set_Bit(GPIOA->ODR, 10); div = PCLK2/(16. * baud); mant = (int)div; frac = (int)((div - mant) * 16. + 0.5); mant += frac >> 4; frac &= 0xf; USART1->BRR = (mant<<4)+(frac<<0); USART1->CR1 = (1<<13)|(0<<12)|(0<<10)|(1<<3)|(1<<2); USART1->CR2 = 0<<12; USART1->CR3 = 0; } void Uart1_Send_Byte(char data) { if(data=='\n') { while(Macro_Check_Bit_Clear(USART1->SR, 7)); USART1->DR = 0x0d; } while(Macro_Check_Bit_Clear(USART1->SR, 7)); USART1->DR = data; } void Uart1_Send_String(char *pt) { while(*pt!=0) { Uart1_Send_Byte(*pt++); } } void Uart1_Printf(char *fmt,...) { va_list ap; char string[256]; va_start(ap,fmt); vsprintf(string,fmt,ap); Uart1_Send_String(string); va_end(ap); } char Uart1_Get_Pressed(void) { if(Macro_Check_Bit_Set(USART1->SR, 5)) { return (char)USART1->DR; } else { return (char)0; } } char Uart1_Get_Char(void) { char rx; while((rx = Uart1_Get_Pressed()) == 0); return rx; } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex11] UART_ECHOBACK_LAB
๋ฌธ์ ์ค๋ช // main.c #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); } void Main(void) { Sys_Init(); Uart_Printf("UART Echo-Back Test\n"); for(;;) { // ๋ฐ์ ๊ธ์๋ฅผ ๋ค์ UART๋ก ์ถ๋ ฅํ๋ค } } ์ ๋ต ์ฝ๋ #include "device_driver.h" static void Sys_Init(void) { Clock_Init(); LED_Init(); Uart_Init(115200); Key_Poll_Init(); } void Main(void) { Sys_Init(); Uart_Printf("UART Echo-Back Test\n"); for(;;) { unsigned char x; while(!Macro_Check_Bit_Set(USART1->SR, 5)); x = USART1->DR; while(!Macro_Check_Bit_Set(USART1->SR, 7)); USART1->DR = x; } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex10] KEY_CHATTERING_LAB
๋ฌธ์ ์ค๋ช // key.c #include "device_driver.h" void Key_Poll_Init(void) { Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRL, 0xff, 0x44, 24); } /* 0: ๋๋ฒ๊น ์ฉ ์ค์ */ /* 1: ์ ์ ๋์์ฉ ์ค์ */ #if 0 #define N 20000 #else #define N 3000000 #endif int Key_Get_Pressed(void) { /* N ๋งํผ ๊ฐ์ ๊ฐ์ด ์ฝํ์ผ Key ๊ฐ์ผ๋ก ํ์ */ } void Key_Wait_Key_Released(void) { while(Key_Get_Pressed()); } int Key_Wait_Key_Pressed(void) { int k; while((k = Key_Get_Pressed()) == 0); return k; } ์ ๋ต ์ฝ๋ #include "device_driver.h" void Key_Poll_Init(void) { Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRL, 0xff, 0x44, 24); } /* 0: ๋๋ฒ๊น ์ฉ ์ค์ */ /* 1: ์ ์ ๋์์ฉ ์ค์ */ #if 0 #define N 20000 #else #define N 3000000 #endif static int Key_Check_Input(void) { return Macro_Extract_Area(~GPIOB->IDR, 0x3, 6); } int Key_Get_Pressed(void) { unsigned int i, k; for(;;) { k = Key_Check_Input(); for(i=0; i<N; i++) { if(k != Key_Check_Input()) { break; } } if(i == N) return k;; } } void Key_Wait_Key_Released(void) { while(Key_Get_Pressed()); } int Key_Wait_Key_Pressed(void) { int k; while((k = Key_Get_Pressed()) == 0); return k; } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex09] KEY_DRIVER_LAB
๋ฌธ์ ์ค๋ช // key.c #include "device_driver.h" void Key_Poll_Init(void) { Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRL, 0xff, 0x44, 24); } int Key_Get_Pressed(void) { } void Key_Wait_Key_Released(void) { } int Key_Wait_Key_Pressed(void) { } ์ ๋ต ์ฝ๋ #define KEY0_PUSH() (Macro_Check_Bit_Clear(GPIOB->IDR, 6)) #define KEY0_REL() (Macro_Check_Bit_Set(GPIOB->IDR, 6)) #define KEY1_PUSH() (Macro_Check_Bit_Clear(GPIOB->IDR, 7)) #define KEY1_REL() (Macro_Check_Bit_Set(GPIOB->IDR, 7)) #define KEY_VALUE() (Macro_Extract_Area(~GPIOB->IDR, 0x3, 6)) int Key_Wait_Key_Pressed(void) { #if 0 for(;;) { int key = KEY_VALUE(); if( key != 0 ) return; } #endif while( !((key = KEY_VALUE()) != 0)) ); return key; } void Key_Wait_Key_Released(void) { #if 0 for(;;) { if( KEY_VALUE() == 0 ) return; } #endif while( !(KEY_VALUE() == 0) ); } int Key_Get_Pressed(void) { #if 0 if( KEY0_REL() && KEY1_REL() ) return 0; if( KEY0_PUSH() && KEY1_REL() ) return 1; if( KEY0_REL() && KEY1_PUSH() ) return 2; if( KEY0_PUSH() && KEY1_PUSH() ) return 3; #endif return KEY_VALUE(); } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex08] KEY_IN_LAB #2 Key์ ์ํ LED Toggling
๋ฌธ์ ์ค๋ช // main.c #2 void Main(void) { Sys_Init(); Uart_Printf("KEY Input Toggling #1\n"); // KEY[1:0], GPB[7:6]์ GPIO ์ ๋ ฅ์ผ๋ก ์ ์ธ for(;;) { // KEY0๊ฐ ๋๋ฆด๋๋ง๋ค LED0์ ๊ฐ์ Toggling } } ์ ๋ต ์ฝ๋ /* Key์ ์ํ LED Toggling */ #if 1 void Main(void) { Sys_Init(); Uart_Printf("KEY Input Toggling #1\n"); Macro_Write_Block(GPIOB->CRL, 0xff, 0x44, 24); for(;;) { if(Macro_Check_Bit_Clear(GPIOB->IDR, 6)) { Macro_Invert_Bit(GPIOB->ODR, 8); } } } #endif /* Key Released ์ํ ๋๊ธฐ์ ์ํ LED Toggling */ #if 0 void Main(void) { Sys_Init(); Uart_Printf("KEY Input Toggling #2\n"); Macro_Write_Block(GPIOB->CRL, 0xff, 0x44, 24); for(;;) { if(Macro_Check_Bit_Clear(GPIOB->IDR, 6)) { Macro_Invert_Bit(GPIOB->ODR, 8); while(!Macro_Check_Bit_Set(GPIOB->IDR, 6)); } } } #endif /* Inter-Lock์ ์ ์ฉํ Key์ ์ํ LED Toggling */ #if 0 void Main(void) { int interlock = 1; Sys_Init(); Uart_Printf("KEY Input Toggling #3\n"); Macro_Write_Block(GPIOB->CRL, 0xff, 0x44, 24); for(;;) { if((interlock != 0) && Macro_Check_Bit_Clear(GPIOB->IDR, 6)) { Macro_Invert_Bit(GPIOB->ODR, 8); interlock = 0; } else if((interlock == 0) && Macro_Check_Bit_Set(GPIOB->IDR, 6)) { interlock = 1; } } } #endif ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex07] KEY_IN_LAB #1 Key ์ธ์
๋ฌธ์ ์ค๋ช // main.c #1 void Main(void) { Sys_Init(); Uart_Printf("KEY Input Test #1\n"); // KEY[1:0], GPB[7:6]์ GPIO ์ ๋ ฅ์ผ๋ก ์ ์ธ for(;;) { // KEY0์ด ๋๋ ธ์ผ๋ฉด LED0๋ฅผ ON, ์ ๋๋ ธ์ผ๋ฉด OFF // KEY1์ด ๋๋ ธ์ผ๋ฉด LED1๋ฅผ ON, ์ ๋๋ ธ์ผ๋ฉด OFF } } ์ ๋ต ์ฝ๋ /* Key ์ธ์ #1 */ #if 1 void Main(void) { int value = 0; Sys_Init(); Uart_Printf("KEY Input Test #1\n"); Macro_Write_Block(GPIOB->CRL, 0xff, 0x44, 24); for(;;) { if(Macro_Check_Bit_Clear(GPIOB->IDR, 6)) Macro_Set_Bit(value, 0); else Macro_Clear_Bit(value, 0); if(Macro_Check_Bit_Clear(GPIOB->IDR, 7)) Macro_Set_Bit(value, 1); else Macro_Clear_Bit(value, 1); LED_Display(value); } } #endif /* Extract Macro๋ฅผ ์ด์ฉํ Key ์ธ์ #2 */ #if 0 void Main(void) { Sys_Init(); Uart_Printf("KEY Input Test #2\n"); Macro_Write_Block(GPIOB->CRL, 0xff, 0x44, 24); for(;;) { Macro_Write_Block(GPIOB->ODR,0x3,Macro_Extract_Area(GPIOB->IDR,0x3,6),8); } } #endif ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex06] LED_DRIVER_LAB
๋ฌธ์ ์ค๋ช // led.c #include "device_driver.h" void LED_Init(void) { /* ๋ค์ ์ฝ๋๋ ์์ ํ์ง ๋ง์์ค */ Macro_Set_Bit(RCC->APB2ENR, 3); } void LED_Display(unsigned int num) { } void LED_All_On(void) { } void LED_All_Off(void) { } ์ ๋ต ์ฝ๋ #include "device_driver.h" void LED_Init(void) { Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRH, 0xff, 0x66, 0); Macro_Set_Area(GPIOB->ODR, 0x3, 8); } void LED_Display(unsigned int num) { Macro_Write_Block(GPIOB->ODR, 0x3, (~num & 3), 8); } void LED_All_On(void) { Macro_Clear_Area(GPIOB->ODR, 0x3, 8); } void LED_All_Off(void) { Macro_Set_Area(GPIOB->ODR, 0x3, 8); } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex05] BIT_OP_LAB #3 ๋นํธ ์ฐ์ฐ Macro ํ์ฉ์ ์ํ LED Toggling
๋ฌธ์ ์ค๋ช // main.c #3 void Main(void) { volatile int i; /* ์ด ๋ถ๋ถ์ ์์ ํ์ง ๋ง ๊ฒ */ Macro_Set_Bit(RCC->APB2ENR, 3); /* ๋งคํฌ๋ก๋ฅผ ์ด์ฉํ์ฌ ์ด๊ธฐ์ LED ๋ชจ๋ OFF */ for(;;) { /* LED ๋ฐ์ ๋ฐ Delay, Delay๋ 0x80000์ผ๋ก ์ค์ */ } } ์ ๋ต ์ฝ๋ void Main(void) { volatile int i; Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRH, 0xff, 0x66, 0); Macro_Set_Area(GPIOB->ODR, 0x3, 8); for(;;) { Macro_Invert_Area(GPIOB->ODR, 0x3, 8); for(i=0; i<0x80000; i++); } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex04] BIT_OP_LAB #2 ๋นํธ ์ฐ์ฐ Macro ํ์ฉ์ ์ํ LED ON
๋ฌธ์ ์ค๋ช // main.c #2 void Main(void) { /* ์ด ๋ถ๋ถ์ ์์ ํ์ง ๋ง ๊ฒ */ Macro_Set_Bit(RCC->APB2ENR, 3); /* Macro๋ฅผ ์ด์ฉํ์ฌ LED0์ ON, LED1์ OFF๋ก ํ๋ ์ฝ๋๋ฅผ ์ค๊ณํ์์ค */ } ์ ๋ต ์ฝ๋ void Main(void) { Macro_Set_Bit(RCC->APB2ENR, 3); Macro_Write_Block(GPIOB->CRH, 0xff, 0x66, 0); Macro_Write_Block(GPIOB->ODR, 0x3, 0x2, 8); } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex03] BIT_OP_LAB #1 ๋นํธ ์ฐ์ฐ์ ์ํ LED ON
๋ฌธ์ ์ค๋ช // main.c #1 void Main(void) { /* ์ด ๋ถ๋ถ์ ์์๋ก ๋ฐ๊พธ์ง ๋ง์์ค */ RCC->APB2ENR |= (1<<3); /* ๋นํธ ์ฐ์ฐ์ ์ด์ฉํ์ฌ LED0์ ON, LED1์ OFF๋ก ํ๋ ์ฝ๋๋ฅผ ์ค๊ณํ์์ค */ } ์ ๋ต ์ฝ๋ #if 1 void Main(void) { RCC->APB2ENR |= (1<<3); GPIOB->CRH &=~((1<<7)|(3<<3)|(1<<0)); GPIOB->CRH |= (3<<5)|(3<<1); GPIOB->ODR &=~(1<<8); GPIOB->ODR |= (1<<9); } #endif #if 0 void Main(void) { RCC->APB2ENR |= (1<<3); GPIOB->CRH = (GPIOB->CRH & ~((1<<7)|(3<<3)|(1<<0)))|((3<<5)|(3<<1)); GPIOB->ODR = (GPIOB->ODR & ~(0x1<<8)) | (1<<9); } #endif #if 0 void Main(void) { RCC->APB2ENR |= (1<<3); GPIOB->CRH = (GPIOB->CRH & ~(0xff<<0)) | (0x66<<0); GPIOB->ODR = (GPIOB->ODR & ~(0x3<<8)) | (0x1<<8); } #endif ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex02] CMSIS_LAB
๋ฌธ์ ์ค๋ช // main.c #include "device_driver.h" void Main(void) { volatile int i; Uart_Init(115200); Uart_Printf("CMSIS based Register Define\n"); // ์ด ๋ถ๋ถ์ ์์ ํ์ง ๋ง ๊ฒ RCC->APB2ENR |= (1<<3); // LED Pin์ ์ถ๋ ฅ์ผ๋ก ์ค์ for(;;) { // LED ๋ชจ๋ ON for(i=0; i<0x40000; i++); // LED ๋ชจ๋ OFF for(i=0; i<0x40000; i++); } } ์ ๋ต ์ฝ๋ #include "device_driver.h" void Main(void) { volatile int i; Uart_Init(115200); Uart_Printf("CMSIS Based Register Define\n"); RCC->APB2ENR |= (1<<3); GPIOB->CRH = 0x66 << 0; for(;;) { GPIOB->ODR = 0x0 << 8; for(i=0; i<0x40000; i++); GPIOB->ODR = 0x3 << 8; for(i=0; i<0x40000; i++); } } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
[ex01] LED_ON_LAB
๋ฌธ์ ์ค๋ช // main.c // ์ด ๋ถ๋ถ์ ์์๋ก ๋ฐ๊พธ์ง ๋ง์์ค #define RCC_APB2ENR (*(unsigned long*)0x40021018) // ์ฌ๊ธฐ์ ์ฌ์ฉ์ ์์์ define์ ์์ฑํ์์ค #define GPIOB_CRH #define GPIOB_ODR void Main(void) { // ์ด ๋ถ๋ถ์ ์์๋ก ๋ฐ๊พธ์ง ๋ง์์ค RCC_APB2ENR |= (1<<3); // GPB[9:8]์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ ํ์์ค GPIOB_CRH = // GPB[9:8]์ LED0์ OFF, LED1์ ON ์ํค๋๋ก ์ค์ ํ์์ค GPIOB_ODR = } ์ ๋ต ์ฝ๋ // ์ด ๋ถ๋ถ์ ์์๋ก ๋ฐ๊พธ์ง ๋ง์์ค #define RCC_APB2ENR (*(unsigned long*)0x40021018) #define GPIOB_CRH (*(unsigned long*)0x40010C04) #define GPIOB_ODR (*(unsigned long*)0x40010C0C) void Main(void) { // ์ด ๋ถ๋ถ์ ์์๋ก ๋ฐ๊พธ์ง ๋ง์์ค RCC_APB2ENR |= (1<<3); GPIOB_CRH = 0x66 << 0; GPIOB_ODR = 0x01 << 8; } ๋ฉ๋ชจ printf ๋ด๋ถ์ \n ์ต๊ดํ ํ์
Study
ยท 2025-03-18
<
>
Touch background to close