STM32学习教程<二> USART串口发送数据

2017-12-06  本文已影响0人  七面琅琊

m_<:整个程序除去基本配置外由两部分组成,main.c与bsp_usart.c。其中,bsp_usart.c及.h负责外设USART寄存器的配置,使其能正常工作。main.c则是在USART配置完能正常操作后来实现USART怎么发送数据。

1 main.c

#include "stm32f4xx.h"
#include "./led/bsp_led.h"   //采用相对路径可不在魔法棒中添加Include Paths
#include "./usart/bsp_usart.h"

int main(void)
{
    USART_Config();   //核心bsp_usart.c中配置USART
    Usart_SendByte(USART1, 'A');   //发送一个Byte
    Usart_SendByte(USART1, '\n');   //发送换行符
    Usart_SendString(USART1, "你好,STM320F407!");   //发送一个字符串 
    while (1)
    {}
}

2.1 bsp_usart.h

#ifndef __BSP_USART_H
#define __BSP_USART_H

#include "stm32f4xx.h"

void USART_Config(void);  //配置USART
void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch);  //发送单个字符
void Usart_SendString(USART_TypeDef * pUSARTx, char *str);  //发送字符串
#endif

2.2 bsp_usart.c

#include "./usart/bsp_usart.h"
/***************** 配置USART寄存器 **********************/
void USART_Config(void)
{
  /* 第一步:初始化GPIO */
  GPIO_InitTypeDef GPIO_InitStructure;   //TX与PA9相连,通过PA9发数,因此GPIO口也要配置
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);   //使能GPIO时钟
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  /* 配置Tx引脚为复用功能  */
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   //选择复用模式
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  //选择复用的引脚     
  GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIO
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);   //将PA9复用到USART1上
  /* 第二步:配置串口初始化结构体 */
  USART_InitTypeDef USART_InitStructure;   //定义一个USART结构体
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);   //使能USART时钟
  /* 配置串口USART1模式 */
  USART_InitStructure.USART_BaudRate = 115200;   //波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;   //8位字长
  USART_InitStructure.USART_StopBits = USART_StopBits_1;   //1个停止位
  USART_InitStructure.USART_Parity = USART_Parity_No;   //无校验
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //无硬件流
  USART_InitStructure.USART_Mode = USART_Mode_Tx;   //选择输出模式
  USART_Init(USART1, &USART_InitStructure);   //初始化USART
  /* 第三步:使能串口 */
  USART_Cmd(USART1, ENABLE);
}
/***************** 发送一个字符 **********************/
void Usart_SendByte(USART_TypeDef * pUSARTx, uint8_t ch)
{
  USART_SendData(pUSARTx, ch);   //由TDR(数据发送寄存器)发送一个字节到数据移位寄存器
  while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);   //判断TDR是否为空,发送完TXE位置1 
  {}
}
/***************** 发送字符串 **********************/
void Usart_SendString(USART_TypeDef * pUSARTx, char *str)   //str理解为char[]首地址
{
  unsigned int k=0;
  do 
  {
    Usart_SendByte(pUSARTx, *(str + k));
    k++;
  }while(*(str + k) != '\0');   //字符串以\0结尾
  /* 等待发送完成 */
  while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET)   //判断所有数据是否发送完,发送完TC位置1
  {}
}
发送数据

说明:收发数据一起写有点复杂,拆开写容易懂,下节写数据接收。尽量把排版和注释做好,方便阅读。

上一篇下一篇

猜你喜欢

热点阅读