串口的理论知识就不重复了!
编写串口流程很简单:初始化端口 ==> 发送程序编写 + 接受程序编写 ==> PC串口调试助手
第一步:因为涉及接受和发送的优先级,所以在初始化串口端口之前必须先初始化中断的设置,下面就先给出主函数的程序:
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断向量的初始化
Usart_Init(115200); //串口初始化
USART_SendData(USART1,0x88);
}
第二步:对Usart_Init()函数进行书写,代码如下:
void Usart_Init(u32 BaundRate) //参数表示传输数据的波特率 这个可以自己选择,一般9600或112500
{
GPIO_InitTypeDef GPIO_InitStructure; //IO口功能
USART_InitTypeDef USART_InitStructure; //串口功能
NVIC_InitTypeDef NVIC_InitStructure; //中断功能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能串口1和相对应的PA口的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure); //PA9 设置成输出模式,即TX 发送脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure); //PA10 设置成输入模式 即RX 读取脚
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //选择串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//设置先占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //设置从优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断使能
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate = BaundRate; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //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); //初始化
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接受中断
USART_Cmd(USART1, ENABLE); //使能串口1
}
这样关于串口1的初始化就好了;
第三步:接受中断处理函数的编程,我们要使接受到的数据发送出去,代码如下:
void USART1_IRQHandler(void) //接受中断函数
{
USART_SendData(USART1,USART_ReceiveData(USART1)); //将接受到的数据发送出去
}
运行上面的程序,在PC端的串口调试助手会接受到0x80,如果通过串口发送任何字符,你会发现单片机会发送回你发送的数据并显示在串口接受界面里!
最后加一个对于printf的说明,虽然printf方便,但一般我们调试不用printf发送数据,因为对于单片机来说耗内存!
下面的方法可以直接引用printf,在串口初始化函数文件增加以下代码:
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
_sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);
USART1->DR = (u8) ch;
return ch;
}
#endif
这样文明就可以直接使用printf输出数据了!