stm32f103c8tx芯片采用中断方式向上位机(win10)发送“hello windows”———USART 串口通讯


本文基于: STM32系统利用串口助手给上位机(win10)连续发送“hello windows!”。

一、中断控制

1.硬件部分

USART 有多个中断请求事件
在这里插入图片描述
为利用 USART 实现开发板与电脑通信,需要用到一个 USB 转 USART 的 IC,我们选择 CH340G 芯片来实现这个功能,CH340G 是一个 USB 总线的转接芯片,实现 USB 转USART、USB 转 lrDA 红外或者 USB 转打印机接口,我们使用其 USB 转 USART 功能。具体电路设计见图 21-9。
我们将 CH340G 的 TXD 引脚与 USART1 的 RX 引脚连接,CH340G 的 RXD 引脚与USART1的 TX引脚连接。CH340G芯片集成在开发板上,其地线(GND)已与控制器的 GND连通。
在这里插入图片描述

2.软件部分

创建了两个文件:bsp_usart.c 和 bsp _usart.h 文件用来存放 USART 驱动程序及相关宏定义。

编程要点

使能 RX 和 TX 引脚 GPIO 时钟和 USART 时钟;
初始化 GPIO,并将 GPIO 复用到 USART 上;
配置 USART 参数;
配置中断控制器并使能 USART 接收中断;
使能 USART;
在 USART 接收中断服务函数实现数据接收和发送。

二、程序编写

参考:链接:https://pan.baidu.com/s/125MJu4aQSN_wJtqZplbioA
提取码:0123

主要代码分析

在这里插入图片描述
中断控制器 NVIC 配置

static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
 /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
/* 配置 USART 为中断源 */
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
 /* 抢断优先级为 1 */
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
 /* 子优先级为 1 */
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
 /* 使能中断 */
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 /* 初始化配置 NVIC */
 NVIC_Init(&NVIC_InitStructure);
 }

USART 初始化配置

void USART_Config(void)
 {
 GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 
 // 打开串口 GPIO 的时钟
 DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
 
 // 打开串口外设的时钟
 DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);
 
 // 将 USART Tx 的 GPIO 配置为推挽复用模式
 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);
 
 // 将 USART Rx 的 GPIO 配置为浮空输入模式
 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
 GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
 
 // 配置串口的工作参数
 // 配置波特率
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
 // 配置 针数据字长
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 // 配置停止位
 USART_InitStructure.USART_StopBits = USART_StopBits_1;
 // 配置校验位
 USART_InitStructure.USART_Parity = USART_Parity_No ;
 // 配置硬件流控制
 USART_InitStructure.USART_HardwareFlowControl =
 USART_HardwareFlowControl_None;
 // 配置工作模式,收发一起
 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 // 完成串口的初始化配置
 USART_Init(DEBUG_USARTx, &USART_InitStructure);
 
 // 串口中断优先级配置
 NVIC_Configuration();
 
 // 使能串口接收中断
USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);
 
 // 使能串口
 USART_Cmd(DEBUG_USARTx, ENABLE);
 }

字符发送函数

/***************** 发送一个字符 **********************/
 void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
 {
/* 发送一个字节数据到 USART */
 USART_SendData(pUSARTx,ch);
 
 /* 等待发送数据寄存器为空 */
 while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
 }
 
 /***************** 发送字符串 **********************/
 void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
 {
 unsigned int k=0;
 do {
 Usart_SendByte( pUSARTx, *(str + k) );
 k++;
 } while (*(str + k)!='\0');

 /* 等待发送完成 */
 while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET) {
 }
}

Usart_SendByte 函数用来在指定 USART 发送一个 ASCLL 码值字符,它有两个形参,第一个为 USART,第二个为待发送的字符。它是通过调用库函数 USART_SendData 来实现的,并且增加了等待发送完成功能。通过使用 USART_GetFlagStatus 函数来获取 USART 事件标志来实现发送完成功能等待,它接收两个参数,一个是 USART,一个是事件标志。

中断服务函数

void DEBUG_USART_IRQHandler(void)
 {
 uint8_t ucTemp;
 if (USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET) {
 ucTemp = USART_ReceiveData( DEBUG_USARTx );
 USART_SendData(USARTx,ucTemp);
 }
 }

这段代码是存放在 stm32f4xx_it.c 文件中的,该文件用来集中存放外设中断服务函数。当我们使能了中断并且中断发生时就会执行这里的中断服务函数。

主函数

int main(void)
 {
 /*初始化 USART 配置模式为 115200 8-N-1,中断接收*/
 USART_Config();
 Usart_SendString( DEBUG_USARTx,"这是一个串口中断接收回显实验\n");
 while (1) {
 }
 }

首先我们需要调用 USART_Config 函数完成 USART 初始化配置,包括 GPIO 配置,USART 配置,接收中断使能等等信息。

三、连接电路 观察结果

请添加图片描述
成功的用stm32芯片向上位机连续发送“hello wondows!”,并且输入stop,stm32!
后停止发送

四、总结

对于刚刚学的人来说,本文根本看不懂,可以先学习中断和串口通信再做,收获会更多。

五、参考资料

https://blog.csdn.net/ssj925319/article/details/110431320
STM32系统利用串口助手给上位机(win10)连续发送“hello windows!”。
stm32cubemx采用中断方式利用开关点灯
零死角玩转STM32—F103指南者.pdf
提取码:0123

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩923

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值