b781e49993d28eb797bf1e7682cc9dae65c1e78d
[goodfet] / firmware / lib / stm32f407.c
1 /*! \file stm32f407.h
2   \author Travis Goodspeed
3   \brief STM32F407 port definitions.
4 */
5
6 #include "platform.h"
7
8 #include "stm32f4xx.h"
9 //#include "stm322xg_eval.h"
10 #include <stm32f4xx_gpio.h>
11 #include <stm32f4xx_rcc.h>
12 #include <stm32f4xx_usart.h>
13 #include "stm32f4_discovery.h"
14
15 void ioinit(){
16   GPIO_InitTypeDef  GPIO_InitStructure;
17   
18   /* GPIOD Periph clock enable */
19   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
20
21   /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
22   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
23   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
24   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
25   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
26   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
27   GPIO_Init(GPIOD, &GPIO_InitStructure);
28 }
29
30 void stmdelay(){
31   //IO so it doesn't get swapped out.
32   __IO uint32_t count=   0x1000;   // >1kbit/s
33   //__IO uint32_t count= 0x100000; // 5 bits per second, for testing
34   while(count--);
35 }
36 void ledon(){
37   GPIO_SetBits(GPIOD, GPIO_Pin_14);
38 }
39 void ledoff(){
40   GPIO_ResetBits(GPIOD, GPIO_Pin_14);
41 }
42 void clkon(){
43   GPIO_SetBits(GPIOD, GPIO_Pin_12);
44 }
45 void clkoff(){
46   GPIO_ResetBits(GPIOD, GPIO_Pin_12);
47 }
48
49 void spibit(int one){
50   if(one) ledon();
51   else    ledoff();
52   clkon();
53   stmdelay();
54   clkoff();
55   stmdelay();
56 }
57
58 void spiword(uint32_t word){
59   int i=32;
60   while(i--){
61     //morsebit(word&1);
62     //manchesterbit(word&1);
63     spibit(word&1);
64     word=(word>>1);
65   }
66 }
67 void spibyte(uint8_t word){
68   int i=8;
69   while(i--){
70     //morsebit(word&1);
71     //manchesterbit(word&1);
72     spibit(word&1);
73     word=(word>>1);
74   }
75 }
76
77
78
79 //! Count the length of a string.
80 uint32_t strlen(const char *s){
81   int i=0;
82   while(s[i++]);
83   return i-1;
84 }
85
86
87 //! Initialize the USART
88 void usartinit(){
89   GPIO_InitTypeDef GPIO_InitStructure;
90   USART_InitTypeDef USART_InitStructure;
91   
92   /* --------------------------- System Clocks Configuration -----------------*/
93   /* USART1 clock enable */
94   RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
95  
96   /* GPIOB clock enable */
97   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
98   
99   
100   
101   /*-------------------------- GPIO Configuration ----------------------------*/
102   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
103   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
104   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
105   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
106   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
107   GPIO_Init(GPIOB, &GPIO_InitStructure);
108  
109   /* Connect USART pins to AF */
110   GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1); // USART1_TX
111   GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1); // USART1_RX
112   
113   /* USARTx configuration ------------------------------------------------------*/
114   /* USARTx configured as follow:
115         - BaudRate = 9600 baud
116         - Word Length = 8 Bits
117         - One Stop Bit
118         - No parity
119         - Hardware flow control disabled (RTS and CTS signals)
120         - Receive and transmit enabled
121   */
122   USART_InitStructure.USART_BaudRate = 9600;
123   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
124   USART_InitStructure.USART_StopBits = USART_StopBits_1;
125   USART_InitStructure.USART_Parity = USART_Parity_No;
126   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
127  
128   //USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
129   USART_InitStructure.USART_Mode = USART_Mode_Tx;
130  
131   USART_Init(USART1, &USART_InitStructure);
132  
133   USART_Cmd(USART1, ENABLE);
134 }
135
136
137 //! Initialize the STM32F4xx ports and USB.
138 void stm32f4xx_init(){
139   int i=20;
140   
141   SystemInit();
142   ioinit();
143   usartinit();
144   
145   
146   return;
147 }
148
149 //! Receive a byte.
150 unsigned char serial0_rx(){
151   while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); // Wait for Character
152   return USART_ReceiveData(USART1);
153 }
154
155 //! Receive a byte.
156 unsigned char serial1_rx(){
157 }
158
159 //! Transmit a byte.
160 void serial0_tx(unsigned char x){
161   
162   spiword(0xdead);
163   
164   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
165   USART_SendData(USART1, (uint16_t) x);
166   
167   spiword(0xbeef);
168 }
169
170 //! Transmit a byte on the second UART.
171 void serial1_tx(unsigned char x){
172
173 }
174
175 //! Set the baud rate.
176 void setbaud0(unsigned char rate){
177   //Ignore this, as we'll be in USB.
178 }
179
180 //! Set the baud rate of the second uart.
181 void setbaud1(unsigned char rate){
182
183 }
184
185
186 //Declarations
187 void nmi_handler(void);
188 void hardfault_handler(void);
189 int main(void);
190
191 //From min.s
192 void Reset_Handler(void);
193
194 // Define the vector table
195 unsigned int * myvectors[50] 
196    __attribute__ ((section("vectors")))= {
197         (unsigned int *)        0x20000800,             // stack pointer
198         (unsigned int *)        Reset_Handler,                  // code entry point
199         (unsigned int *)        main,           // NMI handler (not really)
200         (unsigned int *)        main,   // hard fault handler (let's hope not)  
201 };