bsp.c
6.72 KB
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
/*
*********************************************************************************************************
*
* 模块名称 : BSP模块(For STM32F4XX)
* 文件名称 : bsp.c
* 版 本 : V1.1
* 说 明 : 这是硬件底层驱动程序的主文件。每个c文件可以 #include "bsp.h" 来包含所有的外设驱动模块。
* bsp = Borad surport packet 板级支持包
* 修改记录 :
* 版本号 日期 作者 说明
*
* Copyright (C), 2013-2014, 驰众机器人
*
*********************************************************************************************************
*/
#include <includes.h>
#include "stm32f4xx.h"
#include "bsp.h"
#include "cpu.h"
/*应用端程序校验bootloader*/
void Get_ChipID(void)
{
u32 Sum = 0;
u32 idsum = 0;
u8 *pFlash;
uint32_t id[3];
pFlash = (u8*)ADDR_FLASH_SECTOR_0;/*指向bootloader区域*/
for(u32 i = 0; i < 0x4000; i++)
{
Sum += pFlash[i];/*以BYTE型将第一个扇区数据全部加起来*/
}
/*获取到ID号*/
id[0] = *(__I uint32_t *)(0x1FFF7A10 + 0x00);
id[1] = *(__I uint32_t *)(0x1FFF7A10 + 0x04);
id[2] = *(__I uint32_t *)(0x1FFF7A10 + 0x08);
/*将ID号加起来*/
id[0] = id[0] + id[1] + id[2];
/*再将ID号按BYTE加起来*/
idsum = ((id[0] & 0xff000000) >> 24) + ((id[0] & 0x00ff0000) >> 16) + ((id[0] & 0x0000ff00) >> 8) + ((id[0] & 0x000000ff) >> 0);
/*扇区校验和减去ID号按BYTE加起来的数据如果不是一个固定值证明BOOTLOADER被改了*/
// if(Sum - idsum != 2482572)
// Uart_Printf(COM1,"DATA=%d\r\n",Sum - idsum);
if(Sum - idsum != 2486081)
{
Uart_Printf(COM1, "ID未注册 %08X %08X %08X\r\n",*(__I uint32_t *)(0x1FFF7A10 + 0x00),*(__I uint32_t *)(0x1FFF7A10 + 0x04),*(__I uint32_t *)(0x1FFF7A10 + 0x08));//串口打印ID号
while(1)
{
}
}
}
/*
*********************************************************************************************************
* 函 数 名: bsp_Init
* 功能说明: 初始化硬件设备
* 形 参:无
* 返 回 值: 无
*********************************************************************************************************
*/
extern void TIM3_Int_Init(u16 arr,u16 psc);
extern void TIM7_Int_Init(u16 arr,u16 psc);
void bsp_Init(void)
{
bsp_DelayMS(1000);
//系统数据初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
uart_init(115200);
// vBkpSramInit();
// EXTIX_Init();
XInputInit(); // 24路X点输入端口初始化
YOutputInit(); // 24路y点输出端口初始化
CAN2_Mode_Init(BandRate_500kbps,CAN_Mode_Normal); // CAN2 初始化 250kbps
CAN1_Mode_Init(BandRate_500kbps,CAN_Mode_Normal); // CAN1 初始化
InitParamater();
initPathInfo();
// eMBInit(MB_RTU, 0x01, 1, 38400, MB_PAR_EVEN);//包括USART1 Timer2都在里面初始化了
//
// eMBEnable();
// eMBInit(MB_RTU, 0x01, 1, 115200, MB_PAR_NONE);
// eMBEnable();
bsp_DelayMS(100);
}
/*
*********************************************************************************************************
* 函 数 名: bsp_DelayMS
* 功能说明: 为了让底层驱动在带RTOS和裸机情况下有更好的兼容性
* 专门制作一个阻塞式的延迟函数,在底层驱动中ms毫秒延迟主要用于初始化,并不会影响实时性。
* 形 参: n 延迟长度,单位1 ms
* 返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(uint32_t _ulDelayTime)
{
bsp_DelayUS(1000*_ulDelayTime);
}
/*
*********************************************************************************************************
* 函 数 名: bsp_DelayUS
* 功能说明: 这里的延时采用CPU的内部计数实现,32位计数器
* OSSchedLock(&err);
* bsp_DelayUS(5);
* OSSchedUnlock(&err); 根据实际情况看看是否需要加调度锁或选择关中断
* 形 参: _ulDelayTime 延迟长度,单位1 us
* 返 回 值: 无
* 说 明: 1. 主频168MHz的情况下,32位计数器计满是2^32/168000000 = 25.565秒
* 建议使用本函数做延迟的话,延迟在1秒以下。
* 2. 实际通过示波器测试,微妙延迟函数比实际设置实际多运行0.25us左右的时间。
* 下面数据测试条件:
* (1). MDK5.15,优化等级0, 不同的MDK优化等级对其没有影响。
* (2). STM32F407IGT6
* (3). 测试方法:
* GPIOI->BSRRL = GPIO_Pin_8;
* bsp_DelayUS(10);
* GPIOI->BSRRH = GPIO_Pin_8;
* -------------------------------------------
* 测试 实际执行
* bsp_DelayUS(1) 1.2360us
* bsp_DelayUS(2) 2.256us
* bsp_DelayUS(3) 3.256us
* bsp_DelayUS(4) 4.256us
* bsp_DelayUS(5) 5.276us
* bsp_DelayUS(6) 6.276us
* bsp_DelayUS(7) 7.276us
* bsp_DelayUS(8) 8.276us
* bsp_DelayUS(9) 9.276us
* bsp_DelayUS(10) 10.28us
* 3. 两个32位无符号数相减,获取的结果再赋值给32位无符号数依然可以正确的获取差值。
* 假如A,B,C都是32位无符号数。
* 如果A > B 那么A - B = C,这个很好理解,完全没有问题
* 如果A < B 那么A - B = C, C的数值就是0xFFFFFFFF - B + A + 1。这一点要特别注意,正好用于本函数。
*********************************************************************************************************
*/
void bsp_DelayUS(uint32_t _ulDelayTime)
{
uint32_t tCnt, tDelayCnt;
uint32_t tStart;
tStart = (uint32_t)CPU_TS_TmrRd(); /* 刚进入时的计数器值 */
tCnt = 0;
tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000); /* 需要的节拍数 */
while(tCnt < tDelayCnt)
{
tCnt = (uint32_t)CPU_TS_TmrRd() - tStart; /* 求减过程中,如果发生第一次32位计数器重新计数,依然可以正确计算 */
}
}
/*
*********************************************************************************************************
* 函 数 名: BSP_CPU_ClkFreq
* 功能说明: 获取系统时钟,uCOS-III需要使用
* 形 参: 无
* 返 回 值: 系统时钟
*********************************************************************************************************
*/
CPU_INT32U BSP_CPU_ClkFreq (void)
{
RCC_ClocksTypeDef rcc_clocks;
RCC_GetClocksFreq(&rcc_clocks);
return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
}
/*
*********************************************************************************************************
* 函 数 名: BSP_Tick_Init
* 功能说明: 初始化系统滴答时钟做为uCOS-III的系统时钟节拍,1ms一次
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void BSP_Tick_Init (void)
{
CPU_INT32U cpu_clk_freq;
CPU_INT32U cnts;
cpu_clk_freq = BSP_CPU_ClkFreq(); /* 获取系统时钟 */
#if (OS_VERSION >= 30000u)
cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;
#else
cnts = cpu_clk_freq / (CPU_INT32U)OS_TICKS_PER_SEC; /* 获得滴答定时器的参数 */
#endif
SysTick_Config(cnts); /* 这里默认的是最低优先级 */
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/