STM32的USART串口通信
一、串口通信简介
1.两种电平标准TTL标准:当电平处于2.4~5V之间时,表示逻辑1;当电平处于 0 ~0.5V时,表示逻辑0。
RS-232标准:当电平处于-15~-3V之间时,表示逻辑1;当电平处于3 ~15V时,表示逻辑0。
2.RS-232标准的传输距离及抗干扰能力更好。重点是两种标准的转换。
USB转串口通讯
USB转串口主要是设备跟电脑通信,该过程需要电平转换芯片来实现,常用的芯片有CH340,PL2303,CP2102,FT232。使用的时候需要安装电平转换芯片的驱动。
3.原生的串口到串口
主要是控制器跟串口设备或者传感器通信,不需要电平转换芯片来转换电平,直接使用TTL电平通信。例如GPS模块。
4.波特率与比特率
波特率即每秒钟传输的码元个数,便于对信号进行解码。常用的波特率4800,9600,115200。比特率即每秒钟传输的二进制位数。
5.通讯的起始和停止信号
起始信号由逻辑0的数据位表示,停止信号可由0.5,1.5,1或2个1的数据位来表示。双方自行约定。
6.校验
通过校验码来避免数据在传输过程中,受到外部干扰而发生偏差。常采用奇偶校验,只能检测出发生偏差位的1位。
二、使用stm32芯片进行串口通信
要求:
(1)设置波特率为115200,1位停止位,无校验位。
(2)STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。
(3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。
参考程序:原程序
1.这程序和我们的要求还不符合,我们还需要改一下
具体改一下main函数,中断函数和发送函数。具体如下
main函数 修改如下
#include "stm32f10x.h"
void Delay_ms(volatile unsigned int t)
{
unsigned int i,n;
for(n=0;n<t;n++)
for(i=0;i<800;i++);
}
int main(void)
{
User_USART_GPIO_Config();
User_NVIC_Config();
User_USART_Config();
User_UART_Send_String(USART1, "abcdefg!\n");
while(1)
{
User_UART_Send_String(USART1, "hello windows!\n");
Delay_ms(5000);
}
}
中断函数修改如下:
void SysTick_Handler(void)
{
}
//中断服务函数,前面在User_USART.c void User_USART_Config(void)函数中
//USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了数据接收中断,所以
//将处理接收数据时的中断服务
int i=0;
uint8_t a[11];
void USART1_IRQHandler(void)
{
//uint8_t temp;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
a[i++] = USART_ReceiveData(USART1);
//USART_SendData(USART1, a[i-1]);
}
if(a[0]=='S'&&a[1]=='t'&&a[2]=='o'&&a[3]=='p'&&a[4]==','&&a[5]=='s'&&a[6]=='t'&&a[7]=='m'&&a[8]=='3'&&a[9]=='2')
while(1);
}
发送函数修改如下:
void User_USART_Send_Byte(USART_TypeDef* pUSARTX, uint8_t Data)
{
//向数据寄存器写入8bit数据
pUSARTX->DR = (Data & (uint16_t)0x01FF);
//USART_GetFlagStatus检查数据是否发送完成
while(USART_GetFlagStatus(pUSARTX, USART_FLAG_TXE) == RESET);
}
//向串口发送一个字符串数据,即可以发送包含多个字节的数据,char类型为8bit,其字符串中的每个字符都可用一个int数表示,即ASCII标准
void User_UART_Send_String(USART_TypeDef* pUSARTX, char* str)
{
unsigned int i = 0;
do
{
User_USART_Send_Byte(pUSARTX, *(str + i));
i++;
}
while(*(str+i)!='\0');
//USART_GetFlagStatus检查多个数据是否发送完成
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
{
}
2.将程序修改好之后我们就开始将程序烧录到stm32芯片中
具体要用到软件FlyMcu
3.在这之前我们还要先下一个驱动 CH340,这个很容易就可以在网上下,将芯片通过USB串口转接线接到电脑上边,就可以看到我们电脑的设备管理器的端口处就会显示这个CH340驱动
4.接着就开始烧录程序
主要用到FlyMcu软件,找好我们调试好的.hex程序,将他烧录到我们的stm芯片中。
显示烧录成功
5.接着开始在野火多功能调试助手运行
点击打开串口,就会发现芯片一直在发送hello,window
然后我们手动发送Stop,stm32 就会发现它停止发送了。
三、总结
整个程序的运行过程还是比较简单的,但中间就有很多细节问题很难受,比如电脑下不起CH340驱动,芯片的线的连接之类的,这次感觉涨了很多的经验,获益匪浅。
上一篇: STM32---ADC模数转换
下一篇: 如何用正则匹配带多个属性的html标签