由于设备APB(外部时钟中线)不一样,USART1用的是APB2,USART2~UART5用的是APB1,不注意是容易导致时钟启动失败:
typedef struct
{
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;
}boardCOMCfg;
boardCOMCfg boardComCfg[comNum] = {
{ 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 ,2},
{ UART5, UART5_IRQn, RCC_APB1Periph_UART5, RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, GPIOC, GPIO_Pin_12, GPIOD, GPIO_Pin_2 ,1}
};
u8 boardComInit(u8 comX,u32 bound){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//comX ·¶Î§ÊÇ1-5
if(comX==0 || comX>5)
{
return 1;
}
if(comX == 1)
RCC_APB2PeriphClockCmd(boardComCfg[comX-1].comClk , ENABLE);
else
RCC_APB1PeriphClockCmd(boardComCfg[comX-1].comClk , ENABLE);
RCC_APB1PeriphClockCmd(boardComCfg[comX-1].TXPortClk , ENABLE);
RCC_APB2PeriphClockCmd(boardComCfg[comX-1].RXPortClk, ENABLE);
USART_DeInit(boardComCfg[comX-1].UARTx);
/* Configure USART Tx as alternate function push-pull */
GPIO_InitStructure.GPIO_Pin = boardComCfg[comX-1].TxPin; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(boardComCfg[comX-1].RxPort, &GPIO_InitStructure);
/* Configure USART Rx as input floating */
GPIO_InitStructure.GPIO_Pin = boardComCfg[comX-1].RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(boardComCfg[comX-1].TxPort, &GPIO_InitStructure);
//USART
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(boardComCfg[comX-1].UARTx, &USART_InitStructure);
//NVIC
NVIC_InitStructure.NVIC_IRQChannel = boardComCfg[comX-1].NVIC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = boardComCfg[comX-1].IRQPrio;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(boardComCfg[comX-1].UARTx, USART_IT_RXNE, ENABLE);
USART_Cmd(boardComCfg[comX-1].UARTx, ENABLE);
return 0;
}