4.STM32 串口通信

                                                      通信的基本概念

1.串行与并行通信

串行通讯与并行通讯
按数据传送的方式,通讯可分为串行通讯与并行通讯,串行通讯是指设备之间通过少
量数据信号线 ( 一般是 8 根以下 ) ,地线以及控制信号线,按数据位形式一位一位地传输数
据的通讯方式。而并行通讯一般是指使用 8 16 32 64 根或更多的数据线进行传输的通
讯方式,它们的通讯传输对比说明见图 20-1 ,并行通讯就像多个车道的公路,可以同时传
输多个数据位的数据,而串行通讯,而串行通讯就像单个车道的公路,同一时刻只能传输
一个数据位的数据。

 串行通讯:USRAT,IIC,SPI

并行通信:SDIO(4位),FSMC(16位)

2.全双工、半双工和单工

 

iic是单工的 

3.同步与异步

 有有时钟信号的都叫同步,没有时钟信号的都叫异步

4.通信的速率

比特率:是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,每秒传送数据就越多。

波特率:表示每秒钟传送码元符号的个数,是衡量数据传送速率的指标。

在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。波特率是传输通道频宽的指标。

传输速率:传输速率是一种泛指,指的是数据从一点向另一点传输的速率。包含上面的比特率、波特率等。

通信速度:通信速度和传速速度同样也是一种泛指。比如I2C通信速度100KHz,SPI最大通信速度支持150Mbps。


                                               串口通信----串口通信协议简介

 

                                        


              

                                                          串口功能框图讲解

 

 

 

 

 

  IE:中断使能。

 

 

 USART_CR1:UE,TE.RE

 

 

 TXE:发送缓冲区

 RXE接收缓冲区

 

 

 这里DIV_Mantissa=39=0x27

USART_BRR=0X271

                                                STM32串口初始化结构体固件库

        

                                                        

  

 25.6.1 状态寄存器(USART_SR)

 USART1发送数据

#ifndef __USART1_H
#define __USART1_H
#include "stm32f10x.h"
//
#define  DEBUG_USARTx            USART1
#define  DEBUG_USART_CLK         RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxCLKCmd  RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE    115200
//
#define  DEBUG_USART_GPIO_CLK             RCC_APB2Periph_GPIOA					
#define  DEBUG_USART_GPIO_APBxClkCmd		RCC_APB2PeriphClockCmd
//
#define  DEBUG_USART_TX_GPIO_PORT		GPIOA
#define  DEBUG_USART_TX_GPIO_PIN       GPIO_Pin_9  					
#define  DEBUG_USART_RX_GPIO_PORT      GPIOA
#define  DEBUG_USART_RX_GPIO_PIN       GPIO_Pin_10
//
#define  DEBUG_USART_IRQ          USART1_IRQn
#define  DEBUG_USART_IRQHandler   USART1_IRQHandler			

void USART_Config(void);

void Usart_SendByte( USART_TypeDef* PUSARTx ,uint8_t data);

#endif
#include "usart1.h"

void USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

	RCC_APB2PeriphClockCmd(DEBUG_USART_CLK|DEBUG_USART_GPIO_CLK, ENABLE);	//使能USART1,GPIOA时钟
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;      //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	         //复用推挽输出
  GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;     //PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;     //浮空输入
  GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		 //子优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			 //IRQ通道使能
  NVIC_Init(&NVIC_InitStructure);	                      //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;							 //串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;						    //字长为8位数据格式
	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(DEBUG_USARTx, &USART_InitStructure);     //初始化串口1
  USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(DEBUG_USARTx, ENABLE);                    //使能串口1 

}

void Usart_SendByte( USART_TypeDef* PUSARTx ,uint8_t data)
{
	 USART_SendData( PUSARTx, data);
	 while( USART_GetFlagStatus( PUSARTx, USART_FLAG_TXE ) == RESET);

}

 记得不记得拍死!!

                                                串口发送和接收字节讲解

/*发送两个字节的数据*/
void Usart_SendHalfWord( USART_TypeDef* PUSARTx ,uint16_t data)
{
	 uint8_t temp_h,temp_l;
	
	 temp_h = (data&0xff00) >> 8 ;            //要发送的高八位数据
	 temp_l  = (data&0xff);				        //要发送的低八位数据
	 
	 USART_SendData( PUSARTx, temp_h);                                 //USART1要发送的数据data
	 while( USART_GetFlagStatus( PUSARTx, USART_FLAG_TXE ) == RESET);//当数据已经转移到位移寄存器,然后输出到上位机
    
	 USART_SendData( PUSARTx, temp_l);                                 //USART1要发送的数据data
	 while( USART_GetFlagStatus( PUSARTx, USART_FLAG_TXE ) == RESET);//当数据已经转移到位移寄存器,然后输出到上位机
	
}
//发送8位数据的数组
void Usart_SendArr( USART_TypeDef* PUSARTx ,uint8_t *arr ,uint8_t num)
{
	 uint8_t i;
	 for( i=0;i<num;i++ )
	 {
			 Usart_SendByte( PUSARTx ,arr[i]);
	 }
	 while( USART_GetFlagStatus( PUSARTx, USART_FLAG_TC ) == RESET);//TC:发送完成 (Transmission complete)
}
int main(void)
 {
	 uint8_t a[10]={1,2,3,4,5,6,7,8,9,10};
	 USART_Config();
	 Usart_SendArr( DEBUG_USARTx ,a ,10) ;
	 while(1) {}
 }

