打印
[STM32F4]

Nucleo F401再探索——小串口本事大

[复制链接]
1514|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
串口作为和上位机通讯的一个神奇,我们在开发和调试中试离不开它的,它可以直接将传感器采集到得一些数据输出打印到电脑端。本次我们来为NULEO添加一个臂膀,需要特别注意是的NUCLEO的串口2接到ST-Link,不是串口1哦。

沙发
aizaixiyuanqian|  楼主 | 2018-5-31 18:47 | 只看该作者
1.新建USART.C与USART.H两个文件,在USART.C中编写对串口的相关配置,在USART.H声明相关函数供主函数和其他函数调用。

使用特权

评论回复
板凳
aizaixiyuanqian|  楼主 | 2018-5-31 18:47 | 只看该作者
2.在USART.C中,主要是完成串口的初始化(串口管脚初始化、管脚映射、波特率、数据位、停止位等)。这些大家都懂得们这里不在啰嗦。

使用特权

评论回复
地板
aizaixiyuanqian|  楼主 | 2018-5-31 18:48 | 只看该作者
本帖最后由 aizaixiyuanqian 于 2018-7-31 22:27 编辑

void usart_init()
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
         NVIC_InitTypeDef NVIC_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能 GPIOA 时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);// USART2时钟使能
   //连接PXx到串口USARTx
   GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //PA2 复用 USART2
   GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //PA3复用 USART2
   //GPIO初始化
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;   //复用
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_Init(GPIOA, &GPIO_InitStructure);
   //配置串口
  USART_InitStructure.USART_BaudRate = 115200;   //波特率
  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(USART2, &USART_InitStructure);  
  USART_Cmd(USART2, ENABLE);     //串口使能
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断

  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;  
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);         
}

使用特权

评论回复
5
aizaixiyuanqian|  楼主 | 2018-5-31 18:51 | 只看该作者
这里我们先简单的来测试下,先不采用中断的方式,使用C语言中的打印函数。我们需要做以下三个步骤:

使用特权

评论回复
6
aizaixiyuanqian|  楼主 | 2018-5-31 18:53 | 只看该作者
2.1USART.H中引用 #include “stdio.h”

使用特权

评论回复
7
aizaixiyuanqian|  楼主 | 2018-5-31 18:53 | 只看该作者
2.2在Taget选项卡中,勾选用Use Micro LIB。


使用特权

评论回复
8
aizaixiyuanqian|  楼主 | 2018-5-31 18:54 | 只看该作者
2.3在USART.C添加下面代码。
int fputc(int ch, FILE *f)
{
         /* 发送一个字节数据到串口 */
         USART_SendData(USART2, (uint8_t) ch);
         /* 等待接收完成 */
         while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
        return (ch);
}

使用特权

评论回复
9
aizaixiyuanqian|  楼主 | 2018-5-31 18:55 | 只看该作者
3.主函数中完成对串口的初始化,直接打印测试。
int main()
{
        usart_init();
        while(1)
        {
                printf("欢迎学习NUCLEO板卡—STM32F401\n");               
        }
}

使用特权

评论回复
10
aizaixiyuanqian|  楼主 | 2018-5-31 18:56 | 只看该作者
很遗憾的是,我们打开串口助手,设置好波特率和一些数据位后打印出来的是一些乱码,这个问题困扰我很久,这几天时间里我一直在看ST时钟配置的底层库是如何设置的,终于这个问题让我给解决了,默认的库配置HSE直接定义为25M,我们需要将HSE的值改为8M即可

使用特权

评论回复
11
aizaixiyuanqian|  楼主 | 2018-5-31 18:56 | 只看该作者
在stm32f4xx.h文件中将默认的25000000改为8000000


使用特权

评论回复
12
aizaixiyuanqian|  楼主 | 2018-5-31 18:57 | 只看该作者
再次编译,烧写运行。打开串口助手可以看到串口已经被打印出来,这个的串口调试大功告成。

使用特权

评论回复
13
aizaixiyuanqian|  楼主 | 2018-5-31 18:57 | 只看该作者
串口助手打印出来的数据

使用特权

评论回复
14
aizaixiyuanqian|  楼主 | 2018-5-31 18:58 | 只看该作者
有了串口这个臂膀我们在后面的学习中更加得心应手,我们可以直接将传感器获取的值打印出来,方便开发调试。

使用特权

评论回复
15
yklstudent| | 2018-6-4 11:38 | 只看该作者
为什么都喜欢用这个功能

使用特权

评论回复
16
aizaixiyuanqian|  楼主 | 2018-6-17 20:43 | 只看该作者
yklstudent 发表于 2018-6-4 11:38
为什么都喜欢用这个功能

这个功能不好吗?

使用特权

评论回复
17
enderman1| | 2018-7-3 20:31 | 只看该作者
感谢分享!

使用特权

评论回复
18
enderman1| | 2018-7-3 20:33 | 只看该作者
底层的一些东西果然也非常重要啊!

使用特权

评论回复
19
gaoke231| | 2018-7-3 21:22 | 只看该作者
算是良心分享了,很详细啊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

1353

帖子

6

粉丝