文档章节

stm32 Uart 串口

kangxin1234
 kangxin1234
发布于 2015/09/07 09:47
字数 593
阅读 115
收藏 1

        STM32的串口非常强大,它不仅支持最基本的通用串口同步、异步通讯,还具有 LIN总线功能(局域互联网)、IRDA功能(红外通讯)、SmartCard功能。usart1挂在APB2总线上,usart2和usart3挂在APB1总线上。

         这里只说明串口通信如何使用,以Usart1为例,usart1用的是GPIOA_Pin_9,和GPIOA_Pin_10。Pin9为Tx,Pin10为RX。

        配置uart主要有4点:

        1、开启时钟:

        开启GPIOA时钟和USART1的时钟。

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);

        2、配置GPIO_InitTypeDef结构体:

void Init_Usart1(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;																

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 				
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	  //Pin9为Tx配置为复用推挽输出 		
  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	   	
  	GPIO_Init(GPIOA, &GPIO_InitStructure);	
  				   	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//Pin10为Rx配置为浮空输入				
  	GPIO_Init(GPIOA, &GPIO_InitStructure);	
}

    3、配置USART_InitTypeDef结构体,开启中断并使能Usart1:

void Usart1_Configuration(uint32_t BaudRate)
{
	USART_InitTypeDef USART_InitStructure;			

	USART_InitStructure.USART_BaudRate            =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; //开启TXAndRX
	USART_Init(USART1, &USART_InitStructure);							
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    //使能中断						
	USART_Cmd(USART1, ENABLE);   //使能usart1  								
}

    4、配置NVIC:

void Usart1_Init_NVIC(void)
{ 	
  	NVIC_InitTypeDef NVIC_InitStructure;			

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//MVIC配置为组2

	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;		
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //主优先级	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	//子优先级	 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			 
	NVIC_Init(&NVIC_InitStructure);		
}

这样就可以使用串口了。

    如果想使用stdio.h中的printf函数需要重新实现一个fputc函数如下:

int fputc(int Data, FILE *f)
{   
	while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE));//等待发送完成	
												
	USART_SendData(USART1,Data);	//发送一个字节					  	   
	return Data;										
}


中断函数:

void USART1_IRQHandler(void)
{
	uint8_t ReceiveData;
	if((USART_GetITStatus(USART1,USART_IT_RXNE)))//判断是否为接收中断
	{
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志位
		ReceiveData=USART_ReceiveData(USART1);//接收一个字节
		printf("%c", ReceiveData);
	}
}

固件库中你要使用的几个函数:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);//发送一个字节到指定串口
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);//接收一个字节
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);//得到状态标志位,判断是发送接收是否完毕。
void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);//清除状态标志位
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);//得到状态标志位,判断是RX还是TX中断。
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);//清除中断标志位

注意:

    进入中断之后,首先判断是发送中断还是接收中断,然后清除中断标志位。之后再接收或发送数据。

    这里整理了一个简单的配置函数库,usart.c, usart.h.

    文件链接

© 著作权归作者所有

kangxin1234

kangxin1234

粉丝 38
博文 51
码字总数 35417
作品 0
程序员
私信 提问
【Contiki学习】01.Contiki-stm32系统下实现serial-shell功能

一,背景介绍 之前通过网上收集资料(资料后期整理之后会在博客分享),在stm32上面跑通了,就是实现了简单的点灯程序,以及串口输出。 但是后期开发使用肯定需要用到shell,经过一番折腾后小...

u014572382
2017/02/04
0
0
区分:串口,COM口,UART,USART

本文主要简述串口,COM口,UART,USART之间的联系和区别,另外也讲述了串口的RS-232电平和TTL电平,以及单片机与电脑之间的串口连接方式。 串口 串口,即串行接口,与之相对应的另一种接口叫...

qq_26904271
2018/04/08
0
0
AliOS Things标准输入输出端口对接以及修改方法

1 标准输入输出端口对接 标准输入输出用于输出系统日志、打印异常信息、软件调试、CLI交互等场景。在具体项目中,只需要对接PUTCHARPROTOTYPE和GETCHARPROTOTYPE两个函数即可。其具体定义如下...

jason_sophia
2018/08/09
0
0
QianFan-zhao/LogicMaster

Logic Master What's Logic Master? Logic master is a logic protocol generator device based on stm32, accessed from a command line in a serial terminal(115200,8N1), using lua scri......

QianFan-zhao
2015/12/28
0
0
STM32 HAL库 回调函数总结

普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数...

super828
2018/01/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt编写自定义控件69-代码行数统计

一、前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行、注释行、代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计。写完这...

飞扬青云
22分钟前
4
0
驰骋工作流引擎-ccflow关于 “ 是否自动计算未来的处理人”的功能变更

关键字:流程未来节点处理人 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 业务背景:一个流程在启动起来后,是可以对一些节点计算出来处理人是谁,流程的走向。对于另...

孟娟
38分钟前
5
0
IT兄弟连 HTML5教程 HTML5表单 HTML表单设计1

表单是PHP程序中最常使用的收集站点访问者信息的数据输入界面。通过表单浏览器获取用户的输入数据,并传送给Web服务器的脚本程序中,以各种不同的方式进行处理。在表单中提供了多种输入方式,...

老码农的一亩三分地
40分钟前
4
0
武者Vue

本文转载于:专业的前端网站➼武者Vue 1 - Introduction2 - The Vue Instance3 - Data & Methods4 - Data Binding5 - Events6 - Event Modifiers7 - Keyboard Events8 - Two-Way Data......

前端老手
45分钟前
6
0
uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
55分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部