• 2-4-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)-基础外设例程-串口(基本使用)


    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTA_BC260Y/my.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

    说明

    HC32F460基础例程源码下载链接: https://github.com/yangfengwu45/learnHC32F460.git

    基础外设例程是提供给已经开发过M0或M1或M3或M4等ARM内核单片机的开发人员!

    例程精简扼要, 力求让开发人员快速使用华大单片机做项目!

    这节说一下串口.

    先提示一个事情

    1.打开数据手册

    2.第33页(我以自己使用的HC32F460JETA为例)

    主要说一下后面的 Func_Grp

    3.然后找到38页

    4.列如:PC0

    PC0后面写的是 Func_Grp1

    那么这个引脚可以作为这些功能使用

     

    5.单片机的USART ,SPI, I2C, I2S, 不是固定的引脚,自己根据表格去指定

    6.华大给了好几个串口的例子

    基本使用

    1.串口基本的初始化

    usart.c

    #define USART_C_
    
    #include "usart.h"
    
    
    /*******************************************************************************
     ** rief USART RX irq callback function.//串口接收中断函数
     ** param [in] None
     ** 
    etval None
     ******************************************************************************/
    static void Usart1RxIrqCallback(void)
    {
        uint16_t m_u16RxData;
        m_u16RxData = USART_RecData(M4_USART1);//获取串口接收的数据
    }
    
    /*******************************************************************************
     ** rief USART RX error irq callback function.(串口接收错误中断处理函数)
     ** param [in] None
     ** 
    etval None
     ******************************************************************************/
    static void Usart1ErrIrqCallback(void)
    {
        if (Set == USART_GetStatus(M4_USART1, UsartFrameErr)){ USART_ClearStatus(M4_USART1, UsartFrameErr);}
        else{}
    
        if (Set == USART_GetStatus(M4_USART1, UsartParityErr)) {USART_ClearStatus(M4_USART1, UsartParityErr);}
        else{}
    
        if (Set == USART_GetStatus(M4_USART1, UsartOverrunErr)) {USART_ClearStatus(M4_USART1, UsartOverrunErr);}
        else{}
    }
    
    /*******************************************************************************
     ** rief 串口初始化
     ** param [in] None
     ** 
    etval None
     ******************************************************************************/
    void usart_init(void)
    {
        en_result_t enRet = Ok;
        stc_irq_regi_conf_t stcIrqRegiCfg;
        
        /*配置串口使用的时钟和基本通信配置*/
        const stc_usart_uart_init_t stcInitCfg = {
            UsartIntClkCkNoOutput, //使用内部时钟源,不需要在其时钟输出IO上输出通信的时钟信号
            UsartClkDiv_1,         //时钟不分频
            UsartDataBits8,        //一个字节数据用8位数据位表示
            UsartDataLsbFirst,     //先传输低位
            UsartOneStopBit,       //停止位1位
            UsartParityNone,       //无奇偶校验
            UsartSamleBit8,        //每次传输8位(1字节),也可以传输 UsartSamleBit16(16位,2字节)
            UsartStartBitFallEdge, 
            UsartRtsEnable,        //使能RTS (串口开始传输前让RTS输出一个高脉冲信号)
        };
    
        /* Enable peripheral clock *//*打开时钟*/
        PWC_Fcg1PeriphClockCmd(PWC_FCG1_PERIPH_USART1 | PWC_FCG1_PERIPH_USART2 | 
        PWC_FCG1_PERIPH_USART3 | PWC_FCG1_PERIPH_USART4, Enable);
        
        /* Initialize USART IO */ /*配置相应的IO作为串口的TX,RX引脚*/
        PORT_SetFunc(USART1_RX_PORT, USART1_RX_PIN, Func_Usart1_Rx, Disable);
        PORT_SetFunc(USART1_TX_PORT, USART1_TX_PIN, Func_Usart1_Tx, Disable);
    
        /* Initialize UART *//*初始化串口配置*/
        enRet = USART_UART_Init(M4_USART1, &stcInitCfg);
        if (enRet != Ok)while (1);
        /* Set baudrate *//*设置串口波特率*/
        enRet = USART_SetBaudrate(M4_USART1, USART1_BAUDRATE);
        if (enRet != Ok)while (1);
    
        /* Set USART RX IRQ *//*设置串口接收中断*/
        stcIrqRegiCfg.enIRQn = Int000_IRQn;//设置中断优先级
        stcIrqRegiCfg.pfnCallback = &Usart1RxIrqCallback;//设置中断回调函数
        stcIrqRegiCfg.enIntSrc = INT_USART1_RI;//中断名称
        enIrqRegistration(&stcIrqRegiCfg);
        NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    
        /* Set USART RX error IRQ *//*设置串口接收错误中断*/
        stcIrqRegiCfg.enIRQn = Int001_IRQn;
        stcIrqRegiCfg.pfnCallback = &Usart1ErrIrqCallback;
        stcIrqRegiCfg.enIntSrc = INT_USART1_EI;
        enIrqRegistration(&stcIrqRegiCfg);
        NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
        NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
        NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
    
        /*Enable RX && RX interupt function && UsartTx*/
        USART_FuncCmd(M4_USART1, UsartRx, Enable);//使能接收
        USART_FuncCmd(M4_USART1, UsartRxInt, Enable);//使能接收中断
        USART_FuncCmd(M4_USART1, UsartTx, Enable);//使能发送
    }

    usart.h

    #ifndef USART_H_
    #define USART_H_
    
    #ifndef USART_C_
    #define USART_C_ extern
    #else
    #define USART_C_ 
    #endif
    
    
    #include "hc32_ddl.h"
    
    /* USART1 baudrate definition */
    #define USART1_BAUDRATE                  (115200ul)
    /* USART1 TX Port/Pin definition */
    #define USART1_TX_PORT                   (PortA)
    #define USART1_TX_PIN                    (Pin09)
    /* USART1 RX Port/Pin definition */
    #define USART1_RX_PORT                   (PortA)
    #define USART1_RX_PIN                    (Pin10)
    
    
    void usart_init(void);
    
    #endif

    2.在头文件里面设置串口1波特率,还有使用哪个引脚作为串口1的发送和接收引脚

    我配置了波特率为115200;  PA9作为串口1的发送数据引脚;  PA10作为串口1的串口接收引脚

    3.串口基本的配置

    4,配置串口中断接收回调函数

    注意:中断优先级有145个:   Int000_IRQn,  Int001_IRQn,  Int002_IRQn .... Int142_IRQn,  Int143_IRQn;数字越小,优先级别越高

    4,配置串口接收错误中断回调函数

    这个应该是固定处理形式,然后应该可以去掉.

     

    5.使能

    注意!要一句一句写!不要用 USART_FuncCmd(M4_USART1, UsartRx | XXXX | XXXX , Enable);  不可以这样子用

    注意!要一句一句写!不要用 USART_FuncCmd(M4_USART1, UsartRx | XXXX | XXXX , Enable);  不可以这样子用

    注意!要一句一句写!不要用 USART_FuncCmd(M4_USART1, UsartRx | XXXX | XXXX , Enable);  不可以这样子用

    6.测试每隔一段时间发送一个字符1

            //发送字符1
            USART_SendData(M4_USART1, '1');
            //等待串口发送完成
            while (Reset == USART_GetStatus(M4_USART1, UsartTxEmpty));

    7.对于一般的用户接收数据呢用户可以按照自己的习惯去写就可以了

    增加空闲中断 (空闲中断需要用到定时器,在后面的章节介绍)

  • 相关阅读:
    MiscellaneosDatabase: 常用数据库资源。包含(Northwind+cn,pubs)
    创建和使用 XML Web 服务
    A.9 ASP.NET 中的验证控件(Validator)
    A.6什么是“asp.net”?
    A.12C# ADO.NET 数据库访问
    LINQ To SQL 的案例
    502 Bad Gateway
    常用 Dos 命令+杂项常用的命令符+常用的公式
    Linux 的 Clock skew detected. Your build may be incomplete 解决方法
    window下Linux 的安装和简单使用 & WMware Workstation 9.0中Linux(Red Hat) 的安装
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/14835667.html
Copyright © 2020-2023  润新知