一、STM32标准库串口驱动
相对于其他通信,串口通信还是比较简单的。对于单片机来说,就是有2个管脚,一个是tx,一个为rx。但只有这2个管脚是不能够来通信的,需要进行必要的寄存器配置,使能串口功能。然后才可以进行通信操作。
stm32f407这款单片机中有6个串口可供使用。
相关的驱动代码:
管理gpio初始化
GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB1PeriphClockCmd(uart_gpio-gpio_uart_clock,ENABLE);GPIO_PinAFConfig(uart_gpio-gpio_group,uart_gpio-gpio_pin_source_rx,uart_gpio-gpio_af_uart);GPIO_PinAFConfig(uart_gpio-gpio_group,uart_gpio-gpio_pin_source_tx,uart_gpio-gpio_af_uart);GPIO__Pin=uart_gpio-gpio_rx|uart_gpio-gpio_tx;GPIO__Mode=GPIO_Mode_AF;GPIO__Speed=GPIO_Speed_50MHz;GPIO__OType=GPIO_OType_PP;GPIO__PuPd=GPIO_PuPd_UP;GPIO_Init(uart_gpio-gpio_group,GPIO_InitStructure);
中断nvic配置:
NVIC_InitTypeDefNVIC_InitStructure;NVIC__IRQChannel=uart_nvic-uart_irq_channel;NVIC__IRQChannelPreemptionPriority=uart_nvic-uart_irq_pp;NVIC__IRQChannelSubPriority=uart_nvic-uart_irq_subp;NVIC__IRQChannelCmd=ENABLE;NVIC_Init(NVIC_InitStructure);
串口参数配置功能:
USART__BaudRate=uart_config-baudrate;USART__WordLength=uart_config-uart_word_length;USART__StopBits=uart_config-uart_stop_bits;USART__Parity=uart_config-uart_parity;USART__HardwareFlowControl=USART_HardwareFlowControl_None;USART__Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(uart_config-uart,USART_InitStructure);
因为stm32中有多个串口可以使用,方便代码重用,所以将一些参数利用结构体做成一个数据结构,统一配置。
相关的结构体配置代码如下:
typedefstruct{uint8_tuart_irq_channel;//串口中断号uint8_tuart_irq_pp;//中断优先级,主优先级uint8_tuart_irq_subp;//中断优先级,子优先级}uart_nvic_t;typedefstruct{uint32_tgpio_uart_clock;//串口GPIO时钟GPIO_TypeDef*gpio_group;//所属组uint16_tgpio_tx;//收发数据口uint16_tgpio_rx;uint8_tgpio_pin_source_tx;//复用收发配置uint8_tgpio_pin_source_rx;uint8_tgpio_af_uart;//gpiouart复用}uart_gpio_t;typedefstruct{USART_TypeDef*uart;uint32_tuart_clock;//串口时钟uint32_tbaudrate;//波特率uint16_tuart_word_length;//数据长度uint16_tuart_stop_bits;//停止位uint16_tuart_parity;//校验}uart_config_t;typedefstruct{uint32_tdma_clock;DMA_Stream_TypeDef*tx_stream_type;uint32_ttx_dma_channel;uint32_ttx_dma_peripheral_base_addr;uint32_ttx_memory_base_addr;uint32_ttx_dma_idr;uint32_ttx_buffer_size;uint8_t*tx_buffer;//指向发送数据缓冲区DMA_Stream_TypeDef*rx_stream_type;uint32_trx_dma_channel;uint32_trx_dma_peripheral_base_addr;uint32_trx_memory_base_addr;uint32_trx_dma_idr;uint32_trx_buffer_size;}uart_dma_t;二、利用中断进行数据读取
例如:利用串口1中断来读取串口数据
voidUSART1_IRQHandler(void){if(USART_GetITStatus(debug_uart_,USART_IT_RXNE)!=RESET)//判断发生接收中断{uint8_trecv=USART_ReceiveData(debug_uart_)0xFF;//USART_ClearITPingBit(USART1,USART_IT_RXNE);//清除中断标志ring_buffer_2048_write_char(usart1_ring_buffer,recv);if(recv==0x0D){recv0d=1;}if(recv==0x0Arecv0d==1){recv0d=0;recv_comp=1;}//debug_data(recv);}if(USART_GetITStatus(debug_uart_,USART_IT_TXE)!=RESET){USART_ITConfig(debug_uart_,USART_IT_TXE,DISABLE);}}首先判断是否发生接收中断,如果是接收中断则读取一个字符,将读取到的字符写入到循环缓冲区中。
上述代码中,做拉“\r\n”作为结束标识的判断。当接收数据以“\r\n”时,说明已经接收完成,就可以进行数据的操作拉。
三、串口数据的发送
串口配置完成后,就可以进行数据发送。
相关代码如下所示:
voiduart_s_data(USART_TypeDef*uart,uint8_tdata){USART_SData(uart,data);//向串口发送数据while(USART_GetFlagStatus(uart,USART_FLAG_TC)!=SET);//等待发送结束}串口接收数据图: