完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
UART: 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作 UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片, UART 通常被集成于其他通讯接口的连结上。
USART:通用同步/异步串行接收/发送器,(Universal Synchronous/Asynchronous Receiver/Transmitter) USART 是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。 接口通过三个引脚与其他设备连接在一起。任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。 RX:接收数据串行输入。通过过采样技术来区别数据和噪音,从而恢复数据。 TX:发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时, TX引脚处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。 USART 发送接收有三种基本方式,轮询、中断和 DMA。 USART结构框图: 关于USART发送和接收的具体过程请查阅《STM32中文参考手册》,了解即可,重点掌握实际操作应用, CubeMX大大简化了程序的编写。方便应用。 接下来简单演示使用STM32与PC进行数据的相互发送、接收… CubeMX配置 串口1默认为PA9,PA10引脚,由于我的单片机开发板PA9,PA10用作了LED驱动,且并未引出,所以将USART1复用到PB6,PB7。 如果使用中断需要使能串口中断: 时钟配置: 初始化程序分析 串口设置的一般步骤可以总结为如下几个步骤: 串口时钟使能,GPIO 时钟使能 串口复位 GPIO 端口模式设置 串口参数初始化 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤) 使能串口 编写中断处理函数 使用CubeMX配置,前面6个步骤已经自动帮我们生成了,我们只需要编写中断处理函数和主函数就可以了,我们这里暂时采用轮询的方式并不需要编写中断处理函数。 生成的串口初始化程序主要在usart.c文件中: 串口参数初始化 void MX_USART1_UART_Init(void) { huart1.Instance = USART1; //串口选择 huart1.Init.BaudRate = 115200; //波特率 huart1.Init.WordLength = UART_WORDLENGTH_8B; //8位字长 huart1.Init.StopBits = UART_STOPBITS_1; //1位停止位 huart1.Init.Parity = UART_PARITY_NONE; //无奇偶校验 huart1.Init.Mode = UART_MODE_TX_RX; //发送接收模式(全双工) huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; //不使用硬件流控制 huart1.Init.OverSampling = UART_OVERSAMPLING_16; //过采样 } 串口硬件初始化 void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(uartHandle->Instance==USART1) { __HAL_RCC_USART1_CLK_ENABLE(); //串口时钟使能 __HAL_RCC_GPIOB_CLK_ENABLE(); //GPIO端口时钟使能 /**USART1 GPIO Configuration PB6 ------> USART1_TX PB7 ------> USART1_RX */ GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //PB6端口初始化 GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //PB7端口初始化 __HAL_AFIO_REMAP_USART1_ENABLE(); //使能复用IO时钟 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0); //中断优先级管理 HAL_NVIC_EnableIRQ(USART1_IRQn); } 程序编写 首先在main.c中重定向printf()和scanf()函数到串口发送和接收,方便应用: /* USER CODE BEGIN 0 */ int fputc(int ch, FILE *f){ uint8_t temp[1] = {ch}; HAL_UART_Transmit(&huart1, temp, 1, 0xffff); return ch; } int fgetc(FILE * f) { uint8_t ch = 0; HAL_UART_Receive(&huart1,&ch, 1, 0xffff); return ch; } /* USER CODE END 0 */ 然后我们就可以在主函数中使用printf发送数据了:打印一个Pikachu #define user_main_printf(format, ...) printf( format "rn", ##__VA_ARGS__) /* USER CODE BEGIN 2 */ user_main_printf("hello world!"); user_main_printf(" .__ __ .__ "); user_main_printf("______ |__| | _______ ____ | |__ __ __ "); user_main_printf("\____ \| | |/ /\__ \ _/ ___\| | \| | \"); user_main_printf("| |_> > | < / __ \ \___| Y \ | /"); user_main_printf("| __/|__|__|_ (____ /\___ >___| /____/ "); user_main_printf("|__| \/ \/ \/ \/ "); /* USER CODE END 2 */ 采用轮询方式接收数据,并且发送到PC串口助手窗口显示: while (1) { ch=getchar(); HAL_UART_Transmit(&huart1,&ch,1,0); } 通过串口助手可以看到打印了hello world和pikachu ,并且在发送窗口发送字符,单片机收到后再发送给PC显示: |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1183浏览 3评论
609浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2336浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1897浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 00:15 , Processed in 1.147129 second(s), Total 51, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号