📄 uart.c
字号:
/****************************************************************************
* Copyright (C), 2010 求是信息科技
*
* 文件名: uart.c
* 内容简述: 本文件包含USART1使用的一些常用函数。
* 函数说明:USART1_Init()
* 将串口USART1配置好,默认打开中断,优先级为组0,从优先级为0,在实际应用中根据需要更改
* USART1_RCC_Configuration()
* 系统初始化,使能USART1和GPIOA时钟,调用时就放在最前面,否则程序无法正常运行
* USART1_GPIO_Configuration()
* USART1管脚配置
* USART1_Configuration()
* USART1参数配置
* USART1_WriteString()
* 向USART1写一个字符串
* USART1_IRQHandler()
* 中断服务子程序,根据需要进行更改
* printf() scanf()
* 向串口输出,从串口接收数据,与平常使用无差别
* 文件历史:
* 版本号 日期 作者 说明
* v1.0 2011-2-8 吴占敏 创建该文件
*/
#include "stm32f10x.h"
#include <stdio.h>
#include "uart.h"
#include "includes.h"
extern OS_EVENT *USART1MsgQueue;
char msg[40];
/*******************************************************************************
* 函数名:USART1_Init
* 输 入: 无
* 输 出: 无
* 功能说明:USART1初始化,管脚配置,USART1参数配置,时钟使能,中断配置。
**/
void USART1_Init(void)
{
USART1_RCC_Configuration(); //必须放在第一行,否则串口无法正常工作
USART1_GPIO_Configuration();
USART1_Configuration();
//USART1_NVIC_Configuration();
}
/*******************************************************************************
* 函数名:USART1_RCC_Configuration
* 输 入: 无
* 输 出: 无
* 功能说明:系统初始化,使能USART1和GPIOA时钟,调用时就放在最前面,否则程序无法正常运行
*/
void USART1_RCC_Configuration(void)
{
/*使能USART1和GPIOA时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );
}
/*******************************************************************************
* 函数名:USART1_GPIO_Configuration
* 输 入: 无
* 输 出: 无
* 功能说明:USART1管脚配置。
* 根据手册,USART1_TX为PA9,必须设置为复用推挽输出 ,
* USART_RX为PA10,必须设置为浮动输入或上拉输入
*/
void USART1_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*把 GPIO_InitStruct 中的每一个参数按缺省值填入
其实没有这一步程序功能不会有太大影响,但是编写C程序时,
我们往往希望变量的值在我们的掌控之中*/
GPIO_StructInit(&GPIO_InitStructure);
/* USART_TX管脚配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP ;//复用推挽输出,一开始设置成了推挽输出,结果错误
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* USART_RX管脚配置 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;// 浮动输入,也可用上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*******************************************************************************
* 函数名:UART1_SendByte
* 输 入: 1字节数据
* 输 出: 无
* 功能说明:USART1发送一个字节的数据。
*/
void UART1_SendByte(INT8U TxData)
{
while (!USART_GetFlagStatus(USART1,USART_FLAG_TXE));
USART_SendData(USART1, TxData);
}
/*******************************************************************************
* 函数名:UART1_WriteString
* 输 入: 字符串地址指针
* 输 出: 无
* 功能说明:USART1发送一个字符串。
*/
void USART1_SendString(u8* TxString)
{
while(*TxString != '\0')
{ while (!USART_GetFlagStatus(USART1,USART_FLAG_TXE));//等待数据寄存器数据移入移位寄存,防止覆盖上一次数据
USART_SendData(USART1, *(TxString++));//该函数在标准库定义,参考文件stm32f10x_usart.c
}
}
/*******************************************************************************
* 函数名:USART1_Configuration
* 输 入: 无
* 输 出: 无
* 功能说明:USART1配置。
* 波特率115200,数据位8位,停止位1位,无奇偶校验,无流控制,
* 全双工,使能中断,使能USART1外设
*/
void USART1_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200 ;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
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);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能USART1中断
USART_Cmd(USART1, ENABLE);
}
/*******************************************************************************
* 函数名:USART1_NVIC_Configuration
* 输 入: 无
* 输 出: 无
* 功能说明:系统中断管理,USART1中断优先级设置。
* 优先级组0,USART1的IRQ通道,从优先级为0,通道使能
* 备 注:为了方便使用,此处单独定义了这么一个中断管理函数,
* 若还有其他中断,则最好把所有中断放一起进行优先级分配。
*/
void USART1_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/* Enable the USARTy Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*******************************************************************************
* 函数名:USART1_IRQHandler
* 输 入: 无
* 输 出: 无
* 功能说明:USART1中断服务子程序。
**/
void USART1_IRQHandler(void)
{
u8 RxData;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
RxData = USART_ReceiveData(USART1);
UART1_SendByte(RxData);
}
}
void USART1_Isr(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
msg[0] = USART_ReceiveData(USART1);
OSQPost(USART1MsgQueue,(void *)&msg[0]);
}
}
//////////////////////////////////////////////////////////////////
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
/*******************************************************************************
* 函数名:fputc
* 输 入:
* 输 出:
* 功能说明:重定义fputc函数,这样可以使用printf函数从串口1打印输出
*/
int fputc(int ch, FILE *f)
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, (uint8_t) ch);
return ch;
}
/*******************************************************************************
* 函数名:fgetc
* 输 入:
* 输 出:
* 功能说明:重定义fgetc函数,这样可以使用scanf函数从串口1输入数据
*/
int fgetc(FILE *f)
{
/* 等待串口1输入数据 */
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
{}
return (int)USART_ReceiveData(USART1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -