Код: Выделить всё
//----------
// Definition aller UARTs
// Reihenfolge wie bei UART_NAME_t
//----------
UART_t UART[] = {
// Name, Clock , AF-UART ,UART , Baud, Interrupt
{COM3,RCC_APB1Periph_USART3,GPIO_AF_USART3,USART3,115200,USART3_IRQn, // UART3 mit 115200 Baud
// PORT , PIN , Clock , Source
{GPIOC,GPIO_Pin_10,RCC_AHB1Periph_GPIOC,GPIO_PinSource10}, // TX an PC10
{GPIOC,GPIO_Pin_11,RCC_AHB1Periph_GPIOC,GPIO_PinSource11}}, // RX an PC11
};
//----------
// init aller UARTs
//----------
void UB_Uart_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
UART_NAME_t nr;
for(nr=0;nr<UART_ANZ;nr++) {
// Clock enable der TX und RX Pins
RCC_AHB1PeriphClockCmd(UART[nr].TX.CLK, ENABLE);
RCC_AHB1PeriphClockCmd(UART[nr].RX.CLK, ENABLE);
// Clock enable der UART
if((UART[nr].UART==USART1) || (UART[nr].UART==USART6)) {
RCC_APB2PeriphClockCmd(UART[nr].CLK, ENABLE);
}
else {
RCC_APB1PeriphClockCmd(UART[nr].CLK, ENABLE);
}
// UART Alternative-Funktions mit den IO-Pins verbinden
GPIO_PinAFConfig(UART[nr].TX.PORT,UART[nr].TX.SOURCE,UART[nr].AF);
GPIO_PinAFConfig(UART[nr].RX.PORT,UART[nr].RX.SOURCE,UART[nr].AF);
// UART als Alternative-Funktion mit PushPull
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
// TX-Pin
GPIO_InitStructure.GPIO_Pin = UART[nr].TX.PIN;
GPIO_Init(UART[nr].TX.PORT, &GPIO_InitStructure);
// RX-Pin
GPIO_InitStructure.GPIO_Pin = UART[nr].RX.PIN;
GPIO_Init(UART[nr].RX.PORT, &GPIO_InitStructure);
// Oversampling
USART_OverSampling8Cmd(UART[nr].UART, ENABLE);
// init mit Baudrate, 8Databits, 1Stopbit, keine Paritдt, kein RTS+CTS
USART_InitStructure.USART_BaudRate = UART[nr].BAUD;
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(UART[nr].UART, &USART_InitStructure);
// UART enable
USART_Cmd(UART[nr].UART, ENABLE);
// RX-Interrupt enable
USART_ITConfig(UART[nr].UART, USART_IT_RXNE, ENABLE);
// enable UART Interrupt-Vector
NVIC_InitStructure.NVIC_IRQChannel = UART[nr].INT;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// RX-Puffer vorbereiten
UART_RX[nr].rx_buffer[0]=RX_END_CHR;
UART_RX[nr].wr_ptr=0;
UART_RX[nr].status=UART_RX_EMPTY;
}
}