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
{}
}
发送数据
说明:收发数据一起写有点复杂,拆开写容易懂,下节写数据接收。尽量把排版和注释做好,方便阅读。
网友评论