STM32_Study: STM32_Study (gitee.com)
不逼逼 贴代码
usart.c
#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>
/**
* @brief
* UART:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter)
* 库 : STM32F10x_StdPeriph_Lib_V3.5.0
*
*/
void usart1_init(void)
{
// 1.使能时钟 GPIO / USART
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIO时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // USART时钟使能
// 2.配置GPIO_pin脚 TX / RX
GPIO_InitTypeDef gpio_initStructure; // GPIO_INIT结构体
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); //初始化 输出引脚
gpio_initStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
gpio_initStructure.GPIO_Pin = GPIO_Pin_10; //配置引脚
GPIO_Init(GPIOA, &gpio_initStructure); //初始化 输入引脚
// 3.UART初始化并使能
USART_InitTypeDef usart_init_type_def; // usart结构体
usart_init_type_def.USART_BaudRate = 115200; //波特率 115200
usart_init_type_def.USART_WordLength = USART_WordLength_8b; //长度 8bit
usart_init_type_def.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // usart模式 输入和输出
usart_init_type_def.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制 无
usart_init_type_def.USART_Parity = USART_Parity_No; //校验位 无
usart_init_type_def.USART_StopBits = USART_StopBits_1; //停止位 1
USART_Init(USART1, &usart_init_type_def); //初始化usart
USART_Cmd(USART1, ENABLE); //使能USART1
//至此,发送已经可以使用
//可调用USART_SendData(USART1, (uint16_t)data) 发送数据
//也可以重写fputc然后使用printf()打印函数(下方有该函数);
// 4.1使能接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中断 USART_IT_RXNE:Receive Data register not empty interrupt 非空中断(字面意思)
// 4.2NVIC配置 “内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC)”
NVIC_InitTypeDef nvic_init_type_def; // NVIC_Init 结构体
nvic_init_type_def.NVIC_IRQChannel = USART1_IRQn; //通道配置
nvic_init_type_def.NVIC_IRQChannelCmd = ENABLE; //使能
nvic_init_type_def.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
nvic_init_type_def.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_Init(&nvic_init_type_def);
}
/**
* @brief 重载C prinf的调用函数
* 注:需要开启KEIL软件里面的 Target->User Micro LIB 选项
*
* @param ch
* @param f
* @return int
*/
int fputc(int ch, FILE *f)
{
// while ((USART1->SR & 0X40) == 0);
// //DR:数据寄存器
// USART1->DR = (uint16_t)ch;
// return ch;
// 获取标志位:USART1->SR
// SR:status register, 状态寄存器
// USART_FLAG_TC (=0X40) : Transmission Complete flag 发送完成标志
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
;
//循环发送,直到发送完毕
USART_SendData(USART1, (uint16_t)ch);
return ch;
}
/**
* @brief 配置中断4.1/4.2后,触发中断时中断系统会调用该函数
*
*/
void USART1_IRQHandler(void)
{
uint16_t data;
//判断USART1当前状态是否是非空中断
// USART_IT_RXNE(0x0525):Receive Data register not empty interrupt 非空中断
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
//接收数据 return : uint16_t
data = USART_ReceiveData(USART1);
//接收完毕 发送出去 (测试使用)
//可以创建接收数据uint8_t temp[10]将每一个数据合并一起.
USART_SendData(USART1, data);
}
}
/**
* @brief 测试
*
*/
void usart1_test(void)
{
printf("Hello world !");
}
usart.h
#include "stm32f10x.h"
#ifndef __USART_H__
#define __USART_H__
//初始化uart
void usart1_init(void);
//测试
void usart1_test(void);
#endif
网友评论