新手入门
- 积分
- 6
- 金钱
- 6
- 注册时间
- 2022-6-28
- 在线时间
- 1 小时
|
使用的串口 是USART1
usart.c 文件
#include "usart.h"
/*
* 功能:USART1初始化
*
* 参数:u32 bound --设置的波特率
* 返回值:无
*/
void USART1_Init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;//NVIC
GPIO_InitTypeDef GPIO_InitStructure;//GPIO
USART_InitTypeDef USART_InitStructure;//USART
//开启GPIOA、USART时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
USART_DeInit(USART1);//恢复串口1默认状态
//USART_TX GPIO_PA9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//引脚9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速率50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);//将配置好的参数写入GPIO_Init()
//USART_RX GPIO_PA10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//引脚10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//将配置好的写入GPIO_Init()
//NVIC设置
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//嵌套中断向量组选择
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//NVIC中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占主优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//抢占子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能 IRQ通道
NVIC_Init(&NVIC_InitStructure);//将配置好的参数写入NVIC_Init()
//USART设置
USART_InitStructure.USART_BaudRate = bound ;//波特率设置
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_Mode = USART_Mode_Tx | USART_Mode_Rx ;//工作模式:收发
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件控制流
USART_Init(USART1, &USART_InitStructure);//
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能串口接收中断
USART_Cmd(USART1,ENABLE);//USART1使能
}
/*
* 功能:USART1发送1字节数据
*
* 参数:USART_TypeDef* pUSARTx,--结构体指针,指向pUSARTx
* u32 data--待发送的1 Byte的数据
* 返回值:无
*/
void USART_SendByte(USART_TypeDef* pUSARTx, u32 data)
{
USART_SendData(pUSARTx, data);//调用USART数据发送函数,将数据发送
//等待发送数据寄存器为空
while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);//TXE标志位,发送寄存器为空,发送单字节数据时使用
}
/*
* 功能:USART1发送字符串
*
* 参数:USART_TypeDef* pUSARTx,--结构体指针,指向pUSARTx
* char *Str--待发送的字符串
* 返回值:无
*/
void USART_SendStr(USART_TypeDef* pUSARTx, char *Str)
{
do
{
USART_SendByte(pUSARTx, *Str++);
}while(*Str != '\0');//循环发送*Str数据,当字符串指针为空时,指向为0
//等待发送完成
while(USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET);//接收数据寄存器不为空则标志位置1
}
#if 1
/*
* 功能:USART1接收中断服务子程序,将从串口1接收到的数据通过串口1发送
*
* 参数:无
* 返回值:无
*/
void USART1_IRQHandler(void)
{
u8 Res;//接收到的数据
if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET)
{
Res = USART_ReceiveData(USART1);
USART_SendData(USART1,Res);
}
}
#endif
//重定义C库函数printf
//使用printf(),需勾选Use MicroLib
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, ch);//调用USART数据发送函数,将数据发送
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送完成
return ch;
}
main 主函数
#include "stm32f10x.h" // Device header
#include "usart.h"
int main(void)
{
USART1_Init(115200);//串口初始化,波特率115200
USART_SendByte(USART1, '1');
USART_SendStr(USART1, "\tSTM32\n");
while(1)
{
}
}
|
|