aboutsummaryrefslogtreecommitdiff
path: root/STM32F429ZIT6_HelloWorld/main.c
blob: 612437c31727831dc4840a8addea6e79c3323bf1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdint.h>
#include <stdbool.h>
#include <assert.h>

struct RCC {
    uint32_t cr;
    uint32_t pllcfgr;
    uint32_t cfgr;
    uint32_t cir;
    uint32_t ahb1rstr;
    uint32_t ahb2rstr;
    uint32_t ahb3rstr;
    uint32_t reserved0;
    uint32_t apb1rstr;
    uint32_t apb2rstr;
    uint32_t reserved1;
    uint32_t reserved2;
    uint32_t ahb1enr;
    uint32_t ahb2enr;
    uint32_t ahb3enr;
    uint32_t reserved3;
    uint32_t apb1enr;
    uint32_t apb2enr;
    uint32_t reserved4;
    uint32_t reserved5;
    uint32_t ahb1lpenr;
    uint32_t ahb2lpenr;
    uint32_t ahb3lpenr;
    uint32_t reserved6;
    uint32_t apb1lpenr;
    uint32_t apb2lpenr;
    uint32_t reserved7;
    uint32_t reserved8;
    uint32_t bdcr;
    uint32_t csr;
    uint32_t reserved9;
    uint32_t reserved10;
    uint32_t sscgr;
    uint32_t plli2scfgr;
};
// static_assert(sizeof(struct RCC) == 0x88, "RCC register size is incorrect.");

volatile struct RCC * const rcc = (struct RCC *) 0x40023800;

#define RCC_AHB1ENR_GPIOAEN 0b0
#define RCC_AHB1ENR_GPIOBEN 0b10

#define RCC_APB1ENR_TIM2EN  0b0
#define RCC_APB1ENR_TIM3EN  0b1
#define RCC_APB1ENR_TIM4EN  0b10
#define RCC_APB1ENR_TIM5EN  0b100
#define RCC_APB1ENR_TIM6EN  0b1000
#define RCC_APB1ENR_TIM7EN  0b10000
#define RCC_APB1ENR_TIM12EN 0b100000
#define RCC_APB1ENR_TIM13EN 0b1000000
#define RCC_APB1ENR_TIM14EN 0b1000000
#define RCC_APB1ENR_UART4EN 0b1000000000000000000

struct GPIO {
    uint32_t moder;
    uint32_t otyper;
    uint32_t ospeedr;
    uint32_t pupdr;
    uint32_t idr;
    uint32_t odr;
    uint32_t bsrr;
    uint32_t lckr;
    uint32_t afrl;
    uint32_t afrh;
};
// static_assert(sizeof(struct GPIO) == 0x28, "RCC register size is incorrect.");

volatile struct GPIO * const gpiob = (struct GPIO *) 0x40020400;
volatile struct GPIO * const gpioa = (struct GPIO *) 0x40020000;

#define GPIOB_MODER_0_OUT  0b01
#define GPIOB_MODER_7_OUT  0b0100000000000000
#define GPIOB_MODER_14_OUT 0b010000000000000000000000000000

#define GPIOB_ODR_0  0b1
#define GPIOB_ODR_7  0b10000000
#define GPIOB_ODR_14 0b100000000000000

int main(void) {
    rcc->ahb1enr |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN;
    rcc->apb1enr |= RCC_APB1ENR_UART4EN;

    gpiob->moder |=
        GPIOB_MODER_0_OUT |
        GPIOB_MODER_7_OUT |
        GPIOB_MODER_14_OUT;
    gpiob->odr |=
        GPIOB_ODR_0 |
        GPIOB_ODR_7 |
        GPIOB_ODR_14;
}