网站首页 > 技术文章 正文
一、STM32标准库串口驱动
相对于其他通信,串口通信还是比较简单的。对于单片机来说,就是有2个管脚,一个是tx ,一个为rx 。但只有这2个管脚是不能够来通信的,需要进行必要的寄存器配置,使能串口功能。然后才可以进行通信操作。
stm32f407这款单片机中有6个串口可供使用。
相关的驱动代码:
管理gpio初始化
GPIO_InitTypeDef GPIO_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_InitStructure.GPIO_Pin = uart_gpio->gpio_rx | uart_gpio->gpio_tx;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(uart_gpio->gpio_group,&GPIO_InitStructure);
中断nvic配置:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=uart_nvic->uart_irq_channel ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=uart_nvic->uart_irq_pp;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=uart_nvic->uart_irq_subp;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
串口参数配置功能:
USART_InitStructure.USART_BaudRate = uart_config->baudrate;
USART_InitStructure.USART_WordLength = uart_config->uart_word_length;
USART_InitStructure.USART_StopBits = uart_config->uart_stop_bits;
USART_InitStructure.USART_Parity = uart_config->uart_parity;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(uart_config->uart, &USART_InitStructure);
因为stm32中有多个串口可以使用,方便代码重用,所以将一些参数利用结构体做成一个数据结构,统一配置。
相关的结构体配置代码如下:
typedef struct
{
uint8_t uart_irq_channel; //串口中断号
uint8_t uart_irq_pp; //中断优先级,主优先级
uint8_t uart_irq_subp; //中断优先级,子优先级
} uart_nvic_t;
typedef struct
{
uint32_t gpio_uart_clock; //串口GPIO时钟
GPIO_TypeDef* gpio_group; //所属组
uint16_t gpio_tx; //收发数据口
uint16_t gpio_rx;
uint8_t gpio_pin_source_tx; //复用收发配置
uint8_t gpio_pin_source_rx;
uint8_t gpio_af_uart; //gpio uart复用
}uart_gpio_t;
typedef struct
{
USART_TypeDef * uart;
uint32_t uart_clock; //串口时钟
uint32_t baudrate; //波特率
uint16_t uart_word_length; //数据长度
uint16_t uart_stop_bits; //停止位
uint16_t uart_parity; //校验
}uart_config_t;
typedef struct
{
uint32_t dma_clock;
DMA_Stream_TypeDef * tx_stream_type;
uint32_t tx_dma_channel;
uint32_t tx_dma_peripheral_base_addr;
uint32_t tx_memory_base_addr;
uint32_t tx_dma_idr;
uint32_t tx_buffer_size;
uint8_t * tx_buffer; //指向发送数据缓冲区
DMA_Stream_TypeDef * rx_stream_type;
uint32_t rx_dma_channel;
uint32_t rx_dma_peripheral_base_addr;
uint32_t rx_memory_base_addr;
uint32_t rx_dma_idr;
uint32_t rx_buffer_size;
}uart_dma_t;
二、利用中断进行数据读取
例如:利用串口1中断来读取串口数据
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(debug_uart_config.uart, USART_IT_RXNE) != RESET) //判断发生接收中断
{
uint8_t recv = USART_ReceiveData(debug_uart_config.uart)&0xFF;
//USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志
ring_buffer_2048_write_char(&usart1_ring_buffer,recv);
if(recv==0x0D)
{
recv0d=1;
}
if(recv == 0x0A && recv0d==1)
{
recv0d=0;
recv_comp= 1;
}
//debug_data(recv);
}
if(USART_GetITStatus(debug_uart_config.uart, USART_IT_TXE) != RESET)
{
USART_ITConfig(debug_uart_config.uart, USART_IT_TXE, DISABLE);
}
}
首先判断是否发生接收中断,如果是接收中断则读取一个字符,将读取到的字符写入到循环缓冲区中。
上述代码中,做拉“\r\n”作为结束标识的判断。当接收数据以“\r\n”时,说明已经接收完成,就可以进行数据的操作拉。
三、串口数据的发送
串口配置完成后,就可以进行数据发送。
相关代码如下所示:
void uart_send_data(USART_TypeDef* uart,uint8_t data)
{
USART_SendData(uart, data); //向串口发送数据
while(USART_GetFlagStatus(uart,USART_FLAG_TC)!=SET);//等待发送结束
}
串口接收数据图:
猜你喜欢
- 2024-10-12 STM32单片机-多串口printf()问题与ASCII码解析
- 2024-10-12 stm32F0 串口的几个特殊功能 stm32f1串口引脚
- 2024-10-12 STM32串口发送用哪个中断? stm32f4串口发送数据
- 2024-10-12 STM32F103编程学习——USB虚拟串口篇
- 2024-10-12 STM32F4入坑日记——串口发送数据(非中断)
- 2024-10-12 STM32 HAL库串口中断发送过程 stm32f4串口中断
- 2024-10-12 在货物监控设备研发时,STM32串口第一个字节丢失解怎么解决?
- 2024-10-12 STM32单片机采用环形缓冲区实现串口中断数据接收管理
- 2024-10-12 基于STM32的串口与DMA的完美组合(上)
- 2024-10-12 STM32下载程序新思路--使用串口下载STM32程序
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)