STM32串口通信

何为通信

       计算机的设备和外部设备之间进行数据传输

串/并行通信

   

串口通信(通信对应的引脚可以在数据手册中寻找)

TX:数据发送

RX:数据接收

SCLK:时钟(仅同步通信有用)

串口编程所用的固件库函数

1)串口初始化函数:USART_Init

2)中断配置函数:USART_ITConfig

3)串口使能函数:USART_Cmd

4)数据发送函数:USART_SendData

5)数据接受函数:USART_ReceiveData

6)中断位获取函数:USART_GetITStatus

USART初始化结构体

typedef struct

{

  uint32_t USART_BaudRate;            //波特率  一般设置为2400 9600 19200 115200

  uint16_t USART_WordLength;          //字长  可选8位或者9位,没有奇偶检验位选择8位,有奇偶校验位选择9

  uint16_t USART_StopBits;            //停止位 一般选择1个

  uint16_t USART_Parity;             //校验位 

  uint16_t USART_Mode;               //USART模式

  uint16_t USART_HardwareFlowControl; //硬件流控制

} USART_InitTypeDef;

使用同步模式需要配置SCLK引脚输出脉冲的属性

typedef struct

{

  uint16_t USART_Clock;    //时钟使能

  uint16_t USART_CPOL;    //时钟极性

  uint16_t USART_CPHA;   //时钟相位

  uint16_t USART_LastBit;  //最尾位时钟脉冲

} USART_ClockInitTypeDef;

编程要点

1)初始化串口要用的GPIO

2)初始化串口:USART_InitTypeDef

3)中断配置:接收中断,中断优先级

4)使能串口

5)编写发送和接受函数

6)编写中断服务函数

USART.h函数

#ifndef __USART_H

#define __USART_H

#include "stdio.h"    

#include "stm32f10x.h"

#define USART_REC_LEN              200      //定义最大接收字节数 200

#define EN_USART1_RX             1        //使能(1)/禁止(0)串口1接收

          

extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符

extern u16 USART_RX_STA;                 //接收状态标记    

void uart_init(void);

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch);

#endif

USART.c函数

void uart_init(void){

   //GPIO端口设置

   GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

     

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);    //使能USART1,GPIOA时钟

  

    //USART1_TX   GPIOA.9

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

   

  //USART1_RX      GPIOA.10初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart1 NVIC 配置

   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    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 = 115200;//串口波特率

    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(USART1, &USART_InitStructure); //初始化串口1

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断

  USART_Cmd(USART1, ENABLE);                    //使能串口1

}

/*****************  发送一个字节 **********************/

void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)

{

    /* 发送一个字节数据到USART */

    USART_SendData(pUSARTx,ch);

    /* 等待发送数据寄存器为空 */

    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);    

}

/****************** 发送8位的数组 ************************/

void Usart_SendArray( USART_TypeDef * pUSARTx, uint8_t *array, uint16_t num)

{

  uint8_t i;

    

    for(i=0; i<num; i++)

  {

        /* 发送一个字节数据到USART */

        Usart_SendByte(pUSARTx,array[i]);    

  

  }

    /* 等待发送完成 */

    while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET);

}

/*****************  发送字符串 **********************/

void Usart_SendString( USART_TypeDef * pUSARTx, char *str)

{

    unsigned int k=0;

  do

  {

      Usart_SendByte( pUSARTx, *(str + k) );

      k++;

  } while(*(str + k)!='\0');

  

  /* 等待发送完成 */

  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)

  {}

}

/*****************  发送一个16位数 **********************/

void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)

{

    uint8_t temp_h, temp_l;

    

    /* 取出高八位 */

    temp_h = (ch&0XFF00)>>8;

    /* 取出低八位 */

    temp_l = ch&0XFF;

    

    /* 发送高八位 */

    USART_SendData(pUSARTx,temp_h);    

    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

    

    /* 发送低八位 */

    USART_SendData(pUSARTx,temp_l);    

    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);    

}

///重定向c库函数printf到串口,重定向后可使用printf函数

int fputc(int ch, FILE *f)

{

        /* 发送一个字节数据到串口 */

        USART_SendData(DEBUG_USARTx, (uint8_t) ch);

        

        /* 等待发送完毕 */

        while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);        

    

        return (ch);

}

///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数

int fgetc(FILE *f)

{

        /* 等待串口输入数据 */

        while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

        return (int)USART_ReceiveData(DEBUG_USARTx);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值