stm32f107.c

来自「LWIP在STM32裸机上的移植」· C语言 代码 · 共 422 行 · 第 1/2 页

C
422
字号
    - ETH_MII_RXD1   / ETH_RMII_RXD1    : PD10   (RMII)
    - ETH_MII_RXD2                      : PD11
    - ETH_MII_RXD3                      : PD12
    - ETH_MII_RX_ER                     : PB10 
    */

  	/* ETHERNET pins remapp in STM3210C-EVAL board: RX_DV and RxD[3:0] */
  	GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE);

  	/* Configure PA0, PA1 and PA3 as input */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);

  	/* Configure PB10 as input */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  	GPIO_Init(GPIOB, &GPIO_InitStructure);

  	/* Configure PC3 as input */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);

	/* Configure PD8, PD9, PD10, PD11 and PD12 as input */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOD, &GPIO_InitStructure); /**/

  	/* ADC Channel14 config -------------------------------------------------*/
  	/* Relative to STM3210D-EVAL Board   */
  	/* Configure PC.04 (ADC Channel14) as analog input ----------------------*/
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);

  	/* MCO pin configuration-------------------------------------------------*/
  	/* Configure MCO (PA8) as alternate function push-pull */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

#else 	 //RMII_MODE

void GPIO_Configuration(void)
{
  	GPIO_InitTypeDef GPIO_InitStructure;

  	/* ETHERNET pins configuration */
  	/* AF Output Push Pull:
  	- ETH_MII_MDIO 	/ ETH_RMII_MDIO	: PA2
  	- ETH_MII_MDC 	/ ETH_RMII_MDC	: PC1
  	- ETH_MII_TXD2	: PC2
  	- ETH_MII_TX_EN / ETH_RMII_TX_EN: PB11
  	- ETH_MII_TXD0 	/ ETH_RMII_TXD0	: PB12
  	- ETH_MII_TXD1 	/ ETH_RMII_TXD1	: PB13
 	*/

  	/* Configure PA2 as alternate function push-pull */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);

  	/* Configure PC1, PC2 and PC3 as alternate function push-pull */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);

  	/* Configure PB5, PB8, PB11, PB12 and PB13 as alternate function push-pull */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_Init(GPIOB, &GPIO_InitStructure);

  	/**************************************************************/
  	/*               For Remapped Ethernet pins                   */
  	/*************************************************************/
  	/* Input (Reset Value):
  	- ETH_MII_RX_CLK / ETH_RMII_REF_CLK	: PA1
  	- ETH_MII_RX_DV  / ETH_RMII_CRS_DV	: PD8
  	- ETH_MII_RXD0 	 / ETH_RMII_RXD0	: PD9
  	- ETH_MII_RXD1 	 / ETH_RMII_RXD1	: PD10
 	*/

  	/* ETHERNET pins remapp in STM3210C-EVAL board: RX_DV and RxD[3:0] */
  	GPIO_PinRemapConfig(GPIO_Remap_ETH, ENABLE);

  	/* Configure PA1 as input */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  	/* Configure PD8, PD9, PD10, PD11 and PD12 as input */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  	GPIO_Init(GPIOD, &GPIO_InitStructure); /**/

  	/* ADC Channel14 config ---------------------------------------------------*/
  	/* Relative to STM3210D-EVAL Board   */
  	/* Configure PC.00 (ADC Channel10) as analog input ------------------------*/
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  	GPIO_Init(GPIOC, &GPIO_InitStructure);

  	/* MCO pin configuration---------------------------------------------------*/
  	/* Configure MCO (PA8) as alternate function push-pull */
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

#endif

//注意定时器的倍频器:当APB的分频值为1时,TIMx的倍频值为1,否则TIMx的倍频值为2.
//由于TIM3由APB1提供时钟(APB1分频值为2),故TIM3的倍频值为2,TIM3CLK=36M*2=72MHz
void TIM3_Configuration(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
		
	/* ---------------------------------------------------------------
	PCLK1=36MHz
	TIM3CLK = 72 MHz, Prescaler = 7200, TIM3 counter clock = 10KHz
	--------------------------------------------------------------- */
	/* Time base configuration */
	TIM_TimeBaseStructure.TIM_Period = (10-1);        //设置在下一个更新事件装入活动的自动重装载寄存器周期的值(1ms)
	TIM_TimeBaseStructure.TIM_Prescaler =(7200-1);    //设置用来作为TIMx时钟频率除数的预分频值  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;      //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式	
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
	
	//TIM_UpdateDisableConfig(TIM3,ENABLE); 	      //Enables the Update event for TIM3 
	
	TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);   //TIM IT enable	| TIM_IT_Trigger
	
	TIM_Cmd(TIM3, ENABLE);   //TIM3 enable counter
}

//分频数为64,重载值为625,溢出时间为1s (IWDG timeout equal to 1s)
// (the timeout may varies due to LSI frequency dispersion)
void IWDG_Configuration(void)
{
	//IWDG_KR: 写入0X5555
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作
												   //PR : IWDG预分频寄存器
												   //RLR: IWDG重装载寄存器

	IWDG_SetPrescaler(IWDG_Prescaler_64);          //设置IWDG预分频值为32 (1.6ms)
												   //IWDG counter clock: 40KHz(LSI)/64 = 625Hz)
	IWDG_SetReload(750);                           //设置IWDG重装载值为750
												   //Set counter reload value to 750 (1.2s)
	//IWDG_KR: 写入0XAAAA
	IWDG_ReloadCounter();                          //按照IWDG重装载寄存器的值重装载IWDG计数器 (Reload IWDG counter)
	
	//IWDG_KR: 写入0XCCCC
	IWDG_Enable();                                 //使能IWDG (Enable IWDG (the LSI oscillator will be enabled by hardware))

}

void NVIC_Configuration(void)
{
  	NVIC_InitTypeDef   NVIC_InitStructure;

  	/* 2 bit for pre-emption priority, 2 bits for subpriority */
  	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
		
	//设置向量表的位置和偏移
	#ifdef  VECT_TAB_RAM  
		/* Set the Vector Table base location at 0x20000000 */ 
		NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 	   //向量表位于RAM
	#else  /* VECT_TAB_FLASH  */
		/* Set the Vector Table base location at 0x08000000 */ 
		NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);      //向量表位于FLASH
	#endif   

	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;            //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;//先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道被使能	
	NVIC_Init(&NVIC_InitStructure); 

  	NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x1;
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  	NVIC_Init(&NVIC_InitStructure);

  	NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX1_IRQn;	 //CAN2_FIFO1
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  	NVIC_Init(&NVIC_InitStructure); 

  	NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x3;
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  	NVIC_Init(&NVIC_InitStructure);

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?