串口的理论部分我们就不讲了。直接上代码
首先是我们的usart.c文件
#include "bsp_usart.h"
void My_USART1(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART1_InitStrue;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
//GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
USART1_InitStrue.USART_BaudRate=9600;
USART1_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART1_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART1_InitStrue.USART_Parity=USART_Parity_No;
USART1_InitStrue.USART_StopBits=USART_StopBits_1;
USART1_InitStrue.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART1_InitStrue);
// ¿ªÆôÖжϳõʼ»¯NVIC
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStruct);
//USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//½ÓÊÕÖжÏ
USART_Cmd(USART1,ENABLE);
}
/***************** ·¢ËÍÒ»¸ö×Ö½Ú **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
/* ·¢ËÍÒ»¸ö×Ö½ÚÊý¾Ýµ½USART */
USART_SendData(pUSARTx,ch);
/* µÈ´ý·¢ËÍÊý¾Ý¼Ä´æÆ÷Ϊ¿Õ */
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
/***************** ·¢ËÍ×Ö·û´® **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
unsigned int i=0;
while(*str++!='\0')
//while(str[i++]!='\0')
{
Usart_SendByte( pUSARTx, *str );
}
/* µÈ´ý·¢ËÍÍê³É */
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
{}
}
//½ÓÊÜ
uint8_t USART_ReceiveByte(USART_TypeDef* USARTx)
{
while(USART_GetFlagStatus(USARTx,USART_FLAG_RXNE)==RESET);
return (uint8_t)USART_ReceiveData(USART1);
}
//uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
//ÖжϷþÎñº¯Êý
void USART1_IRQHandler()
{
u16 temp;
while(USART_GetFlagStatus(USART1,USART_IT_RXNE)==RESET);
temp = USART_ReceiveData(USART1);
Usart_SendByte(USART1,temp);
}
/*
ʹÓÃprintfº¯Êý
ҪעÒâÒªÌî¼ÓÍ·Îļþ
#include "stdio.h"
ʾÀý´úÂëÈçÏ£º
int fputc(int ch ,FILE *f)
{
USART_SendData(USART1,(uint8_t ch));
while(USART_GetFlagStatus(USART1,USART_IT_RXNE)==RESET);
return ch ;
}
int fgetc(FILE *f)
{
while(USART_GetFlagStatus(USART1,USART_IT_RXNE)==RESET);
return (int) USART_ReceiveData(USART1);
}
*/
usart.h
#ifndef __BSP_USART_H
#define __BSP_USART_H
#include "stm32f10x.h"
void My_USART1(void);//³õʼ»¯
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch);
void Usart_SendString( USART_TypeDef * pUSARTx, char *str);
uint8_t USART_ReceiveByte(USART_TypeDef* USARTx);//½ÓÊܺ¯Êý
void USART1_IRQHandler(void);//ÖжϷþÎñº¯Êý
#endif
主函数
#include "bsp_usart.h"
#include "stdio.h"
int main(void)
{
u16 temp;
u16 num;
LED_GPIO_Config();
delay_init();
My_USART1();
//Usart_SendString(USART1," xiaobai\n");
printf("hello");
while(1)
{
Usart_SendString(USART1," xiaobai\n");
delay_ms(1000);
};
}
实验效果如下:
我们发送你好小白给单片机然后单片机会返回我们发送的数据给我们
/* 注释乱码是因为文本的格式没有选对*/
自己在keil5中选就可以了
步骤如下
选择UTF-8格式即可
效果如下: