让自己别忘了大学里学的东西,那么就把它记录下下来,效率会比忘记然后重新再去找资料再重头学高的多
关于串口的配置过程:
- 配置对应的引脚的状态模式
- 配置串口的参数
- –配置中断 (可有可无)
- 使能上述配置
- –配置中断服务函数 (可有可无)
关于串口的中断含义:
- USART_IT_RXNE 串口的接受端数据不空(满)
- USART_IT_TXE 串口的接受端数据空(不满)
#include <M_all.h>
void M_Usart_Init(u32 BUFF)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_Pin_States_Set(GPIOA,GPIO_Pin_9,GPIO_Mode_AF_PP); //配置引脚
GPIO_Pin_States_Set(GPIOA,GPIO_Pin_10,GPIO_Mode_IN_FLOATING); //配置引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO, ENABLE); //开启时钟 AF+Usart
USART_InitStructure.USART_BaudRate = BUFF; //配置波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //配置传输数据大小
USART_InitStructure.USART_StopBits = USART_StopBits_1; //配置停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //配置奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //串口通讯模式
USART_Init(USART1, &USART_InitStructure); //确定配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //指定UART1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ; //配置中断优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //配置中断子优先
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //配置中断使能
NVIC_Init(&NVIC_InitStructure); //确定配置
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //开启中断
USART_Cmd(USART1, ENABLE); //开启串口
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //等待接受端满
{
USART_SendData(USART1,USART_ReceiveData(USART1)); //将电脑端发送的数据通过CH340打印回电脑处
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); //等待发送完成
}
}
/*---------------------解除下面的函数封印,并且在keil软件配置中勾选"MicroLib"并且让代码包含stdio.h头文件,即可调用printf函数--------*/
//int fputc(int ch, FILE *f)//重定向,让printf输出到串口
//{
// USART_SendData(USART1,ch);
// while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
// return ch;
//}
**
PS:关于AFIO的时钟开启 和引脚状态AF_pp..的关系
**
他们是这样的,对于引脚状态改成AF模式(AF_PP),是因为该引脚不再是普通的io口,而是外设的功能引脚口,所以要配置为AF模式。,
- 1.
对于引脚状态改成AF模式(AF_PP):
是因为该引脚不再是普通的io口,而是外设的功能引脚口,所以要配置为AF模式。
2.
而对于开启AFIO时钟:
是因为原来的这个引脚的外设功能通过Remap函数转移到其他的引脚上去了,或者这个引脚存在着中断,所以要去开启AFIO的复用时钟。