USART配置
uint32_t GPIOx;
uint16_t GPIO_PIN_Tx;
uint16_t GPIO_PIN_Rx;
uint16_t UART_GPIO_AF;
if(USARTx == USART0){
GPIOx = GPIOA;
GPIO_PIN_Tx = GPIO_PIN_9;
GPIO_PIN_Rx = GPIO_PIN_10;
UART_GPIO_AF = GPIO_AF_1;
}
else if(USARTx == USART1){
GPIOx = GPIOA;
GPIO_PIN_Tx = UART2_GPIO_TX;
GPIO_PIN_Rx = UART2_GPIO_RX;
UART_GPIO_AF = UART2_GPIO_AF;
}
else{
return;
}
usart_deinit(USARTx);
rcu_periph_clock_enable(RCU_GPIOA);
gpio_af_set(GPIOx, UART_GPIO_AF, GPIO_PIN_Tx);
/* connect port to USARTx_Tx */
/* configure USART Tx as alternate function push-pull */
gpio_mode_set(GPIOx, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_Tx);
gpio_output_options_set(GPIOx, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_Tx);
/* connect port to USARTx_Rx */
gpio_af_set(GPIOx, UART_GPIO_AF, GPIO_PIN_Rx);
/* configure USART Rx as alternate function push-pull */
gpio_mode_set(GPIOx, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_Rx);
gpio_output_options_set(GPIOx, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_Rx);
RTS初始化
void RTS_GPIOInit(usart_def* p)
{
if(p->USARTx == USART0){
p->RTX_GPIO = GPIOA;
p->RTX_GPIO_PINx = 0;
}
else if(p->USARTx == USART1){
p->RTX_GPIO = GPIOA;
p->RTX_GPIO_PINx = USART2_RTS_PIN;
}
/* Enable the GPIO Clock */
rcu_periph_clock_enable(RCU_GPIOA);
gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLDOWN, p->RTX_GPIO_PINx);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, p->RTX_GPIO_PINx);
}
void RTSControl(usart_def* p, uint8_t OutSt)
{
if(OutSt == ENABLE_RX){
gpio_bit_reset(p->RTX_GPIO, p->RTX_GPIO_PINx);
}
else if(OutSt == DISABLE_RX){
gpio_bit_set(p->RTX_GPIO, p->RTX_GPIO_PINx);
}
}
void Usart_Init(usart_def* p, uint32_t USARTx, uint32_t BaudRate, uint32_t stblen)
{
uint8_t irq_channel;
USARTGPIOInit(USARTx);
if(USARTx == USART0)
{
irq_channel = USART0_IRQn;
rcu_periph_clock_enable(RCU_USART0);
}
else if(USARTx == USART1)
{
irq_channel = USART1_IRQn;
rcu_periph_clock_enable(RCU_USART1);
}
else{
return;
}
usart_deinit(USARTx);
usart_baudrate_set(USARTx, BaudRate);
usart_word_length_set(USARTx, USART_WL_8BIT);
usart_stop_bit_set(USARTx, stblen);
usart_parity_config(USARTx, USART_PM_NONE);
usart_hardware_flow_cts_config(USARTx, USART_CTS_DISABLE);
usart_receive_config(USARTx, USART_RECEIVE_ENABLE);
usart_transmit_config(USARTx, USART_TRANSMIT_ENABLE);
usart_enable(USARTx);
usart_interrupt_enable(USARTx, USART_INT_RBNE); //开启接收中断
usart_interrupt_enable(USARTx, USART_INT_IDLE); //开启空闲中断
nvic_irq_enable(irq_channel, 0);
p->USARTx = USARTx;
p->baudrate = BaudRate;
if(USARTx == USART1)
{
RTS_GPIOInit(p);
RTSControl(p, ENABLE_RX);
}
}