#include "stm32f4xe.h"
#include "stm32f411xe.h"
volatile uint8_t button_pressed = 0;
static void delay(volatile uint32_t d) {
while(d--) __asm("nop");
}
void GPIO_Init(void){
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN |
RCC_AHB1ENR_GPIOBEN |
RCC_AHB1ENR_GPIOCEN;
GPIOC->MODER &= ~(3 << (13*2));
GPIOC->MODER |= (1 << (13*2));
GPIOA->MODER &= ~(3 << (0*2));
GPIOA->PUPDR &= ~(3 << (0*2));
GPIOA->PUPDR |= (1 << (0*2));
}
void EXTI0_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_SYSCFGEN;
SYSCFG->EXTICR[0] &= ~SYSCFG_EXTICR1_EXTI0;
EXTI->IMR |= (1 << 0);
EXTI->FTSR |= (1 << 0);
EXTI->RTSR &= ~(1 << 0);
NVIC_SetPriority(EXTI0_IRQn, 1);
NVIC_EnableIRQ(EXTI0_IRQn);
}
void TIM_Init(void){
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN |
RCC_APB1ENR_TIM3EN |
RCC_APB1ENR_TIM4EN;
TIM2->PSC = 16000; // 1 kHz
TIM2->ARR = 500; // 2 Hz (0.5s toggle)
TIM2->DIER |= TIM_DIER_UIE;
TIM2->CR1 |= TIM_CR1_CEN;
NVIC_EnableIRQ(TIM2_IRQn);
}
void EXTI0_IRQHandler(void){
if (EXTI->PR & (1 << 0)){
delay(50000);
button_pressed = 1;
EXTI->PR |= (1 << 0);
}
}
void TIM2_IRQHandler(void){
if (TIM2->SR & TIM_SR_UIF){
TIM2->SR &= ~TIM_SR_UIF;
GPIOC->ODR ^= (1 << 13);
}
}
int main(void){
GPIO_Init();
EXTI0_Init();
TIM_Init();
while(1){
if (button_pressed){
GPIOC->ODR ^= (1 << 13);
delay(80000);
}
}
}
///////////////////////////////////////////////////////////////////////////////////////
#include "stm32f4xx.h"
void GPIO_Init(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN;
GPIOA->MODER &= ~(3U << (1 * 2));
GPIOA->MODER |= (1U << (1 * 2));
GPIOB->MODER &= ~(3U << (0 * 2));
GPIOB->PUPDR &= ~(3U << (0 * 2));
GPIOB->PUPDR |= (1U << (0 * 2));
}
void Delay_ms(uint32_t ms)
{
for(uint32_t i = 0; i < ms * 3000; i++)
{
__NOP();
}
}
int main(void)
{
GPIO_Init();
while (1)
{
uint8_t button = GPIOB->IDR & (1 << 0);
if (button == 0)
{
GPIOA->ODR ^= (1 << 1);
Delay_ms(100);
}
else
{
//LED pada kondisi terakhir. Kalo kondisi terakhirnya nyala berarti LEDnya bakal nyala terus
}
}
}