当前位置: 代码迷 >> 综合 >> USART
  详细解决方案

USART

热度:42   发布时间:2023-12-23 15:10:20.0

/*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){}}