forked from lab85-ru/jtag_avr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
hardware.c
249 lines (206 loc) · 7.89 KB
/
hardware.c
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
/*
* prvsetuphardware.c
*
* Created on: 06.09.2010
* Author: Àäìèíèñòðàòîð
*/
#include <stdint.h>
#include <string.h>
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "main.h"
#include "hardware.h"
#include "i2c.h"
#include "env_config.h"
#ifndef DEBUG
#define DEBUG 0
#endif
USART_TypeDef* const COM_USART[COMn] = {H_COM1, H_COM2};
GPIO_TypeDef* const COM_TX_PORT[COMn] = {H_COM1_TX_GPIO_PORT, H_COM2_TX_GPIO_PORT};
GPIO_TypeDef* const COM_RX_PORT[COMn] = {H_COM1_RX_GPIO_PORT, H_COM2_RX_GPIO_PORT};
const uint32_t COM_USART_CLK[COMn] = {H_COM1_CLK, H_COM2_CLK};
const uint32_t COM_TX_PORT_CLK[COMn] = {H_COM1_TX_GPIO_CLK, H_COM2_TX_GPIO_CLK};
const uint32_t COM_RX_PORT_CLK[COMn] = {H_COM1_RX_GPIO_CLK, H_COM2_RX_GPIO_CLK};
const uint16_t COM_TX_PIN[COMn] = {H_COM1_TX_PIN, H_COM2_TX_PIN};
const uint16_t COM_RX_PIN[COMn] = {H_COM1_RX_PIN, H_COM2_RX_PIN};
void init_hardware(void)
{
//int i;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
i2c_init();
// set out gpio JTAG_TCK
RCC_APB2PeriphClockCmd(JTAG_TCK_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = JTAG_TCK_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(JTAG_TCK_GPIO_PORT, &GPIO_InitStructure);
// set out gpio JTAG_TDI
RCC_APB2PeriphClockCmd(JTAG_TDI_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = JTAG_TDI_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(JTAG_TDI_GPIO_PORT, &GPIO_InitStructure);
// set out gpio JTAG_TMS
RCC_APB2PeriphClockCmd(JTAG_TMS_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = JTAG_TMS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(JTAG_TMS_GPIO_PORT, &GPIO_InitStructure);
// set IN gpio JTAG_TDO
RCC_APB2PeriphClockCmd(JTAG_TDO_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = JTAG_TDO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(JTAG_TDO_GPIO_PORT, &GPIO_InitStructure);
// set out gpio JTAG_VCC
RCC_APB2PeriphClockCmd(JTAG_VCC_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = JTAG_VCC_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(JTAG_VCC_GPIO_PORT, &GPIO_InitStructure);
// UART Init CONSOL
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
stm32_uart_init(COM1);
stm32_uart_set(COM1, &USART_InitStructure, ENABLE);
printf_d("Start IWDG(watchdog) interval 280ms.\r\n");
/* IWDG timeout equal to 280 ms (the timeout may varies due to LSI frequency dispersion) */
/* Enable write access to IWDG_PR and IWDG_RLR registers */
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
/* IWDG counter clock: 40KHz(LSI) / 32 = 1.25 KHz */
IWDG_SetPrescaler(IWDG_Prescaler_32);
/* Set counter reload value to 349 */
IWDG_SetReload(349);
/* Reload IWDG counter */
IWDG_ReloadCounter();
/* Enable IWDG (the LSI oscillator will be enabled by hardware) */
IWDG_Enable();
}
void com_init(uint8_t port_num, uint32_t baud)
{
USART_InitTypeDef USART_InitStructure;
if (port_num<=4){
USART_InitStructure.USART_BaudRate = baud;//115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
if (baud)
stm32_uart_set( (COM_TypeDef)port_num, &USART_InitStructure, ENABLE);
else
stm32_uart_set( (COM_TypeDef)port_num, &USART_InitStructure, DISABLE);
}
}
void com_tx_start( uint8_t port_num )
{
if (port_num<=4){
if (DEBUG) printf_d("com_tx_start port=%d\r\n",port_num);
USART_ITConfig( COM_USART[ port_num ], USART_IT_TXE, ENABLE);// start tx
}
}
void nvic_config_com1(FunctionalState st)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef SOFTOFFSET
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x20000);
#endif
/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = st;
NVIC_Init(&NVIC_InitStructure);
}
void nvic_config_com2(FunctionalState st)
{
NVIC_InitTypeDef NVIC_InitStructure;
#ifdef SOFTOFFSET
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x20000);
#endif
/* Enable the USART2 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = st;
NVIC_Init(&NVIC_InitStructure);
}
/**
* Configures COM port.
* set ENABLE-DISABLE
*/
void stm32_uart_set(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct, FunctionalState st)
{
if( USART_InitStruct->USART_BaudRate != 0 && st == ENABLE ){
/* USART configuration */
USART_Init(COM_USART[COM], USART_InitStruct);
/* Enable USART */
USART_Cmd(COM_USART[COM], ENABLE);
/* Enable Int to RX char */
USART_ITConfig(COM_USART[COM], USART_IT_RXNE, ENABLE);
return;
}
/* DISABLE Int to TX-RX char */
USART_ITConfig( COM_USART[ COM ], USART_IT_RXNE, DISABLE);
USART_ITConfig( COM_USART[ COM ], USART_IT_TXE, DISABLE);
USART_Cmd(COM_USART[ COM ], DISABLE);
return;
}
void stm32_uart_init(COM_TypeDef COM)
{
GPIO_InitTypeDef GPIO_InitStructure;
switch (COM){
case COM1:
nvic_config_com1(ENABLE);
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM] | RCC_APB2Periph_AFIO, ENABLE);
/* Enable UART clock */
RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);
/* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);
/* USART configuration */
//USART_Init(COM_USART[COM], USART_InitStruct);
/* Enable USART */
//USART_Cmd(COM_USART[COM], ENABLE);
/* Enable Int to RX char */
//USART_ITConfig(COM_USART[COM], USART_IT_RXNE, ENABLE);
break;
case COM2:
nvic_config_com2(ENABLE);
/* Enable GPIO clock */
RCC_APB2PeriphClockCmd(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM] | RCC_APB2Periph_AFIO, ENABLE);
/* Enable UART clock */
RCC_APB1PeriphClockCmd(COM_USART_CLK[COM], ENABLE);//RCC_APB2PeriphClockCmd(COM_USART_CLK[COM], ENABLE);
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = COM_TX_PIN[COM];
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(COM_TX_PORT[COM], &GPIO_InitStructure);
/* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = COM_RX_PIN[COM];
GPIO_Init(COM_RX_PORT[COM], &GPIO_InitStructure);
/* USART configuration */
//USART_Init(COM_USART[COM], USART_InitStruct);
/* Enable USART */
//USART_Cmd(COM_USART[COM], ENABLE);
/* Enable Int to RX char */
//USART_ITConfig(COM_USART[COM], USART_IT_RXNE, ENABLE);
break;
default:
return;
break;
}
}