USART


/*

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)
	{
		

	}


}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入门->放弃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值