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;
}
使用结构体做板级配置
最新推荐文章于 2021-11-16 19:53:40 发布