STM32F1 - 串口通信UART


1> UART硬件框图

1


2> 通信协议

1

位段内容
空闲位TX保持高电平
起始位TX由高变低,保持=1bit位宽
数据为5~8位ASCII的编码数据
校验位校验方式:奇校验 / 偶校验
停止位TX由低变高,保持>=0.5bit位宽

常用配置:115200, 8N1

波特率为115200,
数据位:8位;
奇偶校验:无;
停止位:1位;


3> 硬件设计

1

PA9:USART1_TX;
PA10: USART1_RX


4> 发送1Byte数据_轮询方式

bsp_uart.c:

#include "bsp_uart.h"


// USART1_TX - PA9
// USART1_RX - PA10
	
void USART1_Init(void) 
{
	
/* configures GPIO ports */ 
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
	
/* USART1_TX PA9 */
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
/* USART1_RX PA10 */	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; 
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);

/* configures USART1: 115200baud, 8N1 */
	USART_InitStruct.USART_BaudRate = 115200;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	
	USART_Init(USART1, &USART_InitStruct);
	USART_Cmd(USART1, ENABLE);	
}

void UART_Putchar(uint8_t c)
{
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) /*Wait*/;
	
	USART_SendData(USART1,c);
	
	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) /*Wait*/;
}

4

配置规律, 分模块,顺序配置,井井有条

1-【时钟】模块 -> 2-【GPIO】模块 -> 3-【UART】模块


5> 发送字符串_轮询方式

/**
 * @brief UART put string
 * @str	Pointer to string
 */ 
void UART_Puts(uint8_t *str) 
{ 					
	uint8_t i = 0;
	
	while(str[i] != '\0') {
		if (str[i] == '\n') {
			UART_Putchar('\r');
		}
		UART_Putchar(str[i]);
		i++;
	}
}

有了底层的UART_Putchar()其他都是花活了


6> printf()重定向

重写 fputc()

/**
 * @brief for printf function
 */ 

int fputc(int ch, FILE *f)
{
    if (ch == '\n')                    
        UART_Putchar('\r');            

    UART_Putchar((uint8_t)ch);

    return ch;
}

注意:

1> 包含头文件 #include <stdio.h>
2> 【Target】选项中,勾选【Use MicroLIB】;


7> USART接收中断_图解

7

3


8> USART接收程序_中断方式

bsp_uart.h:

void USART1_Init(void) 
{
	
/* configures GPIO ports */ 
	GPIO_InitTypeDef GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);
	
/* USART1_TX PA9 */
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz ;
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
/* USART1_RX PA10 */	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; 
	
	GPIO_Init(GPIOA, &GPIO_InitStruct);

/* configures USART1: 115200baud, 8N1 */
	USART_InitStruct.USART_BaudRate = 115200;
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;
	USART_InitStruct.USART_Parity = USART_Parity_No;
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	
	USART_Init(USART1, &USART_InitStruct);
		

/* Configures USART1 RXNE interrupt enable */
	USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);

/* Configures NVIC */
	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStruct);

/* USART enable, UE */
	USART_Cmd(USART1, ENABLE);

}

stm32f10x_usart.h:

// USART1总中断处理函数 
void USART1_IRQHandler(void)
{
	uint8_t c;
	
	c = USART_ReceiveData(USART1);
	UART_Putchar(c);
}

RXNEIE位描述:

32
1

读USART_DR就可以清除RXNE位,这招可以;

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F1 HAL DMA UART是指在STM32F1系列微控制器上使用HAL库函数和DMA来实现UART串口通信。引用\[1\]中的代码片段展示了如何配置DMA和UART句柄以实现DMA传输数据到UART。首先,需要使能DMA时钟并配置DMA句柄。然后,通过HAL_DMA_Init函数初始化DMA句柄,并通过__HAL_LINKDMA函数将DMA句柄与UART句柄连接起来。这样,在执行UART传输函数之后,DMA将会自动将数据从内存传输到UART外设。引用\[2\]提供了关于UART串口通信过采样数据和利用DMA实现不定长数据接收的更多详细信息。引用\[3\]中的描述说明了在DMA传输完成后,UART状态会从"tx busy"变为"ready"。 #### 引用[.reference_title] - *1* [【STM32】HAL库 SPI DMA UART驱动开发](https://blog.csdn.net/zDavid_2018/article/details/107988636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【stm32HAL库】uart dma收发驱动(含实例)](https://blog.csdn.net/qq_24629659/article/details/129473515)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值