1、串口初始化
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOD);//使能GPIOA时钟
/* enable USART clock */
rcu_periph_clock_enable(RCU_USART1);//使能USART0时钟
gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_5);//复用功能7
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);//PA9配置成串口输出
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_5);
gpio_af_set(GPIOD, GPIO_AF_7, GPIO_PIN_6);//复用功能7
gpio_mode_set(GPIOD, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);//PA10配置成串口输入
gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
usart_deinit(USART1); // 串口复位
usart_word_length_set(USART1, USART_WL_8BIT); // 字长
usart_stop_bit_set(USART1, USART_STB_1BIT); // 停止位
usart_parity_config(USART1, USART_PM_NONE);
usart_baudrate_set(USART1, 9600U); // 波特率
usart_receive_config(USART1, USART_RECEIVE_ENABLE); // 接收使能
usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); // 发送使能
usart_hardware_flow_rts_config(USART1, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART1, USART_CTS_DISABLE);
usart_enable(USART1); // 串口使能
nvic_irq_enable(USART1_IRQn,1,0);
2,发送函数
void RS485_SendData(uint8_t *buf,uint16_t len)
{
uint8_t t;
SET_485_TX // 发送使能
for(t=0;t<len;t++)
{
while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);
usart_data_transmit(USART1,buf[t]);
}
while(usart_flag_get(USART1, USART_FLAG_TC) == RESET);
usart_interrupt_enable(USART1, USART_INT_RBNE); // 接收中断使能
SET_485_RX
}
3、接收中断
void USART1_IRQHandler(void)
{
uint8_t data;
if((RESET != usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE)) &&
(RESET != usart_flag_get(USART1, USART_FLAG_RBNE))){
/* Read one byte from the receive data register */
data =usart_data_receive(USART1);
USART1_RX_BUF[RS4851_RX_CNT++] = data;
}