单片机学习小组
直播中

xymbmcu

12年用户 1040经验值
擅长:可编程逻辑
私信 关注

请问STM32串口通讯如何发送hello windows?

请问STM32串口通讯如何发送hello windows?

回帖(1)

张鹏

2022-2-18 09:36:30
  一、STM32的USART窗口通讯程序

要求


  1)设置波特率为115200,1位停止位,无校验位。
  2)STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。
  3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。
硬件介绍

本人使用的是野火的野火MINI开发板,芯片是STM32F103RCT6
很方便的一点就是电脑安装CH340驱动后就可以实现USB转串口,用USB线就能实现串口通讯,不需要额外的购置串口线或者USB转串口的配件

USART介绍


  通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。 它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据 组织)SIRENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。 使用多缓冲器配置的DMA方式,可以实现高速数据通信。

寄存器标志位

状态SR常用:

数据DR常用:

波特率BRR常用:

还有

主要是发送/接受使能和中断使能(Enable)



串口初始化需要设置的(以本实验代码位例子):


步骤实例:

1. 串口时钟使能


2.忽略

3.GPIO端口模式设置

GPIO端口模式设置可以在上面提到的手册的8.1.11 查表

输入模式相关:上拉输入、下拉输入、浮空输入、模拟输入的区别
这里注意到GPIO_TX的模式设置的是推挽复用,原因如下:

  因为是串口不在时普通的IO口所以复用,
因为没接上拉电阻所以推挽。
因为TX为发送数据端口所以输出。

这样,输出口的GPIO设置完成

接收口的GPIO,注意这里是pin_10,TX是pin_9,
接收口用到是浮空/带上拉 输入

4.串口参数初始化

//USART相关寄存器设置
void User_USART_Config(void)
{


        USART_InitTypeDef USART_Config;


        //使能USART1时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


        //初始化USART_InitTypeDef结构体
        USART_Config.USART_BaudRate = 115200;                                      //波特率
        USART_Config.USART_HardwareFlowControl = USART_HardwareFlowControl_None;                        //硬件流控制(此处不用)
        USART_Config.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                                                                                //发送和接收使能设置
        USART_Config.USART_Parity = USART_Parity_No;                                                                                                                                //奇偶校验位 (此处不用)
        USART_Config.USART_StopBits = USART_StopBits_1;                                                                                                                        //停止位
        USART_Config.USART_WordLength = USART_WordLength_8b;                                                                                                //字长(可以是8或9位)


        //设置USART1对应的寄存器
        USART_Init(USART1, &USART_Config);


        //使能USART1 数据接收RXEN中断寄存器,即接收数据寄存器有数据可读时,RXEN寄存器产生中断
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);


        //使能串口USART1,使其进行工作
        USART_Cmd(USART1, ENABLE);
       
       
}
USART_Init函数第二个参数是结构体类型指针,所有必须先定义一个结构体

2/3步无先后顺序
我们因为需要的是全双工的通讯
所有这里3的mode同时使能了发送TX和接收口RX

5.开启中断并且初始化NVIC

开启接收中断
ITConfig:中断使能函数
USART_IT_RXNE函数在上文已经说过了,为读取器寄存非空函数

跟GPIO类似初始化入口函数Init
并设置优先级组

初始化结构体

6.使能串口

使用Cmd函数


7.编写中断处理函数

这里我们要求中断发生的条件是接收到了数据
中断发生后,判断接收到的字符是否为“Stop Stm32”
如果是,则停止发送,如果不是则继续发送
8.串口数据收发

这里我不需要任何中断服务,就把原程序的回显函数删掉了

9.串口传输状态获取


主函数


int main(void)
{
        DEBUG_UART_Config();
       
        //USART_SendData(DEBUG_USARTx, 'a');
       
        // printf->fputc->USART_SendData->µçÄÔµÄÉÏλ»ú
       
       
        while(1)
        {
                uint8_t ucTemp;
                uint8_t StopFlag[]="stop,stm32";
                uint16_t len,i;
                int Flag_s=1;
               
                /************************/
               
                uint8_t flag1=0;
                delay(100000);
                printf("hello windows!rn");
               
                /****************************/
                if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
                {
                        len=DEBUG_USARTx->DR & (uint16_t)0x01FF;
                       
                        ucTemp = USART_ReceiveData(DEBUG_USARTx);
                        for(i=0;i                         {
                                if(StopFlag==ucTemp)Flag_s=0;
                                if(BeginFlag==ucTemp)Flag_s=0;
                        }
                        if(Flag_s==1)
                        {
                                flag1=1;
                        }               
                }
                if(flag1==1)break;
               
        }


}
举报

更多回帖

×
20
完善资料,
赚取积分