串口通信

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个小时,最后在论坛里找到原因,吸取教训。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值