/*
usart.h 文件
*/
#ifndef USART_H
#define USART_H
#include "stm32f10x.h"
void usart_init(u32 bound);
#endif
/*
usart.c 文件
1.配置GPIO模式
2.配置串口模式:模式配置的时候我们同时使能收发模式,也可以单独开放一个模式
3.配置中断模式
4.使能串口
5.开启中断:
a.开启中断是我们可以指定中断源,我们这里只是开启了接收寄存器不为空
*/
#include "usart.h"
void usart_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStucture;//配置GPIO模式
USART_InitTypeDef USART_InitStucture;//配置串口模式
NVIC_InitTypeDef NVIC_Initstucture;//配置中断模式
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);//开启GPIO和串口时钟
//GPIO模式配置
GPIO_InitStucture.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStucture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStucture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStucture);
GPIO_InitStucture.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStucture.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStucture);
//串口模式配置
USART_InitStucture.USART_BaudRate=bound;
USART_InitStucture.USART_WordLength=USART_WordLength_8b;
USART_InitStucture.USART_StopBits=USART_StopBits_1;
USART_InitStucture.USART_Parity=USART_Parity_No;//奇偶校验
USART_InitStucture.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//使能收发,但不是说使能了某个中断
USART_InitStucture.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流控制
USART_Init(USART1,&USART_InitStucture);
//中断模式配置
NVIC_Initstucture.NVIC_IRQChannel=USART1_IRQn;
NVIC_Initstucture.NVIC_IRQChannelPreemptionPriority=3;
NVIC_Initstucture.NVIC_IRQChannelSubPriority=3;
NVIC_Initstucture.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_Initstucture);
//接收中断,只开启了接受中断
USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);
USART_Cmd(USART1, ENABLE);
}
/*
中断服务函数
1.当我们开放了多个中断源的时候我们要通过判断到底是哪个中断源触发的中断
2.完事后要清中断,但是串口也可以不用清中断,因为我们读SR寄存器的时候硬件自动清零
3.即使我们只开放了一个中断还是也做一下判断,做一下清除把,毕竟为了所以中断配置统一格式
*/
void USART1_IRQHandler(void)
{
/*
串口通信时记得在串口调试助手设置好以16进制接收发送
*/
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
i=USART_ReceiveData(USART1);
USART_SendData(USART1,i);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=1);
}
//串口发送一个字符串:例如u8 str[] = "I Love C Program!";
void Uart_Send_Str(u8 *str)
{
while(*str != '\0')
{
USART_SendData(USART1, *str);
str++;
while((USART1->SR & (1<<6)) == 0);//查询发送完成标志位
USART1->SR &= ~(1<<6); //将发送完成标志位清零
}
}
/*
主函数
*/
#include "stm32f10x.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "exti.h"
void delay(u32 i){while(i--);}
u8 i=0;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
led_init();
beep_init();
key_init();
usart_init(9600);
while(1)
{
}
}