Open hyunsik-yoon opened 1 year ago
x &= ~(1U<<10)
: x의 10th bit 를 0으로 만든다.x ^= (1U << 10)
: x의 10th bit 를 toggle 한다. typedef struct {
volatile uint32_t dummy[12]; // 앞의 12개의 uint32_t는 무시
volatile uint32_t moder; // base address + (sizeof(uint32_t )*12 바이트) 위치가 됨.
} Gpioa_def;
Gpioa_def *gpio = (Gpioa_def *)(0x40000020); // 0x40000020 는 GPIOA의 register 주소
gpio->moder |= (1U << 10); // 10번째 비트를 1로 셋팅
GPIOA->BSRR = IU << 5; // 5번째 BSRR 만 셋팅
GPIOA->BSRR = IU << 21; // 5번째 BSRR 만 셋팅 (21 = 16 + 5 의 위치. BR5 를 뜻함)
``
blue push button 을 누르는 것을 개발해보기
board user manual을 찾아봄 ("button" 으로 검색)
PC13 을 enable 하려면 bus 를 enable해야 하고 data sheet에서 "block diagram" 을 다시 찾아봄
ref manual에서 "AHB1ENR" 을 검색해보면 GPIOC 는 2nd bit 를 1로 해야함이 나와 있음.
이 보드의 button은 active low button
0
1
or 11
AF07
컬럼이 중요하다고. ------ (여기요)10
: alternate function mode((USART_TypeDef *)usartTx)->BRR = (peripheral_clock + baudrate / 2U) / baudrate;
USART2->DR = ((int)data) & 0XFF;
-> int의 8 bit 만 전송while (USART2->USART_SR & TXE) ;
체크. dmesg | grep tty
__io_putchar(int ch)
function을 UART write 하는 것으로 재구현하면 됨. (stm32 만 그런 듯)RCC의 APB2ENR : bit number 8
Data sheel -> search "analog-" 로 찾고 그 아래 pin 배치를 본다.
GPIOA의 mode를 analog (moder)
Channel
step
Note) STM32F4 ADC is 12 bit conversion
cortex.h
에 있는 __disable_irq();
호출RCC->APBENR |= SYSCFG_EM; // SYSCFG_EM = (1U<<14j)
SYSCFG->EXTICR[3] |= (1U<<5); // EXTI13 을 PC13 으로 연결
EXTI->IMR |= (1U<<13);
EXTI->FTSR |= (1U<<13);
NVIC_EnableRQ(EXTI15_10_IRQn);
호출cortex.h
에 있는 __enable_irq();
호출startup_stm32f411retx.s
파일에 보면 g_pfnVectors:
label 아래 EXTI5_10_IRQHandler
를 찾도록 define 되어 있다. if (EXTI->PR & (1u << 13) != 0) { .. }
을 ISR안에 작성참고) startup_stm32f411retx.s
SystemInit()
function (이 함수가 없을수도 있고)IE
(interrupt enable) 로 끝나는 비트들이 있다.
USART2->CR1 |= (1U<<5);
NVIC_EnableIRQ(USART2_IRQn);
USART2_IRQHandler
if (USART2->SR & SR_RXNE) { key = USART2->DR; /* key 가 l 이면 LED 토클하는 코드 넣는다 */ }
ADC-CR1 |= (1U << 5);
NVIC_EnableIRQ(ADC_IRQn);
ADC_IRQHandler
if (ADC1->SR & SR_EOC) != 0) {
// clear EOC
ADC1->SR &= ~SR_EOC;
// read
uint32_t val = ADC1->DR;
// do something....
}
SysTick->CTRL |= (1U<<1);
SysTick_IRQHandler
TIM2->DIER|= (1U<<0);
NVIC_EnableIRQ(TIM2_IRQn);
TIM2_IRQHandler
TIM2->SR &= ~ SR_UIF
char buf[32] = "...";
로, dest: USART2->DR
, size는 char array size 로 (32
).
more study: https://blog.embeddedexpert.io/?p=1650
from https://www.udemy.com/course/embedded-systems-bare-metal-programming/learn/lecture/26702490?start=45#overview