STM32_Study: STM32_Study (gitee.com)
不逼逼 貼代碼
usart.c
#include "stm32f10x.h"
#include "usart.h"
#include <stdio.h>
/**
* @brief
* UART:通用異步收發(fā)傳輸器(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結(jié)構(gòu)體
gpio_initStructure.GPIO_Pin = GPIO_Pin_9; //配置引腳
gpio_initStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
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結(jié)構(gòu)體
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
//至此,發(fā)送已經(jīng)可以使用
//可調(diào)用USART_SendData(USART1, (uint16_t)data) 發(fā)送數(shù)據(jù)
//也可以重寫fputc然后使用printf()打印函數(shù)(下方有該函數(shù));
// 4.1使能接收中斷
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收中斷 USART_IT_RXNE:Receive Data register not empty interrupt 非空中斷(字面意思)
// 4.2NVIC配置 “內(nèi)嵌向量中斷控制器:Nested Vectored Interrupt Controller (NVIC)”
NVIC_InitTypeDef nvic_init_type_def; // NVIC_Init 結(jié)構(gòu)體
nvic_init_type_def.NVIC_IRQChannel = USART1_IRQn; //通道配置
nvic_init_type_def.NVIC_IRQChannelCmd = ENABLE; //使能
nvic_init_type_def.NVIC_IRQChannelPreemptionPriority = 1; //搶占優(yōu)先級
nvic_init_type_def.NVIC_IRQChannelSubPriority = 1; //響應(yīng)優(yōu)先級
NVIC_Init(&nvic_init_type_def);
}
/**
* @brief 重載C prinf的調(diào)用函數(shù)
* 注:需要開啟KEIL軟件里面的 Target->User Micro LIB 選項
*
* @param ch
* @param f
* @return int
*/
int fputc(int ch, FILE *f)
{
// while ((USART1->SR & 0X40) == 0);
// //DR:數(shù)據(jù)寄存器
// USART1->DR = (uint16_t)ch;
// return ch;
// 獲取標(biāo)志位:USART1->SR
// SR:status register, 狀態(tài)寄存器
// USART_FLAG_TC (=0X40) : Transmission Complete flag 發(fā)送完成標(biāo)志
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
;
//循環(huán)發(fā)送,直到發(fā)送完畢
USART_SendData(USART1, (uint16_t)ch);
return ch;
}
/**
* @brief 配置中斷4.1/4.2后,觸發(fā)中斷時中斷系統(tǒng)會調(diào)用該函數(shù)
*
*/
void USART1_IRQHandler(void)
{
uint16_t data;
//判斷USART1當(dāng)前狀態(tài)是否是非空中斷
// USART_IT_RXNE(0x0525):Receive Data register not empty interrupt 非空中斷
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
//接收數(shù)據(jù) return : uint16_t
data = USART_ReceiveData(USART1);
//接收完畢 發(fā)送出去 (測試使用)
//可以創(chuàng)建接收數(shù)據(jù)uint8_t temp[10]將每一個數(shù)據(jù)合并一起.
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