main.c
#include "led.h"
#include "delay.h"
void My_USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIO时钟使能;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // USART1时钟使能;
GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_9; // 发送端 USART1_TX
GPIO_Init(GPIOA, &GPIO_InitStructrue);
GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 浮空输入
GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_10; // 接收端 USART1_RX
GPIO_Init(GPIOA, &GPIO_InitStructrue);
USART_InitStrue.USART_BaudRate = 115200; // 波特率
USART_InitStrue.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件数据流控制;
USART_InitStrue.USART_Mode = USART_Mode_Rx|USART_Mode_Tx; // 收发模式;
USART_InitStrue.USART_Parity = USART_Parity_No; // 无奇偶校验位;
USART_InitStrue.USART_StopBits = USART_StopBits_1; // 1位停止位;
USART_InitStrue.USART_WordLength = USART_WordLength_8b; // 字长为8位;
USART_Init(USART1, &USART_InitStrue); // 初始化串口;
USART_Cmd(USART1, ENABLE); // 使能串口;
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); // 开启中断;
NVIC_InitStrue.NVIC_IRQChannel = USART1_IRQn; // 中断通道;
NVIC_InitStrue.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级;
NVIC_InitStrue.NVIC_IRQChannelSubPriority = 1; // 子优先级;
NVIC_Init(&NVIC_InitStrue);
}
// 串口1中断服务函数;
void USART1_IRQHandler(void)
{
u8 res;
if (USART_GetITStatus(USART1,USART_IT_RXNE)) // 接收中断;
{
res = USART_ReceiveData(USART1); // 读取收到的数据;
USART_SendData(USART1, res); // 发送数据;
}
}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置优先级分组;
My_USART1_Init();
while (1);
}
实验结果:
总结:
实验过程中有两点需要注意:
1、要移除System文件夹中的usart.c文件,不然会有函数重定义。
2、打开XCOM.exe串口调试工具时不要勾选RTS、DTR两个选项,不然接收不到数据。
DTR表示数据终端准备好,RTS表示请求发送。为什么RTS、DTR不能勾选,什么时候需要勾选,我还没有弄明白,希望知道的朋友多多指教。因为看视频时不认真,随手勾选RTS、DTR两个选项,然后白白浪费了3个小时,最后在论坛里找到原因,吸取教训。