一、串行通信的通信方式
1.同步通信:带时钟同步信号传输,有一根线是同步时钟。例如SPI(全双功)、IIC(半双工)通信接口
2.异步通信:不带时钟同步信号,必须约定好波特率。例如UART(全双功)
二、STM32的串口通信接口
UART:通用异步收发器。
USART:通用同步异步收发器。
STM32F10x系列包含3个USART和2个UART。
都是TTL电平交叉相连即可
与PC机可以使用USB-TTL进行通信。
三、通信引脚
四、常用串口相关寄存器
1.USART_SR状态寄存器:里面一些相关位可以用来判断是否发送接收完成等。
2.USART_DR数据寄存器:通过读写这个寄存器来发送接收数据
3.USART_BRR波特率寄存器:
波特率计算方法:波特率=fPLCLKX /(16*USARTDIV);USARTDIV=72000000/(115200*16)=39.0625
DIV_Fraction=16*0.0625=1=0X01;(小数部分)
DIV_Mantissa=39=0X27;(整数部分)
从而得到USART_BRR波特率寄存器的值为0X0271,这就是115200的波特率对应的寄存器值。
五、串口操作相关库函数
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
串口初始化:波特率,数据字长,奇偶校验,硬件控制流以及收发使能。
第一个成员变量是串口标号,第二个成员变量是结构体
typedef struct
{
uint32_t USART_BaudRate; //波特率
uint16_t USART_WordLength; //位长,8位或9位
uint16_t USART_StopBits; //停止位
uint16_t USART_Parity; //奇偶校验位
uint16_t USART_Mode; //使能输入输出
uint16_t USART_HardwareFlowControl; //硬件流控制
} USART_InitTypeDef;
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
使能串口
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState);
使能相关中断
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);
获取中断状态标志位
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
清除中断状态标志位
六、串口配置一般步骤
1.串口时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
2.串口复位(不是必须的)
USART_DeInit();
3.GPIO模式设置
对GPIO口输入输出的设置
4.串口初始化设置
USART_Init(USART1, &USART_InitStructure);
5.开启中断并且初始化NVIC
NVIC_Init();
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
6.使能串口
USART_Cmd(USART1, ENABLE);
7.编写中断处理函数
void USART1_IRQHandler(void)
8.串口数据收发
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
9.串口传输状态获取
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
七、串口初始化程序编写
void uart_init(u32 bound){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
//GPIOA.9发送GPIO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIOA.10接收GPIO配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// NVIC 配置(在主函数中需要对NVIC设置分组)
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//对USART配置波特率、停止位、校验位等配置
USART_InitStructure.USART_BaudRate = bound;
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(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能接收中断
USART_Cmd(USART1, ENABLE); //使能串口
}
上一篇:为物联网应用开发提速 STM32MP1 MPU贸泽开售
下一篇:STM32F103 时钟配置
推荐阅读
史海拾趣
以前在本版常看到有人问如何从designer导出S曲线、方向图等问题,似乎一直没有得到解决,查看软件帮助,里面的提示也是错误的。这次我自己碰到了这个问题,不得不潜心研究一番,现将结果公布如下,希望不会是toooooooooold。 在HFSS中,生成re ...… 查看全部问答∨ |
如果您正在设计一款手机,您必须解决的关键问题就是能将多少功能集成到尽可能小的空间中。手机的功能是否越多越好?这可不一定。很多人常常碰到难用的手机,就是因为这些手机在过小的空间内塞进了过多的功能。 如何将多种功能整合在一个较小空间内 ...… 查看全部问答∨ |
作者:孙天泽,华清远见嵌入式学院金牌讲师。 从1991年诞生的那天起,Linux内核就在全世界的黑客们精心呵护下不断发展壮大。很多Linux Fans想为Linux内核做贡献,但或许是包括技术在内的等等原因,你的Ideas不一定会被内核容纳。对于操作系统来 ...… 查看全部问答∨ |
最近写了一个PC与PLC 串口通信的小程序,我对PLC一点都不了解,主要是读取寄存器的值. 我想问问 1 PLC的地址怎么表示,只有一台PLC通过USB转串口连接PC 2 RTU模式读取数,我是不是也应该在PLC上设置成RTU? (施耐德的PLC 怎么设置?) … 查看全部问答∨ |
有个工控设备,其中内置一台个人电脑(PC全内置主板),需要配备显示器和键盘。 因为安装空间太小,容纳不了普通CRT或笔记本LCD显示器。况且,该设备的用户界面很简单,只需要控制串口通讯以及操作一个简单的ACCESS数据库,使用带触摸的2.5~3.5寸 ...… 查看全部问答∨ |
VS2005下的类视图分页下,一个类在类列表里面看不到,怎么回事?.h和.cpp文件工程下都加进去了。 VS2005下的类视图分页下,一个类在类列表里面看不到,怎么回事?.h和.cpp文件工程下都加进去了。… 查看全部问答∨ |
EVC pocket pc 2003程序和VS2005 pocket pc SE2003程序区别及问题! EVC下pocket pc 2003和VS2005 pocket pc se 2003模拟器有什么区别???? 是这样的,我在EVC下pocket pc 2003下编译成功并能运行的一个.exe文件直接共享在VS2005 pocket pc se 2003下,但是却点击运行不了.出现如下错误: connot find "mfctest"(// ...… 查看全部问答∨ |
前几日使用维纶触摸屏MT6100I系列产品,大约7天后发现故障: 基本症状如下: 黑屏与维纶手型标志交替闪动. 咨询厂家说: 没有遇到此类情况. 把屏返回厂家说,测试了几天,没有发现故障. 大约7天后,另外一个工地,同样的屏出现了同样的故障.即黑屏与维纶手 ...… 查看全部问答∨ |