bsp.c 6.72 KB
/*
*********************************************************************************************************
*
*	模块名称 : 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) *********************************/