HWA
Bare metal programming with style
gpb_2.h
Go to the documentation of this file.
1 
2 /* This file is part of the HWA project.
3  * Copyright (c) 2021 Christophe Duparquet.
4  * All rights reserved. Read LICENSE.TXT for details.
5  */
6 
12 /* Load pins interface definitions
13  */
14 #include "iob_2.h"
15 
28 /*******************************************************************************
29  * *
30  * Context management *
31  * *
32  *******************************************************************************/
33 
34 #define _hwa_setup__gpb(o,a) \
35  _hwa_setup_r( o, mode ); \
36  _hwa_setup_r( o, otype ); \
37  _hwa_setup_r( o, ospeed ); \
38  _hwa_setup_r( o, pupd ); \
39  _hwa_setup_r( o, odr ); \
40  _hwa_setup_r( o, bsrr ); \
41  _hwa_setup_r( o, lckr ); \
42  _hwa_setup_r( o, afrl ); \
43  _hwa_setup_r( o, afrh ); \
44  hwa->o.toggles = 0
45 
46 #define _hwa_init__gpb(o,a) \
47  _hwa_init_r( o, mode , _hwa_gpbmode_##o ); \
48  _hwa_init_r( o, otype , 0x00000000 ); \
49  _hwa_init_r( o, ospeed , _hwa_gpbspeed_##o ); \
50  _hwa_init_r( o, pupd , _hwa_gpbpupd_##o ); \
51  _hwa_init_r( o, odr , 0x00000000 ); \
52  _hwa_init_r( o, bsrr , 0x00000000 ); \
53  _hwa_init_r( o, lckr , 0x00000000 ); \
54  _hwa_init_r( o, afrl , 0x00000000 ); \
55  _hwa_init_r( o, afrh , 0x00000000 )
56 
57 #define _hwa_gpbmode_porta 0xA8000000
58 #define _hwa_gpbmode_portb 0x00000280
59 #define _hwa_gpbmode_portc 0x00000000
60 #define _hwa_gpbmode_portd 0x00000000
61 #define _hwa_gpbmode_porte 0x00000000
62 #define _hwa_gpbmode_portf 0x00000000
63 #define _hwa_gpbmode_portg 0x00000000
64 #define _hwa_gpbmode_porth 0x00000000
65 
66 #define _hwa_gpbspeed_porta 0x0C000000
67 #define _hwa_gpbspeed_portb 0x000000C0
68 #define _hwa_gpbspeed_portc 0x00000000
69 #define _hwa_gpbspeed_portd 0x00000000
70 #define _hwa_gpbspeed_porte 0x00000000
71 #define _hwa_gpbspeed_portf 0x00000000
72 #define _hwa_gpbspeed_portg 0x00000000
73 #define _hwa_gpbspeed_porth 0x00000000
74 
75 #define _hwa_gpbpupd_porta 0x64000000
76 #define _hwa_gpbpupd_portb 0x00000100
77 #define _hwa_gpbpupd_portc 0x00000000
78 #define _hwa_gpbpupd_portd 0x00000000
79 #define _hwa_gpbpupd_porte 0x00000000
80 #define _hwa_gpbpupd_portf 0x00000000
81 #define _hwa_gpbpupd_portg 0x00000000
82 #define _hwa_gpbpupd_porth 0x00000000
83 
84 #define _hwa_commit__gpb(o,a) \
85  _hwa_commit_r( o, otype ); \
86  _hwa_commit_r( o, ospeed ); \
87  _hwa_commit_r( o, pupd ); \
88  _hwa_commit_r( o, afrl ); \
89  _hwa_commit_r( o, afrh ); \
90  _hwa_commit_r( o, odr ); \
91  _hwa_commit_r( o, bsrr ); \
92  _hwa_commit_r( o, mode ); \
93  _hwa_commit_toggles( &hwa->o ); \
94  _hwa_commit_r( o, lckr )
95 
96 
97 /* Toggle pins
98  */
99 HW_INLINE void _hwa_commit_toggles ( hwa_gpb_t *o )
100 {
101  if ( o->toggles ) {
102  volatile uint32_t *odr = (volatile uint32_t*)o->odr.a;
103 
104  if ( (o->odr.omask & 0xffff) != 0xffff ) {
105  o->odr.ovalue = *odr ;
106  o->odr.omask = 0xffff ;
107  }
108  o->odr.ovalue ^= o->toggles ;
109 
110  /* *odr = o->odr.ovalue ; DO NOT WRITE THE ODR! */
111  volatile uint32_t *bsrr = (volatile uint32_t*)o->bsrr.a;
112  *bsrr = (o->toggles & ~o->odr.ovalue)<<16 | (o->toggles & o->odr.ovalue);
113 
114  /* Reset the BSRR to 0
115  */
116  o->bsrr.ovalue = 0;
117  o->bsrr.omask = 0xffffffff ;
118  o->bsrr.mmask = 0 ;
119 
120  o->toggles = 0 ;
121  }
122 }
iob_2.h
I/O.