代码解析: 

uint8_t    *arr    arr是存放地址的指针变量 (数组、字符)    传入的参数可以是地址  :a                 a[10] 

发送字符串:

/*发送一个字符串*/
void Usart_SendStr( USART_TypeDef* PUSARTx ,uint8_t *str  )
{
	uint8_t i=0;              //注意i要初始化,不初始化指针里的地址飞到哪里去了
	do
	{
		 Usart_SendByte( PUSARTx , *(str+i));
		 i++;
	}while(*(str+i) !='\0');
	while( USART_GetFlagStatus( PUSARTx, USART_FLAG_TC ) == RESET);//TC:发送完成 (Transmission complete)

}

在keil使用printf

/*使用microLib的方法*/
 /* 
int fputc(int ch, FILE *f)
{
	USART_SendData(USART1, (uint8_t) ch);

	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}	
   
    return ch;
}
int main(void)
 {
	 uint8_t a[10]={1,2,3,4,5,6,7,8,9,10};
	 USART_Config();
	// Usart_SendByte( DEBUG_USARTx , 'A');
	// Usart_SendHalfWord( DEBUG_USARTx ,0xff56);
	 Usart_SendArr( DEBUG_USARTx ,a ,10) ;

	 while(1) 
	 {

	 }

 }

程序移植!!

#ifndef __USART1_H
#define __USART1_H
#include "stm32f10x.h"
#include "stdio.h"

#define DEBUG_USART1  0
#define DEBUG_USART2	 0
#define DEBUG_USART3  1
//
#if DEBUG_USART1
#define  DEBUG_USARTx            USART1
#define  DEBUG_USART_CLK         RCC_APB2Periph_USART1
#define  DEBUG_USART_APBxCLKCmd  RCC_APB2PeriphClockCmd
#define  DEBUG_USART_BAUDRATE    115200
//
#define  DEBUG_USART_GPIO_CLK             RCC_APB2Periph_GPIOA					
#define  DEBUG_USART_GPIO_APBxClkCmd		RCC_APB2PeriphClockCmd
//
#define  DEBUG_USART_TX_GPIO_PORT		GPIOA
#define  DEBUG_USART_TX_GPIO_PIN       GPIO_Pin_9  					
#define  DEBUG_USART_RX_GPIO_PORT      GPIOA
#define  DEBUG_USART_RX_GPIO_PIN       GPIO_Pin_10
//
#define  DEBUG_USART_IRQ          USART1_IRQn
#define  DEBUG_USART_IRQHandler   USART1_IRQHandler			

#elif DEBUG_USART2
//串口2
#define  DEBUG_USARTx            USART2
#define  DEBUG_USART_CLK         RCC_APB1Periph_USART2
#define  DEBUG_USART_APBxCLKCmd  RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE    115200
//
#define  DEBUG_USART_GPIO_CLK             RCC_APB2Periph_GPIOA					
#define  DEBUG_USART_GPIO_APBxClkCmd		RCC_APB2PeriphClockCmd
//
#define  DEBUG_USART_TX_GPIO_PORT		GPIOA
#define  DEBUG_USART_TX_GPIO_PIN       GPIO_Pin_2  					
#define  DEBUG_USART_RX_GPIO_PORT      GPIOA
#define  DEBUG_USART_RX_GPIO_PIN       GPIO_Pin_3
//
#define  DEBUG_USART_IRQ          USART2_IRQn
#define  DEBUG_USART_IRQHandler   USART2_IRQHandler			
#elif DEBUG_USART3
//串口3
#define  DEBUG_USARTx            USART3
#define  DEBUG_USART_CLK         RCC_APB1Periph_USART3
#define  DEBUG_USART_APBxCLKCmd  RCC_APB1PeriphClockCmd
#define  DEBUG_USART_BAUDRATE    115200
//
#define  DEBUG_USART_GPIO_CLK             RCC_APB2Periph_GPIOB					
#define  DEBUG_USART_GPIO_APBxClkCmd		RCC_APB2PeriphClockCmd
//
#define  DEBUG_USART_TX_GPIO_PORT		GPIOB
#define  DEBUG_USART_TX_GPIO_PIN       GPIO_Pin_10  					
#define  DEBUG_USART_RX_GPIO_PORT      GPIOB
#define  DEBUG_USART_RX_GPIO_PIN       GPIO_Pin_11
//
#define  DEBUG_USART_IRQ          USART3_IRQn
#define  DEBUG_USART_IRQHandler   USART3_IRQHandler			

#endif
void USART_Config(void);

void Usart_SendByte( USART_TypeDef* PUSARTx ,uint8_t data);

void Usart_SendHalfWord( USART_TypeDef* PUSARTx ,uint16_t data);

void Usart_SendArr( USART_TypeDef* PUSARTx ,uint8_t *arr ,uint8_t num);

void Usart_SendStr( USART_TypeDef* PUSARTx ,uint8_t *str);

#endif

发送数据给上位机~_~

在stm32f10x_it.c需要添加#include "usart1.h"

void DEBUG_USART_IRQHandler(void)
{
	uint8_t ucTemp;
	if( USART_GetFlagStatus( USART1, USART_FLAG_RXNE )!=RESET )
	{
		ucTemp= USART_ReceiveData(USART1);
	   USART_SendData(USART1, ucTemp);	
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值