使用结构体做板级配置


typedef struct boardCOMOpt
{
	USART_TypeDef *	UARTx;
	uint8_t			    NVIC_IRQChannel;
	uint32_t		    comClk;
	uint32_t		    TXPortClk;
	uint32_t		    RXPortClk;
	GPIO_TypeDef *		TxPort;	
	uint16_t		    TxPin;
	GPIO_TypeDef *		RxPort;
	uint16_t		    RxPin;
  uint8_t         		IRQPrio;
}boardCOMOpt_t;

//board_com_opt[0]= board_com_opt[1],   actually "board_com_opt[]" start at 1,board_com_opt[0]is not use
boardCOMOpt_t board_com_opt[COM_MAX_NUM+1] = {
  {	},
	{	USART1,	USART1_IRQn, RCC_APB2Periph_USART1,	RCC_APB2Periph_GPIOA,	RCC_APB2Periph_GPIOA,	GPIOA,	GPIO_Pin_9,		GPIOA,	GPIO_Pin_10	,3},	
	{	USART2,	USART2_IRQn, RCC_APB1Periph_USART2,	RCC_APB2Periph_GPIOA,	RCC_APB2Periph_GPIOA,	GPIOA,	GPIO_Pin_2,		GPIOA,	GPIO_Pin_3	,3},	
	{	USART3,	USART3_IRQn, RCC_APB1Periph_USART3,	RCC_APB2Periph_GPIOB,	RCC_APB2Periph_GPIOB,	GPIOB,	GPIO_Pin_10,	GPIOB,	GPIO_Pin_11 ,3},	
	{	UART4,	UART4_IRQn,	 RCC_APB1Periph_UART4,	RCC_APB2Periph_GPIOC,	RCC_APB2Periph_GPIOC,	GPIOC,	GPIO_Pin_10,	GPIOC,	GPIO_Pin_11 ,3},	
	{	UART5,	UART5_IRQn,	 RCC_APB1Periph_UART5,	RCC_APB2Periph_GPIOC,	RCC_APB2Periph_GPIOD,	GPIOC,	GPIO_Pin_12,	GPIOD,	GPIO_Pin_2  ,3}
};


u8 board_comInit(u8 comX,u32 bound){

	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	
	
	if(comX==0 || comX > COM_MAX_NUM) return 1;
	
	if(comX == 1)
		RCC_APB2PeriphClockCmd(board_com_opt[comX].comClk , ENABLE);
	else
		RCC_APB1PeriphClockCmd(board_com_opt[comX].comClk , ENABLE);
	
	RCC_APB1PeriphClockCmd(board_com_opt[comX].TXPortClk , ENABLE);
	RCC_APB2PeriphClockCmd(board_com_opt[comX].RXPortClk, ENABLE);
	
	USART_DeInit(board_com_opt[comX].UARTx);
	
	/* Configure USART Tx as alternate function push-pull */
	GPIO_InitStructure.GPIO_Pin = board_com_opt[comX].TxPin; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	
	GPIO_Init(board_com_opt[comX].TxPort, &GPIO_InitStructure);
	
	/* Configure USART Rx as input floating */	  
	GPIO_InitStructure.GPIO_Pin = board_com_opt[comX].RxPin;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(board_com_opt[comX].RxPort, &GPIO_InitStructure);  
	
	//USART init
	USART_InitStructure.USART_BaudRate = bound;					
	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;	
	
	USART_Init(board_com_opt[comX].UARTx, &USART_InitStructure); 		
	
	NVIC_InitStructure.NVIC_IRQChannel = board_com_opt[comX].NVIC_IRQChannel;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = board_com_opt[comX].IRQPrio;		
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
	NVIC_Init(&NVIC_InitStructure);							
	USART_ITConfig(board_com_opt[comX].UARTx, USART_IT_RXNE, ENABLE);
	
	USART_Cmd(board_com_opt[comX].UARTx, ENABLE);                    
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